Julia中的特征分解比Mathematica慢5倍?

Dum*_*fus 10 performance linear-algebra julia

我是Julia的新手,主要在Mathematica工作,所以我可能会有一些基本的错误.我试图计算Julia计算随机矩阵的特征系统的时间,并发现它比Mathematica慢5-6倍.

在朱莉娅:

D=1000*(rand(1000,1000)-0.5);
@time (E,F)=eig(D);

Out: elapsed time: 7.47950706 seconds (79638920 bytes allocated*)
Run Code Online (Sandbox Code Playgroud)

在Mathematica中:

First@Timing@Eigensystem[RandomReal[{-500, 500}, {1000, 1000}]]

Out: 1.310408
Run Code Online (Sandbox Code Playgroud)

对于2000 x 2000阵列来说它是相似的,虽然Julia结果的速度比Mathematica调用的速度略慢,但它仍然较慢; Julia需要22秒,而Mathematica会在8秒内计算出来.

至于我在线性代数Julia标准库中读到的,通过调用LAPACK来实现分解,我认为这应该是非常好的,所以我很困惑为什么Julia代码运行得那么慢.有谁知道为什么会这样?它是在进行Mathematica不做的某种平衡或阵列对称检测吗?还是它实际上更慢?

此外,这是一个语法问题,可能是一个愚蠢的错误,但你如何改变朱莉娅的平衡?我试过了

@time (E,F)=eig(D[, balance=:nobalance]);
Run Code Online (Sandbox Code Playgroud)

完全像从Julia手册中复制和粘贴一样,但它只是给出了语法错误,所以出了点问题.

我正在使用Windows 7 64位,Julia版本0.2.0 64位,使用Steven Johnson网站上说明安装,首先安装Anaconda以处理先决条件.我使用的是Mathematica学生版9.0.1.

编辑1:

执行versioninfo()屈服

Julia Version 0.2.0
Commit 05c6461 (2013-11-16 23:44 UTC)
Platform Info:
System: Windows (x86_64-w64-mingw32)
WORD_SIZE: 64
BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY)
LAPACK: libopenblas
LIBM: libopenlibm
Run Code Online (Sandbox Code Playgroud)

所以看起来我正在使用openBLAS用于LAPACK和BLAS.一旦我获得了Mathematica实现信息,我也会添加它.

编辑2:

似乎Windows Mathematica 可能使用英特尔MKL BLAS.

And*_*ack 14

Julia的本征计算外包给LAPACKBLAS,我认为Mathematica的情况也是如此.Julia可以使用不同版本的BLAS和LAPACK,因此您可以有效地比较您对Julia的LAPACK和BLAS选择与Mathematica的LAPACK和BLAS(可能是英特尔MKL).

Julia的默认选择是OpenBLAS,它在大多数架构和我的机器上都很快.Julia比Mathematica更快地进行本征计算.如果您使用的是Linux并且已经从回购中选择了BLAS和LAPACK,那么它们很可能比OpenBLAS慢得多.

最近在Julia中添加了平衡选项,并且错误地将该选项添加到函数中eig,该函数只是该函数的MATLAB兼容接口eigfact.写作eigfact(A,balance=:nobalance)应该有效.

编辑1:进一步的调查表明,差异是由于Windows上的OpenBLAS中的线程问题.如果Julia的BLAS仅限于一个线程,则时间与Mathematica相当,但如果允许更多线程,则计算速度会减慢.这在Mac或Linux上似乎不是问题,但如上所述,OpenBLAS的性能通常取决于架构.

编辑2:最近,平衡选项已更改.可以通过写入来关闭平衡eigfact(A,permute=false,scale=false).


tho*_*oly 6

肯定至少有一件事是错的,而且好消息是它很可能是可以解决的.对于这种事情,你最好在GitHub上提交一个问题.我在这里为你做过.

关于速度,您可能需要检查特征分解的准确性是否可比.当然,准确性有时取决于矩阵的条件数; 朱莉娅可能正在使用更仔细的算法,如果条件数不是问题,您的示例可能会也可能不会显示.这绝对是在这个问题上讨论的问题.

关于:nobalance,在文档中,[, something]用于表示这something是可选的.你想用@time (E,F)=eig(D, balance=:nobalance);.但是,eig不接受关键字参数,因此代码和文档当前不同步.