Page 33 - 《软件学报》2021年第8期
P. 33

黎雷生  等:复杂异构计算系统 HPL 的优化                                                         2315


                                Table 3    Pseudocode of accelerated panel DGEMM and broadcast pipeline
                                          表 3   Panel DGEMM 加速和广播流水伪代码
                              Panel 分解基础伪代码                   Panel 分解 DGEMM 加速和广播流水伪代码
                              HPL_pdrpanllN()                 DHPL_pdrpanllN()
                              {                               {
                             if (subpanel 列数小于等于 NBMIN)      if (subpanel 列数小于等于 NBMIN)
                             {执行非递归计算;返回;}                   {执行非递归计算;返回;}
                             do                              do
                             {                               {
                               CPU 执行 DTRSM 计算;                if (subpanel 列数大于 GPU 加速列数)
                               CPU 执行 DGEMM 计算;                {
                               递归调用 HPL_pdrpanllN();            CPU 传输数据到 GPU;
                              }while (subpanel 计算没有完成);         GPU 异步执行 DTRSM 和 DGEMM 计算;
                              }                                 if (待广播的列数大于广播流水阈值)
                                                                {
                                                                  CPU 广播已分解的前一个 subpanel;
                                                                }
                                                                CPU 同步 GPU;
                                                                GPU 传输数据到 CPU;
                                                              } else {
                                                                  CPU 执行 DTRSM 计算;
                                                                  CPU 执行 DGEMM 计算;
                                                              }
                                                                 递归调用 DHPL_pdrpanllN();
                                                                 if(全部 panel 计算完成){
                                                                  CPU 广播最后的 subpanel 和变化的数据;
                                                                 }
                                                              } while (subpanel 计算没有完成);
                                                              }

                 5.2   行交换long算法优化
                    矩阵更新行交换有两种算法可选,bianary-exchange 算法和 long 算法,经过分析和评测选择 long 算法                   [10] .第
                 4.2 节从行交换与 GPU 并行计算的角度针对行交换流程做了优化,本节优化具体的行交换算法.
                    Long 算法包括两个步骤,spread 和 roll.基础代码中,首先是 spread 过程,当前行进程将需要换出的行分发给
                 其他所有进程.然后,非当前行进程把接收的数据与本地需要换出的数据交换.接着是 roll 过程,总共需要进行
                 P–1 次传输.每次传输所有的进程都要参与,每个进程只与自己的邻居交换.第 1 步,先把自己所拥有的一部分与
                 左(右)邻居交换,然后,把自己刚刚得到的数据与右(左)邻居交换.这样左右交替,直到所有的数据都交换完毕,每
                 个进程都拥有了全部的 U.最后所有进程还需要把所有的数据进行重排,放置到矩阵 A 相应的位置.
                    基础代码中,spread 和 roll 使用同一块数据缓冲区,为了避免数据冲突,spread 和 roll 是严格串行的.通过观
                 察发现,spread 的接收数据与 roll 的发送数据并没有依赖关系,spread 和 roll 算法上是可并行性.基于以上观察与
                 分析,将 spread 的接收缓冲与 roll 的发送缓冲分离.这样,非当前进程行在等待接收 spread 数据时,就可以执行 roll
                 数据封装,并把数据传输到发送缓冲区,这部分时间就可以被隐藏.
                    在使用上述的缓冲区分离算法之后,spread 和 roll 已经没有依赖关系,因此提出了一种新的行交换方法,即
                 交换 spread 和 roll 的执行顺序,如图 5(b)所示.对当前行进程来说,在 roll 操作之前,只需将本地需要交换的数据
                 拷贝到发送缓冲区即可,也就是减少了行交换的启动时间.在 roll 执行网络传输的同时,当前行进程可以将
                 spread 所需的数据封装,并异步传输到发送缓冲区.roll 执行完成后,开启执行 spread.同时,把 roll 过程接收的数
                 据异步传输到 GPU,并执行数据交换.在 spread 过程结束后,非当前行进程再将换入的数据传输到 GPU,并交换
                 到相应位置,当前行进程对需要进行内部交换的数据执行 GPU 上的本地交换.这种算法可以实现网络通信传
                 输、GPU 数据封装和数据交换计算以及 CPU 与 GPU 数据传输相互重叠,减少行交换执行时间.
   28   29   30   31   32   33   34   35   36   37   38