这个怎么满足合并访存?

[attach]2976[/attach]
在CUDA平台下,按照上面图,a表示一个浮点型数组,warp每个方格表示一个线程,每种颜色代表一个线程所取的a数组两个值,这个数组下标要怎么实现才能满足合并访存啊?
[table=98%]
[tr][td]尤其是数据量和线程数增加后,超过一个warp大小的时候[/td][/tr]
[/table],感觉无论怎么做都无法满足合并访存啊?还请大牛指点一下?不胜感激啊

把A放到shared memory里面,利用shared memory远远大于global memory的内存吞吐能力来减少对global memory访存耗时!

总版主大人所言甚是。千秋万代一统江湖!V586!

一个帖子多少分啊

一个帖子多少分啊

一个帖子多少分啊


本版禁水,请自觉删除灌水回复或改为有意义的讨论内容,否则灌水回复将被删除。

如果A很大的情况,shared memory毕竟有限,在1.x计算能力的设备上,每个SM的共享存储器大小才16KByte

如果A很大的情况,shared memory毕竟有限,在1.x计算能力的设备上,每个SM的共享存储器大小才16KByte

您的意思是先把所有数据放到shared memory上吗?但是存在两个问题:一是shared memory容量较小,如果数值a较大时,在1.x计算能力的设备上,每个SM的共享存储器大小才16KByte,应该装不下整个数据吧。二是如果把数据放到shared memory上,shared memory是在块内,当次数增加时,很有可能会用到其他块的数据,不同线程块不是不能共享数据么?

您的意思是先把所有数据放到shared memory上吗?但是存在两个问题:一是shared memory容量较小,如果数值a较大时,在1.x计算能力的设备上,每个SM的共享存储器大小才16KByte,应该装不下数组a吧。二是如果把数据放到shared memory上,shared memory是在块内,当次数增加时,很有可能会用到其他块的数据,不同线程块不是不能共享数据么?

请注意,是总版主大人的意思。而不是我的。

我只是由衷的表示赞美,而没有其他意思。

哦,还是感谢您的回帖,呵呵

shared memory数量是有限的,但是你的block里面的thread数量不也是有限制的吗?我建议楼主先看看sm资源分配的一些教程,或许就能找到如何利用shared memory的方法了!

当然还有一种办法,可以不用shared memory,用空间来换取访存的速度,比如你可以对A建立多个数组,每个数组的排列方法都是满足合并访问并且使得每个线程都能得到正确的数值!仅针对你给出的图我是这么考虑的!

好的,谢谢总版大大,呵呵