我想在Racket中實現一個並行映射功能。地方似乎是正確的事情,但他們對我來說是一個未知的領域。我在想代碼看起來應該如下所示。如何使用Places編寫並行圖?
#lang racket
; return xs split into n sublists
(define (chunk-into n xs)
(define N (length xs))
(cond [(= 1 n) (list xs)]
[(> n N)
(cons empty
(chunk-into (sub1 n) xs))]
[else
(define m (ceiling (/ N n)))
(cons (take xs m)
(chunk-into (sub1 n) (drop xs m)))]))
(module+ test
(check-equal? (length (chunk-into 4 (range 5))) 4)
(check-equal? (length (chunk-into 2 (range 5))) 2))
(define (parallel-map f xs)
(define n-cores (processor-count))
(define xs* (chunk-into n-cores xs))
(define ps
(for/list ([i n-cores])
(place ch
(place-channel-put
ch
(map f
(place-channel-get ch))))))
(apply append (map place-channel-put ps xs*)))
這給了錯誤:
f: identifier used out of context in: f
所有我見過的顯示提供了一個主要功能不帶參數這在某種程度上得到的的設計模式的例子用來實例另外的地方,但是這使用起來非常麻煩,所以我正在積極努力避免它。這可能嗎?
注:我也嘗試使用期貨製作並行圖。不幸的是,對於我所有的測試來說,它實際上比map更慢(我嘗試使用fib的遞歸過程版本進行測試),但在這種情況下,如果您有任何提高速度的建議。
(define (parallel-map f xs)
(define xs** (chunk-into (processor-count) xs))
(define fs (map (λ (xs*) (future (thunk (map f xs*)))) xs**))
(apply append (map touch fs)))
我確實在unstable中看到open-place,它將錯誤更改爲unbound。 – wdkrnls