Балансировка блоков, потоков и рабочих групп? - PullRequest
0 голосов
/ 11 июля 2020

У меня есть приложение (не созданное мной), которое требует трех параметров

  • Блоки
  • Потоки
  • Очки (количество вычислений на поток Я предполагая)

Он использует OpenCL, и у меня есть RX 580 ... моя текущая эффективность низкая

Графический процессор имеет 2304 модуля в 36 вычислительных единицах

Теперь Я экспериментировал с разными значениями, но я понятия не имел, что было бы наиболее оптимальной отправной точкой, потому что я не знаю, как блоки и потоки связаны с вычислительными модулями. Любая помощь будет принята с благодарностью в понимании того, как решить # блоков, # потоков на блок и # вычислений на поток

Большое спасибо

1 Ответ

1 голос
/ 18 июля 2020

Я собираюсь сделать те же предположения, что и вы:

Blocks: Number of workgroups
Thread: Number of threads
Points: Some metric of work per thread

Более важно установить правильный размер рабочей группы , а не количество рабочих групп. Вам нужно, чтобы размер группы был минимум шириной SIMD, которая обычно составляет 32 на большинстве графических процессоров. Таким образом, блоки должны быть установлены в Threads / 32.

Для «очков». Это будет зависеть от того, сколько работы выполнено на «cal c». Создание рабочей группы связано с накладными расходами, поэтому вы хотите, чтобы у каждого потока было достаточно работы. По опыту обычно хватает ~ 16 инструкций. Но если вы не видите код ядра, вам просто нужно поэкспериментировать.

В итоге:

  1. Установите «Баллы» так, чтобы у вас было не менее 2304 потоков для работа, которая вам нужна
  2. Установить блоки на потоки / 32

Все это предполагает, что у вас есть как минимум 2304 рабочих элемента, иначе вы не полностью используете свое оборудование.

...