Monad に基づくメタ計算を基本とする Gears OS の設計

小久保翔平

Monad に基づくメタ計算を基本とする Gears OS の設計

小久保翔平

琉球大学大学院修士2年

Gears OS の並列性

処理とデータの単位として Code Gear, Data Gear を用いる

 並列実行の単位となる

 処理とデータの関係から依存関係を決定

Many Core CPU, GPU, Xeon Phi などを有効に利用するためにはそれぞれのアーキテクチャに合わせた記述が必要

Gears OS では Gear を用いて並列実行環境に合わせた設計・実装を行う

Gears OS の柔軟性

Gear を追加することでデータ拡張や機能の追加が可能

バージョンが異なる Gears OS でもの Gear 共通部分を用いて通信を行う

Gears OS の信頼性

Code/Data Gear にはメタ計算に必要な情報として Meta Code/Data Gear が付属されている

 関数型言語における Monad に相当

プログラムに対してメタレベルで Model Checking する

 元のプログラムに影響を与えない

 並列実行時のデッドロック検出

 Code Gear 間での型検査

Cerium

Cerium では Task という分割された処理を依存関係に沿って並列実行する

Task 同士の依存関係はプログラマ自身が記述する

 Task の種類が増えるほど記述が複雑になる

Task 間の依存関係にのみ着目

 データの依存関係を正しく保証しない

Task が取り扱うデータに型情報がない

 汎用ポインタを型変換して利用

 型検査できない

Alice

Alice では処理とデータの単位として Code Segment, Data Segment を用いる

処理とデータの関係から Code Segment 間の依存関係が決定

Data Segment を待ち合わせて Code Segment を実行することを Computaion と定義

Computaion を実現する Computaion を Meta Computaion と定義

 切断や再接続時の処理、データの圧縮の機能などが相当

 通常の Computaion に影響しない

 Meta Computaion 自体は Alice で記述されていない

Data Segment にアクセスする API が設計上の問題で複雑化している

Code/Data Gear

通常レベルとして Code/Data Gear を用いる

 ポインタを扱わない

Code Gear は処理そのもの

 OpenCL/CUDA の kernel に相当

 接続された複数の Input Data Gear を参照

 単一または複数の Output Data Gear に書き出す

 自分が知らない Code/Data Gear は名前で指し示す

Data Gear はデータそのもの

 C の構造体で表現

 Primitive Data Type を格納

Meta Code/Data Gear

メタレベルとして Meta Code/Data Gear を用いる

 ポインタを扱う

各 Gear の関連付け

Model Checking

平行制御

Gear を用いた List の表現

通常 List は要素と次へのポインタを持つ構造体で表現する

Gears OS では任意の要素を持つ Data Gear と次へのポインタを持つ Meta Data Gear の組によって List を表現する

List

Code/Data Gear の性質

ポインタの使用を通常レベルとメタレベルで分離

 ポインタ関連のセキュリティフローを防止

処理が Code/Data Gear に閉じている

 接続された Gear のみに干渉できる

 処理の実行時間、メモリ使用量が予測可能

Gears OS における Meta Computation

関数型言語における Monad に基づいて Meta Computation を行う

 Monad を用いる手法は Moggi らが提案

Gears OS の Meta Computation は Meta Code/Data Gear を用いる

実装言語

本研究室で開発している Continuation based C(CbC) で実装

 LLVM をバックエンドした CbC コンパイラを用いる

CbC ではプログラムを Code Segment, Data Segment という単位で記述

Code Segment 間の処理の移動は goto を用いた軽量継続

 末尾最適化を強制

Context

arch

実行に必要な情報をまとめた Context を生成

 OS の Process, Thread に相当

 メタレベル

Code Gear の名前とポインタの対応

Data Gear を Allocate するための情報

Code Gear が参照する Data Gear へのポインタ

Data Gear に格納される Data Type の情報

Context

/* Context definition */
enum Code {
    Code1,
    Code2,
    Allocator,
};

実行可能な Code Gear の名前を enum Code で宣言

初期化時に名前と関数ポインタを対応付ける

Context

enum UniqueData {
    Allocate,
    Tree,
};

初期化時に確保する Data Gear を enum UniqueData で宣言

Context

struct Context {
    int codeNum;
    __code (**code) (struct Context *);
    void* heap_start;
    void* heap;
    long dataSize;
    int dataNum;
    union Data **data;
};

実行可能な Code Gear の数を示す codeNum

実行可能な Code Gear へのポインタ code

Data Gear の Allocate 用のポインタ heap_start, heap, dataSize

Data Gear の数を示す dataNum

Data Gear へのポインタ data

Data Gear

union Data {
    struct Tree {
        // Tree member definition
    } tree;
    struct Node {
        // Node member definition
    } node;
    struct Allocate {
        long size;
        enum Code next;
    } allocate;
};

Data Gear は C の共用体と構造体を用いた表現する

Persistent Data Gear

Data Gear の管理には木構造を用いる

非破壊で構成する

 平行して読み書き・参照を行うことが可能

 変更前の木構造をすべて保持しているので過去のデータにアクセス可能

arch

Worker

Worker は Synchronized Queue から実行する Code Gear を取得

実行に必要な Data Gear は Persistent Data Gear から読み込む

処理が完了したら Persistent Data Gear に書き込む

arch

Synchronized Queue

List を表現する Code/Data Gear に CAS(Compare and Swap) を行う Meta Code/Data Gear を接続することで Synchronized Queue を実現する

Gears OS の機能は状態遷移図とクラスダイアグラムを組み合わせた GearBox という図で表現する

M:receiver/sender が CAS を行う Meta Code Gear となる

sync

Code Gear の例

// Code Gear
__code code1(struct Context* context) {
    context->data[Allocate]->allocate.size = sizeof(struct Node);
    context->data[Allocate]->allocate.next = Code2;
    goto meta(context, Allocate);
}

必要な情報を Data Gear に書き込み Allocate を行う Code Gear に接続する Code Gear

ポインタを扱っており設計思想と異なる

Code Gear の例

// Code Gear
__code code1(Allocate allocate) {
    allocate.size = sizeof(struct Node);
    allocate.next = Code2;
    goto Allocate(allocate); // goes through meta
}

前の Code Gear として解釈するように CbC コンパイラを改良する

比較

Code Gear

 Cerium の Task

 Alice の Code Segment

 OpenCL/CUDA の kernel

Data Gear

 Alice の Data Segment

 Ceirum, OpenCL/CUDA には同等のものはない

Gears OS は Alice と同様に処理とデータの関係から依存関係を決定

Cerium, OpenCL/CUDA では処理同士の依存関係を記述する

 データの依存関係を保証できない

今後の課題

必要な機能の実装

 Synchronized Queue

Cerium と同様の例題を動かし比較・評価

 Sort

 Word Count

 FFT

GPGPU のサポート

まとめ

処理とデータの関係から処理同士の依存関係を解決し、並列実行するように設計を行なった

Gear という単位を用いて記述することでプログラムを柔軟に変更することを可能とした

Meta Code/Data Gear を用いて Meta Computation を実現する