Main Content

統計関数を並列実行する場合

並列実行の目的

統計計算を並列実行する主な理由は、高速化、つまり、プログラムまたは関数の実行時間の短縮にあります。速度に影響を与える要因では、プログラムまたは関数の実行速度に影響を与える主な要因について説明します。また、結果に影響を与える要因では、並列実行を行った場合に逐次実行とは異なる結果が出る原因について詳細に説明します。

メモ

一部の Statistics and Machine Learning Toolbox™ の関数には、並列計算機能が組み込まれています。Statistics and Machine Learning Toolbox を使用した並列計算の基本操作を参照してください。また、すべての Statistics and Machine Learning Toolbox の関数は Parallel Computing Toolbox™ の関数 (parfor ループなど) と共に使用できます。関数の並列的呼び出しのタイミングは、速度と結果に影響を与える要因を考慮して決定します。

速度に影響を与える要因

並列処理の実行速度に影響を与える可能性がある要因としては、次のようなものが挙げられます。

  • 並列環境設定。この設定は、時間をかけて、並列計算を開始するための parpool を実行します。計算が高速な場合、この設定時間が、並列計算によって節約できる時間を超過する可能性があります。

  • 並列オーバーヘッド。並列実行では、通信と調整にオーバーヘッドが発生します。関数評価が高速な場合、このオーバーヘッドが総計算時間の大きな部分を占める場合があります。したがって、同じ問題を解く場合に並列実行で解く方が逐次実行で解くより遅くなることがあります。例として、MATLAB® Digest の 2009 年 3 月号にある Improving Optimization Performance with Parallel Computing を挙げることができます。

  • 入れ子形式の parfor ループの使用禁止。これは parfor の処理 で説明されています。parfor は他の parfor ループから呼び出された場合は並列処理を行いません。並列処理を利用してカスタム関数をプログラミングした場合、入れ子形式の parfor ループの使用禁止の制限により、並列関数が予想以上に遅くなる原因となる場合があります。

  • 逐次的に実行した場合、parfor ループの実行は for ループの実行よりも若干遅くなります。

  • 渡されるパラメーター。パラメーターは並列計算の実行中に自動的にワーカー セッションに渡されます。パラメーターが多数ある場合、またはパラメーターが大量のメモリを使用する場合、パラメーターの引渡しが計算の実行を低速化する原因となる場合があります。

  • ネットワークと計算のリソースの競合。ワーカーのプールの帯域幅が狭い場合やレイテンシが長い場合、並列計算に時間がかかる可能性があります。

結果に影響を与える要因

並列処理を使用する場合、結果に影響を及ぼし得る要素がいくつかあります。並列実行用にコード調整が必要になるかもしれません。たとえば、ループは独立している必要があり、ワーカーは変数にアクセスできなければなりません。重要な要因のいくつかは次のとおりです。

  • 永続変数またはグローバル変数。永続変数またはグローバル変数が関数により使用される場合、これらの変数がワーカー プロセッサごとに異なる値を取る可能性があります。parfor ループの本体にグローバル変数または永続変数の宣言を含めることはできません。

  • 外部ファイルへのアクセス。並列処理中は計算順序は保証されません。このため外部ファイルへのアクセスは予期できない順序で発生し、予期しない結果につながる可能性があります。2 つ以上のプロセッサが外部ファイルを同時に読み込もうとすると、ファイルはロックされ、読み込みエラーおよび関数の実行停止が発生する可能性があります。

  • inputplotkeyboard のような計算をしない関数をカスタム関数で使用すると、うまく処理されない可能性があります。ワーカーが入力待ち状態になり応答しなくなるので、これらの関数は parfor ループで使用しないでください。

  • parforbreak または return ステートメントを受け付けません。

  • 使用される乱数が、計算結果に影響する場合があります。並列統計計算での再現性を参照してください。

parfor を使用するように for ループを変換する方法については、並列 for ループ (parfor) (Parallel Computing Toolbox)を参照してください。