2011-01-07 16 views
7

私は、次のコードを使用してC++プログラムでの並列効果を取得しようとしています:C++ OpenMPプログラム

#include<iostream> 
using namespace std; 

int main() 
{ 

#pragma omp parallel sections 
    { 
#pragma omp section 
     { 
     cout<<"Hello"; 
     cout<<" "; 
     cout<<"World"; 
     cout<<endl; 

     } 
#pragma omp section 
     { 
     cout<<"H"; 
     cout<<"ello"; 
     cout<<" W"; 
     cout<<"orld"; 
     cout<<endl; 
     } 
#pragma omp section 
     cout<<"Hello"<<" "<<"World"<<endl; 
#pragma omp section 
{  cout<<"Hello "; 
     cout<<"World"<<endl; 
} 
    } 
    return 0; 
} 

を私はこのプログラムを何度も実行していた。私が原因並列処理にインターリーブされた出力を期待していた。..

はしかし、私は実行するたびに、このプログラムは、出力は次のとおりです。

Hello World 
Hello World 
Hello World 
Hello World 

私が何か間違ったことをやっていますか?

おかげ

+0

どのように多くのコア/プロセッサ? –

+0

4つのコア...そして、1つのコアだけにその効果を見たいのですが? – Betamoo

+2

あなたのCPUがハイパースレッディングしない限り、* 1つのコアには効果がありません。 –

答えて

3

コードが正しいですが、インターリーブされた出力は、このような小さなプログラムから取得するのは難しいことができます。出力文の間にsleepのようなものをいくつか呼び出すと、何らかのフラッシングが行われます。

(コンパイルとリンクを-openmpで、-fopenmp、または聞きたいと思うものは何でもあなたのコンパイラでしたか?)

+0

私は '-openmp'でコンパイルしています... – Betamoo

+0

Sleep worked ... thnx – Betamoo

4

どのようにプログラムをコンパイルしていますか? OpenMPは有効になっていますか?あなたが文字をインターリーブ取得したい場合

それとは別に、はるかに簡単なHello Worldのは、次のようになります。あなたのマシンが実際に持っている

int main() { 
    char const* str = "Hello world"; 
    unsigned const len = std::strlen(str); 
    #pragma omp parallel for num_threads(4) 
    for (unsigned thread = 0; thread < 4; ++thread) 
     for (unsigned i = 0; i < len; ++i) 
      std::cout << str[i] << std::endl; 
}