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
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 运行时添加进程
缺点:
- 当您必须在进程之间传递大量数据时效率低下
- 启动较慢
- 您必须明确地向/在工作人员之间共享代码和数据
概括
流程更容易使用并且可以更好地扩展。在大多数情况下,它们可以为您提供足够的性能。如果您在并行作业之间进行大量数据传输,线程会更好,但正确使用和调整会更加精细。
推荐阅读
- javascript - 另一个谷歌地图地理编码问题
- json - 如何在使用 AWS Database Migration Service 将 csv 从 S3 迁移到 RDS 时定义表结构
- javascript - 使用角色时如何正确注销
- typescript - Typescript redux 连接组件类型错误
- javascript - 如何在node.js中将对象存储在数据库中
- javascript - JQuery获取最接近的td文本值
- java - 在android中将整个列表视图数据转换为数组列表时应用程序崩溃
- sql - 带有if逻辑的sql查询
- kubernetes - 如何获取 Kubernetes 中 Pod 的资源使用情况?
- javascript - 如何在 jQuery 对象选择器链中找到最后一个实际元素?