dgemm segfaulting与scipy中的大F阶矩阵

时间:2013-12-10 17:48:54

标签: python numpy matrix scipy blas

我正在尝试使用SciPy的dgemm在Python中计算A * A.T,但是当A具有大的行维度(~50,000)并且我以F顺序传递矩阵时得到段错误。当然,得到的矩阵非常大,但是sgemm和传递给C阶的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']

1 个答案:

答案 0 :(得分:1)

调用Fortran时,不允许使用别名参数。我不确定这是不是你的问题,但可能是。

前两个BLAS调用不对参数进行别名,因为在调用fortran之前会生成临时数组。也就是说,分别由于dtype不匹配和C排序。

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