朱莉娅:宏线程和并行

时间:2018-06-11 16:23:38

标签: multithreading julia

正如我们所知,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宏更方便。您如何看待使用每个宏的优缺点?

最好的问候。

1 个答案:

答案 0 :(得分:6)

以下是我的经历:

线程

优点:

  • 共享内存
  • 以多线程产生朱莉娅的低成本

缺点:

  • 约束到一台机器
  • 必须在Julia start
  • 中指定线程数
  • 虚假分享的可能问题(here
  • 通常你必须使用锁定或原子操作才能使程序正常工作;特别是Julia中的许多函数都不是线程安全的,所以你必须小心使用它们
  • 不保证会继续保持现状Julia 1.0

Processess

优点:

  • 更好的缩放(您可以在多台机器的集群上生成它们)
  • 您可以在Julia运行时添加流程

缺点:

  • 当您必须在流程之间传递大量数据时效率低
  • 启动较慢
  • 您必须明确地向员工/员工之间共享代码和数据

摘要

流程更易于使用和更好地扩展。在大多数情况下,他们会给你足够的表现如果在并行作业之间进行大量数据传输,则线程会更好,但正确使用和调整会更加精细。