CUDA:Matrix+;矩阵,在主机中打印解决方案矩阵时出现分段错误

CUDA:Matrix+;矩阵,在主机中打印解决方案矩阵时出现分段错误,matrix,cuda,Matrix,Cuda,我试图在CUDA中进行一个简单的操作,将一个矩阵添加到另一个矩阵,但当我尝试检查重结果时,出现了一个分段错误,代码如下: /* Includes, system */ #include <stdio.h> #include <cuda.h> #include <cuda_runtime.h> #define N 15000 /* DEVICE CODE */ __global__ void sumaMatrices(int *d_matrix1, int

我试图在CUDA中进行一个简单的操作,将一个矩阵添加到另一个矩阵,但当我尝试检查重结果时,出现了一个分段错误,代码如下:

/* Includes, system */
#include <stdio.h>

#include <cuda.h>
#include <cuda_runtime.h>
#define N 15000

/* DEVICE CODE */
__global__ void sumaMatrices(int *d_matrix1, int *d_matrix2, int *d_matrixSolucion){

    int idThread = blockIdx.x*blockDim.x + threadIdx.x;

    if (idThread < N)
    {
        d_matrixSolucion[idThread] = d_matrix1[idThread] + d_matrix2[idThread];
    }
}

__host__ void printMatrix(int **matrix) 
{
    int i, j;
    //only 4 so the file is not too big
    for (i = 0; i < 4; i++) 
    {
        for (j = 0; j < 4; j++)
        {
            printf("%d", matrix[i][j]);
            printf("  ");
        }
        printf("\n");
    }
    printf("\n");
}

/* HOST CODE*/
int main(int argc, char** argv)
{
    int i;

    int **h_matrix1;
    int **h_matrix2;
    int **h_matrixSolucion;

    int *d_matrix1;
    int *d_matrix2;
    int *d_matrixSolucion;

    h_matrix1 = (int**)malloc(N * sizeof(int*));
    for (i = 0; i < N; i++)
    {
        h_matrix1[i] = (int*)malloc(N * sizeof(int*));
    }

    h_matrix2 = (int**)malloc(N * sizeof(int*));
    for (i = 0; i < N; i++)
    {
        h_matrix2[i] = (int*)malloc(N * sizeof(int*));
    }

    h_matrixSolucion = (int**)malloc(N * sizeof(int*));
    for (i = 0; i < N; i++)
    {
        h_matrixSolucion[i] = (int*)malloc(N * sizeof(int*));
    }

    cudaMalloc((void**)& d_matrix1,N*N*sizeof(int));
    cudaMalloc((void**)& d_matrix2,N*N*sizeof(int));
    cudaMalloc((void**)& d_matrixSolucion,N*N*sizeof(int));

    fillMatrix(h_matrix1);
    fillMatrix(h_matrix2);
    fillMatrixTo0(h_matrixSolucion);

    for(i = 0; i < N; i++) 
    {
        cudaMemcpy(&d_matrix1[i*N], h_matrix1[i], N*sizeof(int), cudaMemcpyHostToDevice);
        cudaMemcpy(&d_matrix2[i*N], h_matrix2[i], N*sizeof(int), cudaMemcpyHostToDevice);
    }

    int tamBloque = 256;
    int tamGrid = N/tamBloque + 1;
    sumaMatrices<<<tamGrid, tamBloque>>>(d_matrix1, d_matrix2, d_matrixSolucion);

    //nos traemos la información del device
cudaThreadSynchronize();
for(i = 0; i < N; i++) 
{
    cudaMemcpy(h_matrixSolucion[i], &d_matrixSolucion[i*N],tamGrid*sizeof(h_matrixSolucion[0]),cudaMemcpyDeviceToHost);
}

    printMatrix(h_matrix1);
    printMatrix(h_matrix2);
    printMatrix(h_matrixSolucion);
}
/*包括,系统*/
#包括
#包括
#包括
#定义N 15000
/*设备代码*/
__全局矩阵(int*d_矩阵1、int*d_矩阵2、int*d_矩阵体积){
int-idThread=blockIdx.x*blockDim.x+threadIdx.x;
if(idThread
如果我评论最后一行,程序不会给出任何错误

我猜问题是我没有在内核中正确地存储信息(这一行:d_matrixsolcion[idThread]=d_matrix1[idThread]+d_matrix2[idThread];),但我对CUDA还很陌生,我真的不知道如何解决它

编辑:现在我已经改变了从设备获取信息的方式,这就是正在打印的内容:

01 2 3
1234
2 3 4 5
3 4 5 6

2 3 4 5
3 4 5 6
4 5 6 7
56778

2 4 6 8
0
0
0 0 0 0


前两个矩阵是包含信息的矩阵,另一个是解决方案,但只填充了一行。

代码中存在各种错误

  • 没有
    fillMatrix

  • 使用
    malloc
    执行的底层主机分配不能保证是连续的,因此不能在单个
    cudaMemcpy
    操作中传输回数据,但必须使用循环,就像用于将数据传输到GPU的循环一样
  • 您的主机分配不太正确,但并不存在实际问题。这:

    h_matrix1[i] = (int*)malloc(N * sizeof(int*));
    
    应该是这样的:

    h_matrix1[i] = (int*)malloc(N * sizeof(int));
    
    其他类似的例子也是如此

  • 网格(线程总数)大小不正确。内核使用一个线程执行一个元素级加法。因此,对于NxN矩阵,您需要NxN线程,而不仅仅是在创建和测试时需要N线程

  • 以下代码修复了这些问题,似乎对我来说工作正常:

    $ cat t2.cu
    /* Includes, system */
    #include <stdio.h>
    
    #include <cuda.h>
    #include <cuda_runtime.h>
    #define N 15000
    
    /* DEVICE CODE */
    __global__ void sumaMatrices(int *d_matrix1, int *d_matrix2, int *d_matrixSolucion){
    
        int idThread = blockIdx.x*blockDim.x + threadIdx.x;
    
        if (idThread < N*N)
        {
            d_matrixSolucion[idThread] = d_matrix1[idThread] + d_matrix2[idThread];
        }
    }
    
    __host__ void printMatrix(int **matrix)
    {
        int i, j;
        //only 4 so the file is not too big
        for (i = 0; i < 4; i++)
        {
            for (j = 0; j < 4; j++)
            {
                printf("%d", matrix[i][j]);
                printf("  ");
            }
            printf("\n");
        }
        printf("\n");
    }
    
    /* HOST CODE*/
    int main(int argc, char** argv)
    {
        int i;
    
        int **h_matrix1;
        int **h_matrix2;
        int **h_matrixSolucion;
    
        int *d_matrix1;
        int *d_matrix2;
        int *d_matrixSolucion;
    
        h_matrix1 = (int**)malloc(N * sizeof(int*));
        for (i = 0; i < N; i++)
        {
            h_matrix1[i] = (int*)malloc(N * sizeof(int));
            for (int j = 0; j < N; j++) h_matrix1[i][j] = 1;
        }
    
        h_matrix2 = (int**)malloc(N * sizeof(int*));
        for (i = 0; i < N; i++)
        {
            h_matrix2[i] = (int*)malloc(N * sizeof(int));
            for (int j = 0; j < N; j++) h_matrix2[i][j] = 2;
        }
    
        h_matrixSolucion = (int**)malloc(N * sizeof(int*));
        for (i = 0; i < N; i++)
        {
            h_matrixSolucion[i] = (int*)malloc(N * sizeof(int));
            for (int j = 0; j < N; j++) h_matrixSolucion[i][j] = 0;
        }
    
        cudaMalloc((void**)& d_matrix1,N*N*sizeof(int));
        cudaMalloc((void**)& d_matrix2,N*N*sizeof(int));
        cudaMalloc((void**)& d_matrixSolucion,N*N*sizeof(int));
    
    
        for(i = 0; i < N; i++)
        {
            cudaMemcpy(&d_matrix1[i*N], h_matrix1[i], N*sizeof(int), cudaMemcpyHostToDevice);
            cudaMemcpy(&d_matrix2[i*N], h_matrix2[i], N*sizeof(int), cudaMemcpyHostToDevice);
        }
    
        int tamBloque = 256;
        int tamGrid = (N*N)/tamBloque + 1;
        sumaMatrices<<<tamGrid, tamBloque>>>(d_matrix1, d_matrix2, d_matrixSolucion);
    
        cudaThreadSynchronize();
        for(i = 0; i < N; i++)
        {
            cudaMemcpy(h_matrixSolucion[i],&d_matrixSolucion[i*N],N*sizeof(int),cudaMemcpyDeviceToHost);
        }
    
        printMatrix(h_matrix1);
        printMatrix(h_matrix2);
        printMatrix(h_matrixSolucion);
    }
    $ nvcc -o t2 t2.cu
    $ cuda-memcheck ./t2
    ========= CUDA-MEMCHECK
    1  1  1  1
    1  1  1  1
    1  1  1  1
    1  1  1  1
    
    2  2  2  2
    2  2  2  2
    2  2  2  2
    2  2  2  2
    
    3  3  3  3
    3  3  3  3
    3  3  3  3
    3  3  3  3
    
    ========= ERROR SUMMARY: 0 errors
    $
    
    $cat t2.cu
    /*包括,系统*/
    #包括
    #包括
    #包括
    #定义N 15000
    /*设备代码*/
    __全局矩阵(int*d_矩阵1、int*d_矩阵2、int*d_矩阵体积){
    int-idThread=blockIdx.x*blockDim.x+threadIdx.x;
    if(idThread