ホームページ >バックエンド開発 >C++ >OpenMP では配列の削​​減は可能ですか?また、どうすれば実現できますか?

OpenMP では配列の削​​減は可能ですか?また、どうすれば実現できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-06 15:44:15790ブラウズ

Is Array Reduction Possible in OpenMP, and How Can It Be Achieved?

OpenMP での配列削減

問題:

プログラムを並列化するには配列削減が必要ですが、 OpenMP では不可能と考えられています。代替手段はありますか?

答え:

はい、OpenMP では配列の削​​減が可能です。以下に 2 つの代替方法を示します。

方法 1: クリティカル セクションを使用したプライベート Sum 削減

  • 各スレッドで配列のプライベート バージョンを作成します。
  • リダクションを並行して実行します。
  • クリティカル セクションの値をマージします。正しい結果を保持します。
int A [] = {84, 30, 95, 94, 36, 73, 52, 23, 2, 13};
int S [10] = {0};
#pragma omp parallel
{
    int S_private[10] = {0};
    #pragma omp for
    for (int n=0 ; n<10 ; ++n ) {
        for (int m=0; m<=n; ++m){
            S_private[n] += A[m];
        }
    }
    #pragma omp critical
    {
        for(int n=0; n<10; ++n) {
            S[n] += S_private[n];
        }
    }
}

方法 2: クリティカル セクションを使用しないプライベート Sum 削減

  • 次元 [10 * nthreads のプライベート配列を作成する] ].
  • リダクションを並行して実行し、結果をプライベートに保存しますarray.
  • クリティカルセクションを除いて値を元の配列にマージします。
int A [] = {84, 30, 95, 94, 36, 73, 52, 23, 2, 13};
int S [10] = {0};
int *S_private;
#pragma omp parallel
{
    const int nthreads = omp_get_num_threads();
    const int ithread = omp_get_thread_num();

    #pragma omp single 
    {
        S_private = new int[10*nthreads];
        for(int i=0; i<(10*nthreads); i++) S_private[i] = 0;
    }
    #pragma omp for
    for (int n=0 ; n<10 ; ++n )
    {
        for (int m=0; m<=n; ++m){
            S_private[ithread*10+n] += A[m];
        }
    }
    #pragma omp for
    for(int i=0; i<10; i++) {
        for(int t=0; t<nthreads; t++) {
            S[i] += S_private[10*t + i];
        }
    }
}
delete[] S_private;

以上がOpenMP では配列の削​​減は可能ですか?また、どうすれば実現できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。