Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-01-26

Getting Started in *LISP (2)

| 18:01 | Getting Started in *LISP (2) - わだばLisperになる を含むブックマーク はてなブックマーク - Getting Started in *LISP (2) - わだばLisperになる

*LISPのチュートリアルをさらってみることの2回目。

1.2.2 Defining a Simple Automaton

この節では、簡単なオートマトンを作ってみるとのこと。

ルールは下記の通り

  1. 各々のセルは0〜9の値を持つ
  2. セルの偶数ならば、2で割る
  3. 奇数ならば、1足して2を掛ける

ということで、世代を進めるための関数を作ってみる。

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

*LISPでは、各グリッドが各々のプロセッサに一対一で割り振られていて、それぞれ値を持っている。

この値に対して一斉にある操作をしたい場合(以下面倒なので、SIMD云々と略してみる)は、!!系の名前になっている。

if!!はSIMD版のif。上記、one-stepでは、evenp!!、floor!!、*!!、1+!!がSIMD命令。

色々と定義

;; 状態の数 (0〜9で10通り)
(defvar *total-number-of-states* 10)

;; グリッドに値を設定するが、*total-number-of-states*を法とした数に設定される 
(defun set-grid (newvalue)
  (*set *automata-grid*
	(mod!! newvalue *total-number-of-states*)))

(set-grid 27)

(view 8 3)
;     DIMENSION 0 (X)  ----->
;
;7 7 7 7 7 7 7 7 
;7 7 7 7 7 7 7 7 
;7 7 7 7 7 7 7 7 

;; 乱数を設定してみる。
(set-grid (random!! 27))
(view 8 3)
;     DIMENSION 0 (X)  ----->
;
;3 4 8 4 0 3 6 0 
;1 2 3 9 2 6 2 6 
;7 6 3 4 9 3 3 3 

;; 上記は便利なので、関数として定義
(defun random-grid ()
  (set-grid (random!! *total-number-of-states*)))

;; 何世代かをまとめて実行するユーティリティ
(defun run (&optional (n 1))
  (dotimes (i n)
    (set-grid (one-step))))
  • 実験してみる
(progn
  (random-grid) ; 乱数で埋める
  (view 8 8)
  (run 100)     ; 百世代実行
  (view 8 8))   ; 結果を確認
;=>
;     DIMENSION 0 (X)  ----->
;
;0 3 1 9 2 9 5 4 
;7 3 2 3 7 4 6 3 
;5 5 4 0 4 9 9 3 
;7 8 0 9 0 7 4 5 
;5 6 8 3 0 3 3 0 
;3 2 1 3 4 4 9 9 
;2 8 4 8 4 9 6 7 
;7 4 1 4 5 1 8 0 
;
;     DIMENSION 0 (X)  ----->
;
;0 1 4 0 1 0 2 2 
;4 1 1 1 4 2 2 1 
;2 2 2 0 2 0 0 1 
;4 4 0 0 0 4 2 2 
;2 2 4 1 0 1 1 0 
;1 1 4 1 2 2 0 0 
;1 4 2 4 2 0 2 4 
;4 2 4 2 2 4 4 0 

このパターンの場合、何世代か実行すると、0、1、2、4の数値に収束する。

うーん、勿論シミュレータなので、実際には、ループに展開されているだけなのですが、実機だと実際に65536個のプロセッサで同時に計算できたりするわけで、ロマンですねー。

並列処理で思い出したのですが、Dan Friedman氏の60歳を祝って著名な関係者が記念の講演をしていて、その中にGuy Steel氏の講演もあります。

これまでGLSが研究して来た内容が数々紹介されていて面白いのですが、並列の話もしていました。

この中の説明は、*LISPではなくてConnection Machine Lispの説明になっていますが、並列の話題に限らず、非常に面白い講演なのでおすすめです!

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20080126