目次
本文書では,SILC の応用プログラム(ユーザプログラム)を作成するために 必要となる情報を提供する.まず SILC サーバのコンパイル方法と実行方法 について述べる.次に C 言語と Fortran によるユーザプログラムの開発 方法について述べる.さらに SILC の数式 (命令記述言語) について解説し, 最後に API の詳細をまとめる.
SILC サーバをコンパイルして動かすには以下のソフトウェアがインストール された Unix/Linux 環境または Windows 環境が必要である.
C/Fortran コンパイラ
GNU Make
GNU Bison
GNU Flex
また, 以下の行列計算ライブラリを SILC サーバに組み込んで利用できる.
BLAS, LAPACK (http://www.netlib.org/)
Lis 1.0.2 (http://www.ssisc.org/lis/)
FFTSS (http://www.ssisc.org/fftss/)
SILC の動作が確認されている計算環境(括弧内は後述する make.inc の作成例を示す inc/ ディレクトリ
内のファイル名),OS,およびコンパイラは以下の通りである.「OpenMP」の欄は
当該環境における OpenMP のサポートの有無を示す.
表 1. テスト環境
| 計算環境 | OS | コンパイラ | OpenMP |
|---|---|---|---|
| Sun Fire 3800 (make.sunfire) | Solaris 9 (sparc) | Sun ONE Studio 7 | Yes |
| SGI Altix 3700 (make.altix) | Red Hat Linux Advanced Server 2.1 | Intel C 9.1 Intel Fortran 9.1 | Yes |
| IBM eServer xSeries 335 (make.linux-icc-32) | Red Hat Linux 8.0 | Intel C 9.0 Intel Fortran 9.0 | Yes |
| Dell PowerEdge SC 1420 (make.linux-icc-64) | Fedora Core 4 | Intel C 9.0 (EM64T) Intel Fortran 9.0 (EM64T) | Yes |
| IBM OpenPower 710 (make.openpower) | SuSE Linux Enterprise Server 9 (ppc) | IBM XL C 7.0 IBM XL Fortran 9.1 | Yes |
| Apple PowerMac G5 (make.g5) | Mac OS X 10.4.2 | IBM XL C 6.0 IBM XL Fortran 8.1 | Yes |
| NEC SX-6i (make.sx) | SUPER-UX 13.1 SX-6 | C++/SX 1.0 for SX-6 FORTRAN90/SX 2.0 for SX-6 | No |
| Panasonic CF-R3 (make.gcc) | Fedora Core 3 | GCC 3.4.2 | No |
| IBM ThinkPad T42 (make.gcc) | KNOPPIX 4.0 LinuxTag Japanese Edition | GCC 3.3.6 | No |
| Dell Dimension 84000 (make.mingw) | Microsoft Windows XP Professional SP2 | MinGW (GCC 3.2.3) | No |
SILC のソースコード(silc-1.3.tar.gz)は以下の
場所から入手できる.
silc-1.3.tar.gz からソースコードを
取り出すには次のコマンドを実行する.これによりカレントディレクトリ
の silc-1.3/src/ ディレクトリ内に SILC の
ソースコードが展開される.
$ gzip -cd silc-1.3.tar.gz | tar xvf -
SILC をコンパイルするには,計算環境に合わせた内容の make.inc というファイルを silc-1.3/src/ ディレクトリ内に作成する必要がある.上述のテスト環境向けに
作成した make.inc ファイルのサンプル
が silc-1.3/src/inc/ ディレクトリ内にある.
サンプルファイル名と想定する計算環境,OS,コンパイラの対応関係
は表 1 の通りである.
make.inc ファイルには,make コ
マンドの入力ファイルとなる Makefile で用いられる
マクロ変数を記述する.マクロ変数には大きく分けて SILC に依存しない一般
的なもの(表 2)と SILC 固有のマクロ
変数(表 3)がある.
表 2. 一般的なマクロ変数
CC | C コンパイラのコマンド名 |
FC | Fortran コンパイラのコマンド名 |
LINK.f | Fortran プログラムのリンクに用いるリンカのコマンド名
(デフォルトは FC に指定したコマンド名) |
BISON | GNU Bison のコマンド名 |
FLEX | GNU Flex のコマンド名 |
CFLAGS | C のコンパイラオプション |
FFLAGS | Fortran のコンパイラオプション |
LDFLAGS | C/Fortran コンパイラのリンカオプション |
SHAREDCFLAGS | 共有ライブラリのコンパイルに必要な C コンパイラ オプション |
SHAREDFFLAGS | 共有ライブラリのコンパイルに必要な Fortran コンパイラ オプション |
SHAREDLDFLAGS | 共有ライブラリのリンクに必要な C/Fortran コンパイラの リンカオプション |
RANLIB | ranlib コマンドの名前(ranlib コマンドを実行する必要のない環境では echo コマンド等を指定する) |
RM | rm コマンドの名前(定義する必要があるのは 一部の環境に限られる) |
表 3. SILC 固有のマクロ変数
OMPFLAGS | OpenMP 並列化を有効にするための C/Fortran コンパイラ オプション |
LIBS | SILC サーバおよびサンプルプログラムをリンクするための リンカオプション(リンクするライブラリ等を指定) |
PLATFORM_MODULES | 特定のライブラリに依存する格納形式モジュールおよび
計算モジュールのうち,SILC に組み込むものを列挙する.以下のモジュールが
指定できる(括弧内は依存するライブラリ名).各モジュールの詳細について
は4.7節 を参照.
|
PLATFORM_TESTS | 特定のライブラリに依存するサンプルプログラムのうちコン
パイルするものを列挙する.以下のサンプルプログラムが指定できる(括弧内は
依存するライブラリ名).
|
BLAS_DRIVER | BLAS ドライバのファイル名(後述) |
BLAS_CFLAGS | BLAS を呼ぶプログラムをコンパイルするためのCコンパイラ オプション |
BLAS_LIBS | BLAS を呼ぶプログラムをリンクするためのリンカ オプション(リンクするライブラリ等を指定) |
LAPACK_DRIVER | LAPACK ドライバのファイル名(後述) |
LAPACK_CFLAGS | LAPACK を呼ぶプログラムをコンパイルするためのCコンパイラ オプション |
LAPACK_LIBS | LAPACK を呼ぶプログラムをリンクするためのリンカ オプション(リンクするライブラリ等を指定) |
LIS_CFLAGS | Lis を呼ぶプログラムをコンパイルするための C コンパイラ オプション |
LIS_LD | Lis を呼ぶプログラムをリンクするのに用いるリンカの コマンド名 |
LIS_LIBS | Lis を呼ぶプログラムをリンクするためのリンカ オプション(リンクするライブラリ等を指定) |
LINPACK_LIBS | LINPACK を呼ぶプログラムをリンクするためのリンカオ プション(リンクするライブラリ等を指定) |
BLAS および LAPACK は,SILC サーバとサンプルプログラムからドライバを 介して呼び出される.ドライバには以下の3種がある.用いる BLAS/LAPACK の バージョンに応じて適当なドライバを1つ選んで利用する.
Intel Math Kernel Library(MKL)用ドライバ
blas_intelmkl.c,
lapack_intelmkl.c
Sun Performance Library 用ドライバ
blas_sunperf.c,
lapack_sunperf.c
汎用ドライバ
blas_dumb.c,
lapack_dumb.c
用いるドライバ,コンパイラオプション,およびリンカオプション(リンクする
ライブラリ等)を指定するには make.inc ファイルに以下の
マクロ変数を定義する.
BLAS_DRIVERBLAS ドライバのファイル名 BLAS_CFLAGSBLAS 用の C コンパイラオプション BLAS_LIBSBLAS 用のリンカオプション LAPACK_DRIVERLAPACK ドライバのファイル名 LAPACK_CFLAGSLAPACK 用の C コンパイラオプション LAPACK_LIBSLAPACK 用のリンカオプション
汎用 BLAS/LAPACK ドライバを用いる場合のマクロ定義例を以下に示す.
BLAS_DRIVER= blas_dumb.c BLAS_CFLAGS= BLAS_LIBS= /opt/LAPACK/blas.a LAPACK_DRIVER= lapack_dumb.c LAPACK_CFLAGS= $(BLAS_CFLAGS) LAPACK_LIBS= /opt/LAPACK/lapack.a $(BLAS_LIBS)
silc-1.3/src/inc/ ディレクトリ内の make.inc の作成例は -DDEBUG オプションを
付けてコンパイルする設定になっているため,SILC サーバとユーザプログラムの
実行時に多量のメッセージが出力される.make.inc を
修正してこのオプションを削除またはコメントアウトすればメッセージの出力を
抑えることができる.
silc-1.3/src/ ディレクトリ内に make.inc を作成した後,同じディレクトリで次のよう
に make コマンドを実行して SILC サーバを
コンパイルする.SILC のサンプルプログラムも一緒にコンパイルされる.
$ make
ユーザプログラムを実行する前に SILC サーバを起動しておく必要がある. SILC サーバを起動するには次のように入力する(注: SILC サーバの実行 可能形式ファイルがあるディレクトリをカレントディレクトリにする必要が ある).SILC サーバはフォアグラウンドで動作する.
$ cd src/server $ ./server
共有メモリ並列環境では OpenMP で
並列化された SILC サーバが利用できる.スレッド数を制御するには
環境変数 OMP_NUM_THREADS を設定する.例:
$ env OMP_NUM_THREADS=4 ./server
特に指定しない限り SILC サーバが用いるポート番号は毎回変化する.
ポート番号を指定するには環境変数 SILC_PORT を
設定する.例:
$ env SILC_PORT=32000 ./server
SILC サーバは起動後に自身のホスト名とポート番号を ‾/.silc に書き出す.後述するクライアントルーチン SILC_INIT(3.1節)は,このファイルに記述されたホスト名
とポート番号に従ってサーバへの接続を確立する.‾/.silc の
内容は以下の通りである.
ホスト名ポート番号[EOF]
SILC サーバとユーザプログラムをそれぞれファイルシステムの異なる計算環境で
実行する場合はユーザプログラム側の ‾/.silc を人手に
より作成する必要がある.以下のように echo コマンドを
利用するとよい:
$ echoホスト名ポート番号> ‾/.silc
SILC サーバを終了するには, Ctrl-C を入力するか, kill コマンドでサーバプロセスを終了させる.例:
$ kill -9 プロセス番号
SILC のユーザプログラムは,ネットワークを介して SILC サーバに 接続し,以下の関数を用いてサーバが管理するライブラリを利用する. これらの関数をクライアントルーチンと呼ぶ. 引数の詳細は5節で述べる.
C 言語用クライアントルーチン:
SILC_INIT
SILC サーバに接続する.
SILC_PUT
行列やベクトルなどのデータをサーバに送る.
SILC_EXEC
サーバに計算を指示する.計算指示には SILC の命令記述 言語(4節)で表された 文字列(数式)を用いる.
SILC_GET
計算結果をサーバから受け取る.
SILC_FINALIZE
サーバとの接続を切る.
Fortran 用クライアントルーチン:
SILC_INIT
SILC サーバに接続する.
SILC_PUT_SCALAR,
SILC_PUT_MATRIX,
SILC_PUT_MATRIX_CRS など
行列やベクトルなどのデータをサーバに送る. C言語の場合とは異なり,送るデータの型に応じて異なる関数を用いる.
SILC_EXEC
サーバに計算を指示する.計算指示には SILC の命令記述 言語(4節)で表された 文字列(数式)を用いる.
SILC_GET_SCALAR,
SILC_GET_MATRIX,
SILC_GET_MATRIX_CRS など
計算結果をサーバから受け取る. 上記の送信の場合と同様にデータ型別に異なる関数を用いる.
SILC_FINALIZE
サーバとの接続を切る.
これらのクライアントルーチンは C 言語用,Fortran 用とも
に silc-1.3/src/client/libsilc.a に
定義されている.このライブラリファイルをユーザプログラムに
リンクすることにより上記のクライアントルーチン群が利用
できる.libsilc.a は SILC サーバの
コンパイル時に一緒に作成される.
また,クライアントルーチンの呼び出しに用いる構造体や
定数(5節参照)は silc-1.3/src/client/client.h(C 言語用)および silc-1.3/src/client/fortran/client.h(Fortran 用)に
定義されている.
なお,ユーザプログラムは逐次プログラムでもマルチスレッド化された 並列プログラムでもよいが,クライアントルーチンの呼び出しは同一 スレッドから行なわなければならない.
C 言語によるユーザプログラムの構成例(solve.c)を
以下に示す.このプログラムは疎行列 A を係数とする連立一次方程式 Ax = b を
解くプログラムの例である.
#include "client.h"
int main(int argc, char *argv[])
{
silc_envelope_t object; /* データの授受に用いる構造体 */
double *value, *b, *x;
int *index, *row;
/* 疎行列 A(CRS 形式)およびベクトル b の生成 */
SILC_INIT();
object.v = value;
object.type = SILC_MATRIX_TYPE;
object.format = SILC_FORMAT_CRS;
object.precision = SILC_DOUBLE;
object.m = object.n = N; /* 次数 */
object.nnz = NNZ; /* 非ゼロ要素数 */
object.row = row;
object.index = index;
SILC_PUT("A", &object);
object.v = b;
object.type = SILC_COLUMN_VECTOR_TYPE;
object.precision = SILC_DOUBLE;
object.length = N;
SILC_PUT("b", &object);
/* 連立一次方程式 Ax = b の求解 */
SILC_EXEC("x = A ¥¥ b");
object.v = x;
SILC_GET(&object, "x");
SILC_FINALIZE();
/* 解(ベクトル x)の出力 */
}
上記のユーザプログラムと同じ計算を行なう Fortran プログラムの
構成例(solve.f)を以下に示す.
INCLUDE 'client.h'
REAL *8 VALUE(NNZ), B(N), X(N)
INTEGER *4 ROW(N+1), INDEX(NNZ), IERR
C 疎行列 A(CRS 形式)およびベクトル b の生成
CALL SILC_INIT(IERR)
CALL SILC_PUT_MATRIX_CRS('A', VALUE, N, N, NNZ, ROW, INDEX,
& SILC_DOUBLE, IERR)
CALL SILC_PUT_COLUMN_VECTOR('b', B, N, SILC_DOUBLE, IERR)
C 連立一次方程式 Ax = b の求解
CALL SILC_EXEC('x = A ¥ b', IERR)
CALL SILC_GET_COLUMN_VECTOR('x', X, IERR)
CALL SILC_FINALIZE(IERR)
C 解(ベクトル x)の出力
ユーザプログラムをコンパイルするには,
(1)ヘッダファイル(client.h)と
ライブラリファイル(libsilc.a)の
あるディレクトリを指定するオプション,
(2)リンクするライブラリ(libsilc.a および
後述の追加ライブラリ)を指定するオプションをコンパイラに与える.
例えば,GNU C コンパイラを用いて前節の C プログラム(solve.c)をコンパイルするには次のように gcc コマンドを実行する.以下の例ではホームディレクトリ
配下に ‾/silc-1.3/src/ ディレクトリがあると
仮定している.
$ gcc -I‾/silc-1.3/src/client -c solve.c $ gcc -L‾/silc-1.3/src/client -o solve solve.o -lsilc
-I オプションと -L オプションはそれ
ぞれ client.h と libsilc.a があるディレクトリを指定するオプション,-lsilc は libsilc.a のリンクを指示するオプションである.
なお,プログラムを繰返し修正してコンパイルする場合はユーザプログラムと
同じディレクトリに次のような Makefile を作成すると
便利である.
all: solve CC= gcc CFLAGS= -I$$HOME/silc-1.3/src/client LDFLAGS= -L$$HOME/silc-1.3/src/client LIBS= solve: solve.c $(CC) $(CFLAGS) -c solve.c $(CC) $(LDFLAGS) -o $@ solve.o -lsilc $(LIBS)
このファイルを用いて solve.c をコンパイルするには
次のように make コマンドを実行する.
$ make
また,GNU Fortran コンパイラを用いて前節の Fortran プログラム(solve.f)をコンパイルするには次のように g77 コマンドを実行する.
$ g77 -I‾/silc-1.3/src/client/fortran -fno-second-underscore -c solve.f $ g77 -L‾/silc-1.3/src/client -o solve solve.o -lsilc
C プログラムの場合と同様に次のような Makefile を作成しておくと便利である.
all: solve FC= g77 -fno-second-underscore FFLAGS= -I$$HOME/silc-1.3/src/client/fortran LDFLAGS= -L$$HOME/silc-1.3/src/client LIBS= solve: solve.f $(FC) $(FFLAGS) -c solve.f $(FC) $(LDFLAGS) -o $@ solve.o -lsilc $(LIBS)
なお,いくつかの計算環境では libsilc.a と共に
ソケット通信機能を利用するためのライブラリをリンクする必要がある.
主な計算環境と追加ライブラリの有無を以下に示す.上記の Makefile では LIBS に追加ライブラリを
記述すればよい.
表 4. 主な計算環境と追加ライブラリの有無
| 計算環境 | 追加ライブラリ |
|---|---|
| Solaris | -lsocket -lnsl |
| GNU/Linux | なし |
| Microsoft Windows (MinGW) | -lws2_32 |
| Mac OS X | なし |
ユーザプログラムと SILC サーバのあいだで授受できるデータ型には
以下の5つがある.データ型の指定には括弧内の定数を用いる.
これらの定数は client.h に定義されて
いる(5節参照).
スカラー(SILC_SCALAR_TYPE)
列ベクトル(SILC_COLUMN_VECTOR_TYPE)
行ベクトル(SILC_ROW_VECTOR_TYPE)
行列(SILC_MATRIX_TYPE)
3次元配列(SILC_CUBIC_ARRAY_TYPE)
利用可能なデータの精度を以下に示す.精度の指定には括弧内の定数を 用いる.各精度に対応するC言語と Fortran のデータ型(精度)を示す.
行列を授受する場合はデータ型(SILC_MATRIX_TYPE)と共に
格納形式を指定する必要がある.現在サポートしている行列の格納形式は
以下の2種である.
SILC_FORMAT_DENSE
密行列(dense matrix).Fortran の2次元配列に相当する格納形式. 以下の属性値および配列から成る.
行数(整数型)
列数(整数型)
長さ m * n の配列(精度は任意)
行列のすべての要素を Fortran の2次元配列の形式(列優先)で 格納する(注:C言語の2次元配列は行優先).
SILC_FORMAT_CRS
Compressed Row Storage(CRS)形式の疎行列(sparse matrix). 行列の要素のうち値が 0 でないもの(これを非零要素と呼ぶ)のみを 保持する格納形式.以下の属性値および配列から成る.
行数(整数型)
列数(整数型)
非ゼロ要素数(整数型)
長さ nnz の配列(精度は任意)
非ゼロ要素のみを行優先ですき間なく格納する.
長さ m + 1 の単精度整数型配列
row[0] は1行目の最初の非ゼロ要素の
配列 value における位置(添字),
row[1] は2行目の最初の非ゼロ要素の
添字というように,各行の非ゼロ要素の開始位置を格納する.
row[m] の値は nnz とする.
長さ nnz の単精度整数型配列
配列 value における対応する添字の
非ゼロ要素の列番号を保持する.例えば,行列のある行の5列目の
要素が value[7] に格納されている場合,
index[7] に列番号 5 を格納する.
例: 次の4行4列の行列を CRS 形式で表した場合の 配列 value, row, および index の内容を以下に示す.
| 11 0 0 0 | | 0 22 0 0 | | 0 32 33 0 | | 41 0 0 44 |
value: 11, 22, 32, 33, 41, 44(長さ 6)
row: 0, 1, 2, 4, 6(長さ 5)
index: 1, 2, 2, 3, 1, 4(長さ 6)
クライアントルーチン SILC_EXEC の引数には
サーバに計算を指示するための文字列を与える.文字列の内容は SILC の
命令記述言語で書かれた一種のプログラムである.
命令記述言語の実行単位は文(statement)であり,次の3種がある.
代入文
変数への値の格納を指示する文.等号(=)の左辺には変数名(および 添字),右辺には式(expression)を指定する.変数は代入により型 宣言なしで作成でき,任意のデータ型の値を代入できる.既存の変数に 新しい値を代入すると古い値は削除される.
手続き呼び出し文
手続き(procedure)の呼び出しを指示する文.
システム文
SILC サーバを制御するための文.現時点 では prefer 文(4.3節)がある.
また,複数の文をセミコロン(;)で結合して
一括して SILC_EXEC に渡すことができる.
代入文には次の2種がある.
単純代入文(simple assignment)
"" の形の代入文.
式の値を指定された名前の変数に代入する.
変数がなければ新たに定義し,同名の変数があれば値を変更する.
"変数名 = 式A = B" のように式として変数名を与えた場合,
複製された値が代入される(変数 B の値のコピーが作られる).
累算代入文(augmented assignment)
二項演算を伴う代入文であり,以下の7種がある.
例えば,"" は "変数名 += 式" と等しい.
左辺の変数名は定義済みでなければならない.
変数名 = 変数名 + 式
変数名 += 式加算
変数名 -= 式減算
変数名 *= 式乗算
変数名 /= 式除算
変数名 %= 式余り
変数名 *@= 式要素ごと乗算(elementwise multiplication)
変数名 /@= 式要素ごと除算(elementwise division)
代入文の右辺には式を指定する.式の構成要素を以下に示す.
ここで,x,
y,
e1,
e2, ...,
eN は任意の式である.
なお,単項演算子および二項演算子のオペランドとして有効なデータ型に
ついては4.4節を,利用可能な
組込み関数については5.3節をそれぞれ参照.
単項演算子
x‾複素共役
x'共役転置
x'‾ または x‾'転置
-x符号反転(negation)
二項演算子
x + y加算
x - y減算
x * y乗算
x / y除算
x % y余り
A ¥ b
連立一次方程式 Ax = b の求解(A はN×N行列,
b は列ベクトルまたはN×M行列)
x *@ y要素ごと乗算(elementwise multiplication)
x /@ y要素ごと除算(elementwise division)
関数呼び出し
f(e1,
e2, ...,
eN)
f は
関数名,e1,
e2, ...,
eN は任意の式(引数)
連結(concatenation)
{e1,
e2, ...,
eN}
列方向に連結する.
e1,
e2, ...,
eN が
スカラーならば列ベクトルが得られる.
{e1;
e2; ...;
eN}
行方向に連結する.
e1,
e2, ...,
eN が
スカラーならば行ベクトルが得られる.
{e1;;
e2;; ...;;
eN}3次元配列を生成する.
範囲(range)
{e1:e2}
始点 e1 から
終点 e2 までの
整数を要素とする列ベクトルを生成する.
e1 と
e2 には
値が整数となる式を指定する.
リテラル
小数点を伴う数値は倍精度実数(SILC_DOUBLE),
それ以外の数値は単精度整数(SILC_INT)として扱われる.
定数
e自然対数の底
i虚数単位(複素数は 3 - 5 * i のように二項演算子を用いて得る)
pi円周率
inf無限大
その他
変数名は式である.
括弧で演算子の結合順序を変更できる.
式には添字(4.6節)を付加できる.
手続き呼び出し文は,手続き名と引数の並びから成る.以下に例を示す.
split(A, L, D, U)
行列 A を下三角部分,対角部分,上三角部分に分け,
それぞれ L, D, U に
格納する.
手続き呼び出し文の引数には以下の3種がある.
手続きへの入力となる引数.値は変更されない.
手続きからの戻り値が格納される引数.
手続きへの入力となり,かつ戻り値が格納される引数.
上記の手続き split の例では,第1引数 は in 引数, 残りは out 引数である.各引数の in/out/inout の区別, および引数として認められるデータ型は手続きごとに異なる. 利用可能な組込み手続きについては5.3節を参照.
システム文は SILC サーバの動作を制御するための文であり,以下のものがある.
prefer モジュール名指定したモジュールをモジュールリストの先頭に移動して モジュール関数の検索順序を変更する.モジュール関数の 検索については4.7節を参照.
演算子のオペランドには任意の式を記述できるが,オペランドとして 有効なデータ型は演算子ごとに異なる.演算子と有効なデータ型の組み合わせ を表 6 と表 7 に 示す.二項演算子のオペランドに関する制限は 累算代入文(4.1節)にも適用される.
表 7. 二項演算子
| 演算子 | 左オペランド | 右オペランド | 演算結果 |
|---|---|---|---|
| 加算および減算 | スカラー | スカラー | スカラー |
| 列ベクトル | 列ベクトル | 列ベクトル | |
| 行ベクトル | 行ベクトル | 行ベクトル | |
| 行列 | 行列 | 行列 | |
| 3次元配列 | 3次元配列 | 3次元配列 | |
| 乗算 | スカラー | スカラー | スカラー |
| スカラー | 列ベクトル | 列ベクトル | |
| スカラー | 行ベクトル | 行ベクトル | |
| スカラー | 行列 | 行列 | |
| 列ベクトル | スカラー | 列ベクトル | |
| 列ベクトル | 行ベクトル | 行列 | |
| 行ベクトル | スカラー | 行ベクトル | |
| 行ベクトル | 列ベクトル | スカラー[a] | |
| 行ベクトル | 行列 | 行ベクトル | |
| 行列 | スカラー | 行列 | |
| 行列 | 列ベクトル | 列ベクトル | |
| 行列 | 行列 | 行列 | |
| 3次元配列 | スカラー | 3次元配列 | |
| 除算 | スカラー | スカラー | スカラー |
| 行ベクトル | 行列 | 列ベクトル | |
| 行列 | 行列 | 行列 | |
| 余り[b] | スカラー | スカラー | スカラー |
| 連立一次方程式の求解 | スカラー | スカラー | スカラー |
| 行列 | 列ベクトル | 列ベクトル | |
| 行列 | 行列 | 行列 | |
| 要素ごと乗算および要素ごと除算 | スカラー | スカラー | スカラー |
| 列ベクトル | 列ベクトル | 列ベクトル | |
| 行ベクトル | 行ベクトル | 行ベクトル | |
| 行列 | 行列 | 行列 | |
| 3次元配列 | 3次元配列 | 3次元配列 | |
[a] 演算結果はベクトルの内積を表す. [b] 2つのオペランドの精度は共に整数でなければならない. | |||
二項演算子のオペランドの精度が異なる場合,計算前に精度を変換して2つの オペランドの精度を合わせる.精度変換には以下のルールを適用する.
6つの精度のあいだに以下の順序関係を定める.ここで,x → y なら ば y は x の上位精度であると言う.また,x → y かつ y → z な らば x → z である.
SILC_LONG→SILC_DOUBLE→SILC_DOUBLE_COMPLEX↑ ↑ ↑SILC_INT→SILC_FLOAT→SILC_COMPLEX
2つのオペランドの一方が他方の上位精度ならば,後者を前者の精度に変換する.
例えば,一方のオペランドの精度が SILC_DOUBLE,
他方が SILC_FLOAT ならば,前者は後者の上位精度なので
後者を SILC_DOUBLE に変換する.
どちらも他方の上位精度でなければ,双方を共通の上位精度に変換する.
例えば,一方のオペランドの精度が SILC_DOUBLE,
他方が SILC_COMPLEX ならば,双方を共通の上位
精度 SILC_DOUBLE_COMPLEX に変換する.
代入文の左辺(変数名),および任意の式に添字を付加できる. 添字は1から始まる.添字の記法を以下に示す.
A[x]
A はベクトル.
A[x,y]
A は行列.
A[x,y,z]
A は3次元配列.
ここで x, y,
z は任意の式である.式の値はスカラー整数
または整数の列ベクトルでなければならない(それ以外の値ならば実行時
エラーとなる).
添字の式として範囲(range)を用いる場合,始点と終点の式は各々省略できる.
例えば,a を次数 n の
ベクトルとすれば,a[:5] と a[1:5],
a[5:] と A[5:,
n]a[:] と a[1: は
それぞれ等しい.
n]
添字を用いることのできる文脈とその機能,および用例を以下に示す.
表 8. 添字の文脈と機能
| 機能 | 文脈 | 用例 |
|---|---|---|
| 部分参照 | 代入文の右辺 |
|
| 関数の引数・手続きの in 引数 |
| |
| 制約代入 | 代入文の左辺 |
|
| 手続きの out 引数 |
| |
| 部分参照+制約代入 | 手続きの inout 引数 |
|
SILC 命令記述言語における演算子,関数,および手続きは,モジュー ル関数と呼ぶラッパーを介してライブラリ関数の呼び出しに置き換えら れ実行される.モジュール関数は,いくつかのモジュールにまとめられ ている.用意されているモジュールとそれに含まれるモジュール関数の 概要を以下に示す.
coremodule
行列以外のデータ型を処理するモジュール関数から成るモジュール.
dense
密行列を扱うモジュール関数から成るモジュール.
sparse_crs
CRS 形式の疎行列を扱うモジュール関数から成るモジュール.
leq_lis
反復解法 ライブラリ Lis を呼び出すためのモジュール.
leq_cg
密行列および CRS 形式の疎行列に対する CG 法を実装するモジュール.
leq_gs
密行列に対する Gauss-Seidel 法を実装するモジュール.
leq_lu
密行列に対する LU 分解による線形解法を実装するモジュール.
blasmodule
BLAS(Basic Linear Algebra Subprograms)による行列ベクトル積などの モジュール関数を含むモジュール.
fftss
高速フーリエ 変換ライブラリ FFTSS を呼び出すためのモジュール.
また,以下の実験的なモジュールがある.
sparse_band
LAPACK(Linear Algebra PACKage)の Band 形式および LU 分解を 実装するモジュール.
sparse_jds
疎行列用の Jagged Diagonal Storage(JDS)形式を実装するモジュール.
leq_smsamg
Super Matrix Solver AMG version 3 (株式会社ヴァイナス) を呼び出す ためのモジュール.
leq_mp
多倍精度反復解法ライブラリ mp_crs を呼び出すためのモジュール. このモジュールを利用するには GNU MP ライブラリが必要である.
linpackmodule
Linpack ベンチマーク用のモジュール関数から成るモジュール.
SILC サーバは,数式を構成する個々の演算子,関数,および手続きに ついて上記のモジュールから適当なモジュール関数を1つ選択して実行 する.いくつかの演算子,関数,手続きには,対応するモジュール関数が 複数存在する(例えば,leq_cg,leq_gs,leq_lu の3つにはそれぞれ 連立一次方程式の求解演算子に対応するモジュール関数が含まれる). また,モジュール群は SILC サーバにおいてリスト構造で管理されている. SILC サーバは,リストの先頭から順にモジュール内のモジュール関数を 調べてゆき,最初に見つかったモジュール関数を演算に用いる.同名の 関数および手続きが複数のモジュールに定義されている場合の選択方法も 同様であり,最初に見つかったモジュール関数が用いられる.
リスト内のモジュールの順序を変更するには SILC_EXEC で prefer 文(4.3節)を用いる.
prefer 文は指定されたモジュールをリストの先頭に移動する.これにより
演算子,関数,および手続きとモジュール関数の対応関係を容易に変更できる.
ヘッダファイル "client.h"
SILC のユーザプログラムを作成する際はこのヘッダファイルを用いる.
silc_envelope_t 構造体
SILC_PUT および SILC_GET の
引数として用いる構造体.授受するデータ型に応じて以下のメンバ変数を利用する.
共通のメンバ変数:
int type;データ型(3.3節). 以下のいずれかの値を設定する.
SILC_SCALAR_TYPE(スカラー) SILC_ROW_VECTOR_TYPE(行ベクトル) SILC_COLUMN_VECTOR_TYPE(列ベクトル) SILC_MATRIX_TYPE(行列) SILC_CUBIC_ARRAY_TYPE(3次元配列)
int precision;精度(3.3節). 以下のいずれかの値を設定する.
SILC_INT(単精度整数) SILC_LONG(倍精度整数) SILC_FLOAT(単精度実数) SILC_DOUBLE(倍精度実数) SILC_COMPLEX(単精度複素数) SILC_DOUBLE_COMPLEX(倍精度複素数)
const char *format;
格納形式(3.4節).
行列(データ型が SILC_MATRIX_TYPE)の場合のみ,
以下の値を設定する.
SILC_FORMAT_DENSE(密行列) SILC_FORMAT_CRS(CRS 形式の疎行列)
SILC_SCALAR_TYPEの場合:
void *v;スカラー値へのポインタ(※)
SILC_ROW_VECTOR_TYPE,
SILC_COLUMN_VECTOR_TYPEの場合:
size_t length;ベクトルの長さ
void *v;ベクトル(1次元配列)へのポインタ(※)
SILC_MATRIX_TYPE(SILC_FORMAT_DENSE)の場合:
size_t m, n;次数
void *v;行列(列優先の2次元配列)へのポインタ(※)
SILC_MATRIX_TYPE(SILC_FORMAT_CRS)の場合:
size_t m, n;次数
size_t nnz; 非零要素数
void *v;非零要素の配列へのポインタ(※)
int *row;行ポインタの配列へのポインタ(※)
int *index;列インデックスの配列へのポインタ(※)
なお,row と index の
要素は0オリジンで表す.
SILC_CUBIC_ARRAY_TYPE の場合:
size_t l, m, n;各次元の次数
void *v;3次元配列へのポインタ(※)
SILC_GET の場合は※印のメンバ変数のみ設定する.
SILC_PUT の場合はすべて設定する.
以下の関数はいずれも正常終了なら 0,エラーなら −1 を返す.
int SILC_INIT(void);
SILC サーバへの接続を確立する.ユーザプログラムの冒頭(サーバを 利用し始める箇所)で呼び出す.
int SILC_FINALIZE(void);
SILC サーバへの接続を終了する.ユーザプログラムの最後(サーバの 利用を終える箇所)で呼び出す.
int SILC_EXEC(const char *expr);
サーバに計算を指示する.expr には SILC の命令記述 言語(4節)で 記述したプログラムを文字列で与える.
int SILC_PUT(const char *name, silc_envelope_t *envelope);
データに名前をつけて SILC サーバに預ける.name には
データの名前を文字列で与える.envelope には,送信する
データに関する情報を設定した silc_envelope_t 構造体への
ポインタを与える.
int SILC_GET(silc_envelope_t *envelope, const char *name);
名前を指定して SILC サーバからデータを受け取る.
envelope には silc_envelope_t 構造体
へのポインタを与える.name には受信するデータの
名前を文字列で与える.
受信データの格納領域を指定する方法には次の2つがある.
ユーザが事前に必要なデータ領域を確保する
silc_envelope_t 構造体の
メンバ v(および CRS 形式の行列の場合は
メンバ row と index)に
受信データの格納領域へのポインタを設定
して SILC_GET を呼び出すと,
その領域に受信データが格納される.
必要なサイズの領域を SILC_GET に
自動的に確保させる
silc_envelope_t 構造体の
メンバ v に NULL を
代入して SILC_GET を呼び出すと,
必要なサイズの領域が自動的に確保される.データが
不要になったら,ユーザは v が
指す領域(および CRS 形式の行列の場合は
メンバ row と index が指す
領域)を free 関数で開放しなければならない.
ヘッダファイル "client.h"
SILC のユーザプログラムを作成する際はこのヘッダファイルを用いる.
後述のクライアントルーチンに共通する引数を以下に示す.
INTEGER*4 precision
精度(3.3節). 以下のいずれかの値を設定する.
SILC_INT(単精度整数) SILC_LONG(倍精度整数) SILC_FLOAT(単精度実数) SILC_DOUBLE(倍精度実数) SILC_COMPLEX(単精度複素数) SILC_DOUBLE_COMPLEX(倍精度複素数)
INTEGER*4 status
サブルーチンの終了コード.正常終了なら 0,エラーなら −1 を返す.
また,下記の type には次のデータ型を用いる.
INTEGER*4( SILC_INTの場合)INTEGER*8( SILC_LONGの場合)REAL*4( SILC_FLOATの場合)REAL*8( SILC_DOUBLEの場合)COMPLEX*8( SILC_COMPLEXの場合)COMPLEX*16( SILC_DOUBLE_COMPLEXの場合)
SILC_INIT(status)
SILC サーバへの接続を確立する.ユーザプログラムの冒頭(サーバを 利用し始める箇所)で呼び出す.
出力:
INTEGER*4 status終了コード
SILC_FINALIZE(status)
SILC サーバへの接続を終了する.ユーザプログラムの最後(サーバの 利用を終える箇所)で呼び出す.
出力:
INTEGER*4 status終了コード
SILC_EXEC(expr, status)
サーバに計算を指示する.
入力:
CHARACTER*size expr命令記述言語(4節)による計算指示
出力:
INTEGER*4 status終了コード
SILC_PUT_SCALAR(name, value, precision, status)
スカラー値に名前を付けて SILC サーバに預ける.
入力:
CHARACTER*size name名前
type valueスカラー値
INTEGER*4 precision精度
出力:
INTEGER*4 status終了コード
SILC_PUT_ROW_VECTOR(name, value, length, precision, status)
行ベクトルに名前を付けて SILC サーバに預ける.
入力:
CHARACTER*size name名前
type value(length)ベクトルの要素の配列
INTEGER*4 lengthベクトルの長さ
INTEGER*4 precision精度
出力:
INTEGER*4 status終了コード
SILC_PUT_COLUMN_VECTOR(name, value, length, precision, status)
列ベクトルに名前を付けて SILC サーバに預ける.
入力:
CHARACTER*size name名前
type value(length)ベクトルの要素の配列
INTEGER*4 lengthベクトルの長さ
INTEGER*4 precision精度
出力:
INTEGER*4 status終了コード
SILC_PUT_MATRIX(name, value, m, n, precision, status)
密行列に名前を付けて SILC サーバに預ける.
入力:
CHARACTER*size name名前
type value(m, n)行列の要素の配列
INTEGER*4 m, n次数
INTEGER*4 precision精度
出力:
INTEGER*4 status終了コード
SILC_PUT_MATRIX_CRS(name, value, m, n, nnz, row,
index, precision, status)
疎行列(CRS 形式)に名前を付けて SILC サーバに預ける.
row と index の
要素は1オリジンでなければならない.
入力:
CHARACTER*size name名前
type value(nnz)非零要素の配列
INTEGER*4 m, n次数
INTEGER*4 nnz非零要素数
INTEGER*4 row(m+1)行ポインタの配列
INTEGER*4 index(nnz)列インデックスの配列
INTEGER*4 precision精度
出力:
INTEGER*4 status終了コード
SILC_PUT_CUBIC_ARRAY(name, value, l, m, n, precision, status)
3次元配列に名前を付けて SILC サーバに預ける.
入力:
CHARACTER*size name名前
type value(l, m, n)3次元配列
INTEGER*4 l, m, n各次元の次数
INTEGER*4 precision精度
出力:
INTEGER*4 status終了コード
SILC_GET_SCALAR(name, value, status)
指定した名前のスカラー値を SILC サーバから受け取る.
入力:
CHARACTER*size name名前
出力:
type valueスカラー値
INTEGER*4 status終了コード
SILC_GET_ROW_VECTOR(name, value, status)
指定した名前の行ベクトルを SILC サーバから受け取る.
ユーザは,配列 value を用意するために予め
ベクトルの長さ(length)を知って
いなければならない.
入力:
CHARACTER*size name名前
出力:
type value(length)ベクトルの要素の配列
INTEGER*4 status終了コード
SILC_GET_COLUMN_VECTOR(name, value, status)
指定した名前の列ベクトルを SILC サーバから受け取る.
ユーザは,配列 value を用意するために予め
ベクトルの長さ(length)を知って
いなければならない.
入力:
CHARACTER*size name名前
出力:
type value(length)ベクトルの要素の配列
INTEGER*4 status終了コード
SILC_GET_MATRIX(name, value, status)
指定した名前の密行列を SILC サーバから受け取る.
ユーザは,配列 value を用意するために予め行列の
次数(m, n)を
知っていなければならない.
入力:
CHARACTER*size name名前
出力:
type value(m, n)行列の要素の配列
INTEGER*4 status終了コード
SILC_GET_MATRIX_CRS(name, value, row, index, status)
指定した名前の疎行列(CRS 形式)を SILC サーバから受け取る.
ユーザは,配列 value,row,
および index を用意するために予め行列の
次数(m, n)と
非零要素数(nnz)を知っていなければならない.
row と index の要素は1オリジンで
表される.
入力:
CHARACTER*size name名前
出力:
type value(nnz)非零要素の配列
INTEGER*4 row(m+1)列ポインタの配列
INTEGER*4 index(nnz)行インデックスの配列
INTEGER*4 status終了コード
SILC_GET_CUBIC_ARRAY(name, value, status)
指定した名前の3次元配列を SILC サーバから受け取る.
ユーザは,配列 value を用意するために予め3次元配列
の大きさ(l, m,
n)を知っていなければならない.
入力:
CHARACTER*size name名前
出力:
type value(l,
m, n)3次元配列
INTEGER*4 status終了コード
[関数]スカラー dot(行ベクトル, 列ベクトル)
行ベクトルと列ベクトルの内積を返す.
[関数]スカラー sqrt(スカラー)
[関数]ベクトル sqrt(ベクトル)
与えられたスカラーまたはベクトルの各要素の平方根を返す.
[関数]スカラー norm2(ベクトル)
与えられたベクトルの2ノルムを返す.
[関数]スカラー length(ベクトル)
与えられたベクトルの長さ(要素数) を返す.
[関数]スカラー time()
現在の時刻を表す倍精度実数で返す.
[関数]列ベクトル diagvec(行列)
与えられた行列の対角要素を列ベクトルにして返す.
[関数]行列 zeros(スカラー)
[関数]行列 zeros(スカラー, スカラー)
全要素が 0(倍精度)の密行列を生成して返す.引数が1つの場合は正方行列 を生成する.引数が2つの場合は第1引数が行数,第2引数が列数を表す.
[関数]行列 ones(スカラー)
[関数]行列 ones(スカラー, スカラー)
全要素が 1(倍精度)の密行列を生成して返す.引数が1つの場合は正方行列 を生成する.引数が2つの場合は第1引数が行数,第2引数が列数を表す.
[関数]行列 rand(スカラー)
[関数]行列 rand(スカラー, スカラー)
倍精度実数の乱数から成る密行列を生成して返す.引数が1つの場合は正方 行列を生成する.引数が2つの場合は第1引数が行数,第2引数が列数を表す. 乱数列の初期化には後述の srand 手続きを用いる.
[関数]列ベクトル size(行列)
行列の次数(行数と列数)を長さ2の列ベクトルとして返す.
[関数]スカラー size(行列, スカラー)
行列の次数(行数または列数)を求める. 第2引数が 1 の場合は行数,2 の場合は列数をそれぞれ返す.
[関数]行列 full(スカラー, スカラー)
倍精度の整数行列を生成して返す.第1引数は行数,第2引数は列数を表す. 要素はすべて非零となるように選ばれる(ただし乱数ではない).
split( [手続き]行列 IN, 行列 OUT, 行列 OUT, 行列 OUT)
第1引数の行列を下三角部分,対角部分,上三角部分に分割する.各部分は それぞれ第2〜4引数に指定した変数に格納される.
srand( [手続き]スカラー IN)
第1引数(整数)をシードにして乱数生成器(Mersenne Twister)を初期化する.
[関数]行列 sparse(ベクトル r, ベクトル c, ベクトル v, スカラー m, スカラー n)
[関数]行列 sparse(ベクトル r, ベクトル c, スカラー v, スカラー m, スカラー n)
CRS 形式の疎行列を生成して返す.第1引数のベクトル r は行番号のリスト,第2引数のベクトル c は列番号のリストを表す.第3引数 v がベクトルの場合,r と c の第 k 要素は v の第 k 要素を格納する行番号および列番号を表す.すなわち,v は行列の非零要素のリストを表す.3つの
ベクトル r,c,v の次数は同じでなければ
ならない.v がスカラーの場合は行列の
すべての非零要素が同じ値になる.このとき,r と c の次数は同じでなければならない.
第4引数 m は生成する行列の行数,
第5引数 n は列数を表す.
行列の精度は v の精度と同じになる.
[関数]行列 zeros(スカラー)
[関数]行列 zeros(スカラー, スカラー)
全要素が 0(倍精度)の CRS 形式の疎行列を生成して返す.引数が1つの 場合は正方行列を生成する.引数が2つの場合は第1引数が行数,第2引数が 列数を表す.
[関数]行列 eye(スカラー)
指定された次数の単位行列(CRS 形式)を生成して返す.
[関数]行列 diag(ベクトル)
[関数]行列 diag(ベクトル, スカラー)
対角行列を生成して返す.引数が1つの場合,与えられたベクトルの次数
を n とすると,ベクトルの各要素を対角要素と
する n 行 n 列の
疎行列(CRS 形式)を生成する.引数が2つの場合,第2引数(以下 k とする)は対角からのオフセット値を表す.k = 0 ならば引数が1つの場合と等価であり,k > 0 ならば (1, k+1) から
右下にのびる上対角,k < 0 なら
ば (1-k, 1) から右下にのびる下対角に
ベクトルの各要素が格納された行列を生成する.行列の次数は n+k である.
[関数]列ベクトル diagvec(行列)
与えられた行列(CRS 形式)の対角要素を列ベクトルにして返す.
[関数]行列 fliplr(行列)
与えられた行列(CRS 形式)の列を逆順に並べ替えて返す.
[関数]行列 flipud(行列)
与えられた行列(CRS 形式)の行を逆順に並べ替えて返す.
2007年10月31日(SILC v1.3)
SILC サーバとユーザプログラムのコンパイル方法についての 記述を追加した.
API リファレンスに新しいモジュール関数を 追加した.
2006年11月12日(SILC v1.2)
本文書のソースファイル を DocBook XML 形式に 変更した.
いくつかのモジュール関数の記述を追加した.
2005年11月25日(SILC v1.1)
若干の修正を加えた.
2005年9月20日(SILC v1.0)
SILC v1.0に合わせて作成.
$Id: users_ja.xml,v 1.12 2007/10/31 06:31:35 kajiyama Exp $