我在内核中有很多未使用的寄存器。我想告诉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