Dynamic/Nested GPU 与 OpenMP 编程模型的并行性
Dynamic/Nested Parallelism of GPU with OpenMP programming model
我的问题与声明目标 OpenMP 构造和dynamic/nested GPU 并行特性有关。 OpenACC 2.0 以两种方式支持动态并行; routine 指令并以嵌套方式使用 parallel/kernels 指令。但是在 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 函数调用时会发生什么?
目前 OpenMP 不支持目标区域的嵌套。所以你的代码很可能不会编译。或者当遇到嵌套的目标构造时,它可能会在运行时崩溃。或产生意想不到的结果。基本上不合格程序的结果是不确定的。
我的问题与声明目标 OpenMP 构造和dynamic/nested GPU 并行特性有关。 OpenACC 2.0 以两种方式支持动态并行; routine 指令并以嵌套方式使用 parallel/kernels 指令。但是在 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 函数调用时会发生什么?
目前 OpenMP 不支持目标区域的嵌套。所以你的代码很可能不会编译。或者当遇到嵌套的目标构造时,它可能会在运行时崩溃。或产生意想不到的结果。基本上不合格程序的结果是不确定的。