我正在Ipython中准备一个小演示,我想展示在Julia中进行并行操作是多么容易。
这基本上是这里描述的蒙特卡罗Pi计算
问题是我不能让它在IPython(Jupyter)笔记本中并行工作,它只使用了一个。
我以julia -p 4
的身份启动Julia
如果我在REPL中定义函数并在那里运行它,它就可以正常工作
@everywhere function compute_pi(N::Int)
"""
Compute pi with a Monte Carlo simulation of N darts thrown in [-1,1]^2
Returns estimate of pi
"""
n_landed_in_circle = 0
for i = 1:N
x = rand() * 2 - 1 # uniformly distributed number on x-axis
y = rand() * 2 - 1 # uniformly distributed number on y-axis
r2 = x*x + y*y # radius squared, in radial coordinates
if r2 < 1.0
n_landed_in_circle += 1
end
end
return n_landed_in_circle / N * 4.0
end
function parallel_pi_computation(N::Int; ncores::Int=4)
"""
Compute pi in parallel, over ncores cores, with a Monte Carlo simulation throwing N total darts
"""
# compute sum of pi's estimated among all cores in parallel
sum_of_pis = @parallel (+) for i=1:ncores
compute_pi(int(N/ncores))
end
return sum_of_pis / ncores # average value
end
julia> @time parallel_pi_computation(int(1e9))
elapsed time: 2.702617652 seconds (93400 bytes allocated)
3.1416044160000003
但当我这样做时:
using IJulia
notebook()
尝试在笔记本电脑中做同样的事情,它只使用1个核心:
In [5]: @time parallel_pi_computation(int(10e8))
elapsed time: 10.277870808 seconds (219188 bytes allocated)
Out[5]: 3.141679988
那么,为什么Jupyter没有使用所有的核心呢?我该怎么做才能让它正常工作?
谢谢。
使用addprocs(4)
作为笔记本中的第一个命令,应该可以提供四个工人在笔记本中执行并行操作。
解决这个问题的一种方法是创建一个始终使用4个内核的内核。为此需要一些手工工作。我假设你在一台unix机器上。
在文件夹~/.ipython/kernels/julia-0.x
中,您会发现以下kernel.json
文件:
{
"display_name": "Julia 0.3.9",
"argv": [
"/usr/local/Cellar/julia/0.3.9_1/bin/julia",
"-i",
"-F",
"/Users/ch/.julia/v0.3/IJulia/src/kernel.jl",
"{connection_file}"
],
"language": "julia"
}
如果复制整个文件夹cp -r julia-0.x julia-0.x-p4
,并修改新复制的kernel.json
文件:
{
"display_name": "Julia 0.3.9 p4",
"argv": [
"/usr/local/Cellar/julia/0.3.9_1/bin/julia",
"-p",
"4",
"-i",
"-F",
"/Users/ch/.julia/v0.3/IJulia/src/kernel.jl",
"{connection_file}"
],
"language": "julia"
}
路径可能会对你有所不同。请注意,我只是给内核起了一个新名称,并添加了命令行参数`-p4。
您应该看到一个名为Julia 0.3.9 p4
的新内核,它应该始终使用4个内核。
还要注意,当您更新IJulia
时,该内核文件不会得到更新,因此无论何时更新julia
或IJulia
,都必须手动更新它。
您可以使用以下命令添加新内核:
using IJulia
#for 4 cores
installkernel("Julia_4_threads", env=Dict("JULIA_NUM_THREADS"=>"4"))
#or for 8 cores
installkernel("Julia_8_threads", env=Dict("JULIA_NUM_THREADS"=>"8"))
重新启动VSCode后,此选项将显示您的select kernel
选项。