CUDA: SM, SP, потоки, варпы
Начал изучать CUDA. Читаю разные источники. Везде пишут +/- одно и то же, но толком не могу понять такую вещь. У меня GTX 1060, на которой 1152 ядра, 9 SM (получается 1152/9 = 128 ядро, они же SP на каждый SM)*.
При этом:
Max Threads Per Multiprocessor: 2048
Max Threads Per Block: 1024
Warp Size: 32 threads
Compute Capability: 6.1
Теперь интересные вопросы:
Правильный расчёт ли я произвёл выше, где помечено * ?
Поскольку 1 блок исполняется на одном SM, каким образом это возможно, если в блоке 1024 потока, а в SM – 128 SP? Можно предположить, что потоки одного блока выполняются последовательно группами по 128, но тогда каким образом возможно организовать их синхронизацию (
__syncthreads)? Можно, конечно, предположить, что 128 потока выполняются до точки синхронизации (__syncthreads), затем ждут, после следующие 128 и т.д. После точки синхронизации они продолжают работу до следующей точки синхронизации.Читал, что варпы также могут выполняться не одновременно, а частями (скажем 4 раза по 8 потоков). Если это так, в каких случаях это происходит?
Что даёт параметр "Max Threads Per Multiprocessor"? Зачем он, на что влияет?
Ответы (1 шт):
Получил ответ на англоязычной версии SO.
Да, всё верно.
Да, по крайней мере, примерно так. Я бы добавил, что GPU спроектированы так, чтобы скрывать задержку (latency) памяти путем (дешевого) переключения контекста между варпами, т.е. синхронизация не будет единственной причиной переключения контекста. Варпы блока потоков не обязательно должны выполняться синхронно.
Warp divergence (не знаю, как правильно это перевести... разветвление варпов?): у вас в коде есть условие (if), которое отправляет одну часть варпа по иному пути относительно другой части варпов. Это обрабатывается по-разному на более новых архитектурах GPU. Поищите понятие "Независимое планирование потоков" (Independent Thread Scheduling).
Это влияет на то, сколько блоков (каждый с менее чем 1024 потоками) может быть запланировано на одном SM. Существуют и другие факторы, влияющие на это (например, использование общей памяти и регистров). Поищите понятие "Утилизация" (Utilization).