LoginSignup
10
6

More than 5 years have passed since last update.

やる気の出ない計算機科学シリーズ その1 初めてのFormura

Last updated at Posted at 2017-10-19

やる気の出ない計算機科学シリーズ第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のコードは動かないのが多くて。。。

sample.fmr
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つの関数の実装が必要です。
1. init : データ構造を受け取って、初期化します。今回は全部を0にします。
2. step : データを受け取って、次のステップのデータを計算して戻します。今回はなにもしません。

続いて、コード生成の設定ファイルを作成します。ファイル名はfmrファイルと同じ名にします。

sample.yaml
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回目以降に先送りするとして、まずは実際に使ってみましょう。

出力されたファイルを呼び出すプログラムを書きます。

sample-main.cpp
#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
村主さんのご冥福を心よりお祈りします。

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6