为什么这是一个无冲突的存储库访问?

时间:2014-03-19 17:58:50

标签: memory cuda gpgpu

以下是从CUDA C编程指南中获取的图像:

enter image description here

指南说这是无冲突访问的示例,因为第3,第4,第6,第7和第9个线程访问了第5行中的相同字。

我不太明白为什么这个没有冲突,因为不仅线程3,4,6,7和9访问同一个银行内的相同工作(不应该是内存冲突的一个例子吗?)但是线程5也必须访问银行4。

你能告诉我这个案子吗?

1 个答案:

答案 0 :(得分:8)

请注意, bank word 或共享内存中的位置不同。银行集体指共享内存中满足特定地址模式条件的所有单词。

通常,如果从warp(或cc 1.x中的半warp)的所有访问都转到单独的bank,则可以避免共享内存库冲突。这些访问不需要是扭曲顺序,即只要来自每个线程的请求针对一个单独的存储体,它们就可以被加扰。

以上说明涵盖了图表中的每个箭头,但指向银行5的箭头除外。

如果我们没有其他信息,那么针对单个银行的多个箭头将表明潜在的银行冲突。

然而,有一个例外,当不仅访问目标是同一个银行,而且他们正在瞄准内存中的相同单词。当多个共享内存请求以内存中的相同字为目标时,共享内存系统有一个广播机制来获取该字中包含的数据,并在一个周期内将其提供给所有请求线程

从文档(http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#shared-memory-1-x):

  

共享内存具有广播机制,在处理一个内存读取请求时,可以同时读取32位字并将其广播到多个线程。当多个线程从同一个32位字内的地址读取时,这可以减少存储体冲突的数量。