微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

循环如何以块、扭曲和线程的形式映射到 GPU 中?

如何解决循环如何以块、扭曲和线程的形式映射到 GPU 中?

我需要说明如何使用 OpenACC 在设备上映射循环。我也不确定块、经线和线程的作用。

如果我有这样的循环:

#pragma acc parallel loop
for(i=0; i<1024; i++){
  vector[i] += 1;
}

我的 GPU 支持“每个块的最大线程数 = 1024”。 循环如何并行化为块? 我的第一个想法是单个块足以处理操作,因为向量有 1024 个元素。在这种情况下,我认为该块由 1024 个线程组成,每个线程对应于具有不同索引 vector[i] += 1; 的操作 i

我对线程的理解是否正确?

我会有 32 条 32 线的经线。他们是如何被处决的?它们可以同时运行吗?

解决方法

OpenACC 本身并没有规定到目标设备的组和向量映射,这是由编译器实现完成的。虽然您没有指定,但我的回答假设您使用的是 NVIDA HPC 编译器(又名 PGI)作为对 GNU 的反对。

当以 NVIDIA GPU 为目标时,“gang”映射到 CUDA 块,“vector”映射到线程块的 x 维度。由于您没有指定向量长度,编译器很可能使用 8 个组(块),每个组有 128 个向量(线程)。您可以通过在编译期间添加标志“-Minfo=accel”来查看编译器反馈消息并设置环境变量“NV_ACC_TIME=1”以在运行后获取简单配置文件来验证这一点。

如果要强制编译器每个块使用 1024 个线程,请将子句“vector_length(1024)”添加到并行循环指令中。在这种情况下,使用 1x1024 或 8x128 计划之间的性能无关紧要,但请尝试一下。

我会有 32 条 32 线的经线。他们是如何被处决的?都可以 它们同时运行?

是的,总共有 32 个经线,每个经线有 32 个线程。一个warp是在SIMT模式下执行的,Single Instruction Multiple Threads,意思是所有的线程在不同的数据上同时执行同一条指令。

在 NVIDIA 设备上,您拥有流式多处理器 (SM),最多可以同时执行 2048 个线程或 64 个扭曲。由于您只使用 1024 个线程,是的,这些将同时运行。

请注意,SM 数量因设备而异,但例如,V100 有 80 个 SM,因此仅使用 1 个 SM 的一半会严重影响设备的利用率。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。