【问题标题】:Indexing scheme vs. array of pointers in CUDA索引方案与 CUDA 中的指针数组
【发布时间】:2012-08-02 18:51:50
【问题描述】:

我想在 CUDA 中添加两个二维数组。

当我使用索引方案时,程序运行良好:

#define COLUMNS 3
#define ROWS 2    
__global__ void add(int *a, int *b, int *c)
{
    int x = blockIdx.x;
    int y = blockIdx.y;
    int i = (COLUMNS*y) + x;
    c[i] = a[i] + b[i];
}    

int main()
{
    int a[ROWS][COLUMNS], b[ROWS][COLUMNS], c[ROWS][COLUMNS];
    int *dev_a, *dev_b, *dev_c;
    cudaMalloc((void **) &dev_a, ROWS*COLUMNS*sizeof(int));
    cudaMalloc((void **) &dev_b, ROWS*COLUMNS*sizeof(int));
    cudaMalloc((void **) &dev_c, ROWS*COLUMNS*sizeof(int));
    for (int y = 0; y < ROWS; y++) // Fill Arrays
        for (int x = 0; x < COLUMNS; x++)
        {
            a[y][x] = x;
            b[y][x] = y;
        }
    cudaMemcpy(dev_a, a, ROWS*COLUMNS*sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b, b, ROWS*COLUMNS*sizeof(int), cudaMemcpyHostToDevice);
    dim3 grid(COLUMNS,ROWS);
    add<<<grid,1>>>(dev_a, dev_b, dev_c);
    cudaMemcpy(c, dev_c, ROWS*COLUMNS*sizeof(int), cudaMemcpyDeviceToHost);
    return 0;
}

但是,当矩阵 b 表示为指针数组而不是如上所述的索引方案时,它不起作用:

int a[ROWS][COLUMNS], **b, c[ROWS][COLUMNS];
int *dev_a, *dev_b, *dev_c;
b = (int**)malloc(ROWS*sizeof(int*));
for (int i = 0; i < ROWS; i++)
b[i] = (int*) malloc(COLUMNS*sizeof(int));

为什么?

我使用了这里的例子:http://www.math.uaa.alaska.edu/~afkjm/cs448/handouts/cuda-firstprograms.pdf

【问题讨论】:

  • 什么不起作用?如何将指针矩阵数组复制到设备上,这可能是问题所在。

标签: pointers matrix cuda


【解决方案1】:

尽管这个问题很老,但我会尽量给每个来到这里有相关问题的人一个提示。

我同意leftaroundabout。没有 malloc 的编译时常量分配

int a[ROWS][COLUMNS], b[ROWS][COLUMNS], c[ROWS][COLUMNS];

很可能为每个大小为 ROWS*COLUMNS 的变量(a、b、c)分配一个内存块。可以通过一次 memcpy 操作将该块复制到设备。

在指针指向的情况下,每一列都是单独分配的,因此我们不能保证拥有一个可以使用单个 memcpy 复制到设备的连续内存块。

在给定的**b 情况下,必须单独复制每个列的数据,以实现类似的行为。

for (int o=0; o<ROWS; ++o)
{
  cudaMemcpy((dev_b+o*COLUMNS), b[o], COLUMNS*sizeof(int), cudaMemcpyHostToDevice);
}

尽管如此,我认为应该使用相同的方案处理 a 和 b 以避免在元素排序不同的情况下出现索引混淆。 (虽然我声称 a[ROWS][COLUMNS] 变量将使用行优先顺序存储。)

【讨论】:

    猜你喜欢
    • 2012-07-11
    • 2016-12-23
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多