如何为 Julia 多线程设置我的计算机?

and*_*ame 1 multithreading julia

我的台式机 CPU 是 intel i7-4770,它有 4 个物理内核和 8 个逻辑内核。为了获得最佳性能,我如何使用附加参数启动 Julia。“julia -p 4 -t 8”是对的吗?

在此处输入图片说明

Prz*_*fel 5

这是两种不同的选择。

  • -t 用于单个 Julia 进程的线程数
  • -p 用于(本地)Julia 集群中的进程数,这些进程中的每一个都可以有一个或多个线程。

线程和多处理之间的区别在于并行计算的模式——主要是由于任务访问内存的方式不同。对于多线程,您将使用Threadspackage 和 mutltiprocessingDistributed包。

下面的例子应该可以解决问题。

在单个进程中运行 4 个线程:

$ julia -t 4

julia> Threads.nthreads() 
4

julia> using Distributed

julia> Distributed.nworkers()
1
Run Code Online (Sandbox Code Playgroud)

运行 4 个单线程 worker(总共 5 个julia进程)并检查第二个 worker 上的线程数:

$ julia -p 4

julia> using Distributed

julia> Distributed.nworkers()
4

julia> fetch(@spawnat 2 Threads.nthreads())
1
Run Code Online (Sandbox Code Playgroud)

运行 4 个多线程 worker(总共 5 个julia进程,每个进程有 4 个线程)并检查 master 和第二个 worker 上的线程数:

$ julia -p 4 -t 4

julia> using Distributed

julia> Distributed.nworkers()
4

julia> Threads.nthreads()
4

julia> fetch(@spawnat 2 Threads.nthreads())
4
Run Code Online (Sandbox Code Playgroud)

现在关于性能,简短的回答是“视情况而定”。一些库将使用多线程功能,而其他库则大多不会。

例如LinearAlgebra,默认情况下使用BLASwhich 具有自己的多线程设置:

$ julia -t 3

julia> using LinearAlgebra

julia> BLAS.vendor()
:openblas64

julia> BLAS.get_num_threads()
8
Run Code Online (Sandbox Code Playgroud)

其他软件包,例如DataFrames目前正在为多线程大量开发的软件包,应该充分利用该-t参数。

基本上使用-t auto默认为逻辑核心数的设置可能是一个很好的设置。

在运行您自己的算法时,您将决定是采用多线程还是多处理。一般的经验法则是,对于数值计算,多线程通常更易于使用,但多处理可扩展(并且使用该--machine-file选项可以拥有巨大的分布式 Julia 集群)。