barrier(CLK_GLOBAL_MEM_FENCE);#pragma omp target teams // Some initialization...// Some other work depending on pervious loop}barrier(CLK_LOCAL_MEM_FENCE
下面的代码是在大大简化危险指针算法(在文章中介绍)之后可以得到的。由于简化的总量,不能用它来代替算法(而且不需要知道任何关于算法的知识来回答这个问题)。然而,我认为它仍然完美地代表了原算法中的内存排序挑战。struct T { int a = 0; };std::atomic<T*> a{new T()};
std::atomic&
global float* c) unsigned int i = get_global_id(0);
barrier(CLK_GLOBAL_MEM_FENCEfor(int t = 0; t < 2; t++){ barrier(CLK_GLOBAL_MEM_FENCE因此,尽管设置了障碍,但在不同的时间点,求和都超过了其他线程的结果。我以为障碍会确保所有线程都到达了它,并把