Какова взаимосвязь между ядром CUDA, потоковым мультипроцессором и моделью блоков и потоков CUDA?
Что сопоставляется с тем, что и что распараллеливается и как? и что более эффективно, увеличить количество блоков или количество потоков?
В настоящее время я понимаю, что на мультипроцессор приходится 8 ядер cuda. и что каждое ядро cuda сможет выполнять по одному блоку cuda за раз. и все потоки в этом блоке выполняются последовательно в этом конкретном ядре.
Это правильно?
Схема потоков/блоков подробно описана в Руководстве по программированию CUDA. В частности, в главе 4 говорится:
Архитектура CUDA построена вокруг масштабируемого массива многопоточных потоковых мультипроцессоров (SMs). Когда программа CUDA на центральном процессоре вызывает сетку ядра, блоки сетки перечисляются и распределяются между мультипроцессорами с доступной производительностью. Потоки блока потоков выполняются одновременно на одном мультипроцессоре, а несколько блоков потоков могут выполняться одновременно на одном мультипроцессоре. Когда блоки потоков завершаются, на освободившихся мультипроцессорах запускаются новые блоки.
Каждый SM содержит 8 ядер CUDA, и в каждый момент времени они выполняют один блок из 32 потоков - таким образом, для выдачи одной инструкции для всего блока требуется 4 такта. Можно предположить, что потоки в любом данном варпе выполняются синхронно, но для синхронизации между варпами необходимо использовать __syncthreads()
.