GPU程序优化的本质是实现从算法特性到底层硬件架构特征的有效映射。全局内存容量大,但访存带宽相对较低,具有较长的访存延迟,是限制GPU程序性能的主要因素之一。充分考虑GPU访存特点,提高片外访存带宽利用率,降低访存延迟,是提高GPU程序性能的关键。这就需要我们在GPU程序优化过程中,不仅要考虑算法特性,而且还要考虑底层硬件架构的特征,最终还需要完成这两种特征的高效映射。
1.CPU与GPU之间的传输优化
对于GPU编程来说,我们首先要考虑的是CPU-GPU之间的传输,而在CU-DA中提供了一种叫作zero-copy的方式,通过线程与底层硬件的直接映射,即可以减少数据传输的消耗。
2.global memory非合并访问
合并访问是指连续的线程访问连续的数据。实际算法在访问数据的时候,往往会出现连续的线程访问不连续的数据地址,由于线程寻址而导致不必要的时间损耗。所以为了提高访问全局存储器的效率,我们常常通过共享内存(shared memo-ry)解决这类问题。
3.共享内存(shared memory)与存储体冲突(bank conflict)(www.daowen.com)
share memory是GPU片内缓存存储器。它是一块可以被同一block中的所有线程访问的可读存储器。共享内存自身不存在合并访问的问题,往往用于处理非合并访问的问题。Bank conflict是指一个warp内的多个线程同时访问同一个bank时,将导致线程访问shared memory的串行化。即当一个线程访问shared memory时,warp中的其他线程将会排队等候,直到bank请求被满足。因此,bank conflict应该尽量避免。
4.全局内存通道冲突(channels conflict)
channels conflict与bank conflict类似,是由于warp发起的访存请求所造成的全局内存通道冲突,即grip内开启的线程没有均衡地分配到全局内存的channel,导致分配的channel数量不多,致使其他的channel处于空闲状态。线程同时对少量的channel访问造成在单个channel中串行化的问题。
5.向量化
向量化主要指一条向量指令操作向量寄存器中的多个元素。向量化访存的主要作用有两个:充分利用访存带宽利用率;可以进行向量计算,开发ILP(指令级并行)。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。