3.5.例題プログラムと実験
3.5.1.例題プログラム
ここでは,作成したA−BITSプログラムを2つ用意する.1つ目は,値を2つ入力して大きいほうの 値を表示するプログラムである.それから2つ目は,2つの値の最大公約数をユークリッドの互除法で 計算して結果を表示するプログラムである.次に,それら例題プログラムについての説明を行う.
◆ 最大値を表示
まず1つ目のA−BITSプログラムとして,2つの値を入力して大きいほうの値を表示するプログラムに っいて説明する.これは図3.52に示してあるが,図3.52の方はTestという識別子の部品で,図3.53 の方は MaxMin という部品である.
Test ではまず, 1bit:1 がトリガを発生させてそれを 32bit:Inputlnteger の TrIn 端子に送って
入力待ち状態にする.それからユーザが整数を入力してEnterキーを押すと,入力された32ビット値
が MaxMin の Op1 端子に入る.それと同時に 32bit:lnputlnteger の TrOut端子 からトリガが出ても う1っの 32bit:lnputlnteger に入り,再び入力待ちとなる.そこで,ユーザが同じように値を入力し てEnterキーを押すと MaxMin の OP2 端子に入る. 32bit:Printlnteger では, MaxMin の Max 端子 からの32ビット値(2つの値の大きいほう)を受け取って画面に表示する.
Test から MaxMin に値が入ることは前述したが,そのときは Op1 と Op2 から32ビット値が出て くるので,両方の値をまず複製してその1組は 32bit:Compare の入力として使用する. 32bit:Compare は ,もし Op 1 の値〉 Op2 の値ならビット値1を出力し,そうでなければビット値0を出力する.複 製されたもう一方の値の組はもう一度複製されて2組の経路の両方に存在している 32bit:Gate に入
る. 32bit:Gate の一方の組は 32bit:Compare の実行結果でビット1が出力されたときに開き,もう 一方の組は 32bit:Compare の実行結果でビット値0が出力されたときに開くようになっている.双方 の経路は 32bit:Gate の先で結合される.ただし,双方の経路は値の接続が逆になるように接続されて いる.開かれない方の 32bit:Gate は値を破棄するので,結果的にどちらかの値の組のみが MaxMin の
Max 端子と Min 端子に出力されることになる.
Tei・t
2つの値を入力する
1ヒ)lt 1
トリガ送出 C:E.,t→τ「in
Xノ.f直、_販・」、f直
大きい値を表示 酬p輪1°†蜘
図3.52最大値を表示(メインUnit)
}1略・、ト,¶rl
Lluptl・:3rピ
取大値と最小値
図3.53 最大値と最小値(MaxMin Unit)
◆ ユークリッドの互除法 ユークリッドの互除法とは,
である.
2つの値の最大公約数を求めるための方法で,次のようなアルゴリズム
2つの値をaとbとしたとき,もしa>bならばX←aでY←b,そう
でなければX←bでY←aとする.
T←(a÷bの余り)とする.
もしT≠0ならばX←YでY←Tとして1に戻り,そうでなければa
とbの最大公約数をYとして終了する.これをA−BITSプログラムとして作成したものが図3.54と図3.55である.前者は Test という識別子 の部品で,後者は gcm32 という部品である.
Test での動作は MaxMin のときとほぼ同じであるが, MaxMin であった部分が gcm32 に置き換わ っている. 32bit:Inputlnteger の2つの出力値は gcm32 の Op1 端子と Op2 端子に入り, gcm32 の
Result 端子からは2つの値の最大公約数が出力される.その32ビット値は, 32bit:Printlnteger の ln 端子に送られて表示される.
gcm32 の内部は MaxMin とは異なり,データのフィードバックループが存在する.そのため,ルー プ中に新たなビット列が入ってこないように 32bit:Gate を設置して32ビット値を1つ通したら閉じ るようになっている.※ 32bit:Gate を通過したデータの「割る数」にあたる方は2回複製されて2つ の32bit:Gate(A, Bとする)で一旦保留される.それから「割られる数」と「割る数」に当たる2つ
1組の数値は 32bit:Divide で計算が行われてその結果の剰余が Mod から送出され,それが複製され て1つは 32bit:Gate (Cとする)に入る.もう1つは 32bit:Equal に入って32ビット値0と比較が 行われ,等しければビット1を,そうでなければビット0が結果として送出される.その値はAに,そ れを反転した値がBとCに入る.Aが開くとそれは gcm32 の Result 端子に送られて外部に送出され
て計算結果となる.B, Cが開くと, Bの値は「割られる数」, Cの数は「割る数」になって※の経路
†
デニン一﹁
lbit:1
トリ
力 −1:lut−〔》Tt 1rl
入力1
32btt.lnpリtl∩tef(er
入力2
・32blt:lhP{.〔tlntefcer rtl〕1」†一→TtlrI
{]lt−lf−c・F,] − I li } →1)PL.
1
、
レ ゜口
や _ム
計算
不
図3.54 ユークリッドの互除法(メインUnit)
●
若くーn じ:IE
OFIピーナ{r:
〔lut1→「r l rI 32ヒllt:}3tを
t 〔lut→}「{
1ヒltt:喧 _
一 一rd :
uりt→ln
一已rヨ1:
「.
口↓」tL;一→Trlr|
Pt−一.一一
〔lt.lt1−→ln
lt−IF・1い⊃ヨt巳
一bIn ]L]t−lrl1
lblt:1
⑪utZ−→「r l「」
32bit:|ヨte
一→ n 授
n・﹁
32b it:Sate
﹁→
U吐
e
I
fJ(t
OLIt−→1〕P 1
:…12bi†:[1}㌧ll:】e
U t
→ 臼
n f
寵 五→
〇
Out1−→Tr}rr
M)d→ln
t嗜rヨ ー up
l:▲リt1−→:〕p1
1]1−lt−t}「}1
tJU
32blt:Equal
ユ
enet rd l:DI」F・1|f膓ヨte
クリッドの互除法
一↑−τヨ白
1
鯨
E:Ct,:,1を3n−tlrt
E「1讐t葛
erletヨに〔1りPい1:ヨ
F[ e i:リlt−→lr」
ttt.
ィ
1
・だ
図3.55 ユークリッドの互除法(gcm32 Unit)
3.5.2.実験
◆ 最大値を表示
2つの値を人力してその最大値を表示するA−BITSプログラムの2回の実行結果を,図3. 56に示す.
左図は1回目で,右図が2回目である.1回目の入力値は「66565」と「545648648」で,結果として大 きい方の数が表示されているので正しい.また,21・旧の入力値も「35876521」と「86」で,結果とし て大きいほうの数が表示されているため正しい.それから,それぞれ計算に要した時間をドの表に示す.
参考として,C++言語で同じ働きをするプログラムを記述して実行した結果の計算時間も下の表の右端 に示してある.なお実行環境のCPUはPentium3450MHz, OSはWindows XPである.
対象 単純巡回実行方式 マルチスレッド方式 C++言語で記述(参考)
1回目 Q回目
6.2×10㌧5[s]
U.2×10^−5[s]
5.7×10^−1[sコ T.7×10^−1[s]
1.7×丑0^−7[s]
P.7×10^−7[s]
図3.56 最大値と最小値の実行結果
◆ ユークリッドの互除法
ユークリッドの互除法で最大公約数を計算するA−BITSプログラムの2回の実行結果を,図3. 57に示 す.左図が1回目で右図が2回目である.1回目では入力値が「45151356」と「354」で,計算結果とし て「6」が表示されている.この2つの値の最大公約数は6であるため計算結果は正しい.また2回目 の人力値は「874」と「234885536」で,計算結果としては「2」が表示されている.この2つの値の最 大公約数は2であるため計算結果は正しい.それから,それぞれの計算時間を下の表に示す.最大値の 表示のプログラムの場合と同様に,参考としてC斗+言語で同じ働きをするプログラムを記述して実行し た結果の計算時間も下の表の右端に示してある.実行環境も同じく,CPUはPentium3450MHz, OSは
Windows XPである。
対象 単純巡回実行方式 マルチスレッド方式 C++言語で記述(参考)
1回目 Q回目
1.9×10㌧3[s]
R.8×10^−3[s]
5.8×10^ P[s]
T.3×10^ P[s]
5.9×10^−7[s]
P.1×10^−6[s]
図3.57 ユークリッドの互除法の実行結果
3.6.評価
3.6.1.インタフェースの評価
ここでは,プログラムの視覚的な側面を中心に評価を行う.まず,図3.52と図3.・53図はどちらも Node数とEdge数のそれぞれが10個未満の配置数であるということもあり,コメントとしてTextを入 れる余裕もあるほどすっきりとしている.実際両プログラムは, MaxMin と gcm32 の部品を差し換え てコメントを変更した以外には違いがないため,見た目はほぼ同じである.Edgeに付属する選択円(矢 印が描かれている青丸図形)が示すビットの流れる方向を見るだけでほぼプログラムの流れを把握でき るので,テキストプログラムと比べると視覚的にメリットがあるといえる.ただ,Nodeから出る端子を 読み取るために矢印に付属する Out→ln のような形式のテキストを見る必要があるが,位置的に離れ た場所に目を移動するため,接続関係を把握し辛い点が問題である.
ここで,実際のテキストプログラムによる記述と比較することにする.図3.53とほぼ同じ機能を持 っプログラムをC++言語で記述すると,次のようになる.
long maxmin(long a, long b){
return (a>b ? a : b);
︸
この記述の意味は,「2つの符号付き整数を変数aとbで受け取り,もしa>bならば戻り値としてaを返 し,そうでなければbを返す関数」である.また,図3.55のプログラムと等価な機能をC++言語で記 述すると,次のようになる.
10ng euclid(long x, long y){
for(10ng t; ; x;y, y=t){
t=X%y;
if( t==0 )
return y;
}︸
この記述の意味は,「2つの符号付き整数を変数xとyで受け取り,ユークリッドの互除法のアルゴリズ ムで算出した最大公約数yを返す関数」である.このように,A−BITSで記述した2つの例題のどちらも,
わずか数行のプログラムで表現できることがわかる.しかしながら,このような短いプログラムを記述 するためには言語固有の構文や演算子などの多くの記述規則を覚えなければならないため,記述量のみ でどちらが簡単かを判断することはできない.特に一般的な言語ではあらかじめプリミティブデータ型
と演算が定義されているため,この例題のようなプログラムはテキスト言語のほうが記述し易いのは当 然であるといえる.ただ,A−BITSによる記述は並行性とビットレベル操作が表現できるため,例えば整 数ビットデータの一部だけ取り出すなどの操作に対しては本システムに優位性があるといえる.
図3.53と図3.55では,NodeやEdgeに付属するテキストと狭いプログラムマップがプログラムを読 みにくくしている.付属テキストは,Nodeの種類やEdgeの接続端子を表示するための重要なものであ るが,他のテキストと重ならないようにしなければならないため,狭いマップ上での接続線の配置は困 難である.また,図式に表現されていても必然的に図中に表示される文字の量が多くなってしまうため,
VPLのメリットを十分に生かすことができない点も問題である.これらの点はスクロール可能なプログ ラムマップ,及び付属テキストの移動機能を追加することによって容易に解決できると考えられる.
図3.55では,Node数とEdge数が多く接続関係も複雑でEdgeの交差も多いため,そのプログラムが 何をしているのかを一目で把握することが難しい.それに伴い,プログラムマップのスペースもほとん
どなくコメントとしてTextも配置できないほど込み入ったものとなってしまっている点は大きな問題 である。これは,A−BITSプログラムの規模が大きくなると現れる言語仕様の問題である.従って前述の 機能追加では解決できず,言語仕様の変更が必要であると考えられる.