我一直在优化一些代码,并在 CUDA Nsight 性能分析中遇到了共享内存库冲突报告的问题。我能够将它简化为 Nsight 报告为存在银行冲突的非常简单的一段代码,而它似乎不应该存在。下面是内核:
__global__ void conflict() {
__shared__ double values[33];
values[threadIdx.x] = threadIdx.x;
values[threadIdx.x+1] = threadIdx.x;
}
以及调用它的主要功能:
int main() {
conflict<<<1,32>>>();
}
请注意,我正在使用单个扭曲来真正将其减少到最低限度。当我运行代码时,Nsight 说有 1 个银行冲突,但根据我读过的所有内容,不应该有任何冲突。对于对共享内存数组的每次访问,每个线程都在访问连续的值,每个值都属于不同的存储体。
是否有其他人在报告 Nsight 时遇到过问题,或者我只是在银行冲突的运作方面遗漏了一些东西?我将不胜感激任何反馈!
顺便说一句,我正在运行以下设置:
- 视窗 8
- GTX 770
- Visual Studio 社区 2013
- CUDA 7
- Nsight Visual Studio 4.5版