マルチコアプロセッサ対応の自動テストアプリケーションを LabVIEW で最適化
概要
LabVIEW は、自動テストアプリケーション用の使いやすいグラフィカルプログラミング環境であると同時に、様々な CPU コアにコードを動的に割り当てる機能を備えているため、マルチコアプロセッサ上での実行速度を高めることが可能な性質を持っています。このドキュメントでは、並列プログラミングテクニックを最大限に活用した LabVIEW アプリケーションを作成する方法を説明します。
マルチスレッドプログラミングの課題
ごく最近まで、プロセッサ技術の進化は、より高いクロックレートで処理する CPU(中央演算処理装置)を搭載したコンピュータという形でもたらされてきました。ただし、クロックレートが理論上の物理的限界に近づくと、複数のプロセッサコアを搭載したプロセッサが開発されるようになりました。マルチコアプロセッサを使用した場合、並列プログラミングテクニックを使って自動テストアプリケーションを開発することで最高の性能とスループットを実現できます。カリフォルニア大学バークレー校の電気/コンピュータエンジニアリング教授、Dr. Edward Lee 氏は、並列処理のメリットについて次のように述べています。
「これから並列コンピュータアーキテクチャに移り変わっていくことによって、ムーアの法則は終わりを告げるであろうと、多くの技術者はみています。今後もコンピュータの性能を高めて行きたいのなら、並列処理を採用したプログラムが必要です。」
ただしマルチプロセッサのメリットを活かしたアプリケーションをプログラミングするには、かなり高度なテクニックが必要です。マイクロソフト社の創始者、ビル・ゲイツ氏は、それを次のような言葉で表しています。
「並列で処理するプロセッサのパワーを存分に活用するには、ソフトウェアの方で同時並行性の問題に対処しなくてはなりません。ただしマルチスレッドコードを書いたことのある開発者なら、それがいかに難しいタスクかよくわかっているはずです。」
都合のいいことに LabVIEW は、並列アルゴリズムを作成しやすい直観的な環境であることと、アプリケーションに複数のスレッドを動的に割り当てることが可能なため、マルチコアプロセッサに非常に適したプログラミング環境となっています。実際に LabVIEW なら、マルチコアプロセッサを使用した自動テストアプリケーションを簡単に最適化できるため、最高のパフォーマンスを引き出すことが可能です。さらに、PXI Express 対応のモジュール式計測器を使用すると、PCI Express バスの優れたデータ転送レートにより、このメリットがさらに強化されます。マルチコアプロセッサと PXI Express 計測器のメリットを特に活かすことのできるアプリケーションが、多マルチチャンネル信号解析インライン処理や HIL(hardware in the loop)です。ここでは、様々な並列プログラミングテクニックについて説明するとともに、各テクニックの持つメリットについて解説します。
並列テストアルゴリズムの実装
並列処理のメリットを活用できる自動テストアプリケーション(ATE)として一般的なのが、多チャンネル信号解析です。周波数解析はプロセッサの負荷の大きい操作であるため、テストコードを並列化して、各チャンネルの信号処理を複数のプロセッサコアに分散することにより、実行速度を向上させることができます。このメリットを実現するためにプログラマが行うべき唯一の変更は、テストアルゴリズムの再構築です。
例えば、高速デジタイザの2チャンネルで多チャンネル周波数解析(フーリエ変換:FFT)を行う2つのアルゴリズムの実行時間を比較します。このテストでは、PXIe-5122 14ビット高速デジタイザを使用して、最高サンプリングレート(100 MS/秒)で信号を集録します。まず、LabVIEW でこの操作を行う場合の従来型の逐次プログラミングモデルを以下に示します。

図1. 逐次実行型の LabVIEW コード
上図のブロックダイアグラムでは、両チャンネルの周波数解析が FFT Express VI 内で実行されています。この VI は、各チャンネルを順次解析します。このアルゴリズムでもマルチコアプロセッサで効率的に実行することは可能です。ただし各チャンネルを並列に処理すれば、アルゴリズムのパフォーマンスを高めることができます。
上記の VI のプロファイルを見ると、高速デジタイザからの集録に比べ、FFT の方がはるかに長い時間がかかっていることがわかります。各チャンネルを一度に1つずつフェッチして2つの FFT を並列で実行することで、処理時間を大幅に短縮することができます。このような並列方式を採用した場合の LabVIEW ブロックダイアグラムは、以下のようになります。

図2. 並列実行型の LabVIEW コード
上図のコードでは、各チャンネルがデジタイザから逐次フェッチします。両方のフェッチ操作完全に並列で実行することが可能です。ただし、フーリエ変換はプロセッサへの負荷が大きいため、信号処理を並列で行うだけでさらに性能を向上させることができます。そしてその結果全体の実行時間が短縮されます。以下のグラフは、両方式の実行時間を比較したものです。

図3. 逐次 vs 並列アルゴリズムの実行時間(時間)
このグラフが示すように、ブロックサイズ(フェッチごとのサンプル数)が増えるにつれ、並列処理による処理時間の短縮はより顕著になります。ブロックサイズが大きくなると、並列アルゴリズムの性能向上は2倍に近くなります。次のグラフは、集録サイズ(サンプル数)の変化に伴う性能の向上を比率で表したものです。
図4. 並列アルゴリズムの性能の向上(パーセント)
図4は、ブロックサイズが100万サンプルより大きい(100 Hz の分解能帯域幅)場合、並列処理では 80% 以上の性能向上が見られることを示しています。
LabVIEW では各スレッドが動的に割り当てられるため、マルチコアプロセッサで自動テストアプリケーションの性能の向上を実現するのは容易です。マルチスレッドを有効にするために特別なコードを作成する必要もありません。並列テストアプリケーションの場合、プログラミング面では最小限の調整でマルチコアプロセッサのメリットを活用することが可能です。
カスタム並列テストアルゴリズムの構成
信号処理アルゴリズムを並列化すると、LabVIEW が CPU の使用を複数のコアに分割することが可能になるというメリットがあります。以下の図は、CPU がアルゴリズムの各部分を処理する順序を示しています。

図5. CPU によるプロセス実行
図が示すように、LabVIEW は集録データの多くを並列で処理できるため、実行時間を節約できます。並列処理では、LabVIEW が各信号処理サブルーチンのコピー(またはクローン)を作成することが必要です。デフォルトでは、LabVIEW の多くの信号処理アルゴリズムは「再入実行」可能です。つまり、個々のスレッドやメモリスペースなど、各サブルーチンの固有のインスタンスを動的に割り当てるということです。そのため、カスタムサブルーチンは再入可能な操作をするよう明示的に構成する必要があります。これも LabVIEW なら簡単な構成手順で行えます。このプロパティを設定するには、ファイル→VI プロパティを選択し、「実行」カテゴリを選択します。ここで、「再入実行」を選択します。

図6. LabVIEW での再入実行の構成
上記のような簡単な手順で、標準の LabVIEW 解析関数と全く同じように、複数のカスタムサブルーチンを並列実行することができます。その結果、簡単なプログラミングテクニックにより、マルチコアプロセッサでの自動テストアプリケーションのパフォーマンスを向上させることが可能です。
HIL(Hardware-in-the-Loop)アプリケーションの最適化
並列信号処理テクニックのメリットを活かすことができる2つめのアプリケーションは、複数の計測器を使用した同時入出力です。一般に、HIL(hardware-in-the loop)またはインライン処理アプリケーションと言われており、高速デジタイザまたは高速デジタル I/O モジュールを使用して信号を集録します。ソフトウェア側では、デジタル信号処理アルゴリズムが実行されます。最後に、別のモジュール式計測器によって結果が生成されます。一般的な図式は以下のようになります。

図7. インライン信号処理(HIL)
一般的な HIL アプリケーションには、インラインデジタル信号処理(フィルタ処理、補間など)、センサシミュレーション、カスタムコンポーネントエミュレーションなどがあります。このドキュメントでは、インラインデジタル信号処理アプリケーションのスループットを最大に高める方法について紹介します。
一般には、シングルループストラクチャと、キューを使用したパイプライン型マルチループストラクチャの2つの基本プログラミングストラクチャを使用することができます。シングルループストラクチャは、実装が簡単でブロックサイズが小さい場合に待ち時間が短くなります。一方マルチループアーキテクチャでは、マルチコア CPU を十分に活用できるためスループットを大幅に向上させることが可能です。
従来型のシングルループ方式では、高速デジタイザ読み取り関数と、信号処理アルゴリズム、高速デジタル I/O 書き込みが逐次式に配置されていました。以下のブロックダイアグラムに示すように、それらのサブルーチン1つ1つが LabVIEW のデータフロープログラミングモデルで決められたとおりに順次実行する方式です。

図8. シングルループ方式によるループ内処理
シングルループストラクチャには、いくつかの制約があります。各段階が順次実行されるため、プロセッサはデータの処理中計測器 I/O を実行することが不可能です。この方法ではプロセッサは一度に1つの関数しか実行できないため、マルチコア CPU を効率的に利用することができません。マルチコア CPU の1つのコアだけがアプリケーションに使用されるため、シングルループストラクチャは集録レートが低いアプリケーションには十分ですが、データスループットを高めるにはマルチループストラクチャが必要です。
マルチループアーキテクチャでは、キューストラクチャを使って各 While ループ間でデータの受け渡しを行います。以下の図は、While ループ間におけるキューストラクチャのデータフロープログラミングの概念を示しています。

図9. キューストラクチャにより複数のループでデータを共有
上図に示すように、キューによってデータを複数のループ間で共有することが可能となっています。これは一般に生産者/消費者ループストラクチャといわれるもので、このケースでは、高速デジタイザが1つのループでデータを集録し、各繰り返しにおいて新しいデータセットを FIFO に渡すようになっています。消費者ループは単にキューの状態を監視し、データが得られると各データセットをディスクに書き込みます。キューを使用するメリットは、どちらのループも互いに依存せずに実行することができる点にあります。上記の例では、高速デジタイザはディスクへの書き込みが遅延していてもデータの集録を続けることが可能です。余ったサンプルは一時的に FIFO に格納されます。一般に生産者/消費者パターンによるパイプライン並列化では、より効率的にプロセッサを使用できるため、データスループットを高めることができます。LabVIEW では CPU スレッドを各コアに動的に割り当てることが可能なため、このようなメリットはマルチコアプロセッサではさらに顕著です。
インライン信号処理アプリケーションでは、3つの独立した While ループと2つのキューストラクチャを使用してデータを受け渡すことができます。この方式では、1つのループがデバイスからデータを集録し、別のループが専用の信号調節を実行して、最後のループが出力用デバイスにデータを書き込みます。この方式を表したブロックダイアグラムを以下に示します。

図10. 複数のループとキューストラクチャを持つパイプライン型信号処理
上図では、上のループが生産者ループで、高速デジタイザからデータを集録しそれを最初のキューストラクチャ(FIFO)に渡します。中段のループは生産者としても消費者としても動作します。このループは、各繰り返しでキューストラクチャから複数のデータセットをデキュー(消費)し、それらをパイプライン方式で個々に処理します。このパイプライン方式を利用すると、最大4つのデータセットを個別に処理できるため、マルチコアプロセッサにおける処理性能を高めることが可能です。中段のループは生産者としての役割も果たし、処理されたデータを2つめのキューストラクチャに渡します。下段のループは処理済みのデータを高速デジタル I/O モジュールに書き込みます。
並列処理アルゴリズムを使用すると、マルチコア CPU でのプロセッサ使用効率が向上します。総スループットは、プロセッサ使用率とバスの転送速度という2つの要因に依存します。一般に CPU とデータバスは大きなデータブロックを処理する際に最も効率的に動作します。また、転送速度の速い PXI Express 対応の計測器を使用すれば、データ転送時間をさらに短縮することが可能です。集録サイズ(サンプル数)に基づいたサンプルレートによる最大スループットを以下のグラフに示します。

図11. マルチループ vs シングルループストラクチャのスループット
このグラフに表示されているベンチマークは、全て16ビットサンプリングで実行されたものです。また、信号処理アルゴリズムは、カットオフ周波数がサンプルレートの 0.45倍となるような7次バタワースローパスフィルタを使用しています。データが示すように、4ステージパイプライン(マルチループ)方式なら最大のデータスループットを実現できます。2ステージ信号処理の場合、シングルループ方式(逐次)に比べ性能は向上しますが、4ステージに比べると CPU の使用効率は劣ります。上記のサンプルレートは、PXIe-5122 高速デジタイザと PXIe-6537 高速デジタル I/O モジュールの入出力両方における最大サンプルレートです。20 MS/秒のとき、アプリケーションバスは入力時 40 MB/秒、出力時 40 MB/秒でデータを転送し、全バス帯域幅は 80 MB/秒となります。
また、パイプライン型信号処理方式では、入力と出力の間に待ち時間が生じることも覚えておく必要があります。待ち時間は、ブロックサイズやサンプルレートなど複数の要因の影響を受けます。以下の表は、シングルループアーキテクチャと4ステージマルチループアーキテクチャにおいて、計測された待ち時間をブロックサイズと最大サンプルレートによって比較したものです。
表1および2. シングルループ/4ステージパイプラインのベンチマーク

予想通り、CPU の使用率が 100% に近づくにつれ、待ち時間が長くなっています。この傾向は4ステージパイプライン型でサンプルレートが 20 MS/秒のときに特に顕著です。逆にシングルループの場合は、いずれの例でも CPU 使用率が 50% を超えることはほとんどありません。
まとめ
PXI/PXI Express モジュール式計測器など PC ベースの計測システムは、マルチコアプロセッサ技術の進化とデータバス速度の向上により多大な恩恵を受けています。最新の CPU がプロセッサコアを追加することで性能を高めるようになると、CPU 効率を最大化するため並列またはパイプライン型処理構造が必要になります。幸い LabVIEW は処理タスクを個々のプロセッサコアに動的に割り当てるため、マルチコアプロセッサ対応アプリケーションのプログラミングに最適なソリューションです。上記のデータが示すように、LabVIEW アルゴリズムを並列処理用にプログラミングすることで、パフォーマンスを大幅に向上させることができます。
法律関連事項
本チュートリアル(以下「チュートリアル」という)は、National Instruments(以下「NI」という)によって作成されたものです。本チュートリアルは、NIにてサポートされていますが、本チュートリアルの内容に関するテストや検査が完全に行われていない可能性があり、チュートリアルの品質について、もしくは、関連製品およびドライバの各改訂版に対するサポート継続については、何らの保証も適用されません。本チュートリアルは、いかなる保証もなく「作成された状態のまま」で提供されており、ni.com/jpの使用条件に特別に規定されている特定の制約事項に従うものとします。 (http://ni.com/legal/termsofuse/japan/ja/)


