我正在尝试理解使用 GPU 进行编码。我在理解 GPU 线程与全局内存的交互时遇到了一些麻烦。
我知道当我们在设备上分配或复制某些东西时,它是通过引用完成的。但是当我们试图在一个线程中访问全局内存时,究竟会发生什么?是否所有线程都尝试同时访问内存导致串行执行,还是它们都制作自己的副本或其他什么?
任何帮助都感激不尽。
我正在尝试理解使用 GPU 进行编码。我在理解 GPU 线程与全局内存的交互时遇到了一些麻烦。
我知道当我们在设备上分配或复制某些东西时,它是通过引用完成的。但是当我们试图在一个线程中访问全局内存时,究竟会发生什么?是否所有线程都尝试同时访问内存导致串行执行,还是它们都制作自己的副本或其他什么?
任何帮助都感激不尽。
是否所有线程都尝试同时访问内存导致串行执行,还是它们都制作自己的副本或其他什么?
如果您想并行进行计算,则否。例如,要并行添加一个数组,您可以:
int idx = blockIdx.x * blockDim.x + threadIdx.x;
outArr[idx] = a[idx] + b[idx];
网格内的每个线程将从两个不同的位置进行两次读取(在右侧),一次写入另一个位置。全部在全局内存中。您可以让所有线程从全局内存中的同一位置读/写。但是,为了防止竞争条件,您需要使用atomic functions
.
从/向全局内存读取/写入可能很慢(它是 DRAM),特别是如果线程不从合并内存中读取(即:如果线程 0、1、2、3 从 0x0、0x4、0x8、0xc 读取,则它是合并的) . 要了解有关 CUDA 内存模型的更多信息,您可以阅读 CUDA 编程指南中的第 2.4 节。
希望有帮助!