c++のプログラムの並列化を行いたい

前提

C++でシミュレーションを実装しました.実装したシミュレーションは問題なく
動くのですが,計算にかかる時間がとても長いです.
また,includeしているヘッダファイルはクラスsimulation に関係するものなので,
今回の並列化には影響はないと考えております.

実現したいこと

並列化を行うことで,計算にかかる時間を短くしたいです.
具体的には,以下のコードのfor(int i=0;i<50;i++)の50個の処理を並列化したいです.

該当のソースコード

C++

#include "customerRecord.h"#include "customerCollection.h"#include "simulation5.h"#include <fstream>#include <string>#include <time.h>int main(){ time_t start_time, end_time; const double MAX = 120000000; pair<double,double> ans_simu;//first:AoIの値、second:信頼誤差の値 double mu1 = 1; double mu2; double first_cin = false;//ファイル書き込み用,一番初めの値が書き込まれたらtrueに for(int i=0;i<50;i++){//【この50のfor文の並列化を行いたい】 start_time = time(NULL);//処理開始前時間 mu2 = ((double)i / 10) + 0.1;//0.1~5.0まで int L2_0_kugiri = 100;//c=0~9.9まで0.1刻み int L2_1_kugiri = 100; int L2_2_kugiri = 100; double k_0_border = 0;//実際に刻んだ閾値 double k_1_border = 0; double k_2_border = 0; double bestAoI = 0;//最適なAoIを格納 double bestgosa= 0;//最適なAoIをとった時の信頼誤差を格納 double best_k_0_border = 0;//最適なAoIをとったときの閾値を確保 double best_k_1_border = 0; double best_k_2_border = 0; bestAoI = MAX; for(int k_0=0;k_0<L2_0_kugiri;k_0++){ k_0_border = (double) k_0 / 10; for(int k_1=0;k_1<L2_1_kugiri;k_1++){ k_1_border = (double) k_1 / 10; for(int k_2=0;k_2<L2_2_kugiri;k_2++){ k_2_border = (double) k_2 / 10; simulation simu(mu1,mu2,k_0_border,k_1_border,k_2_border); ans_simu = simu.AoI_return(mu1,mu2,k_0_border,k_1_border,k_2_border);//first:平均AoI,second:信頼誤差 if(bestAoI > ans_simu.first){//より最適な平均AoIを発見した場合,その時のAoI,誤差,閾値を保存 bestAoI = ans_simu.first; bestgosa = ans_simu.second; best_k_0_border = k_0_border; best_k_1_border = k_1_border; best_k_2_border = k_2_border; } } } } end_time = time(NULL);//プログラム実行時間計算用 cout << " コード実行時間" << end_time - start_time << "秒," << endl; cout << "mu2 = " << mu2 << "fin" << endl; //値の出力 if(first_cin == false){//一回めだけ,ファイルを新規作成 first_cin = true; ofstream fout1; string filename1 = "heiretumae.dat"; fout1.open(filename1, std::ios::out); fout1 << mu2 << " " << bestAoI << " " << bestgosa << " " << best_k_0_border << " " << best_k_1_border << " " << best_k_2_border << endl; fout1.close(); } else{//最初以外は追記 ofstream fout1; string filename1 = "heiretumae.dat"; fout1.open(filename1, std::ios::app); fout1 << mu2 << " " << bestAoI << " " << bestgosa << " " << best_k_0_border << " " << best_k_1_border << " " << best_k_2_border << endl; fout1.close(); } } return 0;}

試したこと

OpenMPについて調べましたが,共有変数のあたりでつまづいてしまいました.

補足情報(FW/ツールのバージョンなど)

C++11を使用しております.

コメントを投稿

0 コメント