scipy中具有大Forder矩阵的dgemm分段断层

2024-09-30 01:20:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用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']

Tags: inimportalphanumpytruetrans顺序order
1条回答
网友
1楼 · 发布于 2024-09-30 01:20:15

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

前两个BLAS调用不别名参数,因为临时数组是在调用fortran之前生成的。也就是说,分别是由于数据类型不匹配和C-排序。在

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

相关问题 更多 >

    热门问题