我正在尝试比较 Matlab 和 Julia 之间的速度和性能。我正在查看一个代码,该代码对承受给定负载的连续体结构进行拓扑优化。我正在查看的代码是公共(public)代码topopt88.m:https://www.topopt.mek.dtu.dk/Apps-and-software/Efficient-topology-optimization-in-MATLAB
本质上,它是一种迭代算法,其中在每次迭代中求解 Ax=b 系统(x=A\b),其中 A 取决于结构设计(它是有限元刚度矩阵),并且在每次迭代中都会更新。
在 Julia 中,相同的代码运行速度比 Matlab 慢。我在 Julia 中做了一些代码优化,在函数定义中声明类型,尽可能使用函数,避免使用全局变量,以及实现我在互联网上找到的其他技巧。但是 Julia 仍然比相同的 Matlab 代码慢(在概念步骤的意义上相同)。
我的问题:由于Matlab系统解决“\”是multi threaded by default , Julia 也是这样吗?如果没有,如何多线程 Julia 的\运算符,或者类似地从并行化中获得加速?
最佳答案
默认情况下,Julia 使用 BLAS/OpenBLAS,您可以将其配置为多线程。这需要在多线程设置中运行 Julia 并设置 BLAS.set_num_threads()
配置。
方法如下:
在开始 Julia 之前:
set JULIA_NUM_THREADS=4
或在 Linux 上export JULIA_NUM_THREADS=4
现在让我们在一个线程中测试:julia> using BenchmarkTools, Random
julia> const b = rand(50);
julia> const A = rand(50,50);
julia> @btime A \ b;
424.899 μs (4 allocations: 20.61 KiB)
现在是多线程:julia> using LinearAlgebra
julia> BLAS.set_num_threads(4)
julia> @btime A \ b;
175.701 μs (4 allocations: 20.61 KiB)
你可以看到在我的机器上加速超过了 2 倍。另一个加快速度的选择是将 Julia 切换到 MKL。
julia> pkg"add https://github.com/JuliaComputing/MKL.jl"
julia> pkg "build MKL"
# restart Julia
我没用过MKL.jl
所以如果你试一试,请写下它是如何进行基准测试的。
关于multithreading - 线性系统求解器在 Julia 中是否也像在 Matlab 中一样是多线程的?以及如何在 Julia 中对其进行 "multithread"处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64091728/