在GPU上优化和自动调优信念传播
1. 优化概述
CUDA允许将GPU用作CPU的协处理器进行通用编程,可同时在多个线程上处理内核函数。每个线程在1D、2D或3D线程块结构中有唯一ID,每个线程块是1D或2D网格结构的一部分。块内的每个线程在同一个多处理器上执行,以32个线程的块(warp)形式处理。每个多处理器的活动warp数量受GPU特定的最大值限制,这限制了程序执行的并行性。活动warp数量常受每个多处理器上可用的寄存器或共享内存数量限制,内核执行期间实际活动warp数与最大活动warp数的比率代表多处理器占用率。
为说明潜在优化,以下是与信念传播实现中最常用的内核部分类似的算法:
1. 将浮点变量 currMin
设为无穷大。
2. 对于i从1到N执行以下操作:
- 计算mi,即从全局内存中四个独立数组(数据成本数组和三个邻居的消息数组)的特定索引访问的值之和,并将值存储到特定存储形式(本地、共享或寄存器内存)。
- 检查mi是否小于 currMin
的值;若是,将 currMin
设为mi。
mi值在后续操作中会被访问、操作和相互比较,因此将它们存储在数组等结构中便于通过索引值访问。
初始实现将mi值存储在线程本地的数组中,导致使用GPU上的本地内存。但本地内存的数据访问比寄存器或共享内存慢。后续生成了优化实现,将本地内存访问转换为寄存器或共享内存访问。代码示例如下:
float m[N];
float currMin = INFINITY;
for