多线程 - 降低效率,也许是由“ false共享”所产生的

Multi thread - reduced efficiency, maybe casued by `false sharing`

本文关键字:共享 false 低效率 也许 多线程      更新时间:2023-10-16

我需要计算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;
}

有效,但速度慢了2倍。然后,我尝试"免费"变量'MU,Sigma和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;
}

您在线程中调用的功能的工作很少,启动这些线程的成本超过了通过使用多个线程获得的增益。错误的共享与它无关。

由于 musigmap是按值传递的,因此可以在两个线程之间共享这些(并且在任何情况下,都将其复制为lambda函数的一部分开销(。