昨日は、MOS言語で記述したリアルタイムMOSプロセス1本を実行して、命令の処理時間を調べました。
2009/01/12の記事
さて、今日は、MOS言語で記述したリアルタイムMOSプロセスを3本起動して、簡単な命令の”同時実行”処理時間を計測してみましょう。
リアルタイムMOSプロセスというのは、プライムモーション社のC言語ライクなIO制御言語「MOS言語」を中間言語に翻訳して、その中間言語をリアルタイムインタープリタ(高速翻訳ソフト)で実行する処理です。計測した処理は、以下です。
while( a<1001) {
val[a] = GetTimerValue(1) * 10000000; // 100ns単位
a = a+1;
}
プログラムは、IntervalZero社RTXの100ns分解能タイマーから現在時間を実数の秒として取得し、それを100ns単位の時間として変換し、それを配列に格納するものです。
このプログラムを3本同時実行して、処理時間を計測します。実行環境は、
PentiumⅣ 2.4GHz 1GBメモリ Windows2000 RTX6.0.1Runtime
です。プライムモーション社の「MOS Bench(モスベンチ)」を使用しています。
■計測結果
1つのリアルタイムMOSプロセスの上記プログラム処理時間 約4μs
波形の階段の一段目の値を横軸から読みます。
2つのリアルタイムMOSプロセス同時実行の上記プログラム処理時間 約16μs
波形の階段の二段目の値を横軸から読みます。
3つのリアルタイムMOSプロセス同時実行の上記プログラム処理時間 約24μs
波形の一番上の平らな部分の値を横軸から読みます。
1本のプログラムを実行しているときは、4usで済んでいた処理が、2本同じプログラムを実行すると、1本あたり16usかかります。4倍に延びます。
3本同じプログラムを実行すると、1本当たり24usかかります。6倍に延びます。
したがって、同時に実行するプロセス数が少ないほうが、処理時間が短くなります。同時実行プロセスの本数は、可能な限り少なくしてください。
■使用したテストプログラム
プライムモーション社の「MOS Bench(モスベンチ)」では、リアルタイム制御のプログラムを複数本、簡単に同時実行できます。プロセス番号に制御したいプログラムを割り付けるだけで、マルチプロセス(マルチタスク)になります。今回は、プロセス8番、9番、10番に処理時間を測定する上述のプログラムを割り付けました。
MOS プロセス8番には、以下の処理を割り付けました。
MOSプロセス9番には 「time_10000b.mos.c」をダウンロード
MOSプロセス10番には 「time_10000c.mos.c」をダウンロード
を割り付けました。
8番のプロセスからMOSプロセス9番と10番に割り付けた処理の起動をかけます。 同じ処理が同時に3本走ります。
プロセス8番の計測データを「MOS Bench」の標準出力に出力した後に、プロセス9番の計測データを出力するように、プロセス9番のプログラムには、15秒休む
Sleep(15000);
命令が入っています。
また、プロセス9番の計測データを「MOS Bench」の「標準出力」に出力した後に、プロセス10番の計測データを出力するように、プロセス10番のプログラムには、30秒休む
Sleep(30000);
命令が入っています。
プロセス8番のプログラムの中にある
ProcStartInitial(9);
という記述は、プロセス9番を開始する命令です。
■「MOS Bench」の「標準出力」に出力した処理時間データ
実際に「標準出力」に出力されたデータは、以下になります。
各行の先頭に、例えば、[18:03:15:221.706.4]のようなタイムスタンプがあります。これは、
18時3分15秒221ms706us400ns
を意味します。
■「標準出力」に出力した処理時間データを加工したデータ
上記データから、時間の数値を抜き出して、3列に並べました。
■プログラムの詳細説明
動作説明、評価データの分析については、以下の記事を参照願います。
2009/12/15の記事