【发布时间】:2012-08-28 21:41:18
【问题描述】:
我的内核中有许多未使用的寄存器。我想告诉 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
}
编译 w/: nvcc -arch sm_20 --ptxas-options=-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
}
register 声明什么都不做。
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
}
volatile 声明创建堆栈存储:
4096 字节堆栈帧,0 字节溢出存储,0 字节溢出加载
使用了 21 个电阻,40 字节 cmem[0]
1) 有没有一种简单的方法可以告诉编译器为变量使用寄存器空间?
2)“堆栈框架”在哪里:寄存器,全局内存,本地内存,...?什么是栈帧? (GPU 什么时候有堆栈?虚拟堆栈?)
3)simple.ptx文件基本为空:(nvcc -arch sm_20 -ptx simple.cu)
.loc 2 14 2
ret;
知道在哪里可以找到真机/编译代码吗?
【问题讨论】:
-
编译器优化了整个代码,因为它不会修改任何非瞬态状态。
-
要求每个线程有 1024 个寄存器是一个相当高的要求。大多数内核每个线程需要几十个寄存器。如果您想绝对确定编译器可以将寄存器用于变量,则它必须是标量(即,不是您在
for循环中索引的数组)。 -
可以在这里找到哪里/什么堆栈框架的答案:stackoverflow.com/questions/7810740/…
-
浮点 a1,a2,a3,a4,a5; // 每个 'a' 都有一个 reg 。 . . . . . . . . . . .易失浮动 b1,b2,b3,b4,b5; // 每个 'b' 都在堆栈上(本地内存)。 . . . . . . . . . . 'volatile' 声明对 reg 分配没有任何作用,但它确实创建了一个本地内存堆栈
标签: cuda