【问题标题】:Always does all lines inside openACC kernels work on GPU?openACC 内核中的所有行总是在 GPU 上工作吗?
【发布时间】:2013-06-06 07:08:36
【问题描述】:

我想知道一些相关的内核结构。内核中的每一行都不可能在 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并行结构的情况也一样吗?

【问题讨论】:

    标签: c gpu gpgpu openacc


    【解决方案1】:

    引用规范,关于 kernels 构造:

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

    所以顺序

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

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

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

    【讨论】:

    • 谢谢。我想,完全正确。但是,我们不知道编译器更喜欢在主机上执行哪种情况。因为它是如此基本的情况。也许一些复杂的情况,编译器可能更喜欢这样。
    猜你喜欢
    • 2022-09-29
    • 2019-08-01
    • 2011-07-11
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多