首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ cuda:构造函数之外的cudaMallocManaged访问

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

Stack Overflow用户
提问于 2018-09-25 16:11:25
回答 2查看 129关注 0票数 0

我有一个c++类,它像这样使用cudaMallocManaged:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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)。例如:

代码语言:javascript
复制
MyMatrix *newmat = new MyMatrix(totalr, totalc, padr, padc);
cout << (*newmat).data[0] << endl;

代码语言:javascript
复制
MyMatrix newmat = new MyMatrix(totalr, totalc, padr, padc);
cout << newmat.data[0] << endl;

我如何“坚持”这个指针?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-25 16:22:46

在构造函数中创建一个名为data的局部变量。

代码语言:javascript
复制
float *data;

在分配库达内存并将值分配给局部变量data之后,内存地址似乎不会永久存储在任何地方。所以,你的记忆就变得遥不可及。

您有这一行newmat.data,但在构造中,您从未将任何值分配给成员data。您确实使用了同名的局部变量。

票数 2
EN

Stack Overflow用户

发布于 2018-09-25 16:15:14

你的问题是

代码语言:javascript
复制
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
}

您在cudaMallocManaged(&data, new_rows*new_cols*sizeof(float))中使用的cudaMallocManaged(&data, new_rows*new_cols*sizeof(float))是您在上面一行中声明的float *data;,而不是类的data成员。只需去掉本地float *data;,就可以使用data类成员,如

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52502526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档