Cuda cusparse:慢矩阵乘法(Scsrgemm)

Cuda cusparse:慢矩阵乘法(Scsrgemm),cuda,gpu,Cuda,Gpu,在cusparse文档之后,我编写了以下代码,以CSR格式将两个nxn矩阵A和B相乘。也就是说,矩阵A由三个数组组成A\u vals、A\u colind和A\u rowptr。类似地,对于B。结果存储在矩阵C中 float alpha = 1.0; cusparseMatDescr_t desc; cusparseCreateMatDescr(&desc); cusparseSetMatType(desc, CUSPARSE_MATRIX_TYPE_GENERAL); cuspars

在cusparse文档之后,我编写了以下代码,以CSR格式将两个
nxn
矩阵
A
B
相乘。也就是说,矩阵
A
由三个数组组成
A\u vals
A\u colind
A\u rowptr
。类似地,对于
B
。结果存储在矩阵
C

float alpha = 1.0;

cusparseMatDescr_t desc;
cusparseCreateMatDescr(&desc);
cusparseSetMatType(desc, CUSPARSE_MATRIX_TYPE_GENERAL);
cusparseSetMatIndexBase(desc, CUSPARSE_INDEX_BASE_ZERO);

csrgemm2Info_t info = NULL;
cusparseCreateCsrgemm2Info(&info);

size_t buffer_size;
cusparseeScsrgemm2_bufferSizeExt(handle, n, n, n, &alpha,
                                 desc, A_nnz, A_rowptr, A_colind,
                                 desc, B_nnz, B_rowptr, B_colind,
                                 NULL,
                                 desc, B_nnz, B_rowptr, B_colind,
                                 info, &buffer_size));
void* buffer = NULL;
cudaMalloc(&buffer, buffer_size);
cudaMalloc(C_rowptr, sizeof(int) * (n + 1));
cusparseXcsrgemm2Nnz(handle, n, n, n,
                     desc, A_nnz, A_rowptr, A_colind,
                     desc, B_nnz, B_rowptr, B_colind,
                     desc, B_nnz, B_rowptr, B_colind,
                     desc, *C_rowptr, C_nnz,
                     info, buffer));

cudaMalloc(C_colind, sizeof(int) * *C_nnz);
cudaMalloc(C_val, sizeof(FP_T) * *C_nnz);

cusparseScsrgemm2(handle, n, n, n, &alpha,
                  desc, A_nnz, A_val, A_rowptr, A_colind,
                  desc, B_nnz, B_val, B_rowptr, B_colind,
                  NULL,
                  desc, B_nnz, B_val, B_rowptr, B_colind,
                  desc, *C_val, *C_rowptr, *C_colind,
                  info, buffer));
我希望这个代码会很快。然而,当我在特斯拉V100上使用一个实例测试代码时,
n=1000000
A
包含大约30000000个条目,
B
是一个身份矩阵,该程序花费大约10秒,比CPU(0.2秒)慢得多。
cusparsexcsrgem2nnz
cusparseScsrgemm2
都需要大约5秒的时间


这个结果对GPU正常吗?还是我在程序中犯了错误?

根据我的测试,您给定的尺寸和输入的
cusparseScsrgemm2
操作在特斯拉V100上大约需要40毫秒。没有医生是不可能诊断出你做错了什么的。