SimMc
SimMcの使い方解説
このページは、東工大吉瀬研究室で開発・配布されているメニーコアーキテクチャM-CoreのシミュレータSimMcを使うためのガイドです。
注意!!このページは公式の配布サイトとは一切関係ありません。従って、このページの内容についての質問その他は、吉瀬研究室に連絡しないでください。
必要なもの
Linux環境、そしてSimMcとクロスコンパイラが必要です。次の2つのうちいづれかの方法で環境を用意してください。
(1) VirtualBoxのイメージを利用する
Ubuntu-10.04をベースに、SimMcおよびクロスコンパイラ一式をインストールしたイメージを用意しました。
- VirtualbBox
Windowsの一般的なインストール同様ダイアログに従う
- SimMc環境構築済みVirtualBox環境
(MD5 (SimMcDev-1.0.zip) = a48c7353862399f2edb90d2840f73e6b)
1. ファイルを解凍する
注意!!「デスクトップ」のような日本語ディレクトリでは次のインポートができません。c:\tempなどに展開してください。
2. VirtualBoxを起動し、アプライアンスのインポートを行う
Windowsの場合、メニューの「ファイル」→「仮想アプライアンスのインポート」です。
(2) 自分でコンパイルする場合
- SimMc
http://www.arch.cs.titech.ac.jp/mcore/
- Ubuntu10.04でコンパイルする場合にはパッチをあててください
- mipselクロスコンパイラ
自分で作るにしてもbuildrootで作成するのが簡単。
mipsel-linux-gcccで、uclibcが必要です。
SimMcインストール済みLinuxの起動と終了の仕方
VirtualBox上でのLinux環境の起動と終了の仕方を覚えておきましょう。
起動
1. VirtualBoxを起動し、メニューからSimMcDevをダブルクリックします。
起動中にVirtualBoxがダイアログメッセージを表示する場合がありますが「OK」で進んでください。
2. ログイン
画面では、ユーザsimmcを選択。パスワードは simmc です。
終了
1. メニューバー右端の電源ボタンのアイコンをクリック
2.「Shut Down...」を選択
SimMcの起動
早速SimMcを起動してみましょう。SimMc環境VirtualBoxイメージの場合、SimMcは/home/cad/SimMc/simにインストールされいて、パスが通っています。
1. ターミナルを起動します。
メニューバーの「Applications」→「Accessories」→「Terminal」を辿りクリック
2. プロンプトで SimMc と入力
SimMcが起動。ヘルプメッセージの表示を確認しましょう。
Hello M-Core
SimMcでは普段のコンソールプログラミングと同様に標準出力関数を使って、文字列を表示させることができます。まずは、おきまりのHello Worldを実行してみましょう。
#include <stdio.h> int main(int argc, char **argv) { printf("Hello M-Core\n"); }
1.好きなエディタでプログラムを書く。
例えば「Applications」→「Accessories」→「gedit Text Editor」で、ノートパッドライクなエディタが起動します。ここでは、test.cという名前で保存することにします。セーブ先のディレクトリはホームディレクトリのまま、その他のオプションもデフォルのままでいいです。
2.コンパイルする
クロスコンパイラでコンパイルします。Terminalから下記のコマンドを実行してください。
mipsel-linux-gcc -static test.c
ここで、"-static"をつけ忘れると、ただしくプログラムが実行できませんので注意してください。
3.実行する
コンパイルしてできあがったプログラムをSimMcで起動してみましょう。Terminalで以下のコマンドを実行します。
SimMc a.out
"Hello M-Core"が16個表示されましたか?実はSimMcにオプションをつけずに実行すると、4x4=16個のコアを持つプロセッサとして起動します。ですから16回表示されるのですね。
MClibを使うプログラムをコンパイルする
SimMc/M-Coreでは、MClibで定義されたAPIを使用して通信を行うことができます。それでは、早速MClibを使ったプログラムのコンパイルの仕方をみていきましょう。
次の例は、SimMcのサンプルtest30/main.cで、core(rank_x, rank_y)からcore(1,1)にデータを送るプログラムです。ここで、rank_x,rank_yは、一番IDの大きなコア、つまり4x4の構成であればcore (4, 4)にあたります。
/**********************************************************************/ /* Many-Core Architecture Research Project Arch Lab. TOKYO TECH */ /**********************************************************************/ #include "MClib.h" volatile int buf; /**********************************************************************/ int main(int argc, char *args[]) { int id_x, id_y, rank_x, rank_y; MC_init(&id_x, &id_y, &rank_x, &rank_y); buf = 0; if (id_x == rank_x && id_y == rank_y) { MC_sleep(10000); int dst = 0; setidxy(&dst, 1, 1); MC_dma_put_4b(dst, (int*)&buf, 777); } if (id_x == 1 && id_y == 1) { while(buf == 0); printf("buf %d (this must be 777)\n", buf); } MC_finalize(); return 0; } /**********************************************************************/
上のファイルをtest2.cとして保存したとして、先ほどのようにコンパイルしてみましょう。
mipsel-linux-gcc -static test2.c
コンパイルすると、残念ながら、次のようにエラーが表示されてしまいます
main.c:4:19: error: MClib.h: No such file or directory main.c: In function 'main':
これは、ソースコード中でincludeしているヘッダファイルであるMClib.hをコンパイラがみつけられずに失敗していることを意味しています。gccではコンパイル時にヘッダファイルを探す場所を追加する場合に、-I(念のためですが、これは大文字のアルファベット、アイです)というオプションを用います。VirtualBoxのイメージを使用している場合は、/home/share/cad/SimMcの下にMClib.hが格納されていますので、
mipsel-linux-gcc -I/home/share/cad/SimMc/lib -static test2.c
としましょう。もちろん自分でSimMcを展開した場合には、そのディレクトリを指定してください。
しかし、残念ながら、まだ不完全です。次のようなエラーが発生してしまうと思います。
tmp/ccKNBYVA.o: In function `main': main.c:(.text+0x94): undefined reference to `MC_sleep' main.c:(.text+0xbc): undefined reference to `setidxy' main.c:(.text+0xe4): undefined reference to `MC_dma_put_4b' main.c:(.text+0x164): undefined reference to `MC_finalize' collect2: ld returned 1 exit status
これは、オブジェクトファイルを作成しようとしたときにMClibの関数のオブジェクトがみつからないというコンパイル過程のリンカでのエラーです。これは、あらかじめコンパイルしておいたMClibの中間コードをコンパイル時の引数として一緒に指定することで解決することができます。
mipsel-linux-gcc -I/home/share/cad/SimMc/lib -static /home/share/cad/SimMc/lib/MClib.o test2.c
これでばっちりa.outが作成されます。
不幸にも
mipsel-linux-gcc: /home/share/cad/SimMc/lib/MClib.o: No such file or directory
というエラーが発生した場合には、
cd /home/share/cad/SimMc/lib make
として、MClib.oをコンパイルしてください。
なお、配布されているSimMcで用いられるクロスコンパイラは/home/share/cad/mipsel/usr/bin/mipsel-linux-gccが想定されていますので、自分の環境にあわせて適宜変更してください。
サンプルプログラムを実行してみよう
/home/share/cad/simmc/app/testの下に、サンプルプログラムがあります。ためしに、実行してみましょう。
SimMc /home/share/cad/simmc/app/test/test30/test.out
サンプルプログラムを読むとM-CoreのライブラリであるMClibの基本的な使い方がわかります。
もっと速くシミュレーションしたい!
- 仮想マシンではなく生のLinux環境を構築してSimMcを動かす
- FPGAによるシミュレータScalableCoreを使う :-)