Причины низкой достигнутой занятости - PullRequest
0 голосов
/ 04 мая 2018

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

Хорошее объяснение этому также было дано здесь на стеке потока.

Учитывая вышеупомянутую информацию, не должен ли правильный курс действий (чтобы максимизировать производительность) просто установить размер блока как можно меньшим (равным размеру основы, скажем, 32 потока)? То есть, если вам не нужно убедиться, что большее количество потоков должно взаимодействовать через общую память, я полагаю.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Обычно это хороший подход для использования в качестве небольших блоков, насколько это возможно, но достаточно больших для насыщения устройства (64 или 128 потоков на блок в зависимости от устройства) - это не всегда возможно, так как вы можете синхронизировать потоки или общаться через общий доступ память.

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

То же самое относится к процессору - если у вас есть 5 независимых тактов, и каждый занимает 4 секунды для завершения, но у вас есть только 4 ядра, то это закончится через 8 секунд (в течение первых 4 секунд 4 ядра работают на первых 4 задачах и затем на последнем задании работает 1 ядро, а 3 ядра работают на холостом ходу). Если вы можете разделить всю работу на 20 задач, которые занимают 1 секунду, то вся работа будет выполнена за 5 секунд. Таким образом, наличие множества небольших задач помогает использовать оборудование.

В случае графического процессора вы можете иметь большое количество активных блоков (на Titan X это 24 SM x 32 активных блока = 768 блоков), и было бы хорошо использовать эту мощность. В любом случае не всегда верно, что нужно полностью насытить устройство. Во многих задачах я вижу, что использование 32 потоков на блок (т.е. 50% возможного заполнения) дает такую ​​же производительность, как использование 64 потоков на блок. В конце концов, все зависит от выполнения некоторых тестов и выбора того, что лучше для вас в данном случае с данным оборудованием.

0 голосов
/ 04 мая 2018

Учитывая вышеупомянутую информацию, не должен правильный курс действия будут (чтобы максимизировать производительность) просто установив размер как можно меньшего блока (равного размеру основы, скажем, 32 нити)?

Нет.

Как показано в документации здесь , существует ограничение на количество блоков на мультипроцессор, которое оставляет максимальную теоретическую занятость 25% или 50% при использовании 32 потоковых блоков, в зависимости от на каком оборудовании вы запускаете ядро.

...