cudaMemcpy没有将主机矩阵复制到设备(给出分段错误)

时间:2013-12-02 06:39:21

标签: c cuda

以下是当我尝试打印正在从主机矩阵h_A复制的矩阵d_A时我得到分段错误的代码。当我尝试在cudamalloc打印之前打印矩阵h_A但是在cudamemcpy尝试打印之后d_A(设备矩阵)给我错误。

我使用以下内容: - nvcc -arch = sm_20 Trial.cu -o out to compile

  #include <stdio.h>
  #include <sstream> 
  #include <stdlib.h> 
  #include <time.h> 
  #include <math.h> 
  #include <unistd.h> 
  #include <sys/time.h> 
  #include <stdint.h>
  #include <cuda.h> 
  #include <time.h> 
  inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true)
  {
     if (code != cudaSuccess)
     {
       fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
       if (abort) exit(code);
     }
  }

  void LUdecomposition(float *h_A,float *A_,int dim,unsigned int size_A,int row_A)
  { 
    float *d_A;int k;
    gpuErrchk(cudaMalloc(&d_A, size_A*sizeof(float)));
    gpuErrchk(cudaMemcpy(d_A, h_A, size_A*sizeof(float), cudaMemcpyHostToDevice));

    printf("\n D_A");

    gpuErrchk(cudaMemcpy(A_,d_A,size_A*sizeof(float), cudaMemcpyDeviceToHost));

    for(int i=0; i<size_A; i++)
    {

            if (i % row_A == 0) printf("\n");
            printf("%f ", A_[i]);

    }
    printf("\n D_A");      
  }
  void input_matrix_generation_A(float *Matrix, unsigned int row, unsigned int column,  unsigned int size)
  {

    for (int i=0; i<size; i++)
    {
            Matrix[i] = rand()%5+1;
            if (i % column == 0) printf("\n");
    }       

  }       
  int main(int argc, char *argv[])
  {
    int m=4;int dim=2;

    int size_A=m*m;
    float *A, *A_;

    A = (float*)malloc(sizeof(float)*size_A);
    input_matrix_generation_A(A,m,m,size_A);

    A_ = (float*)malloc(sizeof(float)*size_A);
    LUdecomposition(A,A_,dim,size_A,m);
     for(int i=0; i<size_A; i++)
    {

            if (i % row_A == 0) printf("\n");
            printf("%f ", A_[i]);

    }

    return 0;
   }

2 个答案:

答案 0 :(得分:2)

您正尝试从主机访问(取消引用)设备指针,这会导致未定义的行为并导致分段错误。因此以下代码行无效:

printf("%f ", d_A[i]);

此外,您正在复制额外的内存:

cudaMemcpy(A_,d_A,size_A*sizeof(double), cudaMemcpyDeviceToHost);

应该是

cudaMemcpy(A_,d_A,size_A*sizeof(float), cudaMemcpyDeviceToHost);

答案 1 :(得分:1)

在第23行的代码中,你写道:

for(int i=0; i<size_A; i++)
{
    if (i % row_A == 0) printf("\n");
    printf("%f ", d_A[i]);
}

这是触发段故障的部分。

请注意,设备指针d_A位于GPU上全局内存的内存空间中,并且永远不会在CPU端直接取消引用。