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

Posted

技术标签:

【中文标题】当所有参数都在设备内存中时如何调用 cuSparse?【英文标题】:How to call cuSparse when ALL arguments are in device memory? 【发布时间】:2018-07-15 04:00:59 【问题描述】:

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

cusparseDgemmi(cusparsehandle,cols,cols,cols,nnz,&al,G,
        cols,cscVal,cscColPtr,cscRowInd,
        &bet,SE,cols);

其中cusparsehandlecolsnnzalbet 位于主机内存中,其余位于设备内存中。以上工作正常。

现在假设我首先将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 参考手册说"cuSPARSE API assumes that input and output data reside in GPU (device) memory, unless it is explicitly indicated otherwise by the string DevHostPtr"

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

【问题讨论】:

【参考方案1】:

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

documentation 实际上表示 alpha 和 beta 可以作为指针传递到设备或主机内存中,具体取决于您使用的指针模式设置。这就是它所说的。而你正在尝试做的与此无关。

您真正要问的是“我可以在主机代码中取消引用设备指针吗?”,答案显然是否定的,并且是您看到的段错误的来源。

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

【讨论】:

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

以上是关于当所有参数都在设备内存中时如何调用 cuSparse?的主要内容,如果未能解决你的问题,请参考以下文章

webview 正在模拟器中加载,但未在设备中加载

当设备位于我的用户目录中时,为啥 Android 模拟器会报告“未知虚拟设备”?

包装在静态函数中时,Alamofire 4.0“调用中的额外参数'方法'”

当引入参数时,从指针调用成员函数的 C++ 调用内存访问冲突

当两个成员都在同一个类中时,出现错误“非静态成员引用必须相对于特定对象”

当 Recyclerview 在 NestedScrollview 中时,如何避免绑定所有项目?