multithreading - Julia:宏线程和并行

标签 multithreading julia

正如我们所知,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宏更方便。您认为使用每个宏的优点和缺点是什么?

此致。

最佳答案

这是我的经验:

线程

优点:

  • 共享内存
  • 用多线程生成 Julia 的低成本

  • 缺点:
  • 受限于单机
  • 必须在 Julia 开始时指定线程数
  • 错误共享的可能问题 ( https://en.wikipedia.org/wiki/False_sharing )
  • 通常,您必须使用锁定或原子操作才能使程序正常工作;特别是 Julia 中的许多函数不是线程安全的,所以你必须小心使用它们
  • 不保证在 Julia 1.0 之后保持当前形式

  • 进程

    优点:
  • 更好的扩展(你可以在多台机器的集群上生成它们)
  • 您可以在 Julia 运行时添加进程

  • 缺点:
  • 必须在进程之间传递大量数据时效率低下
  • 启动较慢
  • 您必须明确地向/在工作人员之间共享代码和数据

  • 概括

    流程更容易使用并且可以更好地扩展。在大多数情况下,它们为您提供足够的性能。如果并行作业线程之间有大量数据传输会更好,但要正确使用和调整要精细得多。

    关于multithreading - Julia:宏线程和并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50802184/

    相关文章:

    java - 阻塞队列是否需要同步块(synchronized block)

    java - 了解并发 SQL 查询执行

    julia - 生成表达式,然后在 Julia 中检查它们

    arrays - 二维数组排序问题

    function - 函数在 Julia 中可以是局部的吗?这意味着什么?

    c++ - 将C++成员初始化构造函数转换为Julia

    ios - 如何从委托(delegate)在线程内构建我的单元格?

    java - 多线程不比单线程快(简单循环测试)

    c - 多个互斥锁如何工作?

    python - BigInts 在 Julia 中似乎很慢