Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 线性系统解算器在Julia中是否与在Matlab中一样也是多线程的?以及如何";多线程;是朱莉娅吗?_Multithreading_Matlab_Parallel Processing_Julia_Finite Element Analysis - Fatal编程技术网

Multithreading 线性系统解算器在Julia中是否与在Matlab中一样也是多线程的?以及如何";多线程;是朱莉娅吗?

Multithreading 线性系统解算器在Julia中是否与在Matlab中一样也是多线程的?以及如何";多线程;是朱莉娅吗?,multithreading,matlab,parallel-processing,julia,finite-element-analysis,Multithreading,Matlab,Parallel Processing,Julia,Finite Element Analysis,我试图比较Matlab和Julia的速度和性能。我正在看一个代码,它对承受给定载荷的连续体结构进行拓扑优化。我看到的代码是公共代码topopt88.m: 本质上,它是一种迭代算法,在每次迭代中,Ax=b系统被求解(x=a\b),其中a取决于结构设计(它是有限元刚度矩阵),并在每次迭代中更新 在Julia中,相同的代码运行速度比Matlab慢。我在Julia中做了一些代码优化,在函数定义中声明类型,尽可能多地使用函数,避免全局变量,并实现了我在internet上找到的其他技巧。但是Julia仍然比

我试图比较Matlab和Julia的速度和性能。我正在看一个代码,它对承受给定载荷的连续体结构进行拓扑优化。我看到的代码是公共代码topopt88.m:

本质上,它是一种迭代算法,在每次迭代中,Ax=b系统被求解(x=a\b),其中a取决于结构设计(它是有限元刚度矩阵),并在每次迭代中更新

在Julia中,相同的代码运行速度比Matlab慢。我在Julia中做了一些代码优化,在函数定义中声明类型,尽可能多地使用函数,避免全局变量,并实现了我在internet上找到的其他技巧。但是Julia仍然比相同的Matlab代码慢(概念步骤相同)


我的问题:既然Matlab系统解“\”是,朱莉娅也是这样吗?如果没有,如何使用多线程Julia的\运算符,或者类似地从并行化中获得加速?

默认情况下,Julia使用BLAS/OpenBLAS,您可以将其配置为多线程。这需要在多线程设置中运行Julia,并设置
BLAS.set_num_threads()
配置

以下是如何:

开始之前:

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
,因此如果您尝试一下,请写下它的基准测试方法。

以下是我找到的当前最佳解决方案,它为我提供了最佳性能。 外部Julia在Windows中的终端中键入
设置Julia\u NUM\u THREADS=4
。启动Julia并按以下方式使用线性代数模块:
使用线性代数
BLAS.set\u num\u线程(1)

这样将有4个线程,通过将BLAS线程设置为1,它基本上不会使用自己的池,这似乎与Julia线程池冲突,或者至少对我来说会降低性能。 在这方面,我得到了一些提示: 我目前在Julia 1.5.1中的BLAS设置是
julia>BLAS.vendor()
:openblas64


将Pardiso.jl与默认的MKL稀疏解算器一起使用没有帮助。我还需要弄清楚是否有办法提高性能,以及如何提高性能。

没有明确的答案,但如果只是做简单的矩阵代数,就意味着你很可能只是对调用的基础BLAS进行基准测试-我认为MATLAB使用MKL和Julia OpenBLAS,这在很多问题上可能会比较慢。您可以试试MKL.jl,看看这是否是造成差异的原因。另一方面,函数上的类型注释对于Julia中的性能并不重要,它们是用于方法分派的。一旦调用函数,将自动为任何具体类型生成优化的机器代码。julia>使用BenchmarkTools,Random julia>b=rand(50);julia>A=rand(50,50);朱莉娅>@b时间A\b;341.100μs(4次分配:20.61 KiB)julia>使用线性代数julia>BLAS.set_num_线程(1)julia>@btime A\b;16.301μs(4次分配:20.61 KiB)
julia>BLAS.set\u num\u线程(2)julia>@btime A\b;47.300μs(4次分配:20.61 KiB)julia>BLAS.set_num_线程(3)julia>@btime A\b;77.899μs(4个分配:20.61 KiB)julia>BLAS.set_num_线程(4)julia>@b时间A\b;140.001μs(4次分配:20.61 KiB)
对我来说,它在测试中给出了相反的趋势:增加线程数会增加计算时间。。。顺便说一句,在我的问题中,矩阵A是稀疏的。我在第一篇文章中提到的参考问题中也尝试过,通过在JULIA外部添加“set JULIA_NUM_THREADS=4”,在JULIA内部添加“using LinearAlgebra;BLAS.set_NUM_THREADS(1)”,我可以将原始代码的计算时间减少3秒。你知道发生了什么事吗!?:-)这就是为什么您应该始终提供MWE。如果你的矩阵是稀疏的,你需要使用
Pardiso.jl
-用法很简单。谢谢@Przemyslaw。我尝试了Pardiso,并创建了一个
ps=MKLPardisoSolver()
对象。但是,即使进程的数量随着
set\u nprocs!而改变,性能仍然很慢!(ps,2)
。我获得的最佳性能是在JULIA外部使用
set JULIA\u NUM\u THREADS=1
,在脚本
中使用linearagebra BLAS.set\u NUM\u THREADS(1)
。对于300x100网格的有限元,时间差约为3秒,这或多或少会导致60000x60000稀疏矩阵。还在想为什么。。。