CUDA共享内存不比全球快?

时间:2012-04-20 16:51:14

标签: arrays cuda find compare shared

嗨我有内核功能,我需要比较字节。我想要搜索的区域被分成块,因此4k字节的数组被分成4k / 256 = 16个块。块中的每个线程都在idx上读取数组,并将其与另一个数组进行比较,这就是我想要搜索的内容。我通过两种方式做到了这一点:

1.比较全局内存中的数据,但块中的线程通常需要读取相同的地址。

2.将数据从全局内存复制到共享内存,并以与上述相同的方式比较共享内存中的字节。读同一地址仍有问题。 复制到共享内存如下所示:

myArray[idx] = global[someIndex-idx];
whatToSearch[idx] = global[someIndex+idx];

其余代码是一样的。仅在共享阵列中执行对示例2中的数据的操作。

但是第一个选项比共享内存快10%左右,为什么?谢谢你的解释。

2 个答案:

答案 0 :(得分:9)

如果您只使用一次数据并且块中的不同线程之间没有数据重用,那么使用共享内存实际上会更慢。原因是当您将数据从全局内存复制到共享时,它仍然被视为全局事务。从共享内存中读取时读取速度更快,但无关紧要,因为您必须从全局读取内存一次,而从共享内存读取的第二步只是一个额外的步骤,不能提供任何有价值的内容

因此,关键点在于,只有在需要多次访问相同数据时(无论是来自同一个线程,还是来自同一块中的不同线程),使用共享内存才有用。

答案 1 :(得分:1)

您正在使用共享内存来节省对全局内存的访问,但每个线程仍在对全局内存进行两次访问,因此它不会更快。速度下降可能是因为访问块内全局内存中相同位置的线程尝试将其读入共享内存中的相同位置,这需要序列化。

我不确定你发布的代码到底在做什么,但是你应该确保读取和写入global的次数,聚合在块中的所有线程中,使用共享内存时显着降低。否则你不会看到性能提升。

相关问题