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-12-29

Getting Started in *LISP (17)

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

今回は3.5から再開です。

3.5 Parallel Data Transformation in *Lisp

*Lispは大規模なデータの変形をサポートするオペレーションを提供しているとのことで、グリッド全体の総和を取ったり特定のグリッドに沿ってデータを累積したり色々できるとのこと。このセクションではその様なオペレーションの方法を解説。

データを変形するオペレーションは*Lispには

  1. 累積オペレーション
  2. ランキングとソート
  3. スキャン

等がある

3.5.1 Parallel Prefixing (Scanning)

上記のスキャンの方法には選択したグリッドのpvarを横断して作用するもので、scan!!が代表的。

scan!!は拡張性があり、値を掛け算したり、最大値や最小値を取ったり論理的and、or、xorが取れたり、グリッド間で値をコピーすることが可能。

全プロセッサーに2を設定し、+!!を作用させる例(pvarの表現として(!! 2)は2と書ける。)

(ppp (scan!! 2 '+!!) :end 20)
;>>> 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
;=> NIL

scan!!は :include-self 引数が取れ、各自のプロセッサが自分の値を含めるかを指定できる

(ppp (scan!! 2 '+!! :include-self nil) :end 20)
NIL 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 NIL ; テキストだと先頭が0の筈なんだけれど…

:include-selfは一つシフトさせる用途にも使えることが分かる

scan!!特有の機能として、pvarをセグメントに分けてのオペレーションがある

これには、 :segment-pvar を使用する

;; セグメントの設定: 4つ置きにTを設定し他はnil
(*defvar segments (zerop!! (mod!! (self-address!!) 4)))

;; 確認
(ppp segments :end 16)
;>> T NIL NIL NIL T NIL NIL NIL T NIL NIL NIL T NIL NIL NIL 
;=> NIL

このセグメントにscan!!を作用させてみる

(ppp (scan!! 1 '+!! :segment-pvar segments) :end 16)
;>> 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
;=> NIL

:segment-pvar を与えられたscan!!は、Tを開始地点と見做し作用することが分かる

次回 3.5.2から再開