从OpenMP 4中读取一些教程,我发现target
个区域可以使用task
子句参与CPU depend
的相同依赖关系图。
编写CPU task
时,我们知道它们可以同时运行。但这可能在GPU上有用吗? GPU可以同时运行多个target
区域吗?
我尝试使用此代码:
#include <omp.h>
#include <stdio.h>
int main(){
int i;
#pragma omp parallel
#pragma omp single
{
#pragma omp task private(i)
#pragma omp target
{
for(i=0; i<100; i++)
printf("1 %d\n", i);
}
#pragma omp task private(i)
#pragma omp target
{
for(i=0; i<100; i++)
printf("2 %d\n", i);
}
#pragma omp task private(i)
#pragma omp target
{
for(i=0; i<100; i++)
printf("3 %d\n", i);
}
}
#pragma omp taskwait
}
虽然task
以任意顺序执行,但target
区域以原子方式执行,一次执行一个区域。