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程序集代码(有关详细信息,请阅读)
Threads
模块执行线程。这允许生成实际的系统线程。与此列表中的下一个场景相比,优势在于所有线程共享相同的进程内存
分布式模块进行多处理/分布式计算。这里的好处是,您可以使用相同的API从一台机器移动到一个集群。在任何HPC计算场景中,这都是首选
- 如果您的函数
,f1
,f2
主要执行I/O操作,并且不是CPU密集型(例如从internet下载文件)或等待其他进程完成-请使用绿色线程(f3
/@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