Я думаю, что вы должны иметь более глубокий взгляд на планирование ядер в cuda.
Есть два важных размеры: блоки и нитей на блоке
Каждый блок запланирован на одном SM и есть то нарезанных в перекосов. Поэтому блоки имеют общую память, которая доступна только внутри блока, , потому что она лежит на памяти SM. Количество блоков на каждый SM зависит от размера устройства и расчета занятости. Максимальные блоки для SM - 8 для CC 1.0-2.x и 16 для CC 3.x.
Каждый блок имеет определенное количество нитей на блок. Потоки делятся на перекосы, и деформации могут выполняться в произвольном порядке, определяемом только планировщиком warp- и SM.
Теперь ваша карта имеет общее количество 384 ядер на 2 SM с 192 ядрами каждый. Счет ядра CUDA представляет собой общее число команд с плавающей запятой или целочисленными точками одинарной точности, которые могут быть выполнены за каждый цикл. Не учитывайте ядра CUDA при любых расчетах.
Максимальное количество потоков зависит от вычислительной способности. CC2.0-3.x поддерживает максимум 1024 потока на блок при наличии достаточных регистров и слотов деформации. Деформации статически назначаются планировщикам деформаций. Количество планировщиков warp для SM равно 1 для CC 1.x, 2 для CC 2.x и 4 для CC 3.x.
Если ваше приложение не выполнило одновременные ядра, то для использования каждого SM gridDim должно иметь> = количество блоков SM.
Для использования GTX650m для полного использования вычислительной мощности необходимо иметь как минимум два блока (в противном случае с одним блоком вы могли использовать только один SM). С другой стороны, если вы хотите запланировать потоки 10240, вы можете легко запланировать 10 блоков из 1024 потоков каждый.
Спасибо. Думаю, планирование графика было тем, чего мне не хватало. –