Количество ядер CUDA и количество потоков
Меня смущает соотношение между количеством ядер в GPU NVidia, количеством SMP и максимальным количеством потоков. Свойства устройства для моего ноутбука GT650m показывают 384 ядра, 2 SMP, с 1024 потоками на SMP.
Как эти числа связаны друг с другом и размером основы? Я предполагаю (возможно, неправильно), что на SMP имеется 192 ядра, но это не фактор 1024. Если каждое ядро работает с 32 потоками, я бы ожидал 32 * 192 потоков на SMP, или 2^5 * (2^7 + 2^6) или 4096 + 2048 = 6142.
Что мне не хватает?
1 ответ
Я думаю, что вы должны глубже изучить планирование ядер в CUDA.
Есть два важных размера: блоки и потоки на блок
Каждый блок запланирован на одном СМ и затем разделен на деформации. Поэтому блоки имеют общую память, которая доступна только внутри блока, потому что она находится в памяти SM. Количество блоков на SM зависит от предела устройства и расчета занятости. Максимальное количество блоков на SM составляет 8 для CC 1.0-2.x и 16 для CC 3.x.
Каждый блок имеет определенное количество потоков на блок. Потоки делятся на деформации, и деформации можно запускать в произвольном порядке, определяемом планировщиком деформаций и SM.
Теперь ваша карта имеет общее количество 384 ядер на 2 SM с 192 ядрами на каждом. Число ядер CUDA представляет собой общее количество инструкций с плавающей запятой одинарной точности или целочисленного потока, которые могут быть выполнены за цикл. Не учитывайте ядра CUDA ни при каких расчетах.
Максимальное количество потоков зависит от вычислительной мощности. CC2.0-3.x поддерживает максимум 1024 потоков на блок при достаточном количестве регистров и слотов деформации. Деформации статически назначаются планировщикам деформации. Количество планировщиков основы на SM составляет 1 для CC 1.x, 2 для CC 2.x и 4 для CC 3.x.
Если ваше приложение не выполняет параллельные ядра, то для использования каждого SM gridDim должен иметь>= количество блоков SM.
Чтобы GTX650m полностью использовал вычислительную мощность, у вас должно быть как минимум два блока (в противном случае с одним блоком вы могли бы использовать только один SM). С другой стороны, если вы хотите запланировать потоки 10240, вы можете легко запланировать 10 блоков из 1024 потоков каждый.