魔術師見習いのノート

プロフィール

魔術師見習い
Author魔術師見習い-_-.
Twitter魔術師見習い

コンピュータ関係のメモを主に書きます.

MENU

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で実装されていなかったため上手くいかなかった.

一覧