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;
}
您每次迭代都会开始一个新线程。然而,线程启动是一个昂贵的过程。这可能会解释您的性能损失。 –