2013-12-10 3 views
8

SciPy의 dgemm을 사용하여 Python에서 A * AT를 계산하려고하는데 A에 큰 행 크기 (~ 50,000)가 있고 F에서 행렬을 전달할 때 segfault를 얻으려고합니다. -주문. 물론, 결과 행렬은 매우 큰이지만, 원인이 뭐죠 모두 sgemm 및 C-주문 작품 DGEMM을 통과은dgemm scipy에서 큰 F- 순서 행렬을 사용하여 segfaulting

>>> 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) 

은 사람이하기 전에이 버그를 경험이나 생각을 했습니까? 파이썬 2.7.3, numpy 1.8.0 및 scipy 0.13.2를 사용하고 있습니다.

EDIT : 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'] 
+0

어떤 Blas 라이브러리를 사용하고 있습니까? 'np .__ config __. blas_info'. – jtaylor

+0

정보를 포함하도록 수정 된 설명 –

답변

1

당신은 포트란를 호출 별칭 인수에 사용할 수 없습니다. 나는 이것이 당신의 문제인지 확실하지 않지만 그것이 있을지도 모릅니다.

임시 배열이 fortran을 호출하기 전에 만들어지기 때문에 첫 번째 두 BLAS 호출은 인수의 별명을 지정하지 않습니다. 즉, 각각 dtype 불일치와 C- 오더링 때문입니다.

세 번째 BLAS 호출은 인수의 별칭입니다. 시도 대신 b = A.copy(). T.