OpenCL не имеет глобального барьера, который остановит все потоки, поэтому я пытаюсь создать обходной путь с помощью следующего кода:
void barrier(__global uint* scratch) {
uint nThreads = get_global_size(0);
atom_inc(scratch);
/* this loop never terminates */
while(scratch[0] < nThreads) {
continue;
}
}
Идея состоит в том, что каждый поток зацикливается до тех пор, пока все они не увеличивают этот фрагмент памяти.
Однако значение, прочитанное с нуля[0], никогда не меняется для потоков после того, как оно было прочитано, и оно зацикливается навсегда. Я знаю, что он увеличивается, потому что это правильное значение, когда я считываю его обратно на хост.
Кэшируется ли глобальная память локально? Что тут происходит?