3

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

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

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

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

其余代码相同。只有示例 2 中的数据操作在共享数组中执行。

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

4

2 回答 2

12

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

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

于 2012-04-20T18:18:40.330 回答
1

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

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

于 2012-04-20T18:32:42.223 回答