具有CUDA和cudaMallocPitch的2D阵列

时间:2013-02-27 23:16:11

标签: c cuda nvidia

我一直在阅读关于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:我一直在阅读此帖子: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,或者甚至比较两个值都不起作用。

1 个答案:

答案 0 :(得分:1)

在CUDA参考手册中,它说:

  

5.8.2.17 cudaError_t cudaMallocPitch(void devPtr,size_t pitch,size_t width,size_t height)

     

[...]

     

给出行和列   类型为T的数组元素,地址计算如下:

     

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

因此,您需要先将指针强制转换为char *,然后进行数学计算,然后将其转换回您的类型。