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

Getting Started in *LISP (7)

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

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

Chapter 2 The *Lisp Language

この章では、

  1. *Lispの並列型データの基本としてのpvar
  2. データパラレリズム
  3. *Lispでの並列版関数が元のCLのどの関数に相当するか
  4. 並列版関数の定義とコンパイル

についての詳細を解説するとのこと。

2.1 Creating and Using Parallel Variables

*Lispの並列処理で基本となるデータ型は、pvar(Parallel Variable)

このpvarは各々Connection Machineの1プロセッサに対応していて、number、character、array、structure型が扱える。

2.1.1 Creating a Pvar - !!

*Lispで一番単純な並列操作は、!!(バンバンと読むそうな…)で、スカラー値を引数に取り、pvarを返します。

(!! 24)

;=> #<PVAR CONSTANT-24 :GENERAL  *DEFAULT-VP-SET* (8 4)>

これは、24という値を全部のプロセッサに送るもの。

使われるのは一時的な格納場所ということで、!!では、各プロセッサに値を保持することはできない。

2.1.2 Permanent Pvars - *defvar

値を再度設定するまで永続化したい場合は、*defvarを使う。

(*defvar my-pvar 5)

全プロセッサのmy-pvarに5を代入。

*Lispでは、最初から2つの並列版のpvarが設定されていて、並列版t!!と、nil!!がある。CLでは、tとnilに相当。

2.1.3 Local Pvars - *let

*defvarは、大域的で、ローカルにpvarを設定したい場合には、(なんか微妙な表現だな(^^; ) *letが使える

(*let ((two!! 2)
       (three!! 3.0))
  (+!! two!! three!! my-pvar))

これで、全プロセッサで2 + 3.0を計算する。演算子も+!!という並列版を使う必要あり。

2.1.4 Reading, Writing, and Printing Pvar values

プロセッサは沢山あるけれど(Connection Machine(CM-2)の場合65536個)特定のプロセッサの値を見たい場合は、prefが使える。"processor reference"の略でarefの類推から来てるらしい。

(pref my-pvar 12)
;=> 5

これは、12番プロセッサの値を取得する。上で、*defvarで全部5に設定したので、5が返ってくる。

値を代入したい場合は、*setfを使う。

(*setf (pref my-pvar 12) 42)
;=> 42
(pref my-pvar 12)
;=> 42

値をプリティプリントしたい場合は、pppか、pretty-print-pvarを使う。

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

12番目が、42になっているのが確認できる。

*setfの他には、set*が使える。これは、setqの並列版なのか、setの並列版なのかどっちなのだろう。

(*set my-pvar 9)

(ppp my-pvar :end 20)
;>>> 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 NIL

(*defvar copy-pvar)
; (ちなみに、初期化しないと#:ILLEGAL-VALUE-21421で埋まっている模様)
(ppp COPY-PVAR :end 1)

(*set copy-pvar my-pvar)
(ppp copy-pvar)
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 NIL

代入できた。

一括で扱うのには、*系、プロセッサで並列に実行させたり、その値は、!!系の名前になっているんだろうか。