如何在 CUDA 中实现密集 x 块对角矩阵乘法?

How to implement dense x block-diagonal matrix multiplication in CUDA?

假设您有一个大小为 1500x500 的密集矩阵,您需要将它与一个大小为 500x500 的块对角矩阵相乘,该矩阵由位于对角线上的十个大小为 50x50 的子矩阵组成:

S 0 ... 0 0
0 S     0 0
...
0 0 ... S 0
0 0 ... 0 S  <- each S is 50x50

有时所有 S 都相等,有时不相等。

我还没有分析过,但我觉得直接的 CUBLAS 乘法会在零上浪费太多时间。有什么有效的方法可以实现这样的乘法吗?

您可以使用 cuSparse with the Block Compressed Sparse Row Format as described here。您的矩阵类型可能受益于其他优化,但现在可以使用此优化。

或者,您可以使用 cublas<>gemmBatched 按行或列块访问密集矩阵,并将块对角线定义为一组较小的密集矩阵(可能重复使用相同的数据)。