1

2D配列とcudaMallocPitchに関するstackoverflowのいくつかのスレッドを読んでいて、見つけた小さなドキュメントでcudaMallocPitchを使用しようとしました。しかし、私は今問題に直面しています。

配列を調べて、似たようなことをする必要があります:

 for(int k=0; k<100; ++k){
     for(i=SID; i<SID+stride; ++i){
        while(-1 < j && Driver[k][j] != Road[i]){
            j = Pilot[j][k];

        }
        ++j;
     }
  }

したがって、行の先頭へのポインターを更新する必要があることを読んだので、このコードをピッチで機能させるにはどうすればよいか疑問に思っていました。もちろん、私のカーネルは以下を受け取ります:

__global__ void driving(char *Driver, size_t pitch_driver, 
                        char *Road, int *Pilot, size_t pitch_pilot) 

そして、物事を機能させる方法がよくわかりません。読んで試してみましたが、現時点では機能していないようです。

ありがとうございました。

編集 1:特にこのスレッドを読んでいます: CUDA で 2D 配列を使用するには? そして次の行に出くわしました:

for (int row = 0; row < rowCount; row++)  
 {  
     // update the pointer to point to the beginning of the next row  
    float* rowData = (float*)(((char*)d_array) + (row * pitch));  
    for (int column = 0; column < columnCount; column++)  
     {  
       rowData[column] = 123.0; // make every value in the array 123.0  
       destinationArray[(row*columnCount) + column] = rowData[column];  
      }  
 }  

これは次の行のポインターを更新していますが、前のコードのように作業中に 2 つの for ループを作成する方法がわかりません。

現時点では、配列の 1 つの次元にしかアクセスできませんが、他の次元にはアクセスできません。

値 2 を返しますが、複数の比較を試みると 0 しか返されないか、2 つの値を比較しても機能しません。

4

1 に答える 1

2

CUDA リファレンス マニュアルには次のように書かれています。

5.8.2.17 cudaError_t cudaMallocPitch (void devPtr、size_t ピッチ、size_t 幅、size_t 高さ)

[...]

型 T の配列要素の行と列を指定すると、アドレスは次のように計算されます。

T* pElement = (T*)((char*)BaseAddress + 行 * ピッチ) + 列;

したがって、最初にポインターを char* にキャストし、計算を行ってから、型にキャストする必要があります。

于 2013-06-04T15:34:20.760 に答える