2016-11-11 84 views
1

我在C00格式的矩陣,這是我通過下面的代碼轉換爲CSR格式:爲混合(HYB)格式的CUDA中的稀疏矩陣分配內存?

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

那麼我想從CSR格式HYB格式矩陣轉換,但我不知道有多少內存我需要爲HYB格式的矩陣分配。我在網上查找,找不到任何資源。應該分配多少內存?

以下是我打算使用從企業社會責任轉化爲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

cusparse HYB格式爲[不透明類型](http://docs.nvidia.com/cuda/cusparse/index.html#cusparsehybmatt)。您不需要手動分配它。研究[this](https://www.mcs.anl.gov/petsc/petsc-dev/src/mat/impls/aij/seq/seqcusparse/aijcusparse.cu)。 –

回答

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]);