【发布时间】:2015-04-29 03:47:36
【问题描述】:
我一直致力于优化一些代码,但在使用 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 时遇到过问题,或者我只是在银行冲突的运作方面遗漏了一些东西?如有任何反馈,我将不胜感激!
顺便说一句,我正在运行以下设置:
- Windows 8
- GTX 770
- Visual Studio 社区 2013
- CUDA 7
- Nsight Visual Studio 版 4.5 版
【问题讨论】:
-
您的内核包含越界内存访问。比起银行冲突,我更担心这一点。
-
对不起,我的错误越界了。数组应该是 33 个元素,固定的。
标签: cuda gpu shared-memory bank-conflict