Parallel Schemeに向けたテスト

コンカレントGCの性能を落とさずに並列プログラミングを可能とする方法をいろいろ考えていましたが、どうやらparallel mapと呼ばれるものと相性が良さそうです。

Ypsilon 0.9.6-trunk/r250 Copyright (c) 2008 Y.Fujita, LittleWing Company Limited.
> (import (time))
> (time (let ()
          (define (fib n)
            (if (< n 2)
                n
                (+ (fib (- n 1))
                   (fib (- n 2)))))
          (map fib '(29 30 31 32))))
;;  1.326956 real    1.324082 user    0.004 sys
(514229 832040 1346269 2178309)
> (time (let ()
          (define (fib n)
            (if (< n 2)
                n
                (+ (fib (- n 1))
                   (fib (- n 2)))))
          (parallel-map fib '(29 30 31 32))))
;;  0.736016 real    1.316083 user    0.004001 sys
(514229 832040 1346269 2178309)

2コアのCPUでpthreadを4つ作って計算させてみました。mapをparallel-map(*1)に取り替えるだけでrealの実行時間が約55.46%となりました。これはやってみる価値がありそうですね :)

(*1) 現在のparallel-mapはかなり限定された条件でしか動きません。簡単にSEGVするのでtrunkでもまだサポートしていません。