正如我们所知,Julia支持并行性,这是根植于非常好的语言的东西。
我最近看到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
宏更方便。您如何看待使用每个宏的优缺点?
最好的问候。
答案 0 :(得分:6)
以下是我的经历:
优点:
缺点:
优点:
缺点:
流程更易于使用和更好地扩展。在大多数情况下,他们会给你足够的表现如果在并行作业之间进行大量数据传输,则线程会更好,但正确使用和调整会更加精细。