1

で関数なしで OpenMP を使用しているreduction(+ : sum)場合、OpenMP バージョンは正常に動作します。

#include <iostream>
#include <omp.h>
using namespace std;

int sum = 0;
void summation()
{
    sum = sum + 1;
}

int main()
{
    int i,sum;

#pragma omp parallel for reduction (+ : sum)
    for(i = 0; i < 1000000000; i++)
        summation();

#pragma omp parallel for reduction (+ : sum)
    for(i = 0; i < 1000000000; i++)
        summation();

#pragma omp parallel for reduction (+ : sum)
    for(i = 0; i < 1000000000; i++)
        summation();

    std::cerr << "Sum is=" << sum << std::endl;
}

しかしsummation、グローバル変数に対して関数を呼び出すと、OpenMP バージョンはシーケンシャル バージョンよりもさらに時間がかかります。

同じ理由と変更すべき点を知りたいです。

4

2 に答える 2

0

このsummation関数は、縮小するOMP共有変数を使用しません。修理する:

#include <iostream>
#include <omp.h>

void summation(int& sum) { sum++; }

int main()
{
    int sum;

#pragma omp parallel for reduction (+ : sum)
    for(int i = 0; i < 1000000000; ++i)
        summation(sum);

    std::cerr << "Sum is=" << sum << '\n';
}
于 2012-07-10T11:19:30.450 に答える
0

この 1 つの変数へのアクセスを同期するのにかかる時間は、複数のコアを使用することで得られる時間をはるかに超えます。変数は 1 つしかなく、一度にアクセスできるのは 1 つのコアだけであるため、それらはすべてお互いに際限なく待機します。時間。この設計では同時実行が不可能であり、支払っているすべての同期は実行時間を増加させるだけです。

于 2012-07-10T11:20:58.457 に答える