このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
並列对ループ(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
ループの本体の各実行は,反復と呼ばれます。スレッドは任意の順序で,また互いに独立して反復を評価します。各反復は独立しているため,これらを同期する必要はありません。スレッド数がループ反復数と同じである場合,各スレッドはループの1つの反復を実行します。スレッド数より反復数が多い場合,一部のスレッドは1回を超えるループ反復を実行します。
たとえば100回の反復からなるループが20のスレッドで実行される場合,各スレッドは同時にループを5回ずつ反復します。反復数が多い,または個々の反復処理が長いなどの理由でループの実行に時間がかかる場合,複数のスレッドを使用して実行時間を大幅に削減できます。ただし,この例では,スレッドの作成と削除などの並列処理によるオーバーヘッドのため,速度は20倍にならない可能性があります。
以下の场合にparfor
を使用します。
簡単な計算の反復が多数ある。parfor
はループの反复をグループに分け,各スレッドにより反复の1つのグループが実行されるようにします。
ループ反復の実行に時間がかかる。parfor
は異なるスレッド上で反復を同時に実行します。この同時実行では,個々の反復にかかる時間は削減されませんが,ループ処理にかかる全体的な時間は大幅に削減される可能性があります。
以下の場合,parfor
は使用しないでください。
ループの反復が他の反復に依存する。反復を並列に実行すると誤った結果になる場合があります。
ループの反復が他の反復に依存する場合にparfor
の使用を避けるため,MATLAB编码器では変数の厳密な分类が指定されています。详细は,parforループ内での変数の分類を参照してください。MATLAB编码器ソフトウェアがparfor
仕様に準拠しないループを検出した場合は,コードを生成せずにエラーを出力します。
リダクションは,ループ反復は独立していなければならないというルールに対する例外です。“リダクション変数”は,すべての反復に同時に依存するが反復順序には依存しない値を累積します。詳細は,リダクション変数を参照してください。
単純な計算を実行する数回の反復しかない。
メモ
反復回数が少ないループについては,並列処理のオーバーヘッドがあるために実行が高速化されない場合があります。こうしたオーバーヘッドには,スレッドの作成,スレッド間のデータ同期,スレッドの削除などにかかる時間が含まれます。
parfor
ループには,次の構文を使用します。
parfor i = InitVal:EndVal
最大数のスレッドを指定するには,次の構文を使用します。
parfor (i = InitVal:EndVal,NumThreads)
詳細は,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
ループの本体では以下の構成を使用しないでください。