Как блоки/деформации/потоки CUDA сопоставляются с ядрами CUDA?

Я использую CUDA уже несколько недель, но у меня есть некоторые сомнения по поводу распределения блоков/перекосов/ нить. Я изучаю архитектуру с дидактической точки зрения(университетский проект ), поэтому достижение максимальной производительности не является моей задачей.

Прежде всего, я хотел бы понять, правильно ли я понял эти факты:

  1. Программист пишет ядро ​​и организует его выполнение в сетке блоков потоков.

  2. Каждый блок назначается потоковому мультипроцессору (SM ). После назначения он не может быть перенесен на другой SM.

  3. Каждый SM разбивает свои собственные блоки на варпы (с максимальным размером 32 потока ). Все потоки в варпе выполняются одновременно на ресурсах SM.

  4. Фактическое выполнение потока выполняется ядрами CUDA, содержащимися в SM. Не существует определенного сопоставления между потоками и ядрами.

  5. Если варп содержит 20 потоков, но в настоящее время доступно только 16 ядер, варп не запустится.

  6. С другой стороны, если блок содержит 48 потоков, он будет разделен на 2 варпа, и они будут выполняться параллельно, если доступно достаточно памяти.

  7. Если поток запускается на ядре, затем он останавливается из-за доступа к памяти или длительной операции с плавающей запятой, его выполнение может возобновиться на другом ядре.

Верны ли они?

Итак, у меня есть GeForce 560 Ti, поэтому согласно спецификациям он оснащен 8 SM, каждое из которых содержит 48 ядер CUDA (всего 384 ядра ).

Моя цель — убедиться, что каждое ядро ​​архитектуры выполняет ОДИНАКОВЫЕ инструкции. Предполагая, что мой код не потребует больше регистров, чем доступно в каждом SM,Я представил разные подходы:

  1. Я создаю 8 блоков по 48 потоков в каждом, так что у каждого SM есть 1 блок для выполнения. В этом случае будут ли 48 потоков выполняться параллельно в SM (, используя все 48 доступных для них ядер )?

  2. Есть ли разница, если запустить 64 блока по 6 потоков? (Предполагая, что они будут равномерно отображены среди SM)

  3. Если я «погрузлю» GPU в запланированную работу (, создав, например, 1024 блока по 1024 потока в каждом, )разумно ли предположить, что все ядра будут использоваться в определенный момент и будут выполнять те же вычисления (, предполагая, что потоки никогда не останавливаются )?

  4. Есть ли способ проверить эти ситуации с помощью профилировщика?

  5. Есть ли какая-нибудь ссылка на этот материал? Я прочитал руководство по программированию CUDA и главы, посвященные аппаратной архитектуре, в разделах «Программирование массивно-параллельных процессоров» и «Проектирование и разработка приложений CUDA»; но я не мог получить точный ответ.

131
задан einpoklum - reinstate Monica 3 April 2017 в 07:37
поделиться