我正在尝试了解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节。
希望有帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句