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-06-01

Getting Started in *LISP (11)

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

今回は、3章から再開です。

Chapter 3: Parallel Programming Tools

これまで、CLとの共通点が多くあることをみてきたが、この章では*Lisp特有のところをみてゆく、とのこと。

3.1 Data Parallel Programming

*Lispのデータ操作には大別すると5種類ある。

  1. プロセッサを選択し一連のオペレーションを実行するもの
  2. Connection Machine内のプロセッサ間のデータ移動をするもの
  3. ホストコンピュータとConnection Machine間のデータ転送をするもの
  4. データを合成/加工するもの
  5. pvarの形を決定するもの

以下、それぞれに2づつ例を挙げてゆく

3.2 Processor Selection Operators

常に全プロセッサで計算をしたいとは限らないので、*Lispでは各々のプロセッサを指定して計算したりしなかったりできる。

デフォルトで*cold-bootした場合、全プロセッサは活性状態であるとのこと。

3.2.1 Processor Selection - Doing More by Doing Less

条件分岐のようにプロセッサ毎に特定の命令を実行したりしなかったりすることができて、例えば、CLのwhenのような*whenや、if!!が使える。

色々試してみる。

(*defvar data 4)

;; とりあえず全部4で埋める
(ppp DATA :end 20)
;>>> 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 
;==> NIL

;; self-address!!ではプロセッサの番号を取得できるが、
;; 番号の性質を判定して実行

(ppp (self-address!!) :end 20)
;>>> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
;==>  NIL

(ppp (evenp!! (self-address!!)) :end 20)
;>>>T NIL T NIL T NIL T NIL T NIL T NIL T NIL T NIL T NIL T NIL 
;==> NIL

;; ==> 偶数番号のプロセッサはTを返していることがわかる


;; ちょっと応用
;; アドレスが偶数番号のプロセッサの値に3を加える

(*when (evenp!! (self-address!!))
  (*set data (+!! data 3)))

(ppp DATA :end 20)
;>>> 7 4 7 4 7 4 7 4 7 4 7 4 7 4 7 4 7 4 7 4 
;==> NIL

;; if!!
(ppp (if!! (oddp!! (self-address!!))
           (+!! data 3)
           (-!! data 3))
     :end 20)
;>>> 4 7 4 7 4 7 4 7 4 7 4 7 4 7 4 7 4 7 4 7
;==>  NIL

self-address!!に似たものとして、enumerate!!という数え上げの関数がある。

;; 0で埋める
(*defvar empty-pvar 0)

(ppp empty-pvar :end 20)
;>> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
;==> NIL

;; 偶数番プロセッサで、enumerate!!を実行
(*when (evenp!! (self-address!!))
  (*set empty-pvar (enumerate!!)))

(ppp empty-pvar :end 20)
;>>> 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0
;==> NIL

条件を満したところがenumerate!!の結果で埋まっていることが分かり、順に数え上げられている。

3.2.2 The Processor Selection Operators of *Lisp

*LispにはCLのwhen, unless, if, cond, case, ecaseに対応する述語に加えて、独自の

*allとwith-css-savedという述語が用意されているが詳細は解説しないとのことで、リファレンスを参照せよ、とのこと。

リファレンスもないので、とりあえず、どういうものかを試して探ってみたものの、良く分からず…。

*allは、定義を眺める限りでは、こんな定義。どうやら全プロセッサを選択した状態でなにかをする時に使うものらしい…。

with-css-savedは、currently selected setの状態を保持しつつボディ部を実行するものの様子。しかし、これも詳細不明…。

次回3.3章から再開です。