Cuda cusparse稀疏密集乘法x4比x100多花更多时间

Cuda cusparse稀疏密集乘法x4比x100多花更多时间,cuda,Cuda,使用cusparse,我首先尝试了以下大小的稀疏密集乘法: C1 [8692 x 8692] = A1 [8692 x 7000 sparse] x B1 [7000 x 8692] C2 [8820 x 8820] = A2 [8820 x 32000 sparse] x B2 [32000 x 8820] 只需要0.3秒。然后我做了另一个尺寸如下的: C1 [8692 x 8692] = A1 [8692 x 7000 sparse] x B1 [7000 x 8692] C2 [88

使用cusparse,我首先尝试了以下大小的稀疏密集乘法:

C1 [8692 x 8692] = A1 [8692 x 7000 sparse] x B1 [7000 x 8692]
C2 [8820 x 8820] = A2 [8820 x 32000 sparse] x B2 [32000 x 8820]
只需要0.3秒。然后我做了另一个尺寸如下的:

C1 [8692 x 8692] = A1 [8692 x 7000 sparse] x B1 [7000 x 8692]
C2 [8820 x 8820] = A2 [8820 x 32000 sparse] x B2 [32000 x 8820]
所需时间因稀疏矩阵中的内容而异,但范围为30秒到90秒。我能做些什么来加速它吗?如果可以减少运行时间,我可以用不同的方式切碎矩阵,但我不确定这里的性能问题是什么

稀疏矩阵A1和A2以CSR格式存储,它们的稀疏模式不好,但它们同样不好。下图显示了非零元素分别位于A1和A2中的位置。在这两种情况下,每列的非零元素都被控制为固定在127


根据矩阵的稀疏模式,应将矩阵A1分成两部分,矩阵A11包含大约前8000行,A12包含剩余行,并使用csrmv两次。通过这种方式,cusparse将为每行的线程数选择更好的启发式方法

您还应该考虑使用CutPARSE 6 CSRMv2中的新版本和转置情况。您需要先转置B(使用cublasgeam)并执行以下操作:

C=A1*(B')'

转置情况要好得多,因为对B的访问都是合并的


另一个选项是加密A1(使用cusparsecsr2dense)和使用cublas

非常感谢!我试试看。你是指第6章中的csrmm2吗?矩阵B转置总是更好吗?