Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Нет, может быть много более 32 потоков "в полете" одновременно в одном SM.

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

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

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

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

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

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

Это зависит от того, как вы определяете поток как "работает". В GPU обычно будет много более 512 потоков, потребляющих различные ресурсы на чипе одновременно.

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