A+B=C,你会吗?

一个很简单的问题:两个矩阵A和B相加,请看下面两种方式。
1,直接从显存取数C = A + B;
2,分别将A和B加载进共享存储器,A_s = A; B_s = B; 然后求和C = A_s + B_s;
你会选择那种方式?
这个问题非常基础,希望大家勇于发言,共同进步!:slight_smile:

如果你给我测试时间,我就选择第一种。:slight_smile:

那你认为哪个速度会更快?

我没有测试,纯靠猜想的说:
理论上应该用shared memory快,但是对于这种简单问题,从global memory里直接读会更快。如果kernel不是只做a+b这么简单的事情,还是应该存入shared memory。

第一种方式直接从显存读的话应该也是先读进片内寄存器中,然后执行单元运算,再写回显存
第二种方式写入shared memory后,从shared memory读取数据最快是1-2个周期,而从寄存器读是一个周期,而且从shared memory读有可能发生bank conflict。
所以我选择第一种,不知道以上分析正确否,还请高手指点

要是需要多次在显存中调用一组数,我会用Sharemem,如果一次完成计算,在用Shared我感觉有点做作,浪费写代码的时间。。

:)我也是这么认为的

我感觉第二种方式的数据流应该是:
加载数据:存储器->寄存器->shared mem
处理数据:shared mem->寄存器
保存数据:shared mem->寄存器->存储器 或者 寄存器->存储器
中间都要经过寄存器,shared mem不能直接与存储器通信

:D,如果对这样重复简单的计算,性能就达不到很大的提升了?

当然用第一种了,加一次去一次数据,没必要用共享存储器啊

shared memory和寄存器同是片内的存储器,它和global memory应该是可以相互通信的,并不需要现将数据从global memory读进寄存器,再从寄存器到shared memory

shared memory和寄存器同是片内的存储器,它和global memory应该是可以相互通信的,并不需要现将数据从global memory读进寄存器,再从寄存器到shared memory

怎么理解提升呢?从cpu串行到cuda并行,肯定有了很大的提升,但是在这个问题上,用shared memory性能能否提升我就补确定了。当然如果说性能提升,改用pinned memory肯定还有提升空间。

你这是胡扯!自己不清除不要乱讲,误人子弟!shared memory必须经过寄存器中转,不能直接global → shared! 你还连续发了2次,如此误导众人,不怕损德么!

使用第一种方法,比第二种方法简单高效。楼上们都有道理。所以,并不是一味使用shared memory就肯定是好的。呵呵

同意
啊,大

第一种,就用用一次,放shared干甚呢?

大家在这儿是讨论问题,你不认同我的看法可以发表自己的观点。
没必要进行人身攻击,谢谢!

第一种方法的A,B会不会是存在寄存器里面呢?

我支持第一种,因为就只需要读一次,没必要麻烦