【问题标题】:sparse matrix multiplication using MKL libraries使用 MKL 库的稀疏矩阵乘法
【发布时间】:2020-10-14 09:28:24
【问题描述】:

我正在寻找一种方法来执行对称稀疏矩阵 - 矩阵乘法: X = A B 其中稀疏矩阵 A 之前以 CSR3 格式(上三角)存储,而矩阵 B 是密集的非对称矩阵。 MKL 库中是否有一个例程来执行此操作?还是他们都需要 CSR 格式的完整稀疏矩阵(从中获取句柄)而不是三角形矩阵(我构建了三角形矩阵,因为我需要在 MKL Pardiso 中使用它)?我知道 mkl_sparse_d_mv(...) 例程,但我找不到从以前存储的对称稀疏矩阵(如 CSR 格式的上三角矩阵)中获取稀疏矩阵句柄的方法。 先感谢您, 丹尼尔

【问题讨论】:

    标签: sparse-matrix matrix-multiplication


    【解决方案1】:

    您能试试 mkl_sparse_?_mm,其中 [?] == s,d,c 和 z 数据类型。 该例程执行矩阵-矩阵运算:

    Y := alpha*op(A)X + betaY 其中 alpha 和 beta 是标量,A 是稀疏矩阵,op 是矩阵 A 的矩阵修饰符,X 和 Y 是密集矩阵。

    【讨论】:

    • 谢谢 Gennady,但是如果我只有三角形 CSR 矩阵 A(即 CSR3 或 CSR 向量),如何获取矩阵结构的句柄 (op(A))?是否需要构建完整的 CSR 矩阵来获取句柄?
    • 不,我认为您不需要构建完整的 CSR。检查文档,我看到描述符支持 SPARSE_MATRIX_TYPE_SYMMETRIC 模式。因此,您可以声明类似 descrA.type = SPARSE_MATRIX_TYPE_SYMMETRIC 的内容并将此描述符放入 mkl_sparse_?_mm(....) 例程中。
    • 感谢 Gennady,是的,它似乎工作正常,但后来我注意到我通过 mkl_sparse_d_mm() 获得的结果与我使用 matlab 评估的结果不同。我也刚刚在 Intel MKL 论坛上发了一条消息,寻求帮助community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/…
    【解决方案2】:

    在大多数情况下,您可以通过将适当的偏移量指针传递给指针 B 和指针 E 的行索引,轻松地将 CSR3 存储的矩阵输入到 sparse_d_create_csr

    然后您可以告诉mkl_sparse_d_mm 稀疏矩阵是三角形的,并且您希望它被填充(我从未这样做过,也不能保证它会起作用)。

    【讨论】:

    • 我错了,它似乎不起作用,也许它需要 CSR 格式的完整矩阵而不是三角形的。我注意到只有当稀疏矩阵(我输入为 CSR 格式的三角矩阵)是对角线时它才能正常工作。这里是链接 community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/… 我在英特尔 MKL 论坛中寻求帮助的地方(目前未答复)
    【解决方案3】:

    好的,我现在可以说例程需要 CSR 格式的完整矩阵,矩阵结构描述它只会告诉例程从输入的完整 CSR 矩阵中取一个三角形(上/下),但它仍然需要它全部。

    【讨论】:

    • 好吧,我又错了,它只需要使用标志 SPARSE_MATRIX_TYPE_SYMMETRIC 而不是 SPARSE_MATRIX_TYPE_TRIANGULAR 并且可以插入稀疏矩阵的上/下三角部分。如果稀疏矩阵是对称的,则不必构建完整的 CSR 矩阵。它终于可以 100% 工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多