Cベース設計 3分間クッキング(1) ――乗算回数とトグル数
最近,カレーをよく食べる.今日のカレーは野菜カレーで,にんじんとブロッコリ入り.ブロッコリをゆでるとき,ついつい見入ってしまうのがブロッコリのつぼみの数.いったい,このつぼみは何個くらいあるのでしょう.
スーパの特売で買ってきたブロッコリは小ぶりで,これを半径4cm程度の半球だとすると,表面積はだいたい100cm2.1cm2に100個つぼみがあるとすると合計10,000個.つぼみはでこぼこと密集しているので,15,000個はありそうだ.ブロッコリ一つで15,000個のつぼみ.特売じゃないりっぱなブロッコリだと,つぼみが30,000個はありそう.2進数でいえば14ビットか15 ビット.包丁で半分にすると,確かに15回くらいは枝分かれしているようだ.これがずっと続くとフラクタルである.
このつぼみ1個がトランジスタであるとすると,単精度浮動小数点の乗算器のトランジスタ数がだいたいブロッコリ一つ分.信号処理などのアルゴリズムを検討するとき,どんな乗算器が使えるかや乗算回数が何回になるかが気になるところだ.今後ソフトウェアとハードウェアの垣根がなくなってきて,ソフトウェアを作りながら必要なハードウェアを作るスタイルが定着すれば,乗算器の個数やビット幅にも自由度がでてくる.料理で言えば,今までブロッコリを1個使いきるようにあれこれ考えて料理していたのに対して,ブロッコリを4個使ったり半分だけ使ったりといったことが可能となってくる.
* * *
アーキテクチャの決定に対するソフトウェアの影響力が増してくると,性能解析においてソフトウェアの一部をハードウェアにした場合に性能がどう変化するかを考えながら,ソフトウェアをコーディングする必要がでてくる.例えば,乗算についてはビット幅や回数が問題になる.また,乗算入力のビット・トグルを少なくして,できるだけ静かに動くようにする.このような作業は信号処理解析ツールなどを利用すれば可能だが,C++を使ってリスト1のような感じで乗算演算子をオーバロードしてやることでも実現できる.
リスト1の24行目が15ビット幅の整数の定義で,その中身が1~19行目.ここでは乗算回数と乗算入力のビット変化の計数を行う.テンプレートを使用して,1~32ビットの各ビット幅に対応している.5行目が代入演算子の定義で指定ビット幅にカットする.7行目が乗算演算子の定義で,count変数で乗算回数を数えて,8,9行目で前回の乗算入力からのビット変化を計数する.この関数は30行目のin1*から呼ばれる.
〔リスト1〕乗算とトグルの計数
1 template<int W> struct my_int {
2 int value,count,last_i1,last_i2,toggle;
3 my_int(){value=count=last_i1=last_i2=toggle=0;}
4 operator int() {return(value);}
5 int operator=(int x){value=(x<<(32-W))>>(32-W);
6 return(x);}
7 int operator*(int x){count++;
8 t_count(&last_i1,value);
9 t_count(&last_i2,x);
10 return(value * x);}
11 void t_count(int *a,int b){
12 int tmp = *a ^ b;
13 *a = b;
14 for(int i=0;i<W;i++){
15 if(tmp & 0x01){toggle++;}
16 tmp >>=1;
17 }
18 }
19 };
20
21 #include <iostream>
22 main()
23 {
24 my_int<15> in1,in2;
25 int out32=0;
26
27 for(int i=0;i< 10;i++){
28 in1= i;
29 in2= -i;
30 out32 += in1 * in2;
31 }
32
33 std::cout << out32 << "\n"
34 << in1.count << "\n"
35 << in1.toggle << std::endl;
36 }
* * *
ブロッコリにこのような計数機能を組み込むことで,料理のメニュー(ブロッコリとトマトをオリーブ・オイルで和えたサラダ,ブロッコリと油揚げとかつおだしのスープ,ブロッコリと帆立貝のうま煮といった一連の料理)にどれだけブロッコリが使われたかを,ブロッコリに数えさせることができる.
(本コラムはDESIGN WAVE MAGAZINE 2004年2月号に掲載されました)
◆筆者プロフィール◆
さめしま・まさひろ.高速ディジタル回路のコンサルティングやEDA ツール関係のしごとに従事.