Отношение количества блоков нитей и ядер cuda на машине (в CUDA C)

У меня есть CUDA 2.1, установленный на моей машине, и у него есть графическая карта с 64 ядрами cuda. Я написал программу, в которой я инициализирую одновременно 30000 блоков (и 1 поток на блок). Но я не получаю удовлетворительных результатов от gpu (он работает медленно, чем cpu)

Это то, что количество блоков должно быть меньше или равно количеству ядер для хорошей производительности? Или это то, что производительность не имеет ничего общего с Количество блоков

2 ответов


ядра CUDA не совсем то, что вы могли бы назвать ядром на классическом процессоре. В самом деле, их следует рассматривать не более чем как ALUs (арифметические и логические единицы), которые просто способны вычислять готовые операции.

вы можете знать, что потоки обрабатываются в коробит (группа из 32 потоков) внутри блоков, которые вы определили. Когда ваши блоки отправляются на разные SMs (потоковые Мультипроцессоры, они являются фактическими ядра GPU), каждый SM планирует деформации внутри блока для оптимизации времени вычисления в отношении времени доступа к памяти, необходимого для получения входных данных потоков.

проблема в том, что потоки всегда обрабатываются через их принадлежность warp, поэтому, если у вас есть только один поток на блок, SM, на котором он работает, не сможет планировать через деформации, и вы не будете использовать несколько доступных ядер CUDA. Ваши ядра CUDA будут ждать обработки данных, так как ядра CUDA вычисляют намного быстрее чем данные извлекаются через память.

наличие большого количества блоков с несколькими потоками-это не то, что ожидает GPU. В этом случае вы сталкиваетесь с блок на ограничение SM (это число зависит от вашего устройства), что заставляет ваш GPU тратить много времени, чтобы поставить блоки на SM, а затем удалить их, чтобы обработать следующие. Вы должны скорее увеличьте количество потоков в ваших блоках вместо числа блоки в вашем приложении.


размер warp во всем текущем оборудовании CUDA составляет 32. Использование менее 32 потоков на блок (или не использование раунда, кратного 32 потокам на блок) просто растрачивает циклы. В настоящее время использование 1 потока на блок оставляет что-то вроде 95% циклов ALU вашего GPU в режиме ожидания. В этом и заключается основная причина плохой работы.