Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CUDA:统一内存和指针地址的更改?_C++_Memory_Cuda_Unified Memory - Fatal编程技术网

C++ CUDA:统一内存和指针地址的更改?

C++ CUDA:统一内存和指针地址的更改?,c++,memory,cuda,unified-memory,C++,Memory,Cuda,Unified Memory,我正在使用cuBlas为一些矩阵运算创建一个库。我首先实现了一个矩阵mult 库头类(.h文件)的代码段 #包括“cusolverDn.h”//NOLINT #包括“cuda_runtime.h”//NOLINT #包括“设备启动参数.h”//NOLINT 名称空间感知{ 名称空间矩阵{ 类CudaMatrix转换{ 公众: CudaMatrix转换(); ~cudaMatrix转换(); 无效矩阵乘法(double*A,double*B,double*C,常数int m,常数int k,常数

我正在使用cuBlas为一些矩阵运算创建一个库。我首先实现了一个矩阵mult

库头类(.h文件)的代码段


#包括“cusolverDn.h”//NOLINT
#包括“cuda_runtime.h”//NOLINT
#包括“设备启动参数.h”//NOLINT
名称空间感知{
名称空间矩阵{
类CudaMatrix转换{
公众:
CudaMatrix转换();
~cudaMatrix转换();
无效矩阵乘法(double*A,double*B,double*C,常数int m,常数int k,常数int n);
私人:
//库布拉斯材料
cudaError_t cudaStat1;
cudaError_t cudaStat2;
cublasHandle_t cublasH;
Cubrasstatus_t cublas_状态;
};
}//名称空间矩阵\u变换
}//名称空间感知\u核心
#endif//LIB\u CUDA\u例程\u包含\u矩阵\u变换\u H_
乘法的库类实现片段(.cu文件)

//计算矩阵mult C(m,n)=A(m,k)*B(k,n)
void CudaMatrix转换::MatrixMultiplicationDouble(
双*A,双*B,双*C,整数m,整数k,常数整数n){
//计算每个数组的大小
尺寸s_A=m*k;
尺寸s_B=k*n;
尺寸s=m*n;
//创建要在GPU中使用的阵列
double*d_A=NULL;
double*d_B=NULL;
double*d_C=NULL;
//分配内存
cudaStat1=cudaMallocManaged(&d_A,s_A*sizeof(双精度));
cudaStat2=cudaMallocManaged(&d_B,s_B*sizeof(双精度));
断言(cudaSuccess==cudaStat1);
断言(cudaSuccess==cudaStat2);
cudaStat1=cudaMallocManaged(&d_C,s_C*sizeof(双精度));
断言(cudaSuccess==cudaStat1);
//将数据复制到设备数据
memcpy(d_A,A,s_A*大小(双));
memcpy(d_B,B,s_B*sizeof(double));
//设置用于使用CUDA的内容
int-lda=m;
int-ldb=k;
int ldc=m;
常数双alf=1;
常数双下注=0;
常数双*alpha=&alf;
常数双*beta=&bet;
cublas_status=cublasCreate(&cublasH);
断言(cublas_status==cublas_status_SUCCESS);
//乘法
cublas_status=cublasDgemm(cublasH,//CUDA句柄
CUBLAS_OP_N,CUBLAS_OP_N,//对矩阵不进行运算
m、 n,k,//矩阵中的维数
alpha,//用于乘法的标量
d_A,lda,//矩阵d_A及其前导dim
d_B,ldb,//矩阵d_B及其前导dim
beta,//用于乘法的标量
d_C,ldc//矩阵d_C及其前导dim
);
cudaStat1=cudaDeviceSynchronize();
断言(cublas_status==cublas_status_SUCCESS);
断言(cudaSuccess==cudaStat1);
//破坏把手
cublasH(cublasH);
C=(双*)malloc(s_C*sizeof(双));
memcpy(C,d_C,s_C*sizeof(double));
//确保释放资源
if(d_A)cudaFree(d_A);
if(d_B)cudaFree(d_B);
if(d_C)cudaFree(d_C);
回来
}
CudaMatrixTransformations::CudaMatrixTransformations(){
cublas_status=cublas_status_SUCCESS;
cudaStat1=cudaSuccess;
cudaStat2=cudaSuccess;
}
然后我创建了一个gtest程序来测试我的功能。其中我传递了一个
double*result=NULL作为my
MatrixMultiplicationDouble
函数中的my
C
参数

gtest程序的片段(.cc文件)

TEST\u F(矩阵传输测试,矩阵乘法){
双locu_q[]={3,4,5,6,7,8};
双*q=loc_q;
双loc_w[]={0,1,2,3,4,5,6,7,8,9,10,11};
双*w=loc_w;
double*result=NULL;
双LOCU结果[M_行*M_列]={14,50,86,122,23,86,149,212};
矩阵结果=定位结果;
尺寸m=4;
尺寸k=3;
尺寸n=2;
感知核心::矩阵变换::CudaMatrix变换;
矩阵乘双(w,q,result,m,k,n);
自动rr=std::addressof(结果);
printf(“\nC地址:%p\n”,rr);

std::cout这一行没有做您需要的事情:

cudaStat1 = cudaMallocManaged(&C, s_C * sizeof(double));
当您修改
C
指针的数值时,该修改将不会显示在调用环境中。这是按值传递的性质,而
C
指针的数值在调用
CudaMatrixTransformations::MatrixMultiplicationDouble
时按值传递

因此,该行将在函数内部工作(可能),但结果不会以这种方式传递回调用环境

我建议你修改你的代码,这样你就可以像处理
a
B
一样处理
C
。创建一个额外的指针
d_C
,对其执行
cudamalocmanaged
,然后在返回之前,
memcpy
d_C
的结果返回
C
s在调用此函数之前,假定您正确分配了
C
指针

还要注意的是,最后你释放了
A
B
——我认为这不是你想要的。你应该在返回之前释放
d_A
d_B
d_C

代码还有其他问题。例如,您提到返回
结果
指针,但我没有看到任何证据。实际上,我没有看到任何名为
结果
的指针。此外,函数原型(在类定义中)与您的实现不匹配。原型建议返回
double*
,而您的实现返回
void

由于我列出了观察结果,我不认为您使用的
addressof
提供了您认为是的信息。如果您要比较数值指针值,您需要比较值本身,而不是这些值存储位置的地址。

谢谢