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_ определяет оператор и может быть добавлен, мин или макс.