数据本地化是指将数据从片外内存(local memory、global memory、constant memory和texture memory)转移到片内(register、shared memory),并实现数据共享,以此来减少片外内存访存的依赖。因此,可以通过数据本地化,减少对global memory的访存依赖,从而提高算法性能。
在NVIDIA GPU中提供了shared memory机制、register机制与cache机制。cache机制可以通过ldg()功能实现对整个kernel的生命周期只读的数据缓存在只读的cache中,从而提高访存效率。但是,只读数据的缓存功能仅仅支持计算能力在3.5及以上的设备(NVIDIA TK1 GPU计算能力是3.2)。shared memory可以被同一block的线程读写,同时具有高速访存的特点,可以较好地提高算法性能。但不易掌控,因为需要注意避免出现bank conflict、block间的同步问题等问题。register是线程私有的,同时它是GPU的存储空间中最快的,读取它几乎不耗费时间。但是,register数量有限,合理地使用和分配register是至关重要的,能够极大地提高算法性能。以Kepler GPU为例,每个SM有64K个32位寄存器,如果每个block有1024个线程,那么每个线程最多使用64个寄存器。但是如果将block大小改为512,则最多可以使用128个寄存器。
根据算法的不同特点选择合适的数据本地化方式,同时充分利用底层硬件资源,以达到提高算法性能的目的。以register为例,每个线程的register数量有限,当register耗尽时,数据将会被溢出到localmemory。如果每个线程中使用过多的register或者声明大型结构体或数组,或编译器无法确定数组大小,数据都会被分配到local memory,我们应该极力避免这些。本文测试了shared memory机制数据本地化,性能相对于初始版本反而下降,因此后面一起使用采用register机制数据本地化与向量化。(www.daowen.com)
以blur滤波算法为例,由于计算相邻点滤波后的值有6个数据重用,采用reg-ister机制数据本地化将数据加载到片上内存后,可以减少片外访存依赖的同时,也可以对数据进行多次操作。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。