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