2013-02-27 49 views
1

我一直在閱讀關於二維數組和cudaMallocPitch的stackoverflow的幾個線程,我試圖用cudaMallocPitch和我發現的小文檔。但是我現在面臨一個問題。二維數組與CUDA和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:我一直在閱讀尤其在該線程:How to use 2D Arrays in CUDA?和跨線傳來:

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循環和工作,如在以前的代碼。

目前我只能訪問我的數組的一個維度,但不能訪問另一個維度。

它返回值2,但是當我嘗試我的多重比較時,它只返回0,或者甚至比較兩個值不起作用。

+2

什麼,確切地說是「不工作」?你不瞭解什麼過程的一部分? – talonmies 2013-02-28 06:15:12

+0

當我試圖通過數組時,它不工作。基於類似於我編輯的東西。 – Anoracx 2013-02-28 12:07:27

+0

我認爲你的問題歸結爲:真正的二維數組會導致C語言問題,甚至在CUDA中出現更多問題。相反,'cudaMallocPitch()'將二維數組表示爲一維數組,您可以簡單地訪問:array [row * pitch + column];'。而已。如果你確實需要一個指向行開始的指針,你可以使用'ptr =&array [row * pitch];' – Peter 2013-02-28 14:27:16

回答

1

在它說CUDA參考手冊:

5.8.2.17 cudaError_t使用cudaMallocPitch(空隙devPtr,爲size_t間距,爲size_t寬度爲size_t高度)

[...]

鑑於 類型T的數組元素,地址的計算公式如下:

T * pElement =(T *)((char *)BaseAddress + Row * pitch)+ Column;

因此,您需要先將指針轉換爲char *,然後將其轉換回您的類型。