我试图使用SciPy的dgemm在Python中计算A.T,但是当A具有较大的行维数(~50000)并且我以F顺序传递矩阵时,会得到一个segfault。当然,得到的矩阵非常大,但是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)
有没有人以前经历过这个错误,或者知道是什么引起的?我使用的是python2.7.3、numpy 1.8.0和scipy0.13.2。在
编辑:FWIW,这是唯一产生错误的顺序。在
^{pr2}$以上两种方法都成功了。在
编辑: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之前生成的。也就是说,分别是由于数据类型不匹配和C-排序。在
第三个BLAS调用为参数取别名。尝试使用b=A.copy().T。在
相关问题 更多 >
编程相关推荐