我在內核中有很多未使用的寄存器。我想告訴CUDA使用一些寄存器來保存一些數據,而不是每次需要時都讀取全局數據。 (我不能夠使用共享MEM)強制CUDA使用寄存器作爲變量
__global__ void simple(float *gData) {
float rData[1024];
for(int i=0; i<1024; i++) {
rData[i]=gData[i];
}
// work on the data here
}
編譯瓦特/:NVCC -arch sm_20 --ptxas選項= -v simple.cu,我也得到
0字節堆棧幀,0字節溢出存儲,0字節溢出負載
使用2個寄存器,40個字節CMEM [0]
__global__ void simple(float *gData) {
register float rData[1024];
for(int i=0; i<1024; i++) {
rData[i]=gData[i];
}
// work on the data here
}
寄存器聲明什麼都不做。
0字節堆棧幀,0字節溢出存儲,0字節溢出負載
使用2個寄存器,40個字節CMEM [0]
__global__ void simple(float *gData) {
volatile float rData[1024];
for(int i=0; i<1024; i++) {
rData[i]=gData[i];
}
// work on the data here
}
揮發性聲明創建堆棧存儲:
4096字節堆棧幀, 0字節溢出店,二手0字節溢出負荷
21名抵抗者,40個字節CMEM [0]
1)是否有一個簡單的方法來告訴編譯器使用寄存器空間的變量?
2)'堆棧幀'在哪裏:寄存器,全局mem,本地mem,...?什麼是堆棧框架? (由於當沒有所述GPU具有堆疊的虛擬堆疊?)
3)simple.ptx文件基本上是空的:(NVCC -arch sm_20 -ptx simple.cu)
.loc 2 14 2
ret;
任何想法,我可以找到真正的機器/編譯代碼?
編譯器優化了整個代碼,因爲它不修改任何非瞬態狀態。 – njuffa
每個線程要求1024個寄存器是一個非常高的順序。大多數內核每個線程需要數十個寄存器。如果你想確保編譯器可以使用一個寄存器作爲變量,它需要是一個標量(即不是你在'for'循環中索引的數組)。 –
在哪裏/什麼堆棧框架答案可以在這裏找到:http://stackoverflow.com/questions/7810740/where-does-cuda-allocate-the-stack-frame-for-kernels – Doug