multithreading - 线性系统求解器在 Julia 中是否也像在 Matlab 中一样是多线程的?以及如何在 Julia 中对其进行 "multithread"处理?

标签 multithreading matlab parallel-processing julia finite-element-analysis

我正在尝试比较 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/

相关文章:

matlab - Matlab 中的 4D 可视化(曲面和网格)

c - 数组的POD结构

java - 具有同步数组列表的并行任务

node.js - Node.js 中子进程之间的通信

java - 如何调试Java中无法解释的线程中断

.net - 多个属性的线程安全模式

algorithm - 多边形算法解释中的点

c++ - 在 C++ 中实现 matlab hist()

java - 如何编写服务器/客户端视频和音频流应用程序的代码?

java - 为什么这个片段抛出 NullPointerException