cuda中是以warp为单位进行并行计算的,不同warp间访问share memory没有bank conflict。
那么不同warp之间修改share memory中的同一个double变量需不需要用原子操作?
多谢~
楼主你好,
关于您的第一个问题,答案是没有bank conflict的,因为不同的warp间不能同时访问同一个SM上的同一个shared memory地址(以及它们也不能同时访问不同bank, 以及,它们也不能同时访问shared memory的任何banks)
关于您的第二个问题,您是需要使用原子操作的,例如如下执行顺序,如果不使用原子操作,会导致您所没有期盼的结果:
warp 0中的lane 0线程读取shared memory上的1个double,
warp 1中的lane 0线程读取shared memory上的1个double(还是这个),
warp 0中的lane 0线程将读取后的值加上12345.0
warp 1中的lane 0线程将读取后的值加上54321.0
warp 0中的lane 0线程回写结果
warp 1中的lane 0线程回写结果 // !!! warp 0的结果丢失!
您看,上述反例中,warp 0的结果丢失。所以您还是需要的。
明白了。多谢版主耐心回答。