以下是从CUDA C编程指南中获取的图像:
指南说这是无冲突访问的示例,因为第3,第4,第6,第7和第9个线程访问了第5行中的相同字。
我不太明白为什么这个没有冲突,因为不仅线程3,4,6,7和9访问同一个银行内的相同工作(不应该是内存冲突的一个例子吗?)但是线程5也必须访问银行4。
你能告诉我这个案子吗?
答案 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位字内的地址读取时,这可以减少存储体冲突的数量。