Parallel processing 主机到内核发送信息问题

Parallel processing 主机到内核发送信息问题,parallel-processing,cuda,Parallel Processing,Cuda,以下C语言内核更改数组的单元格: __global__ void test(int *mt[matrix_size]) { mt[0][0]=12; } 下面的代码将内核结果复制到主机,但未将数组正确发送到主机: int *matrix[matrix_size],*d_matrix[matrix_size]; for(int i=0;i<matrix_size;i++) matrix[i] = (int *)malloc(n*n*sizeof(int));

以下C语言内核更改数组的单元格:

    __global__ void test(int *mt[matrix_size])
{
    mt[0][0]=12;
}
下面的代码将内核结果复制到主机,但未将数组正确发送到主机:

    int *matrix[matrix_size],*d_matrix[matrix_size];
for(int i=0;i<matrix_size;i++)
    matrix[i] = (int *)malloc(n*n*sizeof(int)); 
for(int i=0;i<matrix_size;i++)
    cudaMalloc((void**)&d_matrix[i],sizeof(int));
test<<<1,1>>>(d_matrix);
cudaMemcpy(*matrix,*d_matrix,n*n*sizeof(int),cudaMemcpyDeviceToHost);
printf("\n\n %d \n\n",matrix[0][0]); //the result is zero instead of 12
int*矩阵[matrix_size],*d_矩阵[matrix_size];

对于(inti=0;i你在这里犯了很多错误

根本原因是
d_matrix
位于主机内存中,无法直接传递给内核。如果检查运行时错误,您将看到第一个
cudaMemcpy
调用由于错误的方向参数而失败,然后当您修复该错误时,内核因无效地址错误而失败

要解决此问题,您需要在GPU上分配一个
d_矩阵
副本,并将
d_矩阵
复制到该副本。这是因为传递到内核的数组衰减为指针,而不是按值传递

大概是这样的:

#include <cstdio>

const int n = 9;
const int matrix_size = 16;

__global__ 
void test(int *mt[matrix_size])
{
    mt[threadIdx.x][0] = 12 + threadIdx.x;
}

int main()
{
    int *matrix[matrix_size],*d_matrix[matrix_size];

    for(int i=0;i<matrix_size;i++) {
        matrix[i] = (int *)malloc(n * n * sizeof(int)); 
        cudaMalloc((void**)&d_matrix[i], n * n * sizeof(int));
    }

    int **dd_matrix;
    cudaMalloc(&dd_matrix, matrix_size * sizeof(int*));
    cudaMemcpy(dd_matrix, d_matrix, matrix_size * sizeof(int *), cudaMemcpyHostToDevice);

    test<<<1,matrix_size>>>(dd_matrix);

    for(int i=0;i<matrix_size;i++) {
        cudaMemcpy(matrix[i], d_matrix[i], n*n*sizeof(int), cudaMemcpyDeviceToHost);
        printf("%d = %d \n", i, matrix[i][0]); 
    }

    return 0;
}

我相信,这与您的期望更为一致。

您的代码有很多问题,第一个矩阵和d_矩阵没有分配相等的动态内存(请参阅Cudamaloc分配的大小),为什么在内核调用之前要从设备内存复制到主内存(应该是相反的,不是吗?)你能解释一下吗?在设备端处理二维数组时,你可能需要将数组映射到一维数组。你不能直接访问设备主机端的内存,因为你的数组只是复制的,没有映射。内核函数无法访问正确的地址空间。或者你可以参考
cudamemcpy2D()
,点击查看更多信息。谢谢你..但结果仍然是零…@rbhd因为已经有答案了,我能够正确运行它,我的想法有点不同,如果你需要,我可以发布简单的代码(也许效果不如给出的答案好)。
$ nvcc -g -G -arch=sm_52 -o bozocu bozocu.cu 

$ ./bozocu
0 = 12 
1 = 13 
2 = 14 
3 = 15 
4 = 16 
5 = 17 
6 = 18 
7 = 19 
8 = 20 
9 = 21 
10 = 22 
11 = 23 
12 = 24 
13 = 25 
14 = 26 
15 = 27