Forcer CUDA pour utilisation vous inscrire pour une variable

J'ai beaucoup de inutilisés registres dans mon noyau. Je voudrais vous dire, CUDA pour utiliser un peu de registres permettant de contenir des données, plutôt que de faire une base de données mondiale de lire à chaque fois que j'en ai besoin. (Je ne suis pas en mesure d'utiliser le mem.)

__global__ void simple(float *gData) {
float rData[1024];
for(int i=0; i<1024; i++) {
  rData[i]=gData[i];
  }
//work on the data here
}

compiler w/: nvcc -arch sm_20 --ptxas-options=-v simple.cu, et je reçois
0 octets de la trame de pile, 0 octets déversement de magasins, 0 octets déversement des charges
Utilisé 2 registres, 40 octets 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
}

registre déclaration ne fait rien.
0 octets de la trame de pile, 0 octets déversement de magasins, 0 octets déversement des charges
Utilisé 2 registres, 40 octets 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
}

volatils déclaration crée de la pile de stockage:
4096 octets de la trame de pile, 0 octets déversement de magasins, 0 octets déversement des charges
21 les résistants, 40 octets cmem[0]

1) Est-il un moyen facile de dire que le compilateur utilise le registre de l'espace pour une variable?
2) Où est la "stack frame': inscrivez-vous, global mem, local mem,...? Qu'est ce qu'un cadre de pile? (Depuis quand les GPU ont une pile? Une pile virtuelle?)
3) Le simple.fichier ptx est essentiellement vide: (nvcc -arch sm_20 -ptx simple.cu)

.loc 2 14 2
ret;

Une idée d'où je peux trouver de la vraie machine/code compilé?

Le compilateur optimisé l'ensemble du code de loin, parce qu'il ne modifie pas la non-état transitoire.
Demander 1024 registres par thread est un joli défi de taille. La plupart des noyaux nécessitent ~des dizaines de registres par thread. Si vous voulez être absolument sûr que le compilateur peut utiliser un registre pour une variable, il doit être un scalaire (c'est à dire, pas un tableau, vous indice dans un for boucle).
La où/quoi frame de pile réponse se trouve ici: stackoverflow.com/questions/7810740/...
flotteur a1,a2,a3,a4,a5; // chaque " un " reçoit un reg . . . . . . . . . . . . volatile float a,b1, b2,b3,b4,b5; // chaque 'b' est sur la pile (local mem) . . . . . . . . . . . Le "volatile" déclaration ne fait rien pour les reg de répartition, mais il crée un local-mem pile

OriginalL'auteur Doug | 2012-08-28