多进程下多线程矩阵乘法的并行问题

环境变量设置

export JULIA_NUM_THREADS=2

Julia REPL启动命令

julia -p 2

在不使用多进程的情况下运行

rand(Float64, (10000, 10000)) * rand(Float64, (10000, 10000))

在top下能够看到CPU占用最高800%,说明使用了8个核做计算。
如果运行

using Distributed
@spawnat :any rand(Float64, (10000, 10000)) * rand(Float64, (10000, 10000))

在top下看到CPU最高占用只有100%.
问题:

  1. 为什么在指定一个worker计算时不会进行线程并行?
  2. 在单进程运行时,矩阵乘法并行时的线程数似乎与环境变量JULIA_NUM_THREADS无关,如何手动指定?

PS:

julia> versioninfo()
Julia Version 1.4.2
Commit 44fa15b150* (2020-05-23 18:35 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: AMD EPYC 7702P 64-Core Processor
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-8.0.1 (ORCJIT, znver1)

1.5 支持 Specify ENV and number of threads for remote workers · Issue #35037 · JuliaLang/julia

1 个赞

感谢解答。
另外,在单进程运行时,矩阵相乘底层调用的应该是BLAS,我设置了2个线程,而实际为什么是8个线程在运行,这个要怎么设置?

外部调用的线程数设置一般独立于Julia自己的线程数,具体到你的问题,用

LinearAlgebra.BLAS.set_num_threads(2)
1 个赞