2015-09-04 15 views
1

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

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

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

Как я могу это сделать?

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

+1

Да, с помощью глобальной памяти должна работать нормально, но: * Вы должны выделить достаточно глобальную память для всех рабочих групп и назначить рабочие группы их часть памяти * вы должны использовать 'CLK_GLOBAL_MEM_FENCE' вместо' CLK_LOCAL_MEM_FENCE' * вы будете теряют значительную производительность – Baiz

ответ

1

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

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

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

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

3

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

gentype work_group_reduce < оп> (gentype х)

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