Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


数学:并行计算:単一gpuコードをマルチgpu環境で実行するための多次元データ分割手法の検討

単一GPUコードをマルチGPU環境で実行するための多次元データ分割手法の検討


AI总结

目的

本文提出并探讨了一种多维数据分割手法,目的是将原本为单一GPU编写的CUDA代码,自动扩展到多GPU环境下加速执行。主要解决问题是:如何高效分割大规模多维数据,使其能分配到多个GPU上处理,从而突破单GPU显存的容量限制,且尽可能降低数据传输量与开发负担。

手法

  1. 基于采样执行的访问范围分析 方法扩展自1维数据分割的既有做法,通过“采样运行”部分GPU线程来自动推定各线程实际访问的多维数据范围。相比原有的1维方法(只能用一段线性内存区域来描述分块),本方法能更精确地针对多维数组,在每一维上分别确定访问上/下界,从而有效减少不必要的冗余数据传输和存储

  2. 多维分割与索引转换

    • 采样阶段推定出每个维度上的访问区间,按照这些区间对多维数据进行小块分割(segment)
    • 分割前后的数据索引体系不同,需要在内核执行前后自动进行索引变换,保证每个分块内的线程能正确访问属于自己的数据子集。
    • 针对实际GPU代码,论文推导了将原始索引(1维线性地址)映射到分割后多维分块内坐标的公式。
  3. 与已有方法对比

    • 1维分割方法只对部分数据能有效分割(如无法切分B矩阵),容易造成GPU显存利用的浪费。
    • 本方法通过二维或多维分割,大幅缩小每块实际需要的数据量,使得即使数据总量极大,只要主机(CPU)内存能装下,就能通过多GPU流水线加速处理。

结果

  1. 实验设置

    • 测试平台:Intel Xeon E5-2680v2, 512GB内存, 2块NVIDIA Tesla K40(各12GB显存)
    • 测试应用:CUDA矩阵乘法代码,分别应用未分割、1维分割(既有方法)、2维分割(本文方法)
  2. 可处理最大规模

    • 原始代码(无分割):最大可处理约$N=31,584$的矩阵(共11GB内存)。
    • 1维分割方法:最大可处理$N=38,496$的矩阵(17GB)。
    • 本文方法(2维分割):可处理高达$N=207,680$(482GB),远超单GPU显存和既有方法。
  3. 显存/数据传输节约

    • 本文方法将单块需要的GPU内存最多削减80%,并同步减少CPU-GPU间数据传输量。
  4. 性能影响

    • 由于2维分割涉及较复杂的索引变换(需执行除法、模运算等),导致内核有效性能下降约27%-28%,但这一开销换来了能处理更大规模问题的能力。
    • 在分割数合适的情况下,多GPU执行速度接近理论理想的2倍提升。

其他内容与亮点

  • 前提假设:方法要求GPU内核中数组访问为线程/线程块ID的线性组合(可归约为一次函数)。
  • 与相关工作的关系:与Qilin、RSVM、OpenMPC、VAST等已有自动数据分割/大数据流水线系统对比,本文方法更适用于直接优化已写好的单GPU CUDA代码,且分割粒度更细。
  • 未来工作:计划自动化代码转换过程(当前实验还需手工修改索引部分)。
  • 结论本手法适用于超大规模数据、需要跨GPU处理而单GPU显存无法容纳的科学计算场景。即便在牺牲部分效率下,也能显著扩大可处理问题的规模
/var/www/DokuWikiStick/dokuwiki/data/pages/数学/并行计算/単一gpuコードをマルチgpu環境で実行するための多次元データ分割手法の検討.txt · Last modified: 2025/07/20 08:11 by zhonghui