parallel-processing - Julia 中的并行循环 - 不希望在开始之前将工作分开
问题描述
我的机器有4个核心。当我使用 @sync @parallel 进行并行运行时,我注意到 Julia 在将作业发送到 4 个处理器之前将作业分成 4 个:
# start of do_something.jl
function do_something(i, parts)
procs = zeros(Int, parts)
procs[i] = myid()
total = 0.0
for j = 1:i * 100000000
total = total + 1e-6
end
return procs
end
# end of do_something.jl
# synctest3a.jl
addprocs(Sys.CPU_CORES)
@everywhere include("do_something.jl")
parts = 20
procs = @sync @parallel (+) for i = 1:parts
do_something(i, parts)
end
@printf("procs=%s\n", procs)
julia synctest3a.jl 的结果,表示前 5 个被发送到处理器 2,接下来的 5 个被发送到处理器 3,依此类推:
procs=[2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5]
我有一个应用程序,其中执行 do_something() 的时间变化很大(在这个玩具示例中,它或多或少与 i 成正比)。所以我真正想要的是让每个处理器在它空闲时立即执行 do_something,而不是每个处理器总是执行 1/4 的调用。我怎么做?
解决方案
推荐阅读
- jquery - 下拉雪佛龙不旋转
- firebase - 如何在 BigQuery 中合并 Google Ads 和 Firebase 数据
- android - 无法在华为和三星手机上更改可绘制颜色(色调)
- d3.js - tickSizeOuter 不等于零,但仅 yAxis 的第一个和最后一个刻度显示行
- java - Java 中的急切加载是什么?
- asp.net - EPPlus - 无法从 excel 中获取 NPV 和 IRR 函数的值
- iis - IIS 服务器是不是反映了变化?
- azure-data-factory - AzureDataFactory 如何存储过滤器操作的输出
- java - 如何通过 Springboot 服务的 2 个实例从共享位置并行访问文件?
- akka-http - akka-http中的拒绝和异常有什么区别