Cuda 当所有参数都在设备内存中时,如何调用cuSparse?

Cuda 当所有参数都在设备内存中时,如何调用cuSparse?,cuda,gpu,Cuda,Gpu,我有一个代码,它使用cusparseDgemmi将稀疏向量与稠密向量相乘: cusparseDgemmi(cusparsehandle,cols,cols,cols,nnz,&al,G, cols,cscVal,cscColPtr,cscRowInd, &bet,SE,cols); 其中cusparsehandle、cols、nnz、al和bet在主机内存中,其余在设备内存中。以上方法很好 现在假设我首先将cols移动到设备内存,然后调用cusp

我有一个代码,它使用cusparseDgemmi将稀疏向量与稠密向量相乘:

cusparseDgemmi(cusparsehandle,cols,cols,cols,nnz,&al,G,
        cols,cscVal,cscColPtr,cscRowInd,
        &bet,SE,cols);
其中
cusparsehandle
cols
nnz
al
bet
在主机内存中,其余在设备内存中。以上方法很好

现在假设我首先将
cols
移动到设备内存,然后调用cusparse:

//d_cols->cols
int *d_cols,*p_cols;
p_cols=&cols;
printf("%d\n",*p_cols);
cudaMalloc((void**)&d_cols,sizeof(int));
cudaMemcpy(d_cols,p_cols, sizeof(int), cudaMemcpyHostToDevice);

//...

//call cusparse with *d_cols instead of cols
cusparseDgemmi(cusparsehandle,*d_cols,*d_cols,*d_cols,nnz,&al,G,
        *d_cols,cscVal,cscColPtr,cscRowInd,
        &bet,SE,*d_cols);
代码将编译,但在运行时崩溃。cusparse参考手册说

如果是这种情况,那么为什么当
cols
在主机内存中而不是在设备内存中时,我的代码运行正常?当cusparse函数的所有参数都在设备内存中时,如何调用cusparse。我该怎么做

cusparse参考手册中说,“cusparse API假设 输入和输出数据驻留在GPU(设备)内存中,除非 由字符串DevHostPtr明确指示

实际上,根据您使用的指针模式设置,alpha和beta可以作为指针在设备或主机内存中传递。这就是它所说的一切。而你想做的与此无关

您真正要问的是“我可以在主机代码中取消对设备指针的引用吗?”,答案显然是否定的,这就是您看到的segfault的来源

实现这一点的唯一方法是(在支持它的平台上)使用托管内存分配这些其他参数,以便它们在主机和设备上都是有效的指针,并作为cuSparse调用的一部分取消引用它们。请注意,这样做会造成性能损失

cusparse参考手册中说,“cusparse API假设 输入和输出数据驻留在GPU(设备)内存中,除非 由字符串DevHostPtr明确指示

实际上,根据您使用的指针模式设置,alpha和beta可以作为指针在设备或主机内存中传递。这就是它所说的一切。而你想做的与此无关

您真正要问的是“我可以在主机代码中取消对设备指针的引用吗?”,答案显然是否定的,这就是您看到的segfault的来源


实现这一点的唯一方法是(在支持它的平台上)使用托管内存分配这些其他参数,以便它们在主机和设备上都是有效的指针,并作为cuSparse调用的一部分取消引用它们。请注意,这样做会造成性能损失。

感谢您的回复。这很有道理。谢谢你的回复。这是有道理的。