使用纹理缓存与具有低缓存命中率的合并全局内存?

时间:2017-08-13 20:19:19

标签: caching optimization cuda gpgpu

在优化和分析内核的过程中,我注意到它的L2和全局缓存命中频率非常低(平均约为1.2%)。我的内核通常每次经过每次传递读取4个完整的高速缓存行,每个SM有3个块(所以4 * 32 * 2 =每个SM的每个SM有256行高速缓存,具有可变的传递数)。读取来自全局内存的不同区域,显然很难缓存。 (区域的图案是A,32 * B,A .....)

然后明确指出,对于那些如此分散的数据而言,#34;在继续之前只读取一次,L1 / L2缓存几乎没用。为了弥补我的内核读取中的这种广泛性,我考虑使用纹理存储器,它是预先缓存的#34;在L1。

可以考虑"好"练习这样做?

问题1:如果访问该纹理 合并(假设行主要)它是否仍然比非合并纹理读取具有性能提升?

问题2:由于我的数据是以一种方式读取的,因此每个warp读取1行,2D纹理真的有用吗?或者1D分层纹理更适合这项工作吗?

很抱歉,如果旁边的问题已在其他地方得到解答,那么我会想到我会写作并且快速研究(可能使用错误的词汇)并没有得出答案。对不起,如果我的问题很愚蠢,我关于CUDA的文献仅限于nVidia文件。

1 个答案:

答案 0 :(得分:1)

最后,基于纹理的实现没有带来太多。根据我的理解,虽然上升时的缓存率(~50%)肯定是缓存层次结构或纹理单元的开销。

保留(不是特定于应用程序)

纹理内存带来轻微的开销,只有在给定的过滤是一个好处并且整个纹理可以适合缓存的情况下才值得,它允许2D完美缓存的内存,可以抵抗非合并访问。