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

Модель CUDA - какой размер основы?

Какова связь между максимальным размером рабочей группы и размером основы? Допустим, мое устройство имеет 240 потоковых процессоров CUDA (SP) и возвращает следующую информацию -

CL_DEVICE_MAX_COMPUTE_UNITS: 30

CL_DEVICE_MAX_WORK_ITEM_SIZES: 512/512/64

CL_DEVICE_MAX_WORK_GROUP_SIZE: 512

CL_NV_DEVICE_WARP_SIZE: 32

Это означает, что у него восемь SP для потокового мультипроцессора (то есть вычислительной единицы). Теперь, как размер warp = 32, связанный с этими числами?

4b9b3361

Ответ 1

Прямой ответ: Размер Warp - это количество потоков в warp, которое является подразделением, используемым в аппаратной реализации, для объединения доступа к памяти и отправки команд.

Рекомендуемое чтение:

Как упоминал @Matias, я бы прочитал Руководство CUDA C Best Practices Guide (вам нужно прокрутить страницу донизу, где она в списке). Это может помочь вам взглянуть на таблицу в Приложении G.1 на стр. 164.

Объяснение:

CUDA - это язык, который предоставляет parallelism на двух уровнях. У вас есть потоки, и у вас есть блоки потоков. Это наиболее очевидно, когда вы запускаете ядро; вам нужно указать размер каждого блока потока и количество блоков потоков между < < → > , которые предшествуют параметрам ядра.

То, что CUDA не говорит вам, на самом деле происходит на четырех уровнях, а не на двух. На заднем плане ваш блок потоков фактически разделен на подблоки, называемые "warps". Вот краткая метафора, которая поможет объяснить, что происходит на самом деле:

Краткая метафора:

Притворись, что ты педагог/исследователь/политик, который интересуется нынешней математической способностью старшеклассников. Ваш план состоит в том, чтобы дать тест 10 240 студентам, но вы не можете просто поставить их на футбольный стадион или что-то еще и дать им тест. Легче всего разделить (распараллелить) сбор данных, поэтому вы переходите в 20 разных средних школ и просите, чтобы 512 их старших приняли математический тест.

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

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

Вернуться к вашему вопросу:

Используя метафору, ваша программа хочет как можно быстрее вычислить результаты (вы хотите собрать математические тесты). Вы выпускаете ядро ​​с определенным количеством блоков (школ), каждый из которых имеет определенное количество потоков (студентов). У вас может быть только так много блоков, работающих за один раз (для сбора ответов на опрос требуется один проктор в школе). В CUDA блоки потоков выполняются на поточном мультипроцессоре (SM). Переменная: CL_DEVICE_MAX_COMPUTE_UNITS указывает, сколько SM, 30, имеет определенную карту. Это сильно зависит от аппаратного обеспечения - ознакомьтесь с таблицей в Приложении A CUDA C Best Practices Guide. Обратите внимание, что каждый SM может запускать только восемь блоков одновременно независимо от вычислительной способности (1.X или 2.X).

Резьбовые блоки имеют максимальные размеры: CL_DEVICE_MAX_WORK_ITEM_SIZES. Подумайте о том, чтобы выложить свои потоки в сетке; вы не можете иметь строку с более чем 512 потоками. Вы не можете иметь столбец с более чем 512 потоками. И вы не можете складывать больше 64 потоков. Далее, существует максимум: CL_DEVICE_MAX_WORK_GROUP_SIZE количество потоков, 512, которые могут быть сгруппированы вместе в блоке. Таким образом, размеры ваших блоков потоков могут быть:

512 x 1 x 1

1 x 512 x 1

4 x 2 x 64

64 x 8 x 1

и т.д...

Обратите внимание, что с Compute Capability 2.X ваши блоки могут иметь не более 1024 потоков. Наконец, переменная CL_NV_DEVICE_WARP_SIZE указывает размер основы, 32 (количество учащихся в классе). В устройствах Compute Capability 1.X, передача памяти и отправка команд происходят в деталях Half-Warp (у вас всего 16 калькуляторов на класс). В Compute Capability 2.0 переносы памяти группируются с помощью Warp, поэтому 32 выборки одновременно, но отправка команд по-прежнему группируется только с помощью Half-Warp. Для Compute Capability 2.1 обе передачи памяти и отправка команды происходят с помощью Warp, 32 потоков. Эти вещи могут и будут меняться в будущем аппаратном обеспечении.

Итак, мое слово! Перейдем к точке:

В резюме:

Я описал нюансы шаблона warp/thread и других подобных shtuff, но вот несколько вещей, которые нужно иметь в виду. Во-первых, ваш доступ к памяти должен быть "сгруппирован" в наборах из 16 или 32. Поэтому держите X-размерность ваших блоков кратно 32. Во-вторых, и наиболее важный, чтобы получить максимальную отдачу от определенного gpu, вам необходимо максимально увеличить заполняемость. Не имеют 5 блоков из 512 потоков. И не имеют 1000 блоков из 10 потоков. Я бы настоятельно рекомендовал проверить таблицу на основе Excel (работает в OpenOffice тоже, я думаю?), который расскажет вам, что будет занимать GPU для конкретного вызова ядра (требования к распределению макетов и), Надеюсь, это объяснение поможет!

Ответ 2

"Прямой ответ", приведенный в M. Ответ Tibbits - это не что иное, как прямое. Размер основы - 32 потока; это блок, в котором выполняют потоковые мультипроцессоры (SMs). SMs не могут выполнять команды с детализацией более мелкой, чем 32.

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

Ответ 3

Размер основы - это количество потоков, выполняемых одновременно многопроцессором. Мультипроцессор NVIDIA может одновременно выполнять несколько потоков из одного и того же блока, используя многопоточность аппаратного обеспечения.

Важно учитывать размер warp, поскольку все обращения к памяти объединены в кратность размера основы (32 байта, 64 байта, 128 байтов), что повышает производительность.

Руководство по рекомендациям CUDA C содержит всю техническую информацию об этих оптимизациях.

Ответ 4

Прямой ответ краток. В Nvidia БЛОКИ, составленные THREAD, заданы программистом, warp 32 (содержит 32 потока), который является минимальным блоком, выполняемым вычислительным блоком в одно и то же время. В AMD это называется волновой фронт (волна).

В OpenCL WORKGROUPs означают BLOCK в CUDA, что еще, WORKITEMs означает THREAs в CUDA.

Ответ 5

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