2

カーネルで宣言された配列のメモリスペースとは何ですか?たとえば、次のコードでは、配列を宣言しaます。このアレイはどこに配置されますか?ローカルメモリとレジスタの間で混乱していますか?それがレジスターにある場合、それらはどの程度正確にマップされますか?

__device__ int ptr=0;  

__global__ void a()  
{  
    int b[9][9];                                         
    atomicAdd(&ptr,1);  
    b[0][0]=ptr;                                       
    for(int i=1;i<9;i++)  
    {  
        for(int j=1;j<9;j++)  
        {  
            b[i][j]=b[i-1][j-1]+1;  
        }  
    }  
    ptr=b[7][7]+1;                                                 
}     

int main()  
{
    a<<<1,1>>>();  
    return 0;  
}

一般的に、ファイルを介して各変数のメモリスペースを確認する方法はあり.ptxますか?私はこれをコンパイルしまし--ptxas-options=-vたが、有用な情報はありません。ファイルを調べまし.oたが、必要なものが含まれていません。私が欲しいのは、カーネルで使用される変数の場所です。

4

2 に答える 2

1

GTC のプレゼンテーションの 1 つから確認ビューを得たので、この質問に答えています。そのため、Compiler は、これらの配列が十分に小さい場合、これらの配列をレジスターに入れようとします。それらがレジスタ ファイルに収まらない場合は、ローカル メモリにスピルされます。しかし、一次記憶域はレジスターです!!

于 2012-09-28T09:45:05.087 に答える
1

スレッドのプライベート配列は、ローカルメモリ空間、オフザチップの DRAM に確実に格納され、メモリ階層にキャッシュされることもあります。一般に、非配列変数は PTX の仮想レジスタと見なされ、PTX のレジスタの数は無制限です。ただし、明らかに、これらすべての仮想レジスタが物理レジスタにマップされているわけではありません。PTX ポストプロセッサは、NVCC に指定されたマイクロアーキテクチャ フラグに従って、一部のレジスタをローカル空間にスピルし、レジスタの使用を最適化します。

于 2012-09-23T07:53:20.013 に答える