Tengo muchos registros sin usar en mi kernel. Me gustaría decirle a CUDA que use algunos registros para guardar algunos datos, en lugar de hacer una lectura global de datos cada vez que lo necesito. (No soy capaz de utilizar mem compartido.)Obligar a CUDA a usar el registro para una variable
__global__ void simple(float *gData) {
float rData[1024];
for(int i=0; i<1024; i++) {
rData[i]=gData[i];
}
// work on the data here
}
compilar w /: NVCC -arch sm_20 --ptxas-options = -v simple.cu, y consigo
0 bytes pila marco, 0 tiendas de derrames de bytes, 0 bytes cargas derrame
usado 2 registros, 40 bytes 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
}
registro declaración no hace nada.
0 bytes pila marco, 0 bytes tiendas de derrames, 0 cargas bytes derrame
Usado 2 registros, 40 bytes 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
}
volátil declaración crea ordenador pila:
4096 bytes pila marco, 0 bytes tiendas de derrames, 0 bytes cargas derrame
usados resistentes 21, 40 bytes cmem [0]
1) ¿hay una manera fácil de decir al compilador que utilice el espacio de registro para una variable?
2) ¿Dónde está 'stack frame': register, global mem, local mem, ...? ¿Qué es un marco de pila? (Desde cuando la GPU tiene una pila Una pila virtual??)
3) El archivo simple.ptx es básicamente vacío: (NVCC -arch sm_20 -ptx simple.cu)
.loc 2 14 2
ret;
Cualquier idea de dónde puede encontrar el código máquina/compilado real?
El compilador optimizó todo el código, porque no modifica ningún estado no transitorio. – njuffa
Pedir 1024 registros por hilo es una tarea bastante difícil. La mayoría de los núcleos requieren ~ docenas de registros por hilo. Si quiere estar absolutamente seguro de que el compilador puede usar un registro para una variable, necesita ser un escalar (es decir, no una matriz que indexe en un bucle 'for'). –
La respuesta del marco de pila where/what se puede encontrar aquí: http://stackoverflow.com/questions/7810740/where-does-cuda-allocate-the-stack-frame-for-kernels – Doug