3.8 优化GPU内核
现在GPU大部分时刻都是忙碌的,那么是否可以减少GPU计算时间?如图3-9所示,使用函数摘要只显示CUDA函数信息。可以看出,主要耗时的内核是“moveParticles”,第二耗时内核是“cptCurrent”。两个内核的共同部分是都需要遍历粒子列表,先积累对粒子的总电流影响(cptCurrent),然后更新粒子的位置(moveParticles)。可见,原来使用的链表数据结构,即一个C结构存放粒子信息(存放的位置、速度和电荷),这种数据结构适合CPU实现,但并不适合邻近线程需要合并内存访问的GPU。把粒子数据结构变成256个浮点数组的结构链表后,如图3-10所示,性能改善很显著。这也归功于把MPI通信从同步改成异步。