gpt4 book ai didi

c++ - 多线程 - 效率降低,可能由 `false sharing` 引起

转载 作者:行者123 更新时间:2023-11-28 05:10:40 26 4
gpt4 key购买 nike

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

最佳答案

您在线程中调用的函数做的工作很少,启动这些线程的成本超过了使用多线程获得的 yield 。虚假分享与此无关。

因为 musigmap 是按值传递的,所以它们可以在两个线程之间共享(并且,在任何情况下, 作为 lambda 函数开销的一部分被复制)。

关于c++ - 多线程 - 效率降低,可能由 `false sharing` 引起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43571684/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com