gpt4 book ai didi

multithreading - julia 中的@spawn fetch 和@sync @sync 有什么区别

转载 作者:行者123 更新时间:2023-12-05 02:42:14 27 4
gpt4 key购买 nike

异步地做多项工作(排序向量,主要是函数计算(计算是计算或内存限制,目前,我可以用以下方式编写这些操作:

  1. 使用 Threads.@spawn
_f1 = Threads.@spawn f1(x)
_f2 = Threads.@spawn f2(x)
_f3 = Threads.@spawn f3(x)
y1 = fetch(_f1)
y2 = fetch(_f2)
y3 = fetch(_f3)

还有这种模式(看起来更干净):

@sync begin
@async y1 = f1(x)
@async y2 = f2(x)
@async y3 = f3(x)
end

对于这个特定的用例,首选哪个?

最佳答案

Julia 对并行化有以下支持(另见 https://docs.julialang.org/en/v1/manual/parallel-computing/)

  1. 使用 @simd@inbounds 宏生成 SIMD 汇编代码(阅读 https://docs.julialang.org/en/v1/base/simd-types/ 了解更多详情)

  2. 绿色线程(协同例程)- 这些不是实际的线程,但允许一个任务等待另一个任务,通常其他任务不占用当前线程上的 CPU。很好的例子包括等待密集的 I/O 操作或分布式进程的编排。绿色线程非常轻,可以有数千个,但它们都在单个(调用)系统线程中执行。

  3. 通过 Threads 模块的线程。这允许产生实际的系统线程。优点(与此列表中的下一个场景相比)是所有线程共享相同的进程内存。

  4. 通过 Distributed 模块进行多处理/分布式计算。这里的好处是您可以使用相同的 API 从单台机器转移到集群。在任何 HPC 计算场景中,这是要考虑的首选

  5. GPU 计算

在您的帖子中,您正在考虑绿色线程与真实线程。规则很简单:

  • 如果您的函数 f1f2f3 主要执行 I/O 而不是 CPU 密集型(例如从互联网下载文件)或等待其他进程完成 - 使用绿色线程(@sync/@async)
  • 否则使用线程(或分布式计算)。这在 CPU 密集型作业的情况下尤为重要,因为绿色线程不会给您带来任何性能提升,因为它们使用单​​个系统线程。

关于multithreading - julia 中的@spawn fetch 和@sync @sync 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67758282/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com