以下是来自CUDA C编程指南的图片:

指南说,这是一个无冲突访问的例子,因为线程3、4、6、7和9访问银行5中的同一个单词。
我不太明白为什么这种冲突是没有冲突的,因为不仅线程3、4、6、7和9在同一个银行中访问相同的工作(难道这不是内存冲突的一个例子吗?)而且线程5必须访问银行4。
你能给我解释一下这个案子吗?
发布于 2014-03-19 19:43:40
请注意,银行与共享内存中的单词或位置不是一回事。银行是指共享内存中满足某种地址模式条件的所有单词。
通常,如果从一个翘曲(或cc 1.x中的半曲)访问到单独的银行,则可以避免共享内存库冲突。只要来自每个线程的请求以单独的银行为目标,这些访问就不必处于翘曲顺序,即它们可以被置乱。
上面的描述涵盖了图表中的每一个箭头,除了那些指向银行5的箭头。
如果我们没有其他信息,那么多支箭头将显示出一家银行的潜在冲突。
但是,有一个例外,当访问不仅访问相同的银行,而且它们在内存中存储相同的单词。当多个共享内存请求以内存中的同一个单词为目标时,共享内存系统具有一个广播机制,用于在一个周期内接收该单词中包含的数据,并将其服务于所有请求线程。
来自文档(http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#shared-memory-1-x):
共享存储器具有广播机制,在处理一个内存读取请求时,可以同时读取32位字并将其广播到多个线程。这减少了在同一个32位字内从一个地址读取多个线程时银行冲突的数量。
https://stackoverflow.com/questions/22514331
复制相似问题