ホームページ > バックエンド開発 > C++ > OpenMP で配列の削減を並列化するにはどうすればよいですか?

OpenMP で配列の削減を並列化するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-07 03:13:10
オリジナル
889 人が閲覧しました

How Can Array Reduction be Parallelized in OpenMP?

OpenMP での配列のリダクション

OpenMP で配列のリダクションを直接実行することはできません。ただし、配列縮小並列処理を実現する別のアプローチもあります。

最初の方法: プライベート配列とクリティカル セクション

このメソッドは、スレッドごとに配列のプライベート コピーを作成します。各スレッドはプライベート配列に値を入力し、クリティカル セクションを使用して結果を最終配列にマージします。

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 番目の方法: 配列拡張とスレッドに依存しない累積

このメソッドは、すべてのスレッドにまたがる拡張配列を作成します。各スレッドは配列のその部分を埋めてから、クリティカル セクションを使用せずに結果をマージします。このアプローチは、マルチソケット システムで慎重に使用しないと、キャッシュの問題が発生する可能性があります。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート