【问题标题】:Dynamic/Nested Parallelism of GPU with OpenMP programming modelGPU 的动态/嵌套并行与 OpenMP 编程模型
【发布时间】:2015-10-29 07:05:45
【问题描述】:

我的问题与 OpenMP 的 declare target 构造和 GPU 的动态/嵌套并行功能有关。 OpenACC 2.0 以两种方式支持动态并行; routine 指令并以嵌套方式使用并行/内核指令。但是在 OpenMP 中禁止使用嵌套的设备指令,例如 target、teams 或distribute。但是在我看来,声明目标指令与 OpenACC 的常规指令相似。

但是它的语义和用法还不是很清楚。我的示例代码是这样的。

#pragma omp declare target
void foo(){

  //work-1

#pragma omp target teams distribute parallel for 
for(...)
{
    if(...){
       foo();
    {
      //work-2
    }
}

//work-3
}
#pragma omp end declare target

int main(){
//work 

foo();

}

在那个例子中,我期望函数 foo 将被映射为设备函数。但由于它内部有目标构造,编译器将以某种方式转换此代码。我的问题是,当线程在目标构造中遇到 foo 函数调用时会发生什么?

【问题讨论】:

  • 这不是嵌套目标,因为您从目标区域之外的 main 调用 foo。如果你声明一个目标函数,这意味着你应该在目标区域中调用它。

标签: openmp gpgpu openacc


【解决方案1】:

目前 OpenMP 不支持目标区域的嵌套。所以你的代码很可能无法编译。或者当遇到嵌套目标构造时,它可能会在运行时崩溃。或者产生意想不到的结果。基本上不合格程序的结果是未指定的。

【讨论】:

  • 不是所有编译器都生成声明目标函数的宿主实现吗?这就是在 main 中调用 foo 时实际调用的内容,因为它是在目标区域之外调用的。因此,该用法实际上并没有做嵌套目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多