2012-03-23 21 views
3

CUDAで2D配列を扱うことについてたくさん読んでいますが、GPUに送る前に平坦化する必要があると思います.1D配列をGPUに割り当て、GPUで2D配列としてアクセスできますか?CUDAの2D配列

__global__ void kernel(int **d_a) 
{ 

    cuPrintf("%p",local_array[0][0]); 
} 

int main(){ 

    int **A; 

    int i; 

    cudaPrintfInit(); 

    cudaMalloc((void**)&A,16*sizeof(int)); 

    kernel<<<1,1>>>(A); 

    cudaPrintfDisplay(stdout,true); 

    cudaPrintfEnd(); 
} 

答えて

0

をどのように私です固定問題 通常の方法で私はcudaMallocしかし、私はint(*)[col]に型キャストしているが、これは私のために働いています

2

を実際には、(これはメモリアクセススピードアップすることができますが)GPU上でそれを使用する前に、あなたの2次元配列を「フラット化」する必要はありません次のように見える試みたが、私のコードを失敗しました。 2D配列が必要な場合は、cudaMallocPitchのようなものを使用できます。これは、CUDA Cプログラミングガイドに記載されています。私はあなたのコードが機能していない理由は、malloc edの1D配列 - A [0] [0]は存在しないと信じています。あなたのコードを見ると、ではなく、sの1D配列を作成しました。カーネルの使用中

int** A; 
cudaMalloc(&A, 16*length*sizeof(int*)); //where length is the number of rows/cols you want 

そして(任意の要素へのポインタを印刷する):あなたが平らに2次元配列ををmallocしたい場合は、あなたが何か行うことができ

__global__ void kernel(int **d_a, int row, int col, int stride) 
{ 
    printf("%p", d_a[ col + row*stride ]); 
}