Модель CUDA - каков размер основы? - PullRequest
39 голосов
/ 31 августа 2010

Какая связь между максимальным размером рабочей группы и размером основы? Допустим, мое устройство имеет 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 на потоковый мультипроцессор (то есть вычислительную единицу). Теперь, как размер основы = 32 связан с этими числами?

Ответы [ 3 ]

110 голосов
/ 25 сентября 2010

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

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

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

Пояснение:

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

Что CUDA не говорит вам, так это то, что на самом деле вещи происходят на четырех уровнях, а не на двух. На заднем плане ваш блок потоков фактически разделен на субблоки, называемые «перекосами». Вот краткая метафора, помогающая объяснить, что на самом деле происходит:

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

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

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

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

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

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

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

512 х 1 х 1

1 х 512 х 1

4 х 2 х 64

64 х 8 х 1

и т.д ...

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

Итак, мое слово! Давайте перейдем к делу:

В итоге:

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

3 голосов
/ 31 августа 2010

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

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

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

1 голос
/ 29 декабря 2016

Прямой ответ короткий: в Nvidia BLOCK, составленные из THREAD, устанавливаются программистом, а WARP равен 32 (состоит из 32 потоков), что является минимальной единицей, выполняемой вычислительной единицей одновременно. В AMD WARP называется WAVEFRONT («волна»).

В OpenCL рабочие группы означают блоки в CUDA, более того, рабочие группы означают нити в CUDA.

...