在CUDA中以混合(HYB)格式为稀疏矩阵分配内存?

时间:2016-11-11 00:56:03

标签: c++ matrix memory-management cuda nvidia

我有一个C00格式的矩阵,我通过以下代码转换为CSR格式:

status = cusparseXcoo2csr(handle, cooRowIndex, nnz, n, 
    csrRowPtr, CUSPARSE_INDEX_BASE_ZERO);

然后我想将矩阵从CSR格式转换为HYB格式,但我不确定需要为HYB格式的矩阵分配多少内存。我已经在线查看,无法找到相关资源。应该分配多少内存?

以下是我打算用于从csr转换为hyb格式的内容:

cusparseScsr2hyb(handle_array[i], m, n, 
        descr, 
        cooVal,
        csrRowPtr, 
        cooColIndex, 
        hybA, 
        CUSPARSE_HYB_PARTITION_AUTO);

这是我分配内存的代码,但我不确定要为hybA分配内存的内容。

cudaStat1 = cudaMalloc((void**)&cooRowIndex, nnz*sizeof(cooRowIndex[0])); // Row indices for A
cudaStat2 = cudaMalloc((void**)&cooColIndex, nnz*sizeof(cooColIndex[0])); // Column indices for A
cudaStat3 = cudaMalloc((void**)&cooVal, nnz*sizeof(cooVal[0]));           // Data values for A
cudaStat4 = cudaMalloc((void**)&csrRowPtr, (n + 1)*sizeof(csrRowPtr[0]));

1 个答案:

答案 0 :(得分:1)

感谢@RobertCrovella的评论。

以下是混合矩阵的使用方法:

首先创建混合矩阵对象:

cusparseHybMat_t hybA;
cusparseCreateHybMat(&hybA);

然后将您的coo矩阵转换为csr格式:

status = cusparseXcoo2csr(handle, cooRowIndex, nnz, m, 
        csrRowPtr, CUSPARSE_INDEX_BASE_ZERO);

然后将csr矩阵转换为hyb格式:

cusparseScsr2hyb(handle, m, n, descr, cooVal,
            csrRowPtr, cooColIndex, hybA_array[i], 
            0, CUSPARSE_HYB_PARTITION_AUTO);

然后执行稀疏矩阵*密集向量运算:

status = cusparseShybmv(handle,CUSPARSE_OPERATION_NON_TRANSPOSE, &alpha, 
    descr, hybA, &xVal[0], &beta, &y[0]);