SESCでのマルチコアプロセッサのシミュレーション
投稿日: | |
---|---|
タグ: |
SESCで複数のコアで複数のスレッド(またはプロセス)を同時実行しようとした時のことをメモ.結論からいうとこの記事は調査不足のまま書いているが,一応メモしておくことにした.今回の内容で主に参考にした情報源はDongrui's Homepageやあるメール である.
マルチコアを使用するためのAPI
1つのプログラムで複数のスレッドを持つようなプログラムはSESCが提供するAPIを使用して記述することができる. そのAPIは"src/libapp/sesc_thread.c"で定義されており,"src/libapp/sescapi.h"を取り込み,先のCファイルから生成したオブジェクトとリンクすればAPIを利用できる. APIについては"docs/README.libapp"や"sescapi.h"で説明されている.
sescapi.hの一部(...は省略)
void sesc_init(void);
...
int32_t sesc_spawn(void (*start_routine) (void *), void *arg, int32_t flags);
...
void sesc_exit(int32_t err);
これらのAPIは中でpthreadによって何か行われているらしく,提供される関数も同様なものだった.APIを使用したコードは次のようになる.
#include <stdio.h>
#include "sescapi.h"
#define THREADS_NUM 4
void *hello(void *arg)
{
printf("Hello World!\n");
sesc_exit(0);
return NULL;
}
int main()
{
int i;
sesc_init();
for(i=0; i<THREADS_NUM; i++){
sesc_spawn((void*) *hello, NULL, SESC_FLAG_NOMIGRATE|SESC_FLAG_MAP|i);
}
sesc_exit(0);
return 0;
}
これが書かれたファイルは"sescapi.h"と"sesc_thread.o"と同じディレクトリにあるものとする.
コードの説明らは省略するが,これをクロスコンパイルしたものをSESCで実行した後,前と同様にレポートを出力する.
user% ./scripts/report.pl -last
# Bench : ./sesc.mem ./test/test2
# File : sesc_test2.yCPolo : Sun Aug 26 04:25:10 2012
Exe Speed Exe MHz Exe Time Sim Time
(5000MHz)
720.300 KIPS 7.3911 MHz 0.010 secs 0.015 msec
Proc Avg.Time BPType Total RAS BPred
BTB BTAC
0 252.198 hybrid 54.03% (100.00% of 10.63%) 48.56% (
48.77% of 34.82%) 0.00%
1 239.483 hybrid 61.07% (100.00% of 9.06%) 57.20% (
49.58% of 39.93%) 0.00%
2 239.069 hybrid 61.07% (100.00% of 9.06%) 57.20% (
49.58% of 39.93%) 0.00%
3 238.655 hybrid 61.07% (100.00% of 9.06%) 57.20% (
49.58% of 39.93%) 0.00%
nInst BJ Load Store INT FP : LD Forward ,
Replay : Worst Unit (clk)
0 2925 19.93% 19.93% 12.41% 47.66% 0.07% : 13.04%
731 inst/repl : ALUIssueX 0.06
1 1426 20.90% 23.63% 13.88% 41.58% 0.00% : 19.58%
713 inst/repl : ALUIssueX 0.09
2 1426 20.90% 23.63% 13.88% 41.58% 0.00% : 19.58%
713 inst/repl : ALUIssueX 0.09
3 1426 20.90% 23.63% 13.88% 41.58% 0.00% : 20.18%
713 inst/repl : ALUIssueX 0.09
Proc IPC Active Cycles Busy LDQ STQ IWin ROB Regs Ports
TLB maxBr MisBr Br4Clk Other
0 0.04 99.98 73898 1.3 0.0 0.0 0.1 0.0 0.0 0.0
10.6 0.0 87.9 0.0 0.1
1 0.05 41.47 30651 1.6 0.0 0.0 0.1 0.0 0.0 0.0
6.9 0.0 91.3 0.0 0.1
2 0.05 41.41 30604 1.6 0.0 0.0 0.1 0.0 0.0 0.0
6.9 0.0 91.2 0.0 0.1
3 0.05 41.34 30556 1.6 0.0 0.0 0.1 0.0 0.0 0.0
7.0 0.0 91.2 0.0 0.1
################################################################################
Proc Cache Occ MissRate (RD, WR) %DMemAcc MB/s : ...
0 DL1 0.0 6.24% ( 3.7%, 2.5%) 37.70% 0.26GB/s : Bus 749.009 MB/s
: L2 0.0 43.22% (43.2%, 0.0%) 18.50% 0.88GB/s : MemBus 883.224
MB/s :
1 DL1 0.0 7.02% ( 4.7%, 2.3%) 20.10% 0.16GB/s : Bus 749.009 MB/s
: L2 0.0 43.22% (43.2%, 0.0%) 18.50% 0.88GB/s : MemBus 883.224
MB/s :
2 DL1 0.0 7.21% ( 4.9%, 2.3%) 20.10% 0.16GB/s : Bus 749.009 MB/s
: L2 0.0 43.22% (43.2%, 0.0%) 18.50% 0.88GB/s : MemBus 883.224
MB/s :
3 DL1 0.0 7.11% ( 4.7%, 2.4%) 19.83% 0.16GB/s : Bus 749.009 MB/s
: L2 0.0 43.22% (43.2%, 0.0%) 18.50% 0.88GB/s : MemBus 883.224
MB/s :
################################################################################
Proc Cache Occ MissRate (RD, WR) %DMemAcc MB/s : ...
0 IL1 0.0 19.65% (19.7%, 0.0%) 26.92% 0.58GB/s : L2 0.0 43.22%
(43.2%, 0.0%) 18.50% 0.88GB/s : MemBus 883.224 MB/s :
1 IL1 0.0 16.67% (16.7%, 0.0%) 13.17% 0.24GB/s : L2 0.0 43.22%
(43.2%, 0.0%) 18.50% 0.88GB/s : MemBus 883.224 MB/s :
2 IL1 0.0 16.67% (16.7%, 0.0%) 13.17% 0.24GB/s : L2 0.0 43.22%
(43.2%, 0.0%) 18.50% 0.88GB/s : MemBus 883.224 MB/s :
3 IL1 0.0 16.67% (16.7%, 0.0%) 13.17% 0.24GB/s : L2 0.0 43.22%
(43.2%, 0.0%) 18.50% 0.88GB/s : MemBus 883.224 MB/s :
このように複数のコアを動かすこと自体は成功した.
既存のプログラムに対して
元々あるマルチスレッドプログラムを使う場合はどうするか,または複数のプログラムをどうやって並列して動かすか(そもそもそれができるのか)は結局まだ分かっていない.そこで,とりあえず複数のプログラムのソースコードを持ってきてmain関数を別の関数名に置き換え,新しく用意したmain関数付きのオブジェクトとリンクさせることにしてみた.こうすれば,前述で示した方法で複数のコアを使用することができると思ったからだ.結果はここに載せないが,一応この方法を用いれば複数のプログラムをそれぞれのコアで実行することはできた(色々と気になることはあるが). ちなみにこの方法を用いる前にexec関数らを使った方法を試みたが,それらの関数はSESCで実装されていなかったため上手くいかなかった.