最終更新日: | 2007年10月31日 |
---|
この文書では,SILC のサンプルプログラムの1つである console プログラム (src/client/console.c) における SILC の数式 (命令記述言語) の拡張 仕様について述べる.このプログラムは,(1) SILC の数式を対話的に実行す ること,(2) たくさんの数式をファイルから読み込んで一括実行することがで きる.また,SILC の命令記述言語の仕様を拡張しており,条件分岐や反復な どを記述できる.このプログラムを用いることにより,C や Fortran など他 のプログラミング言語の処理系がなくても SILC のユーザプログラムを作成で きる.
条件分岐は以下の形式で記述する:
if (cond_expr) { stmt; ... } else if (cond_expr) { stmt; ... } else { stmt; ... }
cond_expr には後述の条件式を指定する. stmt は任意の文を表す.else 節は省略できる.中括弧は省略できない.
反復は以下の形式で記述する:
while (cond_expr) { stmt; ... }
cond_expr には後述の条件式を指定する.中括弧は省略できない.また, continue 文と break 文が利用できる.
条件式 (cond_expr) は以下の比較演算子から成る.
expr には SILC の命令記述言語で記述された式を指定する.この式の値 はスカラーでなければならない.スカラー以外 (ベクトル,行列など) の値を 取る式を与えると実行時エラーとなる.さらに,上記の条件式は次の論理演算 子および括弧により結合できる.
比較演算子および論理演算子は値として真理値を取る.真理値を取らない式は 条件式として利用できない.また,真理値を表す定数として true および false が利用できる.
console プログラムにおける比較演算子の処理方法は次の通りである.
比較演算子の左辺および右辺に指定された式をそれぞれ一時変数 _ に 対する代入文として実行する:
SILC_EXEC("_ = expr")
一時変数の値を SILC サーバから受け取る:
SILC_GET(&tmp, "_")
受け取った値をクライアント側で比較する.
SILC の命令記述言語で定義されているシステム文に加えて,以下の拡張シス テム文が利用できる.
load "ファイル名", 変数名
Matrix Market 形式の行列データファイルから行列やベクトルなどのデータ を読み込んでサーバに送る.例:
load "filename.mtx", A load "filename.mtx", b
save "ファイル名", 変数名
サーバからデータを受け取って Matrix Market 形式でファイルに保存する. 例:
save "filename.mtx", x
pprint expr
サーバから式 expr の値を受け取ってクライアント側の標準出力に印字 する.
message "文字列"
指定された文字列をクライアント側の標準出力に印字する.
条件分岐,反復,および拡張システム文はクライアント側で実行する.その他 の文 (SILC の命令記述言語における文) はサーバ側で実行する.すなわち, データはすべて SILC サーバ側で管理する (console プログラムにはデータ管 理機構はない).
文はセミコロンで区切ってつなげることができる.行末のセミコロンは省略可.
行末に \ を置くと直後の改行記号を読み飛ばす.例えば,以下の文は1行 とみなされる:
B = {1, 2, 3; \ 4, 5, 6; \ 7, 8, 9}
# から行末まではコメントとみなして読み飛ばす.
上述の拡張命令記述言語で実現した共役勾配 (Conjugate Gradient, CG) 法の プログラムを以下に示す:
# 三重対角行列 A とベクトル b を作る n = 400 A = diag(2.0 * ones(n, 1)) - diag(ones(n-1, 1), 1) - diag(ones(n-1, 1), -1) b = A * (-ones(n, 1)) # 連立一次方程式 Ax=b を CG 法で解く rho_old = 1.0 p = zeros(n, 1) x = zeros(n, 1) r = b bnrm2 = 1.0 / norm2(b) iter = 1 while (iter <= n) { rho = r' * r beta = rho / rho_old p = r + beta * p q = A * p alpha = rho / (p' * q) r = r - alpha * q nrm2 = norm2(r) * bnrm2 x = x + alpha * p if (nrm2 <= 1.0e-12) { break } rho_old = rho iter += 1 } # 解 x をファイルに保存する save "sol.mtx", x # 反復回数を表示する message "number of iterations:" pprint iter
実行方法: 上記のプログラムをファイル (例えば silc_cg.txt) に保存し, SILC サーバを起動した上で次のように console プログラムを実行する:
console silc_cg.txt
反復回数 (number of iterations) が200回で終了すれば正常動作している.
$Id: README.console.ja,v 1.5 2007/10/31 05:18:48 kajiyama Exp $