OpenCL - влияние барьера на производительность - PullRequest
1 голос
/ 12 октября 2011

В OpenCL все потоки должны вычислять несколько общих значений.Какой из следующих двух случаев быстрее?1. Все потоки вычисляют значения, сохраняют в частной памяти и не требуют синхронизации между потоками.2. Один поток вычисляет и сохраняет в локальной памяти.Синхронизировано барьером.Все потоки рабочей группы получают доступ к значениям в локальной памяти.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 12 октября 2011

Зависит от сложности вычисления этих общих значений и от того, сколько рабочих элементов могут работать параллельно.

Допустим, время вычисления общих значений равно A, время выполнения остальных вычислений - B, а накладные расходы для барьера - AO & BO (часть A и часть B). Мы можем рассчитать время для каждого варианта.

  • Вариант 1 и одна нить и 1000 рабочих элементов: 1000А + 1000В
  • Вариант 2 и один поток и 1000 рабочих элементов: A + AO + 1000B + 1000BO
  • Вариант 1 с 1000 нитями и 1000 рабочих элементов: A + B
  • Вариант 2 с 1000 нитями и 1000 рабочих элементов: A + AO + B + BO

Когда у вас столько потоков, сколько рабочих элементов, вариант 2 явно медленнее. Если у вас одна нить, если BO меньше по сравнению с A, вариант 2, вероятно, быстрее.

Истина, вероятно, где-то посередине.

Вариант 3: хост должен рассчитать эти значения и поместить результаты в постоянную память. Если вы сделаете это и используете небольшую двойную буферизацию, вы, вероятно, сможете скрыть время для вычисления следующего набора общих значений, ожидая, пока OpenCL выполнит текущий расчет.

2 голосов
/ 12 октября 2011

Есть ли правильный ответ на этот вопрос, учитывая диапазон устройств, на которых работает OpenCL (например, различные графические процессоры, различные процессоры и Cell BE)? Характеристики производительности будут сильно различаться в зависимости от процессора и графического процессора и, возможно, также от поставщиков и моделей графического процессора.

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

Возможно ли в вашем случае предварительно вычислить несколько общих значений на хосте и передать их как динамические параметры ядру OpenCL или как параметры времени компиляции в ядро ​​OpenCL?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...