LabVIEW​関数​および​ドライバ​の​マルチスレッド​機能

概要

この​ドキュメント​は、​マルチ​コア​プログラミング​の​基本​シリーズ​の​一部​です。
マルチコアプログラミングの基本シリーズ

マルチ​コア​プログラミング​の​基本​シリーズ

マルチ​コア​プロセッサ​の​能力​を​最大限​に​活かす​ため​に​は、​マルチ​ス​レッド​プログラミング​が​欠​か​せ​ま​せん。​アプリケーション​を​複数​の​スレッド​に​分割​すると、​オペレーティングシステム​は​これらの​スレッド​を​コンピュータ​の​複数​の​プロセッサ​コア​間​で​適切​に​分配​(スケジューリング)​し​ます。​この​ドキュメント​では、​NI LabVIEW​で​マルチ​コア​プロセッサ​を​使用​した​マルチ​ス​レッド​セーフ​で​再入​可能​な​関数​と​ドライバ​を​使用​する​こと​の​利点​について​説明​し​ます。

内容

並列​実行​と​マルチ​ス​レッド​セーフ​の​違い

従来​の​プログラミング​言語​では、​並列​実行​を​行う​に​は​プログラム​を​複数​の​スレッド​に​分割​する​必要​が​あり​ます。​分割​さ​れ​た​各​スレッド​は​同時に​実行​する​こと​が​でき​ます。​ただし、​マルチ​ス​レッド​セーフ​アプリケーション​で​問題​なく​実行​できる​コード​を​記述​する​こと​と、​マルチ​コア​システム​で​最大​の​パフォーマンス​を​得る​ため​に​並列​実行​する​コード​を​記述​する​こと​は、​異​なり​ます。​この​違い​は、​プログラム​の​記述​に​使用​する​ドライバ​や​関数​で​表れ​ます。​マルチ​ス​レッド​セーフ​関数​は、​複数​の​スレッド​から​データ​を​上書き​する​こと​なく​呼び出せる​ため、​実行​が​ブロック​さ​れ​て​競合​が​発生​する​こと​が​ありま​せん。​1​つ​の​スレッド​が​関数​を​呼び出す​と、​同じ​関数​の​呼び出し​を​試みる​他の​スレッド​は​最初​の​スレッド​が​完了​する​まで​待機​しな​け​れ​ば​なり​ま​せん。​再入​可能​関数​は、​それに​加​えて、​複数​の​スレッド​から​同時に​呼び出し​て​並列​実行​する​こと​が​でき​ます。​これらの​例​は​どちら​も​マルチ​ス​レッド​プログラム​で​正常​に​実行​さ​れ​ます​が、​同時に​実行​さ​れる​再入​可能​関数​を​使用​した​ほうが​高速​です。

LabVIEW​における​メモリ​と​パフォーマンス​の​バランス

LabVIEW​では、​一般​的​に​ワイヤ​上の​データ​は​データ​を​処理​する​関数​と​は​独立​し​てい​ます。​ワイヤ​上の​データ​に​は、​その​ワイヤ​に​接続​さ​れ​てい​ない​VI​や​関数​から​簡単​に​は​アクセス​でき​ま​せん。​必要​で​あれ​ば、​ワイヤ​を​分岐​する​こと​で​データ​の​コピー​を​作成​し​て、​後続​の​VI​で​処理​でき​ます。​また、​多く​の​LabVIEW VI​および​ドライバ​は​マルチ​ス​レッド​セーフ​で​あり​再入​実行​が​可能​です。​標準​ライブラリ​VI​の​中​に​は、​デフォルト​で​再入​不可能​に​設定​できる​もの​が​あり​ます。​再入​可能​VI​は​メモリ​を​多く​占有​する​ため、​メモリ​使用​率​と​並列​実行​の​バランス​を​考慮​する​必要​が​あり​ます。​LabVIEW​は、​デフォルト​で​メモリ​を​なるべく​節約​し​て​VI​を​再入​不可能​に​設定​する​傾向​に​あり​ます。​並列​実行​を​最大限​に​生かす​必要​が​ある​場合​は、​開発​者​が​意図​的​に​設定​し​ます。​ライブラリ​VI​は​簡単​に​再入​可能​に​設定​でき​ます。

再入​可能​関数

場合​や​環境​によって​は、​関数​へ​の​アクセス​エラー​を​防ぐ​ため​に​関数​または​プログラム​を​再入​不可能​に​設定​しな​け​れ​ば​なら​ない​こと​が​あり​ます。​マルチ​ス​レッド​セーフ​ライブラリ​の​多く​は、​リソース​の​ロック、​すなわち​1​つ​の​スレッド​が​ある​関数​を​呼び出す​と、​その​関数​または​ライブラリ​全体​を​他の​スレッド​から​呼​び​出​さ​れ​ない​よう​ロック​する​こと​で、​スレッドセーフ​を​実現​し​ます。​並列​実行​では、​2​つ​の​コード​の​パス​(スレッド)​が​1​つ​の​ライブラリ​や​関数​へ​同時に​アクセス​しよう​と​すると、​一方​の​スレッド​が​完了​する​まで、​もう​1​つ​の​スレッド​は​強制​的​に​待機​状態​に​さ​れる​か、​ブロック​さ​れ​ます。​一度に​1​つ​の​スレッド​だけ​が​関数​に​アクセス​できる​よう​に​すると、​余分​な​インスタンス​が​必要​なくなる​ため​メモリ​スペース​が​節約​さ​れ​ます。

前述​の​説明​の​とおり、​並列​プログラミング​手法​を​再入​可能​関数​と​組み合わせる​こと​で、​コード​の​パフォーマンス​を​向上​させる​こと​が​でき​ます。

LabVIEW​の​デバイスドライバ​(NI-​DAQmx​など)​は​マルチ​ス​レッド​セーフ​かつ​再入​可能​で​ある​ため、​関数​を​複数​の​スレッド​から​ブロック​さ​れる​こと​なく​同時に​呼び出し​て​正常​に​動作​させる​こと​が​でき​ます。​これ​は、​並列​コード​を​記述​した​り​マルチ​コア​システム​の​パフォーマンス​を​最適​化​する​上​で​重要​な​機能​です。​再入​不可能​な​コード​を​使用​すると、​各​関数​に​アクセス​する​際​に​その​関数​を​使用​中​の​他の​スレッド​が​完了​する​まで​待機​する​必要​が​ある​ため、​パフォーマンス​が​低​く​なる​可能性​が​あり​ます。​この​状態​は、​LabVIEWのVI​階層機能​によって​より​明確​に​理解​する​こと​が​でき​ます。​個々​の​VI​の​階層​は、表示 » VI​階層を​選択​し​て​表示​でき​ます。​図​1​の​VI​階層​では、​F1​と​F2​は​同じ​VI(非常​に​大量​の​データ​を​処理​する​高速​フーリエ​変換​アルゴリズム)​に​依存​し​てい​ます。​F1​と​F2​を​並列​実行​する​ため​に​は、​この​VI​は​必ず​再入​可能​でなければ​なり​ま​せん。

図​1. LabVIEW​の​VI​階層

コード​内​の​不要​な​依存性​を​なくす​ため​に​は、​再入​可能​か​どうか​を​検討​する​こと​が​重要​です。​LabVIEW​の​解析​VI​は、​デフォルト​で​再入​可能​な​もの​も​あれ​ば​再入​不可能​な​もの​も​ある​ため、​これらの​VI​が​確実​に​並列​実行​さ​れる​か​どうか​プロパティ​で​確認​する​こと​が​重要​です。

LabVIEW​で​の​構成

LabVIEW VI​を​再入​可能​に​設定​する​に​は、ファイル​→VI​プロパティを​選択​し、​ドロップ​ダウン​メニュー​から実行を​選択​し​ます。再入​実行チェック​ボックス​を​オン​にし、​ク​ローン​方法​を​選択​し​ます。

図​2. VI​プロ​パテ​ィ​ダイ​ア​ログ​ボックス​の​再入​実行​オプション

LabVIEW​は、​2​種類​の​再入​可能​VI​を​サポート​し​てい​ます。​再入​可能​VI​の​各​呼び出し​に対する​ク​ローン​VI​を​あらかじめ​作成​する​場合、​また​ク​ローン​VI​が​すべて​の​呼び出し​に対して​状態​情報​を​維持​する​必要​が​ある​場合​は、各​インスタンス​の​ク​ローン​を​事前​に​割り当てるオプション​を​選択​し​ます。​たとえば、​再入​可能​VI​に​初期​化​さ​れ​ない​シフトレジスタ​や、​ク​ローン​VI​の​次回​の​呼び出し​まで​維持​する​必要​が​ある​値​を​含む​ローカル​変数、​プロパティ、​メソッド​が​含​ま​れる​場合​は、各​インスタンス​の​ク​ローン​を​事前​に​割り当てるオプション​を​選択​し​ます。​また、​再入​可能​VI​に「初めて​呼び出す?​(First Call?)」​関数​が​含​ま​れる​場合​に​も、​この​オプション​を​選択​し​ます。​さらに、​LabVIEW Real-​Time​システム​で​実行​する​VI​に​も、​ジッタ​を​最小限​に​する​ため​に​この​オプション​を​選択​し​ます。

多数​の​ク​ローン​VI​を​メモリ​に​事前​に​割り当てる​こと​で​メモリ​使用​率​が​増加​しない​よう​に​する​ため​に​は、インスタンス​間​で​ク​ローン​を​共有​するオプション​を​選択​し​ます。​この​オプション​を​選択​すると、​再入​可能​VI​が​実際​に​呼​び​出​さ​れる​まで​ク​ローン​VI​が​作成​さ​れ​ま​せん。​この​オプション​を​有効​に​すると、​ク​ローン​VI​が​必要​時に​作成​さ​れる​ため、​VI​の​実行​時に​ジッタ​が​発生​する​可能性​が​あり​ます。​また、​再入​可能​VI​の​すべて​の​呼び出し​に対して​状態​の​情報​が​維持​さ​れ​ま​せん。

LabVIEW​ドライバ​の​機能

ハードウェア​と​通信​する​場合​は​ハードウェア​の​タイプ​に​関係​なく、​スレッドセーフ​かつ​再入​可能​な​ドライバ​を​使用​する​必要​が​あり​ます。​これらの​特性​により、​マルチ​コア​技術​の​利点​を​生​かし​て​パフォーマンス​を​向上​させる​こと​が​でき​ます。

LabVIEW​の​旧​バージョン​の​デバイス​ドライ​バ​では、​すべて​の​関数​が​再入​可能​という​わけ​では​ありま​せん​で​した。​たとえば、​従来​型​NI-​DAQ​は​マルチ​ス​レッド​セーフ​ですが、​2​つ​の​スレッド​から​同時に​呼​び​出​さ​れ​て​も​エラー​が​発生​しない​という​意味​において​です。​この​機能​は、​グローバル​ロック、​つまり​1​つ​の​スレッド​が​ある​NI-​DAQ​関数​を​呼び出し​たら、​NI-​DAQ​関数​を​使用​する​他の​スレッド​は​すべて​最初​の​関数​が​完了​する​まで​待機​しな​け​れ​ば​なら​ない​仕組み​によって​実現​し​てい​ま​した。

一方、​NI-​DAQmx​では​より​洗練​さ​れ​た​並列​マルチスレッド​環境​が​提供​さ​れ​てい​ます。​NI-​DAQmx​は​再入​可能​で、​複数​の​スレッド​が​同時に​ドライバ​の​関数​を​呼び出す​こと​が​でき​ます。​2​つ​の​ボード​の​異なる​アナログ​入力​が、​同じ​プログラム​内​の​別々​の​スレッド​から​ブロック​さ​れる​こと​なく​同時に​実行​さ​れ​ます。​また、​2​つ​の​独立​した​スレッド​の​アナログ​入力​と​デジタル​入力​を​1​つ​の​ボード​上​で​同時に​実行​でき​ます。​このような洗練された​NI-​DAQmx​ドライバ​の​機能​により、​1​つ​の​ハードウェア​リソース​を​2​つ​の​異なる​リソース​として​扱う​こと​が​でき​ます。

NI​モジュール​式​計測​器​ドライバ​も、​NI-​DAQmx​と​同様​に​機能​し​ます。​表​1​の​ドライバ​は​すべて、​スレッドセーフ​で​あり​再入​可能​です。​したがって、​1​つ​の​関数​を​異なる​デバイス​から​同時に​呼び出す​こと​が​でき​ます。​この​機能​は、​複数​の​計測​器​を​使用​する​大規模​システム​の​コード​で​非常​に​有効​です。

表​1. スレッドセーフ​および​再入​可能​な​モジュール​式​計測​器​ドライバ

まとめ

並列​プログラミング​によって​マルチ​コア​アーキテクチャ​の​利点​を​生かす​場合、​プログラミング​言語​の​種類​や​並列​コード​の​記述​について​だけ​で​なく、​ドライバ​や​関数​が​並列​環境​に​適​し​て​いる​かも​考慮​する​必要​が​あり​ます。

Was this information helpful?

Yes

No