繁体   English   中英

scipy中具有大F阶矩阵的dgemm segfaulting

[英]dgemm segfaulting with large F-order matrices in scipy

我正在尝试使用SciPy的dgemm在Python中计算A * AT,但是当A具有较大的行维(〜50,000)并且我以F顺序传递矩阵时,会遇到段错误。 当然,产生的矩阵非常大,但是在C阶工作中sgemm和传递给dgemm,

>>> import numpy as np
>>> import scipy.linalg.blas
>>> A = np.ones((50000,100))
#sgemm works, A.T is in F-order
>>> C = scipy.linalg.blas.sgemm(alpha=1.0, a=A.T, b=A.T, trans_a=True);
#dgemm works, A is in C-order (slower)
>>> C = scipy.linalg.blas.dgemm(alpha=1.0, a=A, b=A, trans_b=True); 
#dgemm segfaults when both are in F order
>>> C = scipy.linalg.blas.dgemm(alpha=1.0, a=A.T, b=A.T, trans_a=True);
Segmentation fault (core dumped)

有没有人经历过这个错误,或者是什么原因导致的? 我正在使用Python 2.7.3,numpy 1.8.0和scipy 0.13.2。

编辑:FWIW,这是产生错误的唯一顺序。

>>> C = scipy.linalg.blas.dgemm(alpha=1.0, a=A.T, b=A, trans_a=True, trans_b=True)
>>> C = scipy.linalg.blas.dgemm(alpha=1.0, a=A, b=A.T)

以上两种都成功。

编辑:BLAS信息

blas_opt_info:
libraries = ['ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/lib/atlas-base']
define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')]
language = c
include_dirs = ['/usr/include/atlas']

调用Fortran时,不允许为别名自变量。 我不确定这是否是您的问题,但可能是。

前两个BLAS调用不为参数加上别名,因为临时数组是在调用fortran之前创建的。 也就是说,分别由于dtype不匹配和C顺序。

第三个BLAS调用将参数作为别名。 尝试使用b = A.copy()。T代替。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM