主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

並列对ループ(parfor)を使用したアルゴリズムの高速化

生成コード内の并列为ループ(PARFOR)

並列对ループ(parforループ)を含むMATLAB®コードから墨西哥人関数またはC / c++コードを生成して,実行を高速化できる場合があります。

標準のMATLABループと同様,parforループは,ある範囲の値にわたって一連のステートメント(ループ本体)を実行します。しかしループとは異なり,parforループの反復はターゲットハードウェアの複数のコアで並列に実行できます。

反复を并列に実行することで,生成されたコードの実行速度が大幅に改善される场合があります详细。は,PARFORループによる実行速度の改善を参照してください。

メモ

並列実行は,元のMATLABコードではなく,生成された墨西哥人関数またはC / c++コードのみで行われます。MATLABコードを高速化するには,parforループからMEX关数を生成します。次に,MEX关数をコードから呼び出します详细。は,MATLABアルゴリズムを高速化するためのワークフローを参照してください。

MATLAB编码器™ソフトウェアは,开放多处理(OpenMP)アプリケーションインターフェイスを使用して共有メモリ,マルチコアコードの生成をサポートします。分散型の並列処理が必要な場合は,并行计算工具箱™製品を使用してください。既定では,MATLAB编码器は使用可能なすべてのコアを使用します。使用するスレッドの数を指定すると,追加のコアが使用可能な场合でも,MATLAB编码器はスレッドに対し指定数までのコアしか使用しません。詳細は,parforを参照してください。

ループ本体は複数のスレッドで並列に実行できるため,一定の制限に従わなければなりません。MATLAB编码器ソフトウェアがparforの仕様に準拠しないループを検出すると,エラーが発生します。詳細は,parforの制限を参照してください。

PARFORループによる実行速度の改善

parforループは复数のスレッドを同じループで同时に计算できるため,类似のループより実行速度が上がる場合があります。

parforループの本体の各実行は,反復と呼ばれます。スレッドは任意の順序で,また互いに独立して反復を評価します。各反復は独立しているため,これらを同期する必要はありません。スレッド数がループ反復数と同じである場合,各スレッドはループの1つの反復を実行します。スレッド数より反復数が多い場合,一部のスレッドは1回を超えるループ反復を実行します。

たとえば100回の反復からなるループが20のスレッドで実行される場合,各スレッドは同時にループを5回ずつ反復します。反復数が多い,または個々の反復処理が長いなどの理由でループの実行に時間がかかる場合,複数のスレッドを使用して実行時間を大幅に削減できます。ただし,この例では,スレッドの作成と削除などの並列処理によるオーバーヘッドのため,速度は20倍にならない可能性があります。

PARFORループを使用する场合

以下の场合にparforを使用します。

  • 簡単な計算の反復が多数ある。parforはループの反复をグループに分け,各スレッドにより反复の1つのグループが実行されるようにします。

  • ループ反復の実行に時間がかかる。parforは異なるスレッド上で反復を同時に実行します。この同時実行では,個々の反復にかかる時間は削減されませんが,ループ処理にかかる全体的な時間は大幅に削減される可能性があります。

parforループを使用しない場合

以下の場合,parforは使用しないでください。

  • ループの反復が他の反復に依存する。反復を並列に実行すると誤った結果になる場合があります。

    ループの反復が他の反復に依存する場合にparforの使用を避けるため,MATLAB编码器では変数の厳密な分类が指定されています。详细は,parforループ内での変数の分類を参照してください。MATLAB编码器ソフトウェアがparfor仕様に準拠しないループを検出した場合は,コードを生成せずにエラーを出力します。

    リダクションは,ループ反復は独立していなければならないというルールに対する例外です。“リダクション変数”は,すべての反復に同時に依存するが反復順序には依存しない値を累積します。詳細は,リダクション変数を参照してください。

  • 単純な計算を実行する数回の反復しかない。

    メモ

    反復回数が少ないループについては,並列処理のオーバーヘッドがあるために実行が高速化されない場合があります。こうしたオーバーヘッドには,スレッドの作成,スレッド間のデータ同期,スレッドの削除などにかかる時間が含まれます。

parforループの構文

  • parforループには,次の構文を使用します。

    parfor i = InitVal:EndVal

  • 最大数のスレッドを指定するには,次の構文を使用します。

    parfor (i = InitVal:EndVal,NumThreads)

詳細は,parforを参照してください。

parforの制限

  • parforループは次の構文をサポートしていません。

    parfor (i=initVal:step:endVal) parfor i=initVal:step:endVal

  • 开多处理(OpenMP的)アプリケーションインターフェイスをサポートするコンパイラを使用しなければなりません。サポートされるコンパイラを参照してください。OpenMPをサポートしていないコンパイラを使用する場合は,MATLAB编码器parforループをループとして扱います。生成された墨西哥人関数またはC / c++コードでは,ループ反復は単一スレッドで実行されます。

  • OpenMPアプリケーションインターフェイスはJIT墨西哥人コンパイルと互換性がありません。JITコンパイルがOpenMPをサポートしないを参照してください。

  • ループインデックスの型は,ターゲットハードウェアにおいて整数型で表現可能でなければなりません。生成されたコード内でマルチワードタイプを必要としない型を使用してください。

  • スタンドアロンコード生成のparforでは,実行可能ファイルまたはライブラリのビルドにツールチェーンアプローチが必要です。コードジェネレーターでテンプレート生成文件アプローチを使用する原因となるような设定変更は行わないでください。プロジェクトまたは構成でテンプレートmakefileを使用を参照してください。

  • parforループの本体では以下の構成を使用しないでください。

    • 入れ子にされたparforループ

    • 破および返回ステートメント

    • グローバル変数

    • MATLABクラスのリダクション

    • 変数字符のリダクション

    • 外部Cコードを使用したリダクション

    • 外部関数呼び出し

    • 関数のインライン化

    • ループの展开

    • 变长度输入宗量/varargout