arrays - CUDA 共享内存不比全局快?

标签 arrays cuda find compare shared

嗨,我有内核函数,我需要比较字节。我要搜索的区域被分成块,所以 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/

相关文章:

java - Object[] 是如何克隆的

cuda - 在我的程序中分配统一内存。运行后,它抛出 CUDA 错误 :out of memory, 但仍有可用内存

python - 检查字符串中的(仅整个)单词

c - 在 .csv 文件中搜索 C 中的名称匹配项

c# - 无法从 double[][] 转换为 double[*,*]

iphone - NSMutableArray removeAllObjects 导致崩溃

c++ - ArrayFire CUDA 应用程序在第一分钟极其缓慢

CUDA:如何使用 -arch 和 -code 以及 SM 与 COMPUTE

mysql - 如何通过 MySQL 修剪 Woocommerce 简短描述(查找文本并修剪之后的所有内容)?

C(不是++)struct动态初始化中struct数组的struct麻烦malloc