#:g1: Starsimの紹介

Posted 2014-05-30 06:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の150日目です。

Starsimとはなにか

 Starsimは、Connection Machine上で稼動した超並列Lisp処理系のシミュレーターです。

パッケージ情報

パッケージ名Starsim
ソース配布サイトAllegro CL Examples and Utilities: Starsim-f20 (archive.org)
参考サイト*Lisp - Wikipedia, the free encyclopedia

インストール方法

 Franzの配布サイトは最近結構落ちていますが、archive.orgからソースは入手できるので、ダウンロードしてきてセットアップします。
ちなみにSBCL等ANSI CLで動くようにして、ASDF対応したものがありますので、良かったらどうぞ。

 Quicklispのlocal-projectsディレクトリの中に設置して

(ql:quickload :starlisp)

でロードできると思います。

試してみる

 チュートリアルに出てくるオートマトンのコード例を紹介してみます。
繰り返しではなく、グリッド状に配置されたCPUに処理を投げるというイメージになります〈もちろんシミュレーターなので超並列ではありませんが…〉

(in-package :*lisp)

(*cold-boot :initial-dimensions '(16 16)) ;>> ;>> ;>> Thinking Machines Starlisp Simulator. Version 20.0 ;>> ;>> ;=> 1 ; (16 16)

(*defvar *automata-grid* 0) ;=> *AUTOMATA-GRID*

(ppp *automata-grid* :mode :grid :end '(8 5)) ;>> ;>> DIMENSION 0 (X) -----> ;>> ;>> 0 0 0 0 0 0 0 0 ;>> 0 0 0 0 0 0 0 0 ;>> 0 0 0 0 0 0 0 0 ;>> 0 0 0 0 0 0 0 0 ;>> 0 0 0 0 0 0 0 0 ;>> ;=> NIL

(defun view (&optional (width 8) (height 5)) (ppp *automata-grid* :mode :grid :end (list width height)))

(defun set-grid (newvalue) (*set *automata-grid* newvalue))

(defun random-grid () (set-grid (random!! *total-number-of-states*)))

(defun one-step () (if!! (evenp!! *automata-grid*) (floor!! *automata-grid* 2) (*!! (1+!! *automata-grid*) 2)))

(defvar *total-number-of-states* 10)

(defun neumann-count (grid) (+!! (news!! grid 0 -1) ;; north (news!! grid 0 1) ;; south (news!! grid -1 0) ;; west (news!! grid 1 0) ;; east ))

(defun moore-count (grid) (+!! (news!! grid 0 -1) ;; north (news!! grid 0 1) ;; south (news!! grid -1 0) ;; west (news!! grid 1 0) ;; east (news!! grid -1 -1) ;; northwest (news!! grid -1 1) ;; southwest (news!! grid 1 -1) ;; northeast (news!! grid 1 1) ;; southeast ))

(defvar *neighborhood* :neumann)

(defun neighbor-count () (*let ((grid (signum!! *automata-grid*))) (ecase *neighborhood* (:moore (moore-count grid)) (:neumann (neumann-count grid)))))

;; ランダムな値で埋めて、ノイマン方式で隣人の数を勘定してみる (progn (random-grid) (view 8 8) (ppp (neighbor-count) :end '(8 8))) ;>> ;>> DIMENSION 0 (X) -----> ;>> ;>> 5 9 1 0 5 3 5 6 ;>> 3 0 4 5 5 1 2 0 ;>> 9 3 9 2 1 7 7 6 ;>> 7 6 5 2 5 7 1 1 ;>> 3 1 5 5 5 5 7 3 ;>> 0 6 0 6 2 1 2 7 ;>> 3 4 4 5 6 6 2 2 ;>> 0 7 9 1 5 0 6 2 ;>> ;>> DIMENSION 0 (X) -----> ;>> ;>> 4 3 2 3 3 4 4 2 ;>> 3 4 3 3 4 4 3 4 ;>> 4 3 4 4 4 4 4 3 ;>> 4 4 4 4 4 4 4 4 ;>> 3 4 3 4 4 4 4 4 ;>> 4 2 4 3 4 4 4 4 ;>> 2 4 3 4 4 3 4 4 ;>> 3 3 4 4 3 4 3 3 ;>> ;=> NIL

関連

 *Lispのチュートリアルがあるので、過去にこのブログで記事にしてみたりしていましたので、良かったらどうぞ。
ちなみに未だに完結していません…

まとめ

 今回は、Starsimを紹介してみました。
超並列マシンはロマンですね。

comments powered by Disqus