嗨,我有内核函数,我需要比较字节。我要搜索的区域被分成块,所以4k字节的数组被分成4k/256 = 16个块。块中的每个线程读取idx上的数组,并将其与另一个数组进行比较,其中是我要搜索的数组。我通过两种方式做到了这一点:
1.比较全局内存中的数据,但块中的线程通常需要读取相同的地址。
2.将数据从全局内存复制到共享内存,并以上面提到的相同方式比较共享内存中的字节。读取相同地址仍有问题。复制到共享内存如下所示:
myArray[idx] = global[someIndex-idx];
whatToSearch[idx] = global[someIndex+idx];其余的代码是相同的。在共享数组中,仅对示例2中的数据执行操作。
但第一种选择比共享内存快10%左右,为什么?谢谢你的解释。
发布于 2012-04-21 02:18:40
如果您只使用一次数据,并且在一个块中的不同线程之间没有数据重用,那么使用共享内存实际上会更慢。原因是,当您将数据从全局内存复制到共享时,它仍然被视为全局事务。当您从共享内存读取时,读取速度会更快,但这并不重要,因为您已经必须从全局内存读取一次内存,而从共享内存读取的第二步只是一个额外的步骤,不会提供任何有价值的东西。
因此,关键的一点是,只有在需要多次访问同一数据时(无论是从同一线程还是从同一块中的不同线程),使用共享内存才是有用的。
发布于 2012-04-21 02:32:42
您正在使用共享内存来节省对全局内存的访问,但是每个线程仍然对全局内存进行两次访问,因此它不会更快。速度下降可能是因为访问块内全局内存中相同位置的线程试图将其读取到共享内存中的相同位置,并且这需要序列化。
我不确定您发布的代码到底在做什么,但您应该确保在使用共享内存时,在一个块中的所有线程上读取和写入global的次数明显减少。否则,您将看不到性能改进。
https://stackoverflow.com/questions/10250325
复制相似问题