ラケットにパラレルマップ機能を実装してほしいです。場所は構築するのに適しているように思えますが、私にとって未知の領域です。コードは次のようになるはずだと思います。
#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: コンテキスト外で使用される識別子: 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)))