В OpenCL я понимаю, что вы можете использовать функцию barrier()
для синхронизации потоков в рабочей группе. Я (вообще) понимаю, для чего они предназначены и когда их использовать. Я также знаю, что все потоки в рабочей группе должны попасть в барьер, иначе возникают проблемы. Тем не менее, каждый раз, когда я пытался использовать барьеры до сих пор, это, по-видимому, приводит к сбою моего видеодрайвера или сообщению об ошибке доступа к некорректной памяти. Я видел это на двух разных видеокартах (1 ATI, 1 NVIDIA).
Итак, мои вопросы:
- Любая идея, почему это произойдет?
- В чем разница между
barrier(CLK_LOCAL_MEM_FENCE)
иbarrier(CLK_GLOBAL_MEM_FENCE)
? Я прочитал документацию, но мне это было непонятно. - Есть ли общее правило о том, когда использовать
barrier(CLK_LOCAL_MEM_FENCE)
vs.barrier(CLK_GLOBAL_MEM_FENCE)
? - Есть ли время, когда вызов
barrier()
с неправильным типом параметра может вызвать ошибку?