Прямой ответ: Размер деформации - это количество потоков в деформации, которое является подразделением, используемым в аппаратной реализации для объединения доступа к памяти и диспетчеризации команд.
Рекомендуемое чтение:
Как упомянул @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 быть для определенного вызова ядра (расположение потоков и требования к общей памяти). Надеюсь, это объяснение поможет!