为什么这是一次无冲突的内存银行访问?

6
这是一张来自CUDA C编程指南的图片: enter image description here 指南上说这是一个“无冲突访问示例,因为线程3、4、6、7和9在bank 5内访问相同的字”。
我不太明白为什么这是无冲突的,因为不仅线程3、4、6、7和9访问同一个bank中的相同单元(难道不应该是内存冲突的例子吗?),而且线程5还必须访问bank 4。
您能否解释一下这个案例?
1个回答

8
请注意,一个“bank”并不等同于一个共享内存中的单词或位置。一个“bank”指代了所有满足某一地址模式条件的共享内存中的单词。
一般来说,如果每个warp(或在cc 1.x中是半个warp)的访问都指向独立的“bank”,则可以避免共享内存bank冲突。这些访问不需要按照warp的顺序进行,也就是说,它们可以混杂在一起,只要每个线程的请求都指向不同的“bank”。
上述描述涵盖了您图表中的每个箭头,除了那些指向bank 5的箭头。
如果我们没有其他信息,那么多个箭头指向同一个“bank”���能会导致银行冲突。
然而,有一个例外情况,即当许多访问不仅指向同一个“bank”,而且还指向内存中的相同单词时。当多个共享内存请求指向内存中的同一个单词时,共享内存系统具有广播机制,可以将该单词中包含的数据同时提供给所有请求的线程,只需一个周期即可完成。
从文档中得知(http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#shared-memory-1-x):
“共享内存具有广播机制,当服务一个内存读取请求时,可以将32位单词读取并同时广播给多个线程。这减少了当多个线程从同一个32位单词地址中读取时的bank冲突数量。”

在 cc 1.x 设备上,当半个线程束的某些线程(不一定是全部线程)访问同一地址,并且该半个线程束的每个其他线程访问其他银行的地址时,广播会被应用。另一方面,如果两个或更多组线程在同一银行中访问相同的地址(每个组的地址不同),则不会使用广播。在 cc 2.x 及更高版本中,可以有任意数量的此类冲突访问,并且广播将适用于所有这些访问。我的理解正确吗?还是我还有误解? - jcxz
1
是的,我相信你的理解是正确的。如果你比较cc1.x和cc2.x情况下编程指南中共享内存访问的描述(例如,cc2.x的描述:“(与计算能力为1.x的设备不同,多个字可以在单个事务中广播)”),它基本上就是这样表述的。在这个问题中捕获的图表的特定情况下,只有一个需要“广播”的地址位置,因此我不会期望在这方面在cc1.x和cc2.x之间有任何行为上的差异,对于这种情况。 - Robert Crovella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接