正如我们所知,Julia 支持并行性,这是 Root 于非常好的语言的东西。
我最近看到 Julia 支持线程,但在我看来它是实验性的。我注意到在使用 Threads.@Threads
的情况下宏不需要共享数组,这可能是一个计算优势,因为没有执行对象的副本。我还看到不使用 @everywhere
声明所有函数的优点。 .
谁能告诉我使用 @parallel
的好处宏而不是 @threads
宏?
下面是使用非同步宏进行并行处理的两个简单示例。
使用@threads 宏
addprocs(Sys.CPU_CORES)
function f1(b)
b+1
end
function f2(c)
f1(c)
end
result = Vector(10)
@time Threads.@threads for i = 1:10
result[i] = f2(i)
end
0.015273 秒(6.42 k 分配:340.874 KiB)
使用@parallel 宏
addprocs(Sys.CPU_CORES)
@everywhere function f1(b)
b+1
end
@everywhere function f2(c)
f1(c)
end
result = SharedArray{Float64}(10)
@time @parallel for i = 1:10
result[i] = f2(i)
end
0.060588 秒(68.66 k 分配:3.625 MiB)
在我看来,对于循环在数学上独立并且需要大量计算性能的蒙特卡罗模拟,使用
@threads
宏更方便。您认为使用每个宏的优点和缺点是什么?此致。
最佳答案
这是我的经验:
线程
优点:
缺点:
进程
优点:
缺点:
概括
流程更容易使用并且可以更好地扩展。在大多数情况下,它们为您提供足够的性能。如果并行作业线程之间有大量数据传输会更好,但要正确使用和调整要精细得多。
关于multithreading - Julia:宏线程和并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50802184/