2017-04-23 29 views
0

我需要计算2个使用相同参数(仅用于读取)的不同函数。在我使程序多线程之后,程序运行需要2倍的时间(而不是0.5倍)。我是新的多线程编程,但我怀疑为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; 
} 

哪些工作,但慢两倍。然后我试图“免费”变量“亩,西格玛和P”,但它仍然2X倍慢:

#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

你在你的线程调用的功能,这样做一点工作,启动成本那些线程超过了使用多线程获得的收益。虚假分享与它无关。

由于musigma,并p由值来传递,可以将这些两个线程之间(并且,在任何情况下,被复制作为lambda函数的开销的一部分)共享。