Overview
並列 For ループは LabVIEW 2009 の新機能で、For ループ内のプログラムを並列化できるようになりました。 この文書では、この機能、いつ使うべきか、そのサンプルコードを紹介します。
Table of Contents
概要
LabVIEW 2009 以降、並列化を有効にし、通常の For ループから並列 For ループに変換することにより、For ループの内容を複数のプロセッシングコアに分散させられるようになりました。これは複数の並列ワーカ (worker) にプログラムの断片を実行させ、暗に並列実行することで実現しています。コアの数と同じだけのワーカを作れば、並列実行の性能を最大限に引き出せます。
この LabVIEW の新機能を使用する場合と、明にループを複数作る場合を比べてみましょう。下の図は、2つのアプローチがブロックダイアグラムに、どう反映されるか示したものです。
LabVIEW 8.6 以前の並列ループ (明に並列化)

LabVIEW 2009 以降の並列ループ (暗に並列化)

いつ並列 For ループを使うべきか
並列 For ループは、計算量の大きい処理を何度も繰り返し、かつ、繰り返しの結果が次の繰り返しに影響しない場合には、適切なアプローチです。しかし、ある繰り返しの処理結果が、次の繰り返しに影響を与える場合、LabVIEW は並列 For ループの実行を許可しません。繰り返しに依存関係があるということは、この処理を必ず順番に実行する必要があるからです。この場合には、パイプラインなどの別の手法を使って並列化を実現し、CPU コアを活用する方法を検討する必要があるでしょう。
並列 For ループの構成
並列 For ループを構成するには、For ループの枠上で右クリックし「反復の並列化を構成」を選択します。すると、ダイアログが表示されます。並列ループの数を指定できます(正確には並列化する最大数を指定できます)。

並列 For ループには、新たに「P」(ParallelのP)と表示される新しい端子があり、ここに並列ワーカ数の最大値を入力できます。ここには、そのマシンで使用できるCPU数を指定します。

あるいは、CPU情報 VI を使用して、システムに最適なワーカ数を指定することもできます。この方法を、以下のサンプルで示してあります。

すでに存在しているアプリケーションを保守する場合や、並列 For ループを使うべきか分からない場合、「並列化可能なループを検索」機能が便利です。これはツール>>プロファイルから使用でき、並列化可能、並列化不可能かも知れない、並列化不可能のいずれかを表示します。

並列 For ループ使用上の注意
並列 For ループの目的は、使用可能の CPU リソースを最大限に利用することにある、ということをお忘れなく。したがって、並列 For ループ以外の処理(たとえば別のループ)の実行により、システム全体のパフォーマンスが低下することもあります。並列 For ループの外側にある VI や関数も並列実行されると、並列 For ループのワーカ数よりも多くのスレッドが生成されるため、パフォーマンスの低下を招きます。この場合には、CPU のコア数よりも少ないワーカ数を「P」端子に入力し、CPUリソースが枯渇しないようにします。同様に、ネストした並列 For ループもパフォーマンス低下につながります。
また、CPU使用率の最大化(quad-core CPU で使用率を100%にする、など)が、必ずしもシステム全体のパフォーマンスを最大化するとは限りません。非常に大きなデータを処理する場合を考えてみましょう。この処理を並列 For ループ内部で実行する場合、ワーカごとにデータのコピーを持ってしまいます。これは計算複雑性と空間複雑性のトレードオフという、古くからある問題です。データのコピーにかかる時間は、CPUの使用率向上によって短縮された時間よりも、大きいかも知れません。したがって、CPU使用率以外の要素にも注意を払い、経過時間 VI やデスクトップ実行トレースツールキットなどを使って、ベンチマークをとっておきましょう。
サンプル
N-body シミュレーションを考えてみます。互いに重力が働く質点が N 個ある場合を想定し、ここでは N=1000 とします。フロントパネルに表示されている色のついた丸印が質点で、VI を実行するとフロントパネル上で質点が動き回ります。このアルゴリズムは非常に計算量が多く、1000個の質点に対して計算が必要です。
この処理を並列実行できるか確認するために「並列化できるループを検索」を実行してみると、このループは並列化できるようです。このメインのアルゴリズムを高速化したいので、デュアルコアのPCなら、この並列化可能なループを2つのワーカに並列化します。
まとめ
LabVIEW 2009 以降、並列プログラミングを更に強化するため、並列 For ループを追加しました。For ループが並列化できるかどうか不明な場合には、「並列化できるループを検索」ツールで確認できます。
並列 For ループは、繰り返しごとに依存関係のない For ループを並列化するときに使用します。
関連リンク
LabVIEWの新機能については、http://www.ni.com/labview/whatsnew/ja/をご覧ください。
LabVIEW体験版は、こちらから無料ダウンロードできます。
Legal
This tutorial (this "tutorial") was developed by National Instruments ("NI"). Although technical support of this tutorial may be made available by National Instruments, the content in this tutorial may not be completely tested and verified, and NI does not guarantee its quality in any way or that NI will continue to support this content with each new revision of related products and drivers. THIS TUTORIAL IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND AND SUBJECT TO CERTAIN RESTRICTIONS AS MORE SPECIFICALLY SET FORTH IN NI.COM'S TERMS OF USE (http://ni.com/legal/termsofuse/unitedstates/us/).


