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

OpenMP で配列の縮小を実行するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-02 18:13:12599ブラウズ

How to Perform Array Reduction in OpenMP?

OpenMP での配列削減

質問:

配列に対して OpenMP で実行する方法減量作戦?

答え:

OpenMP は配列の削​​減をサポートしています。これを行うには 2 つの方法があります:

方法 1: 「プライベート」変数

を使用してスレッドごとに S のプライベート コピーを作成し、それらに並行して値を設定します。そしてそれらをエリア内の S にマージします:

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: 多次元配列

を使用して次元 10*nthreads の配列を作成し、それを並列に埋めてから、クリティカル セクションなしで S にマージします:

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 までご連絡ください。