竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS バス共有型によるSMPの性能モデル

<<   作成日時 : 2012/07/19 02:43   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

 基本的なマルチプロセッサ構成として、1本のバスに複数のプロセッサとメモリがぶら下がるバス共有型のシステムがある。

画像


 複数のCPUから共有バスを通じてメモリやI/Oへアクセスする。これはCPUが1個の時の構成と大きく変わらないので作るのは簡単。ただしCPUはバスマスタとなり得るので、優先順位の調整が必要となる。CPUはメモリなどの資源に平等にアクセスするためにラウンドロビンという方式で調停する。
この構成では4CPU程度までの実装しか見たことがない(8CPUというのもあるらしいが)。インテルXeon/ItaniumのFSB(Front Side Bus)によるCPUの最大数は4個で、2個はDP、4個はMPとグレードが分けられている。ではこれ以上増やせないのだろうか?
 1本の共有バスにたくさんのデバイスがぶら下がるのは電気的に問題が出そうだが、もしそれが解決されるとしたら他に増やせない要因はないだろうか。どうもバスマスタとなるCPUがたくさんあると競合しそうである。そこでモデルを作ってシミュレーションしてみた。

 CPUはある確率でバスにアクセスを出すものとする。50%なら2サイクルにつき1回の確率でバスマスタ権を要求する。複数のCPUからアクセスがあった場合は、ラウンドロビン方式でアクセス権を調停する。ここではアクセス権のキューに入ったCPU番号を見て、より優先順位の高いCPUからのアクセスがあれば許可してその番号をキューの最後に回す。アクセス要求を出して許可されなかったCPUは待つ。これがCPUのロスタイムとなる。CPUのすべてのサイクル(バスにアクセスしない時間は内部で計算しているものとみなす)ーロスタイムはCPUの効率となる。メモリは1サイクルに付き1回読み書きの要求を受ける。
 このモデルでCPUを1個から16個、CPUのアクセス頻度を10%〜90%として100万サイクル分計算してみた。

サンプル:(gawk)

ideone.com

※どーもwebry.blogはコードの貼り付けが上手くできないので上記ideone.comのソースと実行結果を見て下さい


#! /usr/local/bin/gawk -f
BEGIN{
Cpu = 4
Cycle = 1000000
Snapshot = 10000
Loadav = 0.3

# Bus priority controller
for(i=0;i<Cpu;i++) Prio[i]=i; # 0,1,2,3...


for(Clk=1;Clk<=Cycle;Clk++) {

# Cpu Bus Request
for(j=0;j<Cpu;j++) {
if (rand()<Loadav) {
if (Cpureq[j]>0) {
Wait[j]++;
} else {
Cpureq[j]++;
}
}
}

# Bus grant
Ack=-1;
for(j=0;j<Cpu;j++){
r=Prio[j]; # access grant
if (Cpureq[r]>0) {
Cpureq[r]--;
Ack=r;
BusUsage++;
roundrobin(j);
break;
}
}
if (Clk%Snapshot==0) report();
}

# summary
print "CPU= " Cpu
print "LoadAvarage= " Loadav
for(i=0;i<Cpu;i++) Loss+=Wait[i]/Cycle;
Loss/=Cpu;
print "Loss(%): " Loss*100
print "Spec: " Cpu*(1-Loss)

}

func roundrobin(n ,t,i) {
t=Prio[n];
for(i=n;i<Cpu-1;i++) Prio[i]=Prio[i+1];
Prio[Cpu-1]=t;
return;
}

func report( i) {
printf("Clk: %d ",Clk);
printf("Req: ");
for(i=0;i<Cpu;i++) printf("%d ",Cpureq[i]);
printf("Wait: ");
for(i=0;i<Cpu;i++) printf("%d ",Wait[i]);
printf("Ack: %d\n",Ack);
return;
}


これをExcelに持って行ってプロットしたのがこの図。

画像



 X軸がCPU数で、Y軸が性能。効率100%(ロスタイムなし)なら16CPUで性能16だが、メモリをアクセスしないことはないので実際にはありえない。CPUのアクセス要求を出す頻度で分けているが、予想どおりアクセス頻度が多ければグラフはだんだん低くなっていく。アクセス頻度50%では8CPU搭載しても4CPUをちょっと越えた程度の性能しか出ない。
 妥当なアクセス頻度を推定する。メモリへのアクセスは命令フェッチとロードストア命令によるデータの読み書きなので、命令フェッチの頻度をサイクルあたり0.25(4命令に1回)、ロードストア命令を0.25(4命令に1回)とすると0.25+0.25=0.5で50%。キャッシュメモリのミスヒット率を考慮すると、ヒット率80%でミスヒットが20%、つまりサイクルあたり25%がメモリへのアクセス頻度とみなす。グラフから見る時はミスヒット多めと見積もって30%の所を読んでみる。アクセス頻度50%の線と比較すると、ここでは4CPUで3CPU分の性能しか出ていないが、アクセス頻度30%ではまだ4CPU分に近い。ただし8CPUの箇所では7CPU分の性能を割っている。ここが開くと1CPUモデルでも別の計算機を用意したほうがマシということになる。

 かなり荒いモデルだが、アプリケーションの動作が定常状態になりアクセス頻度がある値で安定するとしたらこれでおおよそ判断することはできる。あとはメモリの帯域などを加味して調整すればよい。

 大昔にプロセッサのアップグレードを行ったら古い4CPUモデルよりも新しい3CPUモデルの方が性能が落ちたことがあったからだ。この時は新しいCPUが性能が良くてより大きな帯域をメモリに対して要求していたので、上記モデルで言うとアクセス頻度が増えた状態になっていたのだ。また最近でもこのモデルが適用できるケースがある。チップ内の複数コアは2次キャッシュを共有するSMPバスである。単純に増やすとその効果がなくなってくる点があるはずだ。実際、8コアを集積したSPARC64VIIIfxは4コア+2次キャッシュを2セットという構成になっており、1つのバスに8個のコアがぶら下がっているわけではない。

富士通、世界最速のSPARC64 CPU「SPARC64 VIIIfx」(PCwatch)

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




バス共有型によるSMPの性能モデル 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる