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的本征计算外包给LAPACK和BLAS,我认为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).