始终openACC内核中的所有行都可以在GPU上运行吗?

时间:2013-06-10 15:09:44

标签: c gpu gpgpu openacc

我想知道一些相关的内核结构。内核中的每一行都不能在GPU上运行吗?

例如我有这个代码:

#pragma acc kernels copy(a[0:n],b[0:n])
    {
        #pragma acc loop
        for (i = 0; i < n; i++)
            a[i] = i+10;   
        a[1] = 10;
        a[3] = 5;
        #pragma acc loop
        for (i = 0; i < n; i++)
            b[i] = i+20;
    }

对于并行结构,情况是否相同?

1 个答案:

答案 0 :(得分:1)

引用规范,关于内核构造:

  

编译器会将内核区域中的代码分解为序列   加速器内核。通常,每个循环嵌套都是不同的   核心。当程序遇到内核构造时,它会   在设备上按顺序启动内核序列。

顺序

a[1] = 10;
a[3] = 5;
您可以在设备上执行放置在两个循环之间的

。问题是,由于此代码不在循环中,OpenACC编译器必须创建一个“假”循环,只需一次迭代即可在GPU上执行它。 由于执行此操作通常较慢,因此一些OpenACC编译器更喜欢在下载数据后在主机上执行此类顺序行。

对于 parallel 部分,答案更简单:所有代码始终在设备上执行。