我一直在努力优化一些代码,并遇到了与CUDA Nsight性能分析共享内存银行冲突报告的问题。我能够将它简化为一个非常简单的代码,Nsight报告这个代码存在银行冲突,但似乎并不存在。下面是内核:CUDA共享内存银行冲突报告更高
__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的报告问题,或者我只是缺少与银行冲突运作有关的问题?我会很感激任何反馈!
顺便说一句,我运行了以下设置:
- 的Windows 8
- GTX 770
- 的Visual Studio社区2013
- CUDA 7
- Nsight Visual Studio版本4.5版
你的内核包含越界存储器访问。我更担心这一点,而不是银行冲突。 – talonmies
对不起,我的错误超出了界限。该数组应该是33个元素,是固定的。 – Nisrak