英特尔MKL稀疏矩阵乘法包装器
sparse-dot-mkl的Python项目详细描述
稀疏点mkl
这是“英特尔MKL库”中稀疏矩阵乘法的包装。
它完全是使用ctypes
在本机python中实现的。
MKL的主要优点是多线程稀疏矩阵乘法。
在编写本文时,scipy稀疏实现是单线程的(2020-01-03)。
第二个优点是稀疏矩阵和稠密矩阵的直接相乘,而不需要任何矩阵
中间转换(也是多线程)。在
有三个函数显式可用-dot_product_mkl
,gram_matrix_mkl
,和sparse_qr_solve_mkl
:
dot_product_mkl
{cd5}
matrix_a
和matrix_b
是numpy数组(1d或2d)或scipy稀疏矩阵(CSR、CSC或BSR)。
只有当一个矩阵是稠密数组或两个稀疏矩阵都是BSR时,才支持BSR矩阵进行矩阵乘法。
不支持稀疏COO矩阵。
Numpy数组必须是连续的。在调用此函数之前,应将非连续数组复制到连续数组
功能。在
此包仅适用于浮点数据。
cast=True
将通过在必要时创建内部副本将数据转换为双精度浮点。
如果A和B都是单精度浮点数,它们将按原样使用。
cast=False
如果输入数组不是双精度或都是单精度,则会引发ValueError。
这默认为False
,原则是在没有显式的情况下不应该发生潜在的不安全的数据类型转换
说明。在
输出将是一个密集数组,除非两个输入都是稀疏的,在这种情况下,输出将是稀疏矩阵。
稀疏矩阵输出格式将与左(A)输入稀疏矩阵相同。
dense=True
将在稀疏矩阵乘法过程中直接生成密集数组。
dense
如果无论如何都要生成密集数组,则没有任何效果。
密集阵列的输出可以是行顺序或列顺序,具体取决于输入顺序。在
copy
已弃用,没有任何效果。在
reorder_output=True
将对输出矩阵中的稀疏矩阵索引进行排序。
如果输出是密集数组,则没有任何效果。
输入稀疏矩阵可以在没有警告的情况下重新排序。
这不会改变数据,只会改变数据的存储方式。
Scipy矩阵乘法不产生有序输出,因此默认为False
。在
out
是对密集输出数组的可选引用,矩阵乘法的乘积将被加到其中。
这在属性上必须与不使用时将返回的数组相同。
具体来说,它必须具有正确的形状、数据类型和列或行的主要顺序,并且必须是连续的。如果此数组的任何属性不正确,将引发ValueError。
当设置out
时,此函数将返回对同一数组对象的引用。在
如果提供了out
,则out_scalar
是{out
,这样
out := matrix_a * matrix_b + out_scalar * out
sparse_qr_solve_mkl(matrix_a, matrix_b, cast=False, debug=False)
这是一个线性方程组(AX=B)的QR解算器,其中matrix_a
是一个稀疏的CSR矩阵
并且matrix_b
是一个稠密矩阵。
它将返回密集数组X
cast=True
将通过在必要时创建内部副本将数据转换为兼容的浮点。
如有必要,还将CSC矩阵转换为CSR矩阵。在
革兰氏矩阵
gram_matrix_mkl(matrix, transpose=False, cast=False, dense=False, debug=False, reorder_output=False)
这将计算矩阵A的gram矩阵ATA,其中矩阵A是稠密的或稀疏的CSR矩阵。
它将返回生成的对称矩阵的上三角部分。
如果A是稀疏的,它将返回一个稀疏矩阵,除非设置了dense=True
。在
transpose=True
将返回AAT
reorder_output=True
将在输出矩阵中排序稀疏矩阵索引。在
cast=True
将通过在必要时创建内部副本将数据转换为兼容的浮点。
它还将转换如有必要,将CSC矩阵转换为CSR矩阵。在
要求
此包需要MKL运行时链接库libmkl_rt.so
(对于OSX,libmkl_rt.dylib
,对于WIN,mkl_rt.dll
)。
如果无法加载MKL库,则在首次导入包时将引发ImportError
。
MKL与conda的完整版本一起发布,
并且可以用conda install -c intel mkl
安装到Miniconda中。
或者,您可以将MKL共享对象的路径添加到LD_LIBRARY_PATH
(例如export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:$LD_LIBRARY_PATH
)。
MKL v2019中存在一些已知错误,可能会导致间歇性分段故障。
如果遇到任何问题,强烈建议更新到MKL v2020。在
- 项目
标签: