首页 > 解决方案 > 如何将我的计算机设置为 Julia 多线程?

问题描述

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

在此处输入图像描述

标签: multithreadingjulia

解决方案


这是两种不同的选择。

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

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

下面的例子应该可以清楚地说明问题。

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

$ julia -t 4

julia> Threads.nthreads() 
4

julia> using Distributed

julia> Distributed.nworkers()
1

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

$ julia -p 4

julia> using Distributed

julia> Distributed.nworkers()
4

julia> fetch(@spawnat 2 Threads.nthreads())
1

运行 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

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

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

$ julia -t 3

julia> using LinearAlgebra

julia> BLAS.vendor()
:openblas64

julia> BLAS.get_num_threads()
8

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

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

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


推荐阅读