やる気の出ない計算機科学シリーズ第1回です。
「スパコンを道具として便利に使いたい!けど別に計算機科学がやりたいわけじゃなんだよ・・・」
という気持ちの人向けに、計算科学向けのネタを適当に解説していきます。
はじめに
Formuraとは理化学研究所の村主崇行特別研究員らが作成したすごいHなHPC向けの開発環境です。
なにができるの???
数式のような簡潔な指示を書くだけでスーパーコンピュータでの計算に必要となる高度なプログラムを自動生成できるプログラミング言語
式が書ければ「京」が使える-高度なプログラムを自動生成できる新言語「Formura」を開発- より引用
ということで、数式っぽい何かをかくとプログラムができちゃう。それもただのプログラムじゃなくてスパコンでも動くぞイエイ!ということができます。
環境
・てきとうなmpiの動くスパコン
・MPIの動くUnixマシン。
インストール
- stackのインストール
stackの公式ドキュメントにそってインストールを行います。
curl -sSL https://get.haskellstack.org/ | sh
- formuraのビルド
git clone git@github.com:nushio3/formura.git
cd formura
stack setup --install-ghc
stack build --trace
試しに実行してみます
stack exec formura
出力は・・・?
Missing: FILES...
Usage: formura FILES... [-o|--output-filename FILENAME] [--nc FILENAME]
[-v|--verbose] [--makefile|--mk] [--ncopt ARG] [-f|--flag ARG]
[--sleep SECOND]
generate c program from formura program.
ふむふむ。formuraのコードが必要とこのこと。
使ってみる。
テストコードの作成
ということで、テストコードさっくり書きます。
exampleのコードは動かないのが多くて。。。
dimension :: 1
axes :: x
begin function init() returns data_init
double [] :: data_init = 0
end function
begin function data_next = step(data)
data_next = data
end function
1行目で行列の次元を宣言します。今回は簡単に1次元で行ってみます。
2行目で名前を軸の名前を宣言します。とりあえずxにしてみます。
fmrファイルでは最小の実装として、下記の2つの関数の実装が必要です。
- init : データ構造を受け取って、初期化します。今回は全部を0にします。
- step : データを受け取って、次のステップのデータを計算して戻します。今回はなにもしません。
続いて、コード生成の設定ファイルを作成します。ファイル名はfmrファイルと同じ名にします。
mpi_grid_shape: [1]
intra_node_shape: [256]
initial_walls:
x: [128]
temporal_blocking_interval: 1
monitor_interval: 1
- intra_node_shape: 各ノードでのグリッドの切り方。今回は256個で実行してみます。
- initial_walls: 内部のサブルーチンの分割について。中心の128で分割してみます。(本当は分割せずに動かしてみたかったのですが、仕様で動きません。)
- mpi_grid_shape: MPIのグリッドの切り方。今回は1ノード、つまりシングルノードで計算します。
- temoral_bloking_interval: テンポラルブロッキング数で一回に進めるステップ数。今回は1、つまりテンポラルブロッキングはなしで
- monitor_interval: 一回のForwardで進めるStep数。今回は1で、つまり1ステップ毎に処理をメインプログラムに戻す事にします。
テストコードのコンパイルと出力
では動かして見ます。
stack exec -- formura sample.fmr +RTS -xc
動いた!! ら、出力されるファイルは次の3つです。
- sample.h : ヘッダファイル
- sample.c : 中身。主にMPI関連の扱いとか
- sample_internal_0.c : 中身。計算したり
動かなかった!! ら、スタックのトレースの出力と睨めっこでもしてみましょう。
テストコードの作成 その2
~~中身の説明は2回目以降に先送りするとして、~~まずは実際に使ってみましょう。
出力されたファイルを呼び出すプログラムを書きます。
#include <stdio.h>
#include <mpi.h>
#include "sample.h"
const int T_MAX = 4;
int main (int argc, char **argv) {
Formura_Navigator navi;
MPI_Init(&argc, &argv);
Formura_Init(&navi, MPI_COMM_WORLD);
while(navi.time_step < T_MAX) {
Formura_Forward(&navi);
}
MPI_Finalize();
printf("Done!\n");
}
初期化して、4ステップ動かしてみます。
コンパイル
mpic++ sample-main.cpp sample.c sample_internal_0.c
実行&結果
> mpirun -np 1 a.out
Done!
動いた〜
( To be continued...
まとめ
現時点で、formuraには網羅的なマニュアルがありません。
そのため、初めて使うには少しハードルが高いものとなっています。
本記事は少しでもformuraに触れる人が増えるといいなと思い作成しております。
今回の記事もソースコードを読みつつ作成しました。
間違いを見つけられましたらコメントでお知らせいただけますと幸いです。
p/s
村主さんのご冥福を心よりお祈りします。