2013-02-27 78 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 *,然后将其转换回您的类型。