Julia ---- 基于 DAG图 的并行计算:Dagger

Dagger 是一个核心库之外并行计算的框架。它借鉴了Python 的 并行计算框架 Dask。它可以在许多Julia工作进程上以向无环图(DAGs)的形式高效地运行计算任务。DAGs 的数据结构就是Thunk,DAGs中每个节点成为Chunk。一个Chunk的输出可以成为下一个Chunk的输入参数。目前看Chunk 都是延迟计算的。

核心函数

delayed(f; options...)

f :是一个给定输入的函数。

options... :包含一些控制DAGs的运行的可选参数。

  • get_result::Bool——将实际结果返回给调度程序,而不是块对象。当f显式地构造块或当返回值很小时(例如,在reduce的情况下)使用
  • meta::Bool——将输入“Chunk”对象本身传递给f,而不是其中包含的值——这总是在主进程上运行
  • persist::Bool——此Thunk的结果在DAG中未使用后不应释放
  • cache::Bool——缓存这个Thunk的结果,这样如果再次计算Thunk,就可以重用缓存的值。如果它已从缓存中删除,请重新计算该值。

  collect(ctx::Context, chunk::Chunk),  获取计算结果

compute(ctx, d::Thunk),创建一个完整的DAGs.

例子

下面是一个DAGs的计算拓扑图

简单的计算,并获取计算结果

using Dagger

add1(value) = value + 1
add2(value) = value + 2
combine(a...) = sum(a)

p = delayed(add1)(4)
q = delayed(add2)(p)
r = delayed(add1)(3)
s = delayed(combine,get_result=true,meta=true)(p, q, r)

@assert collect(s) == 16

生成DAGs图

using Dagger

add1(value) = value + 1
add2(value) = value + 2
combine(a...) = sum(a)

p = delayed(add1)(4)
q = delayed(add2)(p)
r = delayed(add1)(3)
s = delayed(combine,get_result=true,meta=true)(p, q, r)

group(x...) = [x...]
top_node = delayed(group)(p,q,r,s)
compute(top_node)
#Dagger.Chunk{Any,MemPool.DRef}(Array{Int64,1}, ArrayDomain{1}((1:4,)), MemPool.DRef(1, 6, 0x0000000000000020), false)
#ArrayDomain{1}((1:4,)) 可以看到,计算共有4个步骤

collect(top_node)#获取每个步骤的计算结果
# 4-element Array{Int64,1}:
#   5
#   7
#   4
#  16

其他高级特性

我简单尝试了下,像SchedulerOptions, ThunkOptions等还无法正常使用,最起码在julia 1.0.5版本还无法使用。所以要用的话,用一些简单的功能就好了。但是一定要注意性能问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

October-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值