Pointers CUDA中的索引方案与指针数组

Pointers CUDA中的索引方案与指针数组,pointers,matrix,cuda,Pointers,Matrix,Cuda,我想在CUDA中添加两个2D阵列 当我使用索引方案时,程序运行良好: #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[R

我想在CUDA中添加两个2D阵列

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

#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;
}
#定义第3列
#定义第2行
__全局无效添加(int*a、int*b、int*c)
{
int x=blockIdx.x;
int y=块idx.y;
int i=(列*y)+x;
c[i]=a[i]+b[i];
}    
int main()
{
int a[行][列]、b[行][列]、c[行][列];
int*开发a、*开发b、*开发c;
cudamaloc((void**)和dev_a,行*列*大小(int));
cudamaloc((void**)和dev_b,行*列*大小(int));
cudamaloc((void**)和dev_c,行*列*大小(int));
对于(int y=0;y
但是,当矩阵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));
inta[行][列]、**b、c[行][列];
int*开发a、*开发b、*开发c;
b=(int**)malloc(行*大小(int*);
对于(int i=0;i
为什么?


我在这里举了一个例子:

尽管这个问题已经很老了,我还是会尝试给每个来这里遇到相关问题的人一个提示

我同意左撇子的观点。不带malloc的编译时常量分配

int a[ROWS][COLUMNS], b[ROWS][COLUMNS], c[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);
}
for(int o=0;o什么不起作用?如何将指针数组矩阵复制到设备,这可能是问题所在。