次のプログラムを並列化しようとしていますが、配列を減らす方法がわかりません。することは不可能ですが、代替手段はありますか?ありがとう。(mの削減を追加しましたが、これは間違っていますが、その方法に関するアドバイスが必要です。1はい、OpenMPで配列の縮小を行うことは可能です。Fortranでは、このための構造も備えています。++では、自分で行う必要があります。以下に2つの方法を示します。クリティカルセクション(下記のコードを参照)。nthreadsの次元を持つ配列を作成します。クリティカルセクションを使用しません。2番目の方法ははるかに複雑で、特に注意しないとマルチソケットシステムでキャッシュの問題が発生する可能性があります。詳細については、クリティカルセクションを使用せずにOpenMPと並行してこの塗りつぶしヒストグラム(配列の縮小)を参照してください。2Zbosonの答えに関して2つの発言があります:1.方法1は確かに正しいですが、リダクションループは実際にシリアルに実行されます。criticalマトリックスに起因するスレッドによって行われます。2.方法2:初期化ループは単一セクションの外側に移動できるため、並列化できます。4.0の機能の97ページにある複素数削減の例とまったく同じです。パラレルバージョンは正常に動作しますが、おそらくパフォーマンスの問題があるため、調査していません。add_m10x1の入力と出力は値で渡されます。add_m10x1のループはシリアルで実行されます。++の参照を介して)渡す必要がありますadd_m10x1の計算は適切に行われる必要があります。add_m10x1はvoidと宣言し、returnステートメントを削除する必要があります。結果は最初のパラメーターを介して返されます。reductionプラグマはそれに応じて変更する必要があります。TRUEを使用)コードの変更部分は次のとおりです。3OpenMPリダクション操作で配列を使用できるFortranにコードを変換しても魅力がない場合は、多数の一時変数を使用できます。書かなければならないという魅力のない見通しが残ります。どのテンポラリーを更新するかを決定するステートメント。コードが学習に使用したい単なる例である場合は、続けてください。あなたの意図が純粋に並列接頭辞合計ルーチンを書くことであるなら、あちこち検索してください。これは開始するのに適した場所です。