Cuda 线程与全局内存的交互

Cuda 线程与全局内存的交互,cuda,cudafy.net,Cuda,Cudafy.net,我试图理解GPU的编码。我在理解GPU线程与全局内存的交互方面有点困难 我知道当我们在设备上分配或复制某些东西时,它是通过引用完成的。但是,当我们试图访问线程中的全局内存时,到底会发生什么? 是所有线程都试图同时访问内存导致串行执行,还是它们都制作自己的副本或其他东西 任何帮助都将不胜感激 是所有线程都试图同时访问内存导致串行执行,还是它们都制作自己的副本或其他东西 不,如果你想并行计算。例如,要并行添加阵列,您需要执行以下操作: int idx = blockIdx.x * blockDim.

我试图理解GPU的编码。我在理解GPU线程与全局内存的交互方面有点困难

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

任何帮助都将不胜感激

是所有线程都试图同时访问内存导致串行执行,还是它们都制作自己的副本或其他东西

不,如果你想并行计算。例如,要并行添加阵列,您需要执行以下操作:

int idx = blockIdx.x * blockDim.x + threadIdx.x;
outArr[idx] = a[idx] + b[idx];
网格中的每个线程将从两个不同的位置执行两次读取(右侧),一次写入另一个位置。都在全局内存中。您可以让所有线程从全局内存中的同一位置读/写。但是,为了防止竞争条件,您需要使用
原子函数

全局内存的读/写速度可能很慢(它是DRAM),特别是当线程不从联合存储内存中读取时(即:如果线程0、1、2、3从0x0、0x4、0x8、0xc读取,则它是联合存储)。要了解更多有关CUDA内存模型的信息,请阅读《CUDA编程指南》中的第2.4节


希望有帮助

不是复制品,但您也可以阅读谢谢!这很有帮助。