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 数据传输相互重叠,减少行交换执行时间.