2017-04-23 16 views
0

同じパラメータを使用する2つの異なる関数を計算する必要があります(読み込み専用)。プログラムをマルチスレッド化した後、プログラムの実行には2倍の時間が必要です(0.5倍ではなく)。私はマルチスレッドプログラミングでは新しいですが、私はfalse sharingの疑いがあります。マルチスレッド - 効率の低下、おそらく `false sharing`の可能性

私の元のコード(カット):

#include <iostream> 

double frac_twins(double mu, double sigma,p){ 
    return 1; 
} 
double dist_twins(double mu, double sigma,p){ 
    return 2; 
} 

int main(){ 

int n_t=100; 

double* num_t = new double[n_t]; 
double* dist_t = new double[n_t]; 

double mu=2; double sigma=1; 
double num,dist; 

for(double p=0.001; p<=0.101;p+=0.001){ 

    num=frac_twins(mu,sigma,p); 
    dist=dist_twins(mu,sigma,p); 

     num_t[i]=num; 
     dist_t[i]=dist; 
     i++; 
} 

return 0; 
} 

作品罰金。スレッドを使用しようとしました。

#include <iostream> 
#include <thread> 

double frac_twins(double mu, double sigma,p){ 
    return 1; 
} 
double dist_twins(double mu, double sigma,p){ 
    return 2; 
} 

int main(){ 

int n_t=100; 

double* num_t = new double[n_t]; 
double* dist_t = new double[n_t]; 

double mu=2; double sigma=1; 
double num,dist; 

for(double p=0.001; p<=0.101;p+=0.001){ 

     std::thread t1([&num,mu,sigma,p](){ 
    num=frac_twins(mu,sigma,p); 
     }); 
     std::thread t2([&dist,mu,sigma,p](){ 
    dist=dist_twins(mu,sigma,p); 
     }); 

     t1.join(); 
     t2.join(); 

     num_t[i]=num; 
     dist_t[i]=dist; 
     i++; 
} 

return 0; 
} 

これはどちらでも動作しますが、2倍遅くなります。それから私は、「無料」変数のムー、シグマおよびP 'にしようとしましたが、遅くてまだ2倍回:あなたのスレッドで呼び出している

#include <iostream> 
#include <thread> 

double frac_twins(double mu, double sigma,p){ 
    return 1; 
} 
double dist_twins(double mu, double sigma,p){ 
    return 2; 
} 

int main(){ 

int n_t=100; 

double* num_t = new double[n_t]; 
double* dist_t = new double[n_t]; 

double mu=2; double sigma=1; 
double mu2=2; double sigma2=1; double p2; 

double num,dist; 

for(double p=0.001; p<=0.101;p+=0.001){ 

     std::thread t1([&num,mu,sigma,p](){ 
    num=frac_twins(mu,sigma,p); 
     }); 
     mu2=mu; sigma2=sigma; p2=p; 
     std::thread t2([&dist,mu2,sigma2,p2](){ 
    dist=dist_twins(mu,sigma,p); 
     }); 

     t1.join(); 
     t2.join(); 

     num_t[i]=num; 
     dist_t[i]=dist; 
     i++; 
} 

return 0; 
} 
+1

繰り返しごとに新しいスレッドを開始しています。しかし、スレッドの起動はコストのかかるプロセスです。これはあなたのパフォーマンスの損失を説明するかもしれません。 –

答えて

1

機能がこれほど少ないの作業を行う、起動の費用それらのスレッドは、複数のスレッドを使用して得られる利益を上回ります。偽の共有はそれとは関係ありません。 muので

sigma、及びpは値によって渡され、これらは、(い​​ずれにしても、ラムダ関数のオーバーヘッドの一部としてコピーされ、)は、2つのスレッド間で共有することができます。

関連する問題