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版本還無法使用。所以要用的話,用一些簡單的功能就好了。但是一定要注意性能問題。