朱莉娅:宏线程和并行

Ped*_*ael 3 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 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

0.060588秒(68.66 k分配:3.625 MiB)

在我看来,对于蒙特卡罗模拟,其中循环在数学上是独立的,并且需要大量的计算性能,使用@threads宏更方便.您如何看待使用每个宏的优缺点?

最好的祝福.

Bog*_*ski 7

这是我的经历:

主题

优点:

  • 共享内存
  • 生产Julia的成本很低,有许多线程

缺点:

  • 限制在一台机器上
  • 必须在Julia start中指定线程数
  • 虚假分享可能存在的问题(https://en.wikipedia.org/wiki/False_sharing)
  • 通常你必须使用锁定或原子操作才能使程序正常工作; 特别是Julia中的许多函数都不是线程安全的,所以你必须小心使用它们
  • 不能保证在Julia 1.0之后保持现状

Processess

优点:

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

缺点:

  • 必须在进程之间传递大量数据时效率低下
  • 开始慢点
  • 您必须明确地将工作人员之间的代码和数据共享

摘要

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