2016-09-24 8 views
-5

私はPIの価値を見積もるC++プログラムを持っています。 2スレッドまたは4スレッドの間でタスクを分割する方法はありますか?このC++プログラムをマルチスレッド化する方法は?

int main(int argc, char** argv) 
{ 
    double N = 10000000 
    int i, K = 0; 
    float pi; 

    srand(time(NULL)); 

    for(i = 0; i < N; ++i) 
    { 
     double x = rand()/(double)INT_MAX; 
     double y = rand()/(double)INT_MAX; 

     if (x*x + y*y < 1) 
     { 
      K++; 
     } 
    } 

    pi = K*4/N; 

    return 0; 
} 
+0

置き換える/(ダブル) Nを定数* idNで置き換え、powをx * xに置き換え、INT_MAXをdouble定数に置き換えて、マルチスレッド化前の速度を上げてください。 –

+2

スレッドごとにローカルアキュムレータを1つ持ち、その結果を最後に集計します。 –

+0

なぜあなたはINT_MAXで割りますか?そのアルゴリズムはまったく機能しますか? –

答えて

2

初心者の方が簡単なので、代わりにC++ 11スレッドを使用します。

ここにコードがあります。

double PiComputation::Random(){ 
    std::lock_guard<std::mutex> lock(mut_rand); 
    return ((double)dis(gen)/ (double) INT32_MAX); 
} 

double PiComputation::computePiSubTask(int nbSimuls){ 
    double x, y; 
    auto nbOk=0; 
    for (int i=0;i<nbSimuls;++i){ 
     x=Random(); 
     y=Random(); 
     if (x*x+y*y <1){ 
      nbimulsOk++; 
     } 
    } 
    return nbOk; 
} 

double PiComputation::ComputePi(){ 
    nbimulsOk=0; 
    int nbSubTaks=2; 
    int nbSimuls1=N/2; 
    int nbSimuls2=N-N/2; 

    std::thread first (&PiComputation::computePiSubTask, this, nbSimuls1); 
    std::thread second (&PiComputation::computePiSubTask, this, nbSimuls2); 



    first.join(); 
    second.join(); 

    return 4*nbimulsOk/(double) N; 
} 
PiComputation::PiComputation(void):N(100000000) 
{ 

    gen=std::mt19937 (rd()); 
    dis= std::uniform_int_distribution<> (1, INT32_MAX); 
} 


PiComputation::~PiComputation(void){ 
} 

出力にそれを呼び出し中:それはマルチスレッド化されているが、それは、そのボトルネックに遅くなる場合がありますので、乱数生成器のロックがあることが3.1416770800000000

+0

私はそれを試してみる、ありがとう! –

関連する問題