3

OpenMP を使用して C++ で単純な並列プログラムを作成しています。私は Windows 7 と Microsoft Visual Studio 2010 Ultimate で作業しています。OpenMP をサポートするために、プロジェクトの Language プロパティを「Yes/OpenMP」に変更しました。

ここでコードを提供します:

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

using namespace std;

double sum; 
int i;
int n = 800000000;

int main(int argc, char *argv[])
{               
    omp_set_dynamic(0);
    omp_set_num_threads(4); 

    sum = 0;    
    #pragma omp for reduction(+:sum)
    for (i = 0; i < n; i++)
        sum+= i/(n/10);

    cout<<"sum="<<sum<<endl;        

    return  EXIT_SUCCESS;
}

OpenMPxomp_set_num_threads(x); 使っても使わなくても計算時間は同じで7秒くらいです。

誰かが問題を知っていますか?

4

2 に答える 2

2

pragmaステートメントに指定子がありませんparallel:

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

using namespace std;

double sum; 
int i;
int n = 800000000;

int main(int argc, char *argv[])
{               
    omp_set_dynamic(0);
    omp_set_num_threads(4); 

    sum = 0;    
    #pragma omp parallel for reduction(+:sum)  //  add "parallel"
    for (i = 0; i < n; i++)
        sum+= i/(n/10);

    cout<<"sum="<<sum<<endl;        

    return  EXIT_SUCCESS;
}

一連の:

sum=3.6e+009
2.30071

平行:

sum=3.6e+009
0.618365

これは、ハイパースレッディングでいくらか高速化したバージョンです。反復回数を 10 倍に増やし、データ型をlong long:

double sum; 
long long i;
long long n = 8000000000;

int main(int argc, char *argv[])
{               
    omp_set_dynamic(0);
    omp_set_num_threads(8); 

    double start = omp_get_wtime();


    sum = 0;    
    #pragma omp parallel for reduction(+:sum)
    for (i = 0; i < n; i++)
        sum+= i/(n/10);

    cout<<"sum="<<sum<<endl;       

    double end = omp_get_wtime(); 
    cout << end - start << endl;
    system("pause");

    return  EXIT_SUCCESS;
}

スレッド: 1

sum=3.6e+014
13.0541

スレッド: 2

sum=3.6e+010
6.62345

スレッド: 4

sum=3.6e+010
3.85687

スレッド: 8

sum=3.6e+010
3.285
于 2012-06-20T08:59:18.183 に答える
1

Mystical によって指摘されたエラーとは別に、openMP は魔法のように使えると想定しているようでした。せいぜいマシンのすべてのコアを使用できます。コアが 2 つある場合omp_set_num_threads(np)、np>=2 で呼び出すと実行時間が 2 短縮される可能性がありますが、np がコア数よりはるかに大きい場合、並列化のオーバーヘッドによりコードが非効率になります。

Mystical の例は、np=4 の少なくとも 4 つのコアで実行されたようです。

于 2012-06-20T09:19:02.970 に答える