线程与全局内存的交互
Threads interaction with global memory
我正在尝试了解使用 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];
网格内的每个线程将从两个不同的位置进行两次读取(右侧),一次写入另一个位置。全部在全局内存中。您可以让所有线程 read/write 来自全局内存中的同一位置。但是,为了防止竞争条件,您需要使用 atomic functions
。
Read/write from/to 全局内存可能很慢(它是 DRAM),尤其是如果线程不从联合内存中读取(即:如果线程 0、1、2、3 从 0x0 读取, 0x4,0x8,0xc 然后合并)。要了解有关 CUDA 内存模型的更多信息,您可以阅读 CUDA 编程指南中的第 2.4 节。
希望对您有所帮助!
我正在尝试了解使用 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];
网格内的每个线程将从两个不同的位置进行两次读取(右侧),一次写入另一个位置。全部在全局内存中。您可以让所有线程 read/write 来自全局内存中的同一位置。但是,为了防止竞争条件,您需要使用 atomic functions
。
Read/write from/to 全局内存可能很慢(它是 DRAM),尤其是如果线程不从联合内存中读取(即:如果线程 0、1、2、3 从 0x0 读取, 0x4,0x8,0xc 然后合并)。要了解有关 CUDA 内存模型的更多信息,您可以阅读 CUDA 编程指南中的第 2.4 节。
希望对您有所帮助!