リアルタイムプロセスを3本並列実行したときの処理時間

昨日は、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(モスベンチ)」を使用しています。

■計測結果

Mosimage60

つのリアルタイムMOSプロセスの上記プログラム処理時間 約4μs

波形の階段の一段目の値を横軸から読みます。

つのリアルタイムMOSプロセス同時実行の上記プログラム処理時間 約16μs

波形の階段の二段目の値を横軸から読みます。

つのリアルタイムMOSプロセス同時実行の上記プログラム処理時間 約24μs

   波形の一番上の平らな部分の値を横軸から読みます。

1本のプログラムを実行しているときは、4usで済んでいた処理が、2本同じプログラムを実行すると、1本あたり16usかかります。4倍に延びます。

3本同じプログラムを実行すると、1本当たり24usかかります。6倍に延びます。

したがって、同時に実行するプロセス数が少ないほうが、処理時間が短くなります。同時実行プロセスの本数は、可能な限り少なくしてください。

■使用したテストプログラム

プライムモーション社の「MOS Bench(モスベンチ)」では、リアルタイム制御のプログラムを複数本、簡単に同時実行できます。プロセス番号に制御したいプログラムを割り付けるだけで、マルチプロセス(マルチタスク)になります。今回は、プロセス8番、9番、10番に処理時間を測定する上述のプログラムを割り付けました。

MOS プロセス8番には、以下の処理を割り付けました。

「time_10000_2.mos.c」をダウンロード

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」の「標準出力」に出力した処理時間データ

実際に「標準出力」に出力されたデータは、以下になります。

「stdoutlog_3mos.txt」をダウンロード

各行の先頭に、例えば、[18:03:15:221.706.4]のようなタイムスタンプがあります。これは、

18時3分15秒221ms706us400ns

を意味します。

■「標準出力」に出力した処理時間データを加工したデータ

上記データから、時間の数値を抜き出して、3列に並べました。

「stdoutlog_3mos.xls」をダウンロード

■プログラムの詳細説明

動作説明、評価データの分析については、以下の記事を参照願います。

2009/12/15の記事