我有一个c++类,它像这样使用cudaMallocManaged:
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;我如何“坚持”这个指针?
发布于 2018-09-25 16:22:46
在构造函数中创建一个名为data的局部变量。
float *data;在分配库达内存并将值分配给局部变量data之后,内存地址似乎不会永久存储在任何地方。所以,你的记忆就变得遥不可及。
您有这一行newmat.data,但在构造中,您从未将任何值分配给成员data。您确实使用了同名的局部变量。
发布于 2018-09-25 16:15:14
你的问题是
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类成员,如
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
}https://stackoverflow.com/questions/52502526
复制相似问题