Multithreading 朱莉娅的@spawn fetch和@sync@sync有什么区别

Multithreading 朱莉娅的@spawn fetch和@sync@sync有什么区别,multithreading,julia,Multithreading,Julia,要异步执行多个工作(排序向量,主要是函数计算(计算是计算或内存限制的,目前,我可以用以下方式编写这些操作): 使用线程@spawn 还有这种模式(看起来更干净): 对于这个特定的用例,哪一个是首选的?Julia对并行化有以下支持(另请参阅) 使用@SIMD和@inbounds宏生成SIMD程序集代码(有关详细信息,请阅读) 绿色线程(co例程)-这些不是实际的线程,但允许一个任务等待另一个任务,通常是在其他任务不消耗当前线程上的CPU的情况下。很好的示例包括等待密集的I/O操作或分布式进程的编

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

  • 使用
    线程@spawn
  • 还有这种模式(看起来更干净):


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

    Julia对并行化有以下支持(另请参阅)

  • 使用
    @SIMD
    @inbounds
    宏生成SIMD程序集代码(有关详细信息,请阅读)

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

  • 通过
    Threads
    模块执行线程。这允许生成实际的系统线程。与此列表中的下一个场景相比,优势在于所有线程共享相同的进程内存

  • 通过
    分布式
    模块进行多处理/分布式计算。这里的好处是,您可以使用相同的API从一台机器移动到一个集群。在任何HPC计算场景中,这都是首选

  • GPU计算

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

    • 如果您的函数
      f1
      f2
      f3
      主要执行I/O操作,并且不是CPU密集型(例如从internet下载文件)或等待其他进程完成-请使用绿色线程(
      @sync
      /
      @async
    • 否则,请使用
      线程
      (或
      分布式
      计算)。在CPU密集型作业中,这一点尤其重要,因为绿色线程使用单个系统线程,因此不会提高性能

    你可以将
    @sync
    线程一起使用。@spawn
    也可以。你应该写一本关于“与Julia并行编码”的书。我会买它;-)这里有几篇关于并行计算的帖子-如果你找到了它们,那或多或少就是你需要知道的一切;-)
    _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