次期グラフシミュレータ(GraphSim3)に関する考察(1)

修了もほぼ確定したことだし,そろそろ研究室ではできなかった研究の話でもしようかと思う今日この頃.
私はM1の頃から,プラスティックセルアーキテクチャ(以降PCA)用機能シミュレータ「GraphSim(現GraphSim2)」の開発を行っていました.いろいろな寄り道をしたあげく,去年の夏前には,必要最小限のフレームワークを構築し,自分のPCA用回路の開発に役立てていました.
手前味噌で申し訳ありませんが,PCA回路を開発する際,機能シミュレーションには非常に役に立つと思います.それまでC言語などを用いて開発していましたが,C言語などを用いると,そこからのストリーム処理への変換,機能分割,機能結合を脳内で行わなければならず,その辺りにバグがあると,非常にややこしい世界に突入してしまいました.しかし,GraphSimを用いることで,機能分割,結合までのテストを行うことができます.
GraphSimでアルゴリズム*1の正しさを検証したら,あとは実際に各機能回路をレイアウトし,非同期回路として正しく動作するかどうかを単体テスト結合テストを行うだけになります.まあ,ここが一番難しいんですけどね.GraphSimを用いない場合,アルゴリズムのバグか,各機能回路の実装バグかの判断したうえで,必要ならばアルゴリズムに立ち戻らなければならなくなります.それに対して,GraphSimを用いた場合,アルゴリズムのバグは全部つぶすことができます.すなわち,アルゴリズムを構成する基本処理をキチンと機能回路として実現していれば,ほぼ全ての回路は正しく動作することになります*2
さて,このGraphSim,あまり使ってくれる方がいません.まあ,それは良いんです*3.しかし,現状のGraphSimはある種の完成形に近く,これに新しい機能を追加しようとしたときに,非常に困難を伴います.たとえば,「遅延情報を加味したスケジューリング」です.私はこれの実装に1ヶ月を費やしましたが,結局日の目を見ることはありませんでした.
さて,このGraphSimですが,拡張を企んでいます.完全に趣味で,無用の長物ができあがるのが目に見えていますが,これを弄ってるのが幸せなんだから仕方がない.それに,私はPCAに抱いた夢をいまだに忘れられません.PCAは,CPU+Memoryという現代の汎用処理情報機構を完全に時代遅れのものにしてしまう可能性を秘めています.
具体的な拡張方針として,次の3つの項目を考えています.

  1. スケジューリングが可能
  2. 動的再構成可能
  3. プラットホームの導入

スケジューリング可能

これは,非常に難しい問題です.
現状のGraphSimでは,ユーザーが自由にスケジューリングを行うことができません.この場におけるスケジューリングとは,各機能回路の動作順序のことを指します.なぜ難しいか.
GraphSimでは,1つの機能回路を1つのスレッドで動作させています.そして入出力を管理するChannelオブジェクトでブロッキングを行い,スレッドの停止・再開をコントロールしています.
このChannelオブジェクトを弄ることで,私はスケジューリングの管理を行おうとしました.しかしこれが難しい.暫定的には動作するのですが,時々,デッドロックが発生します.これは,もともとスケジューリングを想定しないクラス構成をとっていたため,付け焼刃では難しいということです.
私のイメージでは動くはずなんですけど... 完全に,私の力不足です.

動的再構成可能

現状のGraphSimを用いても,動的再構成を表現することはできます.しかし,APIを叩けばできるというだけです.
PCAでは,動的再構成には2種類あり,機能回路の動的再構成と,機能回路間の通信チャネルの動的再構成があります.これは,グラフにおいて,ノード(機能回路)の内容の書き換えと構造(通信チャネル)の書き換えにあたります.
まず,ノードの内容の書き換えですが,動作中の書き換えは行えません.一度,ノードの動作を止めて,書き換えて,再開させるという手続きが必要です.
また,構造の書き換えですが,これはGraphSimのAPIを叩く必要があります.しかし,PCA回路はAPIを叩くなんてことは行わず,相手ノードまでの通信経路をワームホールルーティングを用いて生成します.これでは,アルゴリズム記述と回路実現のギャップが生まれてしまいます.
特に後者の問題を解決したいと考えています.

プラットホームの導入

現状のGraphSimでは,プラットホームに依存しません.すなわち,PCA的ストリーム処理を記述することはできるが,現実のデバイスであるPCA−1,PCA−2に沿った回路を記述するためのサポートはありません.
私の目的は,プラットホームを変更するだけで,他の機能記述には一切の手をつけずにPCA−1,PCA−2,そして今後考えられる他の用途(例えばunixのようなコマンドライン的な処理)へと適用できるものを目指したいと考えています.
今日のところはこの辺で〜

*1:ここでは基本ストリーム処理の組み合わせにより実現される機能構成を指す.基本ストリーム処理とは,ストリームの分岐,合流,変換を指す.

*2:もしできない場合があるとすれば,私の見落としです.善処しますので報告願います

*3:本当はまったく良くないですけど.黒田研PCA班のみなさん,できればたくさん使ってくださいね〜