Соотношение между количеством блоков потоков и ядер CUDA на машине (в CUDA C) - PullRequest
8 голосов
/ 13 июня 2011

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

Неужели количество блоков должно быть меньше или равно количеству ядер для хорошей производительности?Или же производительность не связана с количеством блоков

Ответы [ 2 ]

16 голосов
/ 13 июня 2011

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

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

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

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

5 голосов
/ 13 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...