我想研究我的并行 GPU 代码(用 OpenACC 编写)的强大扩展性。使用 GPU 进行强大扩展的概念——至少据我所知——比使用 CPU 更模糊。我发现的关于 GPU 强大扩展的唯一资源建议修复问题大小并增加 GPU 的数量。然而,我相信在GPU中存在一定程度的强大扩展,例如通过流式多处理器(在 Nvidia Kepler 架构中)进行扩展。
OpenACC 和 CUDA 的目的是明确地将硬件抽象给并行程序员,将她限制在他们的三级编程模型中,包括 gangs(线程块)、workers(warp)和vectors(SIMT 线程组)。据我了解,CUDA 模型旨在为其线程块提供可扩展性,这些线程块是独立的并映射到 SMX。因此,我看到了两种研究使用 GPU 进行强大扩展的方法:
- 修复问题大小,并将线程块大小和每个块的线程数设置为任意常数。缩放线程块的数量(网格大小)。
- 给定关于底层硬件的额外知识(例如 CUDA 计算能力、最大扭曲/多处理器、最大线程块/多处理器等),设置线程块大小和每个块的线程数,以便一个块占用整个和单个 SMX。因此,在线程块上进行缩放等同于在 SMX 上进行缩放。
我的问题是:我关于 GPU 上的强缩放的思路是否正确/相关?如果是这样,有没有办法在 OpenACC 中执行上述 #2?