カーネルに未使用のレジスタがたくさんあります。必要なときに毎回グローバルデータを読み取るのではなく、いくつかのレジスタを使用してデータを保持するように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
}
レジスタ宣言は何もしません。
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)「スタックフレーム」はどこにありますか:レジスタ、グローバルmem、ローカルmem、...?スタックフレームとは何ですか?(GPUにはいつスタックがありますか?仮想スタックですか?)
3)simple.ptxファイルは基本的に空です:(nvcc -arch sm_20 -ptx simple.cu)
.loc 2 14 2
ret;
実際のマシン/コンパイルされたコードをどこで見つけることができるか考えていますか?