【问题标题】:2D array with CUDA and cudaMallocPitch带有 CUDA 和 cudaMallocPitch 的二维数组
【发布时间】:2013-02-13 23:43:46
【问题描述】:

我一直在阅读有关 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,甚至比较两个值都不起作用。

【问题讨论】:

  • 什么,究竟是“不工作”?您不了解流程的哪一部分?
  • 当我尝试通过数组时它不起作用。基于类似于我编辑的内容。
  • 我认为您的问题归结为:真正的二维数组在 C 中会导致问题,在 CUDA 中会出现更多问题。相反,cudaMallocPitch() 将二维数组表示为一维数组,您只需将其访问为:array[row*pitch + column];。而已。如果你真的需要一个指向行首的指针,你可以使用ptr = &amp;array[row*pitch];
  • @Peter:您的访问代码不正确。不能保证 cudaMallocPitch 返回的音高是数组类型字长的倍数。间距纯粹是根据 GPU 内存控制器页面大小和映射要求来选择的。 API 对所分配的类型一无所知,只知道要分配的每一行的最小字节宽度。
  • 我实际上尝试了@Peter 所说的但它不起作用,我仍然无法访问第二行。

标签: c cuda nvidia


【解决方案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*,进行数学运算,然后再将其转换回您的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2012-05-14
    相关资源
    最近更新 更多