共享内存的访问延迟在计算能力2.x的卡上大约是多少?
楼主您好,NV没有公布这个数字,我也没有测试过。
未知来源的数据表示延迟在18-20个周期。
以及,需要告知您的是:这个延迟一点也不重要,它可以轻松被本warp里的后续指令/其他warp里的指令给掩盖。请不要过分注重太多的小地方,而放任大的方面不去思考。
我曾经写过一个程序,本来没有采用共享内存,直接从显存里读数据,后来用上了共享内存,并且我确定没有bank conflict,结果还不如不用的快。
因为只改了数据的输入,算法什么的都没动,所以我怀疑在显存访问能够合并的情况下,共享内存的访问带宽是比不上显存的
楼主混淆了“延迟”和“带宽(或者说吞吐率)”的概念。
(1)您询问的1楼问题和您的3#的结论是无关的。
(2)您三楼的结论本身就是错误的(共享内存的访问带宽是比不上显存的)
请仔细阅读手册,不要误导您自己,也不要误导论坛的其他人。谢谢!
我的一开始并不确定共享内存的延迟到底大不大,如果按照版主的说法延迟不大的话,那么只有一种可能了,就是共享内存的访问带宽是比不上显存的。
ps:我对没有给出1楼问题和3#的结论之间的逻辑关系深感抱歉
“我的一开始并不确定共享内存的延迟到底大不大,如果按照版主的说法延迟不大的话,那么只有一种可能了,就是共享内存的访问带宽是比不上显存的。”
—您这里还假设了您的写作水平可以让硬件100%发挥出效力,否则您无法得出这个结论。
–实际上,您的结论不正确。请多多看手册。您最近的一些问题已经严重影响论坛的声誉了。
就算硬件没有100%发挥出效力,但是因为只改了数据的输入,算法什么的都没动啊
我来大致总结一下:
1:您顶楼的问题 :shared memory的访问延迟在2.X的卡上是多少。
这个问题2#已经有解答,根据某第三方测试的结果是18-20周期,供您参考。
实际上,这个延迟也不比寄存器慢太多,因而该延迟是很容易被掩盖的,所以一般都不讨论这个延迟,而主要考虑一些高延迟的操作,如global 访问。
2:您在3#提出您的某程序在使用了shared memory的时候,会比不使用更慢,因此您断定是shared memory的带宽不如global memory高。
以及您在5#里面补充说明了您的逻辑关系,您认为您的代码速度变慢只有两个潜在原因,一个是shared memory的延迟,一个是shared memory的带宽,既然前者不成为问题,那一定是后者比global慢。
横扫斑竹在4#给出了答复,表示您顶楼和3#的结论是无关的,以及实际上shared memory更快,带宽更大。
首先指出一个事实是,shared memory的延迟要比global memory的延迟短得多,同时带宽大得多。这个是硬件结构决定的,请勿怀疑这一点。
其次,您观察到您的代码的情况和您的代码写法有关。因此您应该怀疑您的代码书写的不合适,比如在无需使用shared memory的地方使用了shared memory,或者其他原因造成了限制,而不是怀疑作为片上高速缓存的shared memory比global memory慢。
第三,您还需要理解延迟和带宽的是两个不同的参量。在CUDA程序运行中,某指令的延迟越短,越容易被掩盖,在一个延迟完全被掩盖的情况下,实际速度只和带宽/吞吐量有关,而和延迟无关。
3:横扫斑竹在6#指出,您需要让硬件100%发挥出效力才能得出您的结论,实际上是指出您的代码的写法可能有问题,因为您推断出了不符合客观情况的结论。
而您在7#的回答并无对此做出解答,亦无分析您的代码实际情况。因而是不具说服力的。
综上,您的问题只有分析您的代码的实际情况才能得出问题所在,哪里有效率下降的地方,而不是怀疑您的机器,您GPU里面的shared memory是不会凭空变慢的。
大致如此。
对“第三,您还需要理解延迟和带宽的是两个不同的参量。在CUDA程序运行中,某指令的延迟越短,越容易被掩盖,在一个延迟完全被掩盖的情况下,实际速度只和带宽/吞吐量有关,而和延迟无关。”完全赞同
感谢您的支持和认同~