我一直在努力優化一些代碼,並遇到了與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