配列の並列処理 - lisp-cookbook-ja/common-lisp GitHub Wiki

一つの配列を複数のタスクに分けて処理する例です。

下記の例では、CLiki:Xecto を利用しています。

ライブラリの導入方法 (今のところSBCLのみ対応)

;;; #("1" "2" "3" ...)というような整数を文字列にしたものを要素にもつ配列
(declaim ((simple-vector 100000) *number-strings*))
(defvar *number-strings*
  (make-array 100000))

;; 初期化
(dotimes (i 100000)
  (setf (svref *number-strings* i)
        (write-to-string i)))

;;; 数字を要素に持つ配列
(declaim ((simple-array integer (100000)) *numbers*))
(defvar *numbers*
  (make-array 100000))


(aref *number-strings* 100)
;=>  "100"

(aref *numbers* 100)
;=>  0

処理例

(defconstant max-threads 2)

(progn
  (parallel-future:with-context (max-threads) ;max-threadsの値まで並列実行
    (parallel:dotimes (i (length *numbers*))
      :wait                             ;ループごとのボディ部の実行完了を待つ
      (setf (aref *numbers* i)
            (parse-integer (aref *number-strings* i)))))
  (reduce #'+ *numbers*))
;=> 4999950000