嗨,我有内核函数,我需要比较字节。我要搜索的区域被分成块,所以 4k 字节的数组被分成 4k/256 = 16 个块。块中的每个线程读取 idx 上的数组并将其与另一个数组进行比较,我要搜索的内容在哪里。我通过两种方式做到了这一点:
1.比较全局内存中的数据,但是块中的线程往往需要读取相同的地址。
2.将全局内存中的数据复制到共享内存中,并按照上述相同的方式比较共享内存中的字节。读取相同地址的问题仍然存在。
复制到共享内存看起来像这样:
myArray[idx] = global[someIndex-idx];
whatToSearch[idx] = global[someIndex+idx];
其余代码相同。在共享数组中仅执行示例 2 中的数据操作。
但是第一个选项比共享内存快 10%,为什么?谢谢你的解释。
最佳答案
如果你只使用一次数据并且一个块中不同线程之间没有数据重用,那么使用共享内存实际上会更慢。原因是当你将数据从全局内存复制到共享时,它仍然算作一个全局事务。从共享内存读取时读取速度更快,但这并不重要,因为您已经必须从全局读取内存一次,而从共享内存读取的第二步只是一个额外的步骤,没有提供任何值(value).
因此,关键点是使用共享内存仅在您需要多次访问相同数据(无论是来自同一线程,还是来自同一块中的不同线程)时才有用。
关于arrays - CUDA 共享内存不比全局快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10250325/