Cuda cusparse:慢矩阵乘法(Scsrgemm)
在cusparse文档之后,我编写了以下代码,以CSR格式将两个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
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毫秒。没有医生是不可能诊断出你做错了什么的。