【发布时间】:2019-12-29 19:34:07
【问题描述】:
我已经使用支持 OpenAcc 的 PGI 编译器在 GPU 上启动代码大约 3 年了,但到目前为止我无法理解术语“内核”和“并行”之间的区别。 我在 OpenAcc 入门指南中阅读:
并行构造
定义应该为并行编译的程序区域 在加速器设备上执行。
内核构造
定义程序的区域应该被编译成一个 用于在加速器设备上执行的内核序列。
我不明白“在加速器设备上并行执行”和“编译成一系列内核以在加速器设备上执行”之间的区别。如果加速器设备是 GPU,那么所有代码都被编译成某种大小的 CUDA 内核(我试图指的是 CUDA 网格和块),并且这些 CUDA 内核在 GPU 上的 CUDA 线程中执行,不是吗?什么是内核的“序列”? “并行”指令生成 1 个内核,而“内核”可以从同一段代码生成一系列内核?
我也只在所有地方使用“并行”循环指令。例如,为了在 GPU 上并行执行 for 循环,我写了
#pragma acc parallel loop gang vector copy(...) present(...)
for(int i=0; i<N; ++i)
{
...
}
正确吗?什么时候应该使用“内核”?或者它是“并行”的同义词,现在已被弃用且未使用?
【问题讨论】: