gpt4 book ai didi

时间:2018-01-08 标签:c++cuda: cudaMallocManaged access outside of constructor

转载 作者:行者123 更新时间:2023-11-27 23:43:39 24 4
gpt4 key购买 nike

我有一个像这样使用 cudaMallocManaged 的​​ C++ 类:

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;
}

我可以这个构造函数中很好地访问数据数组。

但是,一旦我尝试在它之外访问它(读取或写入),我就会被信号 SIGSEGV(地址边界错误)终止。例如:

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;

我怎样才能“持久化”这个指针?

最佳答案

在您的构造函数中,您创建了一个名为 data 的局部变量:

float *data;

分配cuda内存并赋值给局部变量data后,内存地址似乎并没有永久保存在任何地方。因此,您的内存变得无法访问。

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

关于时间:2018-01-08 标签:c++cuda: cudaMallocManaged access outside of constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52502526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com