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