我有 2 个关于新 OpenMP 4.0 的问题。
第一个是我不明白目标和目标数据有什么区别?根据目标数据规范创建新的数据环境。那么数据环境是怎样的呢?顺便问一下,我们可以将 OpenMP 目标数据比作 OpenACC 数据指令吗?
第二个问题如下:
extern void init(float*, float*, int);
extern void output(float*, int);
void vec_mult(int N)
{
int i;
float p[N], v1[N], v2[N];
init(v1, v2, N);
#pragma omp target map(to: v1, v2) map(from: p)
#pragma omp parallel for
for (i=0; i<N; i++)
p[i] = v1[i] * v2[i];
output(p, N);
}
根据此示例,没有团队指令。那么OpenMP编译器应该如何配置设备内核呢?如果我们谈论 CUDA,调用可能类似于“kernel_func<<<1,1>>>”
如果我们想在 target 内部使用 parallel for 而没有 teams 指令,编译器应该生成具有 1 个块的内核。另一方面,编译器必须通过块内的线程产生迭代。因此内核应该有许多线程(当然也可以使用 1 个线程)。实施该指令的解决方案,
您可以在本文中找到更多解决方案: http://rosecompiler.org/ROSE_ResearchPapers/Liao-OpenMP-Accelerator-Model-2013.pdf