0

我想知道一些相关的内核结构。内核中的每一行都不可能在 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;
    }

acc并行结构的情况也一样吗?

4

1 回答 1

1

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

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

所以序列

a[1] = 10;
a[3] = 5;

您在两个循环之间放置的可以在设备上执行。问题是,由于这段代码不在循环中,OpenACC 编译器将不得不创建一个“假”循环,只需一次迭代即可在 GPU 上执行它。由于这样做通常比较慢,一些 OpenACC 编译器更喜欢在下载数据后在主机上执行这样的连续行。

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

于 2013-06-11T08:12:23.257 回答