bank conflict和global memory访问的几点疑问

1.shared memory中相邻字节属于不同的bank,好像是以16为循环相邻16字节属于16个不同的bank,当访问相同bank时要序列化访问,那么也就是说不同线程访问同一地址会排队访问以及不同线程访问不同地址但属于同一bank也会排队依次访问,对不对?2.同一线程块不同线程访问global memory同一地址是并行访问还是排队依次访问以及不同线程块的不同线程访问global memory同一地址是并行访问还是排队串行访问?

LZ您好:

1.1:shared memory的bank宽度是4B或者8B(kerpler架构,并设置为8B模式)。所以每个bank里面的每个元素是连续的4个BYTE或者8个BYTE。

1.2:访问shared memory时依然是只需要考虑一个warp内的线程的行为即可。

1.3:一个warp 内的多个线程如果访问同一个bank内的相同元素(包括该元素的不同部分,比如一个8Bbank内的一个8B元素中的两个4B子元素),那么是通过广播机制同时完成的。如果是一个warp内的多个线程访问同一个bank的不同元素,那么将产生bank conflict。

2:这同样需要只考虑warp的级别而不是整个线程块一起考虑更不需要多个线程块放在一起考虑多个线程块之间毫无关系甚至都不会在同一时间执行你说考虑多个线程块的事情有神马意义呢在考虑一个warp的时候只需要保证合并访问就可以了而合并访问的内容手册上有详细的叙述请LZ加以参考欢迎您莅临cudazone论坛祝您好运~

十分感谢您的详细解答。:slight_smile: