对于差分的迭代算法(一个点的计算需要用到周围点的值),为什么我使用纹理操作后计算速度比直接从global memory读取数据慢了2倍多?
这个正常的,texture cache / readonly cache本身有巨大的延迟的。
以及,特别的在2.x上,它的性能不如L1的。
如果在3.x上,您用texture效果不好,可能贵算法不适合用texutre.
以及,在2.x, 您用texture效果不好,可能很正常,2.x的L1比texture cache给力的,除了需要特定的空间关系的一些算法,可能很多算法都用了反而会降速的。
这点是正常的。
摘录一段手册的说法,特别针对2.x的:不建议使用texture, 除非你的算法需要空间临近性访问,以及你的实际结果真的加快了。否则不建议。
我個人用GTX650、K20的卡做2維差分法解PDE問題使用texture object的速度是比用global還要快,速度的差異依照數據的尺寸差1.4~2倍,關於記憶體的使用效果可以參考版主的說明
我想另外補充做有限差分的問題很大一部份是在於記憶體存取的優化上,依照我個人的經驗改善記憶體存取的效果會比執著於texture或global記憶體還顯著,請參考GTC2013年的資料"Breaking the Memory Barrier for Finite Difference Algorithms",希望這篇文章能對你有幫助
再補充一篇文章nvidia給的文章3D finite difference calculations using CUDA (structured grids)
[
十分感谢您深夜详细回帖分享经验!
一方面,可以从算法和算法实现上进行优化,针对瓶颈做一些处理,比如差分方法对相邻点的值进行复用以减少访存压力等。
另一方面,可以根据具体硬件的特点,加以优化,比如访存走不同的读取路径,比如调整算法以减少低吞吐量指令的使用等。
无论哪种都需要细致的分析和尝试,而不能认为随意依靠某个特性就完全解决问题。
个人观点如上,与您的回帖相一致。
欢迎您常来论坛,祝您好运!
多谢大家的指导!我的显卡计算能力为3.0,可能我的算法不适合用texture,我会依次根据算法去尝试版主建议的每一种可能的途径。我的算法多半时间主要就是耗费在数据的读取上了,那么依据iHakka 所说的“改善記憶體存取的效果會比執著於texture或global記憶體還顯著”,如果用共享存储器的话,我应该怎样分配?或有什么更好的方法能对相邻点的值进行复用,而不用每次都从Global Memory中读取?
我提供的nvidia那篇材料被引用超過200次以上,而且內容並不難懂就是教你如何善用shared memory 去prefetch data這個概念不論是作矩陣乘法、nbody模擬等都會用到,建議你先觀摩別人的做法後有疑問再來請教
额。看了您推荐的材料,理解力比较差,二维的shared memory的使用方法都有点不太明白,三维的更是有点困难,还望能够多多指导!多谢!