【发布时间】:2022-09-23 23:53:41
【问题描述】:
在 GPU 上进行目标卸载的 OpenMP 是否包括类似于 OpenCL 的全局内存围栏/全局屏障?
barrier(CLK_GLOBAL_MEM_FENCE);
我尝试在团队构造中使用
#pragma omp target teams
{
// Some initialization...
#pragma omp distribute parallel for
for (size_t i = 0; i < N; i += 1)
{
// Some work...
}
#pragma omp barrier
#pragma omp distribute parallel for
for (size_t i = 0; i < N; i += 1)
{
// Some other work depending on pervious loop
}
}
然而,屏障似乎只在团队内部起作用,相当于:
barrier(CLK_LOCAL_MEM_FENCE);
我想避免将内核分成两个,以避免将团队本地数据发送到全局内存以再次加载它。
编辑:我已经能够使用全局原子计数器和团队的忙碌等待来强制执行所需的行为。然而,这似乎不是一个好的解决方案,我仍然想知道是否有更好的方法来使用正确的 OpenMP