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-05-15

Getting Started in *LISP (9)

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

*LISPのチュートリアルを細々とさらっております。今回は、2.4章から再開

2.4 The Size and Shape of Pvars

重要な違いはあるものの、これまでの内容からもPVARとCLのアレイは似たようなものと考えることができることが分かった。

共通点としては、

  • 多数の要素を持つ
  • 要素の形(次元等)と、要素数を指定する。
  • インデックスを指定して読み書きする。
  • 関数に引数として与えられた場合は、値を渡すのではなく、参照を渡す。

等がある。

アレイのサイズの指定のように、PVARの配列サイズはどのようにして決めるか、ということになるが、cold-boot時に指定する方法と後の章で説明する方法がある。

2.4.1 Processor Grids and Configurations

とりあえず、*cold-bootでの初期化の方法の解説。

*cold-bootを呼ぶとPVARは初期化されるが、引数なしで、*cold-bootが呼ばれた場合、搭載されているCPUの数となり、2次元のグリッドで、CPUの個数に応じて適宜調整される。

8K個の場合は、64 x 128 に配置される(8192)

シミュレータの場合は、デフォルト値8 x 4(16)

2.4.2 *cold-boot

*cold-bootの様子

(*cold-boot)

Thinking Machines Starlisp Simulator.  Version 20.0

1 ;シミュレータなので、1個ということか?…。
(16 16)
Configuration Variables

グリッドについては、色々と変数がある。

CPUの数

*number-of-processors-limit*
;=> 256

グリッドの形状

*current-cm-configuration*
;=> (16 16)

2.4.3 Processor Grids and Pvar Shapes

*current-cm-configuration*が8192の場合、(!! 24)を実行すると、64 * 128のグリッド全部に24が格納された状態になっている。

2.4.4 Pvars of Different Shapes and Sizes-VP Sets

プログラム中で、pvarのグリッドの形を変更したくなった場合はどうするか。

そういう場合のためにvirtual processor sets (VP sets)という概念が用意されているが、とりあえず、初歩的な説明を続けるとのこと。

2.5 Calling Parallel Functions

並列関数?を色々と使ってみた例

(ppp (+!! (self-address!!) 3) :end 20)
;>>> 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 

(ppp (*!! (self-address!!) pi) :end 4)
;>>> 0.0d0 3.141592653589793d0 6.283185307179586d0 9.42477796076938d0

(ppp (float!! (1+!! (self-address!!))) :end 12)
;>>> 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0

(ppp (sin!! (*!! (self-address!!) (/!! pi 4))) :end 4)
;>>> 0.0d0 0.7071067811865475d0 1.0d0 0.7071067811865476d0 

(let ((i #C(0.0 1.0)))
  (ppp (exp!! (*!! 2 pi i)) :end 3))
>>> #C(1.0d0 -2.4492127076447545d-16) #C(1.0d0 -2.4492127076447545d-16) #C(1.0d0 -2.4492127076447545d-16)
;; シミュレータだと、数値がちょっと違う…

(ppp (random!! 20) :end 20)
;>>> 3 5 13 4 7 18 15 13 18 19 10 0 8 11 12 4 11 14 9 9
*Lispの関数名について

CLの関数に対応するものが、*Lispの並列版として用意されているが、

  • 大抵末尾に'!!'が付くか、先頭に'*'が付く
  • 動作は殆ど同じだが、並列に動作する

のが特徴。

'!!'(読み:バンバン)が末尾に付いたものは、並列に動作し、いつもPVARを返す。

'*'(読み:スター)が付いたものは、並列に動作するが、基本的にPVARは返さないもの。

という方針で名付けられているとのこと。

2.6 Printing Pvars in Many Ways

PVARのプリティプリント関数である、pppの解説。

オプションを色々解説。

一番簡単なオプションは、:endで、指定した場所まで、表示する。

(*defvar my-pvar 5)

(ppp my-pvar :end 20)
;>>> 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 

:start は開始位置を指定する。

(ppp (self-address!!) :start 20 :end 30)
;>>> 20 21 22 23 24 25 26 27 28 29

:per-line で一行あたりの表示個数を指定できる。

(ppp (self-address!!) :end 30 :per-line 12)
0 1 2 3 4 5 6 7 8 9 10 11 
12 13 14 15 16 17 18 19 20 21 22 23 
24 25 26 27 28 29 

:grid を使うことで現在のグリッドを表示することもできる。

(ppp (self-address!!) :mode :grid :end '(4 4))

;>>>
;     DIMENSION 0 (X)  ----->
;
;0 16 32 48 
;1 17 33 49 
;2 18 34 50 
;3 19 35 51 

:format を付けてさらにみやすく整形。フォーマット指示子は、formatと同じものが使えるらしい。

(ppp (self-address!!) :mode :grid :end '(4 4) :format "~2D ")
;>>>
;     DIMENSION 0 (X)  ----->
;
; 0 16 32 48 
; 1 17 33 49 
; 2 18 34 50 
; 3 19 35 51 

(ppp (self-address!!) :end 32 :per-line 8 :format "~2D " :title "Send addresses")

:title で、グリッドのタイトルを指定可能
;>>>
;Send addresses:
; 0  1  2  3  4  5  6  7 
; 8  9 10 11 12 13 14 15 
;16 17 18 19 20 21 22 23 
;24 25 26 27 28 29 30 31