我正在尝试使用我的 Quadro FX 5800 进行可扩展性分析,它有 240 个核心,其运行时间尺度与核心数量是并行计算的经典研究。 我想知道核心的定义如何适合它? 我如何使用它在不同的核心设置(8,16,32,64,128,240 个核心)上运行? 我的测试用例是简单的矩阵乘法。
GPU 的可扩展性不应以 CUDA 核心数来衡量,而应以 SM 利用率来衡量。 IPC 可能是衡量 SM 利用率的最佳单一指标。在开发算法时,您希望对工作进行分区,以便可以将足够的工作分配给所有 SM,以便在每个周期,warp 调度程序至少有一个有资格发出和指令的 warp。一般来说,这意味着每个 SM 上必须有足够的扭曲来隐藏指令和内存延迟,并提供各种指令类型来填充执行管道。
如果您想测试跨 CUDA 核心的扩展(无意义),那么您可以启动每个块包含 1、2、3、...32 个线程的线程块。每个线程块启动非多个 WARP_SIZE (=32) 个线程将导致仅使用核心的子集。这些基本上都是浪费的执行槽。
如果您想测试 SM 方面的扩展,您可以将算法从 1 个线程块扩展到 1000 个线程块。为了理解扩展,您可以在启动时通过配置每个线程块的共享内存来人为地限制每个 SM 的线程块。
重写矩阵乘法以在每个方向上实现最佳缩放可能会令人沮丧。在您进行该项目之前,我建议您了解如何分布简单的并行计算,例如从 0-100000 求和或跨多个线程块计算阶乘比例。这些算法只有几行代码,可以通过改变启动配置(GridDim、BlockDim、SharedMemoryPerBlock)和内核 1-2 参数来尝试上述缩放您可以使用 CUDA 分析器、Visual Profiler、Parallel Nsight 来计时不同的启动,或 CUevents。
假设您使用 CUDA 或 OpenCL 作为编程模型:将利用率限制为
M
多处理器 (SM) 数量的一种简单方法是使用 M
块(线程)的执行配置来启动内核。如果每个 SM 由 N 个核心组成,这样您就可以测试跨 N、2N、4N、... 核心的可扩展性。
例如,如果GPU有4个SM,每个SM有32个核心。通过运行 1、2 和 4 块的内核,您的内核将利用 GPU 的 32、64 和 128 个核心。