CUDA共享内存不比全球快?

Hla*_*son 2 arrays shared cuda compare find

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

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

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

myArray[idx] = global[someIndex-idx];
whatToSearch[idx] = global[someIndex+idx];
Run Code Online (Sandbox Code Playgroud)

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

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

Bre*_*ood 9

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

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