【问题标题】:How to return sparse matrix from CUSP::csr_matrix in MEX to Matlab?如何将稀疏矩阵从 MEX 中的 CUSP::csr_matrix 返回到 Matlab?
【发布时间】:2018-06-08 23:24:16
【问题描述】:

我正在开发我的 MEX 文件,用于使用 CUDA 进行稀疏矩阵计算。我正在使用 CUSP 库。我不知道如何将 cusp::csr_matrix 返回到 Matlab。例如,我有

cusp::csr_matrix<mwIndex,double,cusp::host_memory> At(m,n,N);

所以,它是 CSR 格式的 At 矩阵,可以说,我已经计算过了。现在,我必须将它返回给 Matlab。像这样的:

plhs[0] = At;

但是,当然,它不是那样工作的,首先是因为 At 在 GPU 上。我想我应该使用 At.values 和索引方法。但是,如何将它们分配给主机数据?

有人可以建议如何做所有这些吗? :)

【问题讨论】:

    标签: matlab return sparse-matrix mex cusp-library


    【解决方案1】:

    Matlab 也以 CSR 格式存储稀疏矩阵,因此并不复杂。您所要做的就是使用mxArray *mxCreateSparse(mwSize m, mwSize n, mwSize nzmax, mxComplexity ComplexFlag); 分配稀疏矩阵,然后设置pr、ir、jc 数组(使用mxGetPrmxGetIrmxGetJc)。 Pr 对应于 cusp 中的 values 数组,ir 对应于 column_indices,jc 对应于 row_offsets。如果矩阵在设备内存中,请使用cudaMemcpycudaMemcpyDeviceToHost 复制它。 Here 是一些使用稀疏矩阵的例子(它适用于 Octave,但也适用于 Matlab)。

    【讨论】:

    • 谢谢。此外,我发现,在使用 CUSP 的情况下,可以使用 Thrust。例如,设备向量 Xg 可以像这样返回到 Matlab 数组 T: mxArray *T = mxCreateDoubleMatrix(n, 1, mxREAL);双 *x = mxGetPr(T);推力::复制(xg.begin(), xg.end(), x);
    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 2012-06-20
    • 2017-07-02
    • 2022-08-18
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多