gpt4 book ai didi

c++ - OpenAcc标准中内核与并行指令之间的区别

转载 作者:行者123 更新时间:2023-12-02 10:22:47 25 4
gpt4 key购买 nike

我已经使用支持OpenAcc的PGI编译器在GPU上启动代码已有3年了,但是到目前为止,我还无法理解术语“内核”和“并行”之间的区别。
我阅读了《 OpenAcc入门指南》:

Parallel Construct

Defines the region of the program that should be compiled for parallel execution on the accelerator device.

Kernels Construct

Defines the region of the program that should be compiled into a sequence of kernels for execution on the accelerator device.



我不理解术语“在加速器设备上并行执行”和“编译为在加速器设备上执行的一系列内核”之间的区别是什么。如果加速器设备是GPU,则所有代码都将编译为某种大小的CUDA内核(我试图表示CUDA网格和块),而这些CUDA内核是在GPU上以CUDA线程执行的,不是吗?什么是内核的“序列”? “parallel”指令使1个内核和“kernels”可以使同一代码段产生一系列内核?

我也到处都只使用“并行”循环指令。例如,为了并行化for循环以在GPU上执行,我编写了
#pragma acc parallel loop gang vector copy(...) present(...)
for(int i=0; i<N; ++i)
{
...
}

这是正确的吗?什么时候应该使用“内核”?还是它是“parallel”的同义词,现在已被弃用而不被使用?

最佳答案

理解差异的最好方法是使用“并行”,程序员在定义要并行化的循环以及如何并行化。基本上,您是在告诉编译器并行化特定循环。使用“内核”,您可以定义一个可以并行化的代码区域,但是编译器的工作是确定并行化的循环以及如何并行化。

对于“并行”,将区域内的所有代码作为一个CUDA内核卸载。如果在“并行”区域内有多个外部循环,则它们仍将在一个CUDA内核中卸载。由于编译器可以通过“内核”发现并行化,因此可以将该区域内的多个循环拆分为一系列单独的CUDA内核启动序列。

完整的详细信息可以在下面找到:https://www.pgroup.com/lit/articles/insider/v4n2a1.htm

请注意,访问本文确实需要您具有PGI Web用户帐户。

关于c++ - OpenAcc标准中内核与并行指令之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59374342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com