代码之家  ›  专栏  ›  技术社区  ›  Tommy

c++cuda:构造函数外部的cudaMallocManaged访问

  •  0
  • Tommy  · 技术社区  · 6 年前

    我有一个c++类,它使用CUDAmallocManager,如下所示:

    MyMatrix::MyMatrix(int new_rows, int new_cols, int padrr, int padcc)
    {
      rows = new_rows;
      cols = new_cols;
      padr = padrr;
      padc = padcc;
    
      cout << "allocating memory" << endl;
      float *data;
      cudaError_t cudaStatus = cudaMallocManaged(&data, new_rows*new_cols*sizeof(float));
      if (cudaStatus != cudaSuccess){
          cout << cudaStatus << endl << flush;
          exit(1);
      }
      cudaDeviceSynchronize();
      cout << "allocating memory successful:" << cudaStatus << endl;
      // I CAN ACCESS DATA HERE
      //data[15] = 5.5; //fine
    }
    MyMatrix::~MyMatrix(void)
    {
     cudaFree(data); // delete the data array
    }
    

    我有一个标题 .h

    class MyMatrix
    {
    
      public:
          MyMatrix(int new_rows, int new_cols, int padr, int padt);
          ~MyMatrix(void);
    
          float *data;
          int padr;
          int padc;
          int rows;
          int cols;
    }
    

    在内部 这个构造器。

    但是,一旦我尝试在它之外访问它(读或写),我就会 terminated by signal SIGSEGV (Address boundary error)

    MyMatrix *newmat = new MyMatrix(totalr, totalc, padr, padc);
    cout << (*newmat).data[0] << endl;
    

    或者

    MyMatrix newmat = new MyMatrix(totalr, totalc, padr, padc);
    cout << newmat.data[0] << endl;
    

    2 回复  |  直到 6 年前
        1
  •  2
  •   CygnusX1 Stack Overflow is garbage    6 年前

    data :

    float *data;
    

    分配cuda内存并将值赋给局部变量之后 数据 ,内存地址似乎不会永久存储在任何地方。所以,你的记忆变得无法到达。

    你有这条线吗 newmat.data ,但在构造函数中,从未为成员赋值 数据

        2
  •  1
  •   NathanOliver    6 年前

    你的问题是

    MyMatrix::MyMatrix(int new_rows, int new_cols, int padrr, int padcc)
    {
      rows = new_rows;
      cols = new_cols;
      padr = padrr;
      padc = padcc;
    
      cout << "allocating memory" << endl;
      float *data;
      cudaError_t cudaStatus = cudaMallocManaged(&data, new_rows*new_cols*sizeof(float));
      if (cudaStatus != cudaSuccess){
          cout << cudaStatus << endl << flush;
          exit(1);
      }
      cudaDeviceSynchronize();
      cout << "allocating memory successful:" << cudaStatus << endl;
      // I CAN ACCESS DATA HERE
      //data[15] = 5.5; //fine
    }
    

    这个 data 你用在 cudaMallocManaged(&data, new_rows*new_cols*sizeof(float)) float *data; 你在上面一行申报的,不是 数据 类成员

    MyMatrix::MyMatrix(int new_rows, int new_cols, int padrr, int padcc)
    {
      rows = new_rows;
      cols = new_cols;
      padr = padrr;
      padc = padcc;
    
      cout << "allocating memory" << endl;
    
      cudaError_t cudaStatus = cudaMallocManaged(&data, new_rows*new_cols*sizeof(float));
      if (cudaStatus != cudaSuccess){
          cout << cudaStatus << endl << flush;
          exit(1);
      }
      cudaDeviceSynchronize();
      cout << "allocating memory successful:" << cudaStatus << endl;
      // I CAN ACCESS DATA HERE
      //data[15] = 5.5; //fine
    }