CUDA - Мультипроцессоры, размер деформации и максимальное количество потоков на блок: какова точная взаимосвязь?

Я знаю, что на графическом процессоре CUDA есть мультипроцессоры, которые содержат ядра CUDA. На своем рабочем месте я работаю с GTX 590, которая содержит 512 ядер CUDA, 16 мультипроцессоров и имеет размер деформации 32. Это означает, что в каждом мультипроцессоре 32 ядра CUDA, которые работают с одним и тем же кодом в той же деформации. . И, наконец, максимальное количество потоков на размер блока составляет 1024.

Мой вопрос в том, как точно связаны размер блока и количество мультипроцессоров - размер деформации. Позвольте мне рассказать о своем понимании ситуации: например, я выделяю N блоков с максимальным размером threadPerBlock 1024 на GTX 590. Насколько я понимаю из руководства по программированию CUDA и из других источников, блоки сначала нумеруются аппаратным обеспечением . В этом случае 16 из N блоков назначены разным мультипроцессорам. Каждый блок содержит 1024 потока, и аппаратный планировщик назначает 32 из этих потоков 32 ядрам в одном мультипроцессоре. Потоки в одном мультипроцессоре (деформации) обрабатывают одну и ту же строку кода и используют общую память текущего мультипроцессора. Если текущие 32 потока сталкиваются с операцией вне кристалла, такой как чтение-запись в память, они заменяются другой группой из 32 потоков из текущего блока. Таким образом, на самом деле в одном блоке 32 потока, которые точно выполняются параллельно на мультипроцессоре в любой момент времени, а не все 1024 потока. Наконец, если блок полностью обрабатывается мультипроцессором , новый блок потока из списка N блоков потока вставляется в текущий мультипроцессор. И, наконец, во время выполнения ядра CUDA в графическом процессоре параллельно выполняется 512 потоков. (Я знаю, что если в блоке используется больше регистров, чем доступно на одном мультипроцессоре, то он делится для работы на двух мультипроцессорах, но давайте предположим, что в нашем случае каждый блок может уместиться в одном мультипроцессоре.)

Итак, верна ли моя модель параллельного выполнения CUDA? Если нет, что не так или чего не хватает? Я хочу точно настроить текущий проект, над которым я работаю, поэтому мне нужна наиболее правильная рабочая модель всего этого.


person Ufuk Can Bicici    schedule 19.07.2012    source источник


Ответы (1)


На своем рабочем месте я работаю с GTX 590, которая содержит 512 ядер CUDA, 16 мультипроцессоров и имеет размер деформации 32. Это означает, что в каждом мультипроцессоре 32 ядра CUDA, которые работают с одним и тем же кодом в той же деформации. . И, наконец, максимальное количество потоков на размер блока составляет 1024.

GTX590 содержит в два раза больше чисел, чем вы упомянули, поскольку на карте 2 графических процессора. Ниже я остановлюсь на одном чипе.

Позвольте мне рассказать о своем понимании ситуации: например, я выделяю N блоков с максимальным размером threadPerBlock 1024 на GTX 590. Насколько я понимаю из руководства по программированию CUDA и из других источников, блоки сначала нумеруются аппаратным обеспечением . В этом случае 16 из N блоков назначены разным мультипроцессорам.

Блоки не обязательно равномерно распределяются по мультипроцессорам (SM). Если вы запланируете ровно 16 блоков, некоторые SM могут получить 2 или 3 блока, в то время как некоторые из них простаивают. Не знаю почему.

Каждый блок содержит 1024 потока, и аппаратный планировщик назначает 32 из этих потоков 32 ядрам в одном мультипроцессоре.

Связь между потоками и ядрами не такая прямая. В каждом SM имеется 32 «базовых» ALU. Те, которые обрабатывают такие вещи, как числа с плавающей запятой одинарной точности и большинство 32-битных целочисленных и логических инструкций. Но есть только 16 единиц загрузки / сохранения, поэтому, если инструкция деформации, которая в настоящее время обрабатывается, является загрузкой / сохранением, ее нужно запланировать дважды. И есть только 4 специальных функциональных блока, которые выполняют такие вещи, как тригонометрия. Таким образом, эти инструкции должны быть запланированы 32/4 = 8 раз.

Потоки в одном мультипроцессоре (деформации) обрабатывают одну и ту же строку кода и используют общую память текущего мультипроцессора.

Нет, в одном SM может одновременно находиться более 32 потоков "в полете".

Если текущие 32 потока сталкиваются с операцией вне кристалла, такой как чтение-запись в память, они заменяются другой группой из 32 потоков из текущего блока. Таким образом, на самом деле в одном блоке 32 потока, которые параллельно работают на мультипроцессоре в любой момент времени, а не все 1024 потока.

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

Наконец, если блок полностью обрабатывается мультипроцессором, новый блок потока из списка N блоков потока вставляется в текущий мультипроцессор.

Мультипроцессор может обрабатывать более одного блока за раз, но блок не может переместиться на другой MP после начала обработки на нем. Количество потоков в блоке, которые в настоящее время находятся в режиме полета, зависит от того, сколько ресурсов использует блок. Калькулятор загруженности CUDA скажет вам, сколько блоков будет в полете одновременно, в зависимости от использования ресурсов вашим конкретным ядром.

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

Нет, блок нельзя разделить для работы на двух мультипроцессорах. Целый блок всегда обрабатывается одним мультипроцессором. Если у данного мультипроцессора недостаточно ресурсов для обработки хотя бы одного блока с вашим ядром, вы получите ошибку запуска ядра, и ваша программа вообще не запустится.

Это зависит от того, как вы определяете поток как «работающий». Графический процессор обычно имеет более 512 потоков, одновременно потребляющих различные ресурсы чипа.

См. Ответ @harrism в этом вопросе: CUDA: сколько всего одновременных потоков?

person Roger Dahl    schedule 19.07.2012
comment
Спасибо за ответ. Это сделало некоторые вещи более ясными, но все же у меня есть некоторые недоумения. Насколько я понимаю из вашего ответа и ответа @harrism, мультипроцессор может обрабатывать более одного блока за одно и то же время, и в мультипроцессоре может быть до 48 деформаций. Мой вопрос: если мультипроцессор может обрабатывать потоки разных блоков, как он может разделить общую память между этими блоками? Я имею в виду, что общая память имеет размер около 48 КБ, и блок может уже использовать большую ее часть. - person Ufuk Can Bicici; 20.07.2012
comment
Совместно используемая память является одним из потенциально ограничивающих факторов того, сколько блоков может выполняться одновременно. Если блок использует более половины доступной разделяемой памяти, то одновременно может работать только один блок. Если блок использует от 1/2 до 1/3 доступной разделяемой памяти, 2 могут работать одновременно, и так далее. - person Roger Dahl; 20.07.2012
comment
В Интернете есть много отличных анализов архитектуры Ферми. В Beyond3D есть по крайней мере пара хороших. Вот один. Хотя я нахожу вопросы дизайна очень интересными, я не думаю, что необходимо знать чип в каких-либо деталях, чтобы иметь возможность написать оптимальное программное обеспечение для графического процессора. На самом деле, материал из Руководства по программированию CUDA C - это все, что вам нужно. - person Roger Dahl; 20.07.2012