目标和目标数据之间的差异?没有团队指令如何进行团队/线程配置?

时间:2013-11-18 19:28:31

标签: c compiler-construction parallel-processing openmp gpgpu

我有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&lt;&lt;&lt;&lt; 1,1&gt;&gt;&gt;”

1 个答案:

答案 0 :(得分:0)

我找到了第二个问题的答案。

如果我们想在目标内部使用 parallel 而不使用 teams 指令,编译器应该生成内核有1个块。另一方面,编译器必须通过块内部的线程生成迭代。出于这个原因,内核应该有很多线程(当然可以使用1个线程)。实现此指令的解决方案

  1. 在这种情况下,您可以使用静态线程数创建内核。
  2. 它没有意义,但可以用1个线程配置内核。 kernel_invocation&lt;&lt;&lt;&lt; 1,1&gt;&gt;&gt;(parameter1,parameter2,...)
  3. 最佳解决方案:)您需要分析器来决定线程数,维度等。
  4. 您可以在本文中找到更多解决方案: http://rosecompiler.org/ROSE_ResearchPapers/Liao-OpenMP-Accelerator-Model-2013.pdf