Cベース設計 3分間クッキング(3) ――メモリ・アクセスのコスト
料理に失敗したとき,「料理にもシミュレータがあったらいいなぁ」と思う.電気の設計では,画面を見ることでシミュレーション結果を受け取ることができる.料理の場合はシミュレーション結果が味覚であるため,適当な出力装置がまだない.世界は広いので,料理シミュレータを本気で研究している人もたくさんいると思う.脳にコネクタをつなぐ装置とか,におい発生器とか,舌にインク・ジェットのしくみで味の要素を吹き付ける機械とか....
ただ,知識として,材料とその調理結果の味に関する情報が集まってくると,頭の中で味と手続きを合成して料理の完成品の味を想像できるようになる.これがプロの料理人.このへんは電気のベテラン設計者と同じ感じであろう.
データが頭にないときは,試作してみたり,料理の本やWeb検索でレシピにアクセスする.しかし,リアルタイム性が要求されるいため物の途中などでアクセスしていたりすると,処理結果が悲惨なことになるので,事前に本をよく読んで,キャッシュ(頭)にレシピをためておく.キャッシュにたまったレシピで自炊していれば,コストも安い.
* * *
組み込みシステムでも,外部メモリ・アクセスは電力などのコストが高くつく.データ・アクセスを解析するツールを使用すればコストを見積もれるが,オーバ・ロードを利用して配列アクセスから関数を呼ぶことでも同様のことができる.
リスト1の28行目が配列アクセス用の宣言で,中身は17~22行目.20行目で添え字演算子[ ]をオーバ・ロードして,ここから4行目のbarを呼んでいる.barでは,9行目の代入で書き込み(write)アクセス,11行目の参照で読み出し(read)アクセスとしてカウンタをインクリメントしている.データの実体は1行目で宣言したRAM配列.13行目のポスト・デクリメント演算子(--)のオーバ・ロードは,32行目の右辺に対応する.13行目の*thisからの読み出しは,自分(*this)からintで読み出すことで11行目を呼び,14行目では自分に書き込むことで,9行目を呼んで書き込みを行う.
31行目~33行目がメモリ・アクセスの実行.34行目はアクセス回数の表示.このサンプルでは,読み出しが1回,書き込みが4回となり,35行目のデータの出力では,「321」と表示される.
実際の応用では,9行目,11行目からトランザクションを起こして,キャッシュ・ヒット,ミス・ヒットなどのアクセス経路情報を元にエネルギを概算し,アルゴリズムのコストを評価する.
生身のシステムである筆者としては,たまにはキャッシュをおもいきりミス・ヒットさせて,懐石料理などを食べに行きたいものである.
〔リスト1〕添え字演算子のオーバ・ロード
1 int RAM[128];
2 int R_CNT, W_CNT;
3
4 struct bar {
5 int addr;
6 bar(int addr_i):addr(addr_i){}
7 int operator=(const bar &other){
8 return(*this=(int)other);}
9 int operator=(int data){ ::W_CNT++;
10 return(::RAM[addr]=data);}
11 operator int() const { ::R_CNT++;
12 return(::RAM[addr]); }
13 int operator--(int) { int tmp=(int)*this;
14 *this=tmp-1; return(tmp);}
15 };
16
17 struct foo {
18 int base;
19 foo(int base_i):base(base_i){}
20 bar operator[ ](int addr) const {
21 return bar(addr+base); }
22 };
23
24 #include<iostream>
25 using namespace std;
26
27 int main(){
28 foo mat(0);
29 bar mmapreg(0);
30 ::R_CNT=::W_CNT=0;
31 mat[2] = 2;
32 mat[1] = mat[2]--;
33 mmapreg=3;
34 cout<<"R:"<<::R_CNT<<" W:"<<::W_CNT<<endl;
35 cout<<::RAM[0]<<::RAM[1]<<::RAM[2]<<endl;
36 }
(本コラムはDESIGN WAVE MAGAZINE 2004年4月号に掲載されました)
◆筆者プロフィール◆
さめしま・まさひろ.高速ディジタル回路のコンサルティングやEDA ツール関係のしごとに従事.