Почему моя программа GPU может выполняться, хотя количество блоков превышает количество резидентных блоков? - PullRequest
0 голосов
/ 04 мая 2019

Я работаю на GPU Tesla M6. Согласно данным, Tesla M6 имеет 12 мультипроцессоров, каждый из которых содержит максимум 32 резидентных блока. Таким образом, общее максимальное количество блоков, находящихся на всем устройстве, составляет 384.

Теперь у меня есть матрица данных с размером (512,1408). Я написал ядро ​​и установил число потоков в блоке равным 64 (1D-блок, один элемент данных в каждом потоке), поэтому размер 1D-скопа составляет 512 * 1408/64 = 11264 блоков, что намного превышает количество резидентных блоков. на ГПУ. Тем не менее, вся программа может работать и выводить правильные результаты.

Интересно, почему код может выполняться, хотя реальное количество блоков превышает резидентное? Означает ли это ухудшение производительности? Не могли бы вы объяснить это подробно мне? Спасибо!

Ответы [ 2 ]

3 голосов
/ 04 мая 2019

В соответствии с вашими вычислениями графический процессор может содержать гораздо больше блоков, чем может быть резидентным.

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

В этом подходе нет ничего плохого;это типично для программирования на GPU.Это не обязательно означает ухудшение производительности.Тем не менее, один из подходов к настройке ядер для максимальной производительности заключается в выборе количества блоков на основе того, сколько из них может быть «резидентным».Подсчет того, сколько человек может быть резидентом, если все сделано правильно, является более сложным, чем то, что вы наметили.Требуется анализ занятости.CUDA предоставляет API заполнения для выполнения этого анализа во время выполнения.

Этот подход также потребует разработки ядра, которое может выполнять работу с сеткой произвольного или фиксированного размера, а не с сеткойРазмер выбирается в зависимости от размера проблемы.Одним из типичных подходов для этого является цикл с шагом сетки .

Если вы комбинируете структуру ядра, такую ​​как цикл с шагом сетки, с выбором блоков во время выполнения на основе анализа занятости, то выможете выполнять свою работу только с теми блоками, которые «резидентны» на GPU;никто не должен быть в очереди, ожидая.Это может иметь или не иметь каких-либо ощутимых преимуществ в производительности.Вы наверняка узнаете только по контрольным показателям.

Я предлагаю прочитать обе статьи, на которые я ссылаюсь, прежде чем задавать дополнительные вопросы.В теге cuda также есть много вопросов, обсуждающих понятия, содержащиеся в этом ответе.

3 голосов
/ 04 мая 2019

Потоки в блоках потоков могут зависеть друг от друга.Модели программирования, такие как кооперативные группы, допускают большие группы, чем блок потока.Количество блоков потоков в сетке может быть на несколько порядков больше, чем количество резидентных блоков потоков (например, минимум 1 блок потоков, GV100 поддерживает 84 x 32 2688 резидентных блоков потоков).

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

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