!!!SimMcの使い方解説 {{category コンピュータ関連Tips}} このページは、[東工大吉瀬研究室|http://www.arch.cs.titech.ac.jp/]で開発・配布されているメニーコアーキテクチャM-CoreのシミュレータSimMcを使うためのガイドです。 ---- 注意!!このページは公式の配布サイトとは一切関係ありません。従って、このページの内容についての質問その他は、吉瀬研究室に連絡しないでください。 ---- {{outline}} !!!必要なもの Linux環境、そしてSimMcとクロスコンパイラが必要です。次の2つのうちいづれかの方法で環境を用意してください。 !!(1) VirtualBoxのイメージを利用する Ubuntu-10.04をベースに、SimMcおよびクロスコンパイラ一式をインストールしたイメージを用意しました。 ::VirtualbBox http://jp.sun.com/products/software/virtualbox/get.html Windowsの一般的なインストール同様ダイアログに従う ::SimMc環境構築済みVirtualBox環境 [SimMcDev-1.0.zip(1145607238)|http://comp.is.uec.ac.jp/miyo/archives/SimMcDev-1.0.zip] をダウンロード (MD5 (SimMcDev-1.0.zip) = a48c7353862399f2edb90d2840f73e6b) 1. ファイルを解凍する 注意!!「デスクトップ」のような日本語ディレクトリでは次のインポートができません。c:\tempなどに展開してください。 2. VirtualBoxを起動し、アプライアンスのインポートを行う Windowsの場合、メニューの「ファイル」→「仮想アプライアンスのインポート」です。 {{ref_image import.jpg}} !!(2) 自分でコンパイルする場合 ::SimMc http://www.arch.cs.titech.ac.jp/mcore/ * Ubuntu10.04でコンパイルする場合には[[パッチ|Diary/2010-5-12]]をあててください ::mipselクロスコンパイラ 自分で作るにしてもbuildrootで作成するのが簡単。 mipsel-linux-gcccで、uclibcが必要です。 !!!SimMcインストール済みLinuxの起動と終了の仕方 VirtualBox上でのLinux環境の起動と終了の仕方を覚えておきましょう。 !!起動 !1. VirtualBoxを起動し、メニューからSimMcDevをダブルクリックします。 {{ref_image start.png}} 起動中にVirtualBoxがダイアログメッセージを表示する場合がありますが「OK」で進んでください。 !2. ログイン 画面では、ユーザsimmcを選択。パスワードは simmc です。 {{ref_image login_s.png}} !!終了 !1. メニューバー右端の電源ボタンのアイコンをクリック !2.「Shut Down...」を選択 !!!SimMcの起動 早速SimMcを起動してみましょう。SimMc環境VirtualBoxイメージの場合、SimMcは/home/cad/SimMc/simにインストールされいて、パスが通っています。 !1. ターミナルを起動します。 メニューバーの「Applications」→「Accessories」→「Terminal」を辿りクリック {{ref_image terminal_s.png}} !2. プロンプトで SimMc と入力 SimMcが起動。ヘルプメッセージの表示を確認しましょう。 {{ref_image exec_simmc_s.png}} !!!Hello M-Core SimMcでは普段のコンソールプログラミングと同様に標準出力関数を使って、文字列を表示させることができます。まずは、おきまりのHello Worldを実行してみましょう。 #include int main(int argc, char **argv) { printf("Hello M-Core\n"); } !1.好きなエディタでプログラムを書く。 例えば「Applications」→「Accessories」→「gedit Text Editor」で、ノートパッドライクなエディタが起動します。ここでは、test.cという名前で保存することにします。セーブ先のディレクトリはホームディレクトリのまま、その他のオプションもデフォルのままでいいです。 {{ref_image write_program_s.png}} {{ref_image save_test.c_s.png}} !2.コンパイルする クロスコンパイラでコンパイルします。Terminalから下記のコマンドを実行してください。 mipsel-linux-gcc -static test.c ここで、"-static"をつけ忘れると、ただしくプログラムが実行できませんので注意してください。 {{ref_image compile_s.png}} !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を使う :-)