cuda – 线程与全局内存的交互

我正在尝试用GPU理解编码.我在理解GPU线程与全局内存的交互时遇到了一些麻烦.

我知道当我们在设备上分配或复制某些内容时,它是通过引用完成的.但是当我们尝试在线程中访问全局内存时,究竟会发生什么?
是否所有线程都试图同时访问内存导致串行执行,还是他们都自己制作副本或其他东西?

任何帮助都感激不尽.

最佳答案

Do all threads try to access memory at the same time leading to serial execution or do they all make their own copies or something else?

如果您想并行进行计算,请选择“否”.例如,要并行添加数组,您可以:

int idx = blockIdx.x * blockDim.x + threadIdx.x;
outArr[idx] = a[idx] + b[idx];

网格内的每个线程将从两个不同的位置进行两次读取(右侧),另一次写入另一个位置.全都在全球记忆中.您可以让所有线程从全局内存中的相同位置读/写.但是,为了防止竞争条件,您需要使用原子功能.

从/向全局存储器读/写可能很慢(它是DRAM),特别是如果线程不从coalesed内存读取(即:如果线程0,1,2,3从0x0,0x4,0x8,0xc读取然后它的coalesed) .要了解有关CUDA内存模型的更多信息,请参阅“CUDA编程指南”中的第2.4节.

希望有所帮助!

点赞