我还没有弄清楚并且谷歌没有帮助我的一件事是,为什么有可能与共享内存发生银行冲突,但在全局内存中却没有?银行与寄存器会存在冲突吗?
UPDATE哇,我真的很感谢 Tibbit 和 Grizzly 的两个回答。看来我只能给一个答案打绿色复选标记。我对堆栈溢出很陌生。我想我必须选择一个答案作为最佳答案。我可以对我没有打绿勾的答案说声谢谢吗?
简短回答:全局内存或寄存器中不存在存储体冲突。
解释:
理解原因的关键是把握操作的粒度。单个线程不访问全局内存。全局内存访问是“合并的”。由于全局内存太慢,块内线程的任何访问都被分组在一起,以尽可能少地向全局内存发出请求。
共享内存可以被线程同时访问。当两个线程尝试访问同一存储体中的地址时,这会导致存储体冲突。
除了分配寄存器的线程之外,任何线程都不能访问寄存器。由于您无法读取或写入我的寄存器,因此您无法阻止我访问它们 - 因此,不存在任何银行冲突。
谁可以读写全局内存?
Only blocks
。单个线程可以进行访问,但事务将在块级别处理(实际上是扭曲/半扭曲级别,但我试图不复杂)。如果两个块访问相同的内存,我不认为它会花费更长的时间,并且可能会被最新设备中的 L1 缓存加速——尽管这并不明显。
谁可以读写共享内存?
Any thread within a given block.
如果每个块只有 1 个线程,则不会出现存储体冲突,但不会获得合理的性能。 Bank 冲突的发生是因为一个块分配了多个线程,例如 512 个线程,并且它们都在争夺同一 Bank 内的不同地址(不完全相同的地址)。 CUDA C 编程指南 - 图 G2,第 167 页(实际上是 pdf 的第 177 页)的末尾有一些关于这些冲突的精彩图片。3.2版本链接 http://developer.download.nvidia.com/compute/cuda/3_2/toolkit/docs/CUDA_C_Programming_Guide.pdf
谁可以读写寄存器?
Only the specific thread to which it is allocated.
因此,只有一个线程同时访问它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)