【问题标题】:Threads interaction with global memory线程与全局内存的交互
【发布时间】:2016-04-23 16:10:15
【问题描述】:

我正在尝试了解使用 GPU 进行编码。我在理解 GPU 线程与全局内存的交互时遇到了一些麻烦。

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

任何帮助将不胜感激。

【问题讨论】:

  • 不是重复的,但您也可以阅读here

标签: cuda cudafy.net


【解决方案1】:

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

如果您想并行进行计算,则否。例如,要并行添加一个数组,您可以:

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 节。

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多