opencl- параллельное сокращение без локальной памяти

Большинство алгоритмов параллельного сокращения использует разделяемую (локальную) память.

Nvidia, AMD, Intel и так далее.

Но если устройства не имеют общей (локальной) памяти.

Как мне это сделать?

Если я использую те же алгоритмы, но сохраняю временные значения в глобальной памяти, это будет работать нормально?

2 ответа

Решение

Если я думаю об этом, мой комментарий уже был полным ответом.

Да, вы можете использовать глобальную память в качестве замены локальной памяти, но:

  • Вы должны выделить достаточно глобальной памяти для всех рабочих групп и назначить рабочим группам их фрагмент памяти (поскольку с локальной памятью вам нужно только указать столько памяти, сколько необходимо для одной рабочей группы, и каждая рабочая группа выделит объем указанной памяти)
  • Вы должны использовать CLK_GLOBAL_MEM_FENCE вместо CLK_LOCAL_MEM_FENCE
  • вы потеряете значительную часть производительности

Если у меня будет время этим вечером, я опубликую простой пример.

Если устройство поддерживает OpenCL 2.0, то можно использовать work_group_reduce:

gentype work_group_reduce ( gentype x)

< Op > в work_group_reduce_ , work_group_scan_exclusive_ и work_group_scan_inclusive_ определяет оператор и может быть добавлен, мин или макс.

Другие вопросы по тегам