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], никога не се променя за нишките, след като бъде прочетена, и зацикля завинаги. Знам, че се увеличава, защото това е правилната стойност, когато я прочета обратно на хоста.
Локално ли се кешира глобалната памет? Какво става тук?