From 2043b3241ccfc103959d3a89d1b03d4714a34aaa Mon Sep 17 00:00:00 2001 From: shikhar Date: Sat, 25 Nov 2017 22:30:21 +0530 Subject: [PATCH 1/3] added multi core fnctionality --- clustering.cpp => Clustering.cpp | 0 clustering.h => Clustering.h | 0 Parameters.h | 6 +- RFIM_2D_main.cpp | 14 +- RFIM_2D_main_multi_core.cpp | 194 ++++++++++++++++++++++++ log.dat | 252 +++++++++++++++++++++++++++++++ main | Bin 0 -> 79312 bytes make.sh | 12 ++ make_multi.sh | 12 ++ 9 files changed, 485 insertions(+), 5 deletions(-) rename clustering.cpp => Clustering.cpp (100%) rename clustering.h => Clustering.h (100%) create mode 100644 RFIM_2D_main_multi_core.cpp create mode 100644 log.dat create mode 100755 main create mode 100755 make.sh create mode 100755 make_multi.sh diff --git a/clustering.cpp b/Clustering.cpp similarity index 100% rename from clustering.cpp rename to Clustering.cpp diff --git a/clustering.h b/Clustering.h similarity index 100% rename from clustering.h rename to Clustering.h diff --git a/Parameters.h b/Parameters.h index ae062ee..70adc8c 100644 --- a/Parameters.h +++ b/Parameters.h @@ -1,8 +1,8 @@ #pragma once //* DEFINE ALL THE PARAMETERS HERE */ -#define iter 10 -#define VER 10 // width of lattice matrix. for ex 6*6 lattice +#define iter 1 +#define VER 64 // width of lattice matrix. for ex 6*6 lattice #define DIM 2 // dimension of lattice // here 2; square lattice #define latt_pc 1 // percentage of lattice points where atom exist #define upspin_pc 0.5 // percentage of upspin in lattice @@ -26,4 +26,4 @@ #define d " : " // used in push relabel -#define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) \ No newline at end of file +#define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) diff --git a/RFIM_2D_main.cpp b/RFIM_2D_main.cpp index 8b82423..eb182d8 100644 --- a/RFIM_2D_main.cpp +++ b/RFIM_2D_main.cpp @@ -7,15 +7,21 @@ //#define _HAS_ITERATOR_DEBUGGING 0 +#include #include "Headers.h" #include "Parameters.h" #include "Clustering.h" #include "PushRelabel.h" #include "LatticeStuff.h" + using namespace std; + +ofstream f; int main(void) { + f.open("log.dat",ios::app); + //Mat image(VER, VER, CV_8UC3); @@ -25,6 +31,7 @@ int main(void) { for (l = 0; l < iter; l++) { + f << "iter: " << l < +#include +#include +#include "Headers.h" +#include "Parameters.h" +#include "Clustering.h" +#include "PushRelabel.h" +#include "LatticeStuff.h" + + +using namespace std; + + +ofstream f; + +int randomizer(void){ + random_device rand_dev; + mt19937 generator(rand_dev()); + uniform_int_distribution distr(0,5000); + return distr(generator); +} +int blowjob(void) { + string file_name = "log.dat"; + file_name + to_string(randomizer()); + f.open(file_name,ios::app); + + //Mat image(VER, VER, CV_8UC3); + + + time_t time_begin, time_end, time_1, time_2; + + long t1, t2, tdiff[iter] = { 0 }, l = 0, sum = 0, i, j, cap = 0, clusters = 0; + + for (l = 0; l < iter; l++) + { + f << "iter: " << l < > flow(V, vector(V, 0)) + , CapacityMat(V, vector(V, 0)) + , Exmat(N, vector(N, 0)) + , sqlat0(VER + 1, vector(VER + 1, 0)) + , sqlat1(VER + 1, vector(VER + 1, 0)); + + /* ==================== INITIALISING 1D VECTORS ================*/ + vector visited(V, 0), Wmat(N, 0), latt(N, 1), Bmat(N, 0), clusstats0(V / 2, 0), clusstats1(V / 2, 0); + + /* =========================== BETA MATRIX (Bmat)======================= */ + + //create_Bmat_bimodal(Bmat); // UNCOMMENT FOR BIMODAL DISTRIBUTION + create_Bmat_gaussian(Bmat); + cout << "Bmat created" << endl; + + /* ====================== CREATING EXISTANCE MATRIX (Exmat)============= */ + + create_Exmat(Exmat, latt); + cout << "Exmat created" << endl; + + /* ================= CREATING CAPACITY MATRIX (CapacityMat)============= */ + + create_CapacityMat(CapacityMat, Exmat); + cout << "created CapacityMatrix" << endl; + + /* =================== LOOP TO ITERATE OVER RANGE OF DELTA ============= */ + + for (int del = del_beg; del <= del_end; del += del_inc) + { + f << "del: " << del << endl; + //open + cout << "\ndEL: " << float(del) / 10 << tab; + + create_Wmat(Wmat, CapacityMat, Bmat, del); + + /* =========== AGUMENTING CAPACITY MATRIX WITH WMAT ============= */ + + create_Augumented_CapacityMat(Wmat, CapacityMat); + + t1 = time(&time_1); /* get current time;*/ + + /*================================================================================================*/ + /* ladies and gentlemen its honour to present you the most important stuff in this awesome code */ + /* ===================== CALLING PUSH RELABEL(CapacityMat)======================================= */ + + pushRelabel(CapacityMat, flow, 0, V - 1); + + /*====================================================================================*/ + t2 = time(&time_2); /* get current time;*/ + + /* ====================== CREATE RESIDUAL GRAPH ================== */ + create_Residual_graph(CapacityMat, flow); + + /*======================================================*/ + /*============ CLUSTERIZATION ======================= */ + /*======================================================*/ + + /* ================= DEPTH FIRST SEARCH ON FLOW ================== */ + dfs(flow, 0, visited); + + /* ============ CREATE AGUMENTED MATRIX AROUND LATTICE =========== */ + createAgumentedMatrix(sqlat0, sqlat1, visited); + + /* ====================== HK CLUSTER ALGO ================== */ + cluster(sqlat1, 1, clusstats1); + cluster(sqlat0, 0, clusstats0); + + /* ====================== PRINT CLUSTERS ================== */ + //printCluster(sqlat1, clusstats1); + //printCluster(sqlat0, clusstats0); + + /* ====================== COUNT CLUSTERS ================== */ + clusters = no_of_clusters(clusstats0, clusstats1); + cout << "clusters: " << clusters << "\n\n"; + f << "clusters: " << clusters << endl; + + tdiff[l] = t2 - t1; + sum += tdiff[l]; + + //re_init + for (i = 0; i < V; i++) + { + for (j = 0; j < V; j++) + { + + if (i < VER + 1 && j < VER + 1) + { + + sqlat0[i][j] = 0; + sqlat1[i][j] = 0; + } + + + flow[i][j] = 0; + } + if (i < V / 2) + { + + clusstats0[i] = 0; + clusstats1[i] = 0; + } + if (i < N) + { + + Wmat[i] = 0; + }visited[i] = 0; + + } + //close + } + + + flow.clear(); + CapacityMat.clear(); + Exmat.clear(); + visited.clear(); + Wmat.clear(); + sqlat0.clear(); + sqlat1.clear(); + clusstats0.clear(); + clusstats1.clear(); + f << endl; + + } + cout << "\n\n\nAVERAGE TIME for " << VER << " ver : " << sum / iter << endl; + + // print time req for each iter + for (l = 0; l < iter; l++) + { + cout << "-" << tdiff[l]; + } + + f.close(); + //system("PAUSE"); + return 0; +} + +int main(void){ + pid_t p = fork(); + // multiple blowjobs at the same time + blowjob(); + return 0; + +} \ No newline at end of file diff --git a/log.dat b/log.dat new file mode 100644 index 0000000..ec2b994 --- /dev/null +++ b/log.dat @@ -0,0 +1,252 @@ +iter: 0 +del: 0 +clusters: 1 +del: 2 +clusters: 1 +del: 4 +clusters: 1 +del: 6 +clusters: 1 +del: 8 +clusters: 1 +del: 10 +clusters: 1 +del: 12 +clusters: 1 +del: 14 +clusters: 1 +del: 16 +clusters: 6 +del: 18 +clusters: 7 +del: 20 +clusters: 8 +del: 22 +clusters: 15 +del: 24 +clusters: 15 +del: 26 +clusters: 15 +del: 28 +clusters: 14 +del: 30 +clusters: 16 +del: 32 +clusters: 14 +del: 34 +clusters: 14 +del: 36 +clusters: 16 +del: 38 +clusters: 16 +del: 40 +clusters: 22 + +iter: 1 +del: 0 +clusters: 1 +del: 2 +clusters: 1 +del: 4 +clusters: 1 +del: 6 +clusters: 1 +del: 8 +clusters: 1 +del: 10 +clusters: 1 +del: 12 +clusters: 1 +del: 14 +clusters: 2 +del: 16 +clusters: 4 +del: 18 +clusters: 6 +del: 20 +clusters: 7 +del: 22 +clusters: 10 +del: 24 +clusters: 11 +del: 26 +clusters: 12 +del: 28 +clusters: 13 +del: 30 +clusters: 17 +del: 32 +clusters: 24 +del: 34 +clusters: 23 +del: 36 +clusters: 23 +del: 38 +clusters: 23 +del: 40 +clusters: 25 + +iter: 0 +del: 0 +clusters: 1 +del: 2 +clusters: 1 +del: 4 +clusters: 1 +del: 6 +clusters: 1 +del: 8 +clusters: 1 +del: 10 +clusters: 1 +del: 12 +iter: 0 +del: 0 +clusters: 1 +del: 2 +iter: 0 +del: 0 +clusters: 1 +del: 2 +clusters: 1 +del: 4 +clusters: 1 +del: 6 +clusters: 1 +del: 8 +clusters: 1 +del: 10 +clusters: 1 +del: 12 +clusters: 1 +del: 14 +clusters: 3 +del: 16 +clusters: 3 +del: 18 +clusters: 4 +del: 20 +clusters: 16 +del: 22 +clusters: 18 +del: 24 +clusters: 18 +del: 26 +clusters: 17 +del: 28 +clusters: 15 +del: 30 +clusters: 19 +del: 32 +clusters: 21 +del: 34 +clusters: 19 +del: 36 +clusters: 20 +del: 38 +clusters: 20 +del: 40 +clusters: 29 + +iter: 1 +del: 0 +clusters: 1 +del: 2 +clusters: 1 +del: 4 +clusters: 1 +del: 6 +clusters: 1 +del: 8 +clusters: 1 +del: 10 +clusters: 1 +del: 12 +clusters: 1 +del: 14 +clusters: 1 +del: 16 +clusters: 3 +del: 18 +clusters: 3 +del: 20 +clusters: 3 +del: 22 +clusters: 7 +del: 24 +clusters: 7 +del: 26 +clusters: 9 +del: 28 +clusters: 11 +del: 30 +clusters: 12 +del: 32 +clusters: 15 +del: 34 +clusters: 15 +del: 36 +clusters: 16 +del: 38 +clusters: 16 +del: 40 +clusters: 20 + +iter: 0 +del: 0 +clusters: 1 +del: 2 +clusters: 1 +del: 4 +clusters: 1 +del: 6 +clusters: 1 +del: 8 +clusters: 1 +del: 10 +clusters: 1 +del: 12 +clusters: 1 +del: 14 +clusters: 6 +del: 16 +clusters: 11 +del: 18 +clusters: 13 +del: 20 +clusters: 15 +del: 22 +clusters: 49 +del: 24 +clusters: 38 +del: 26 +clusters: 43 +del: 28 +iter: 0 +iter: 0 +del: 0 +del: 0 +clusters: 1 +del: 2 +clusters: 1 +del: 2 +clusters: 1 +del: 4 +clusters: 1 +del: 6 +clusters: 1 +del: 8 +clusters: 1 +del: 10 +clusters: 1 +del: 12 +clusters: 2 +del: 14 +clusters: 3 +del: 16 +clusters: 9 +del: 18 +clusters: 10 +del: 20 +clusters: 19 +del: 22 diff --git a/main b/main new file mode 100755 index 0000000000000000000000000000000000000000..96d013bdc70d583df5b058e016d48fad450165dc GIT binary patch literal 79312 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 literal 0 HcmV?d00001 diff --git a/make.sh b/make.sh new file mode 100755 index 0000000..f0ac9c2 --- /dev/null +++ b/make.sh @@ -0,0 +1,12 @@ + +#obj_file=(${1//./ }) + +if g++ --std=c++14 -Wall RFIM_2D_main.cpp LatticeStuff.cpp Clustering.cpp PushRelabel.cpp -o main ; then + echo '*************' + ./main + +else + exit +fi + +#rm build/$obj_file diff --git a/make_multi.sh b/make_multi.sh new file mode 100755 index 0000000..21acf38 --- /dev/null +++ b/make_multi.sh @@ -0,0 +1,12 @@ + +#obj_file=(${1//./ }) + +if g++ --std=c++14 -Wall RFIM_2D_main_multi_core.cpp LatticeStuff.cpp Clustering.cpp PushRelabel.cpp -o main ; then + echo '*************' + ./main + +else + exit +fi + +#rm build/$obj_file From bcd11463d69723b3894f925251f390caaa198828 Mon Sep 17 00:00:00 2001 From: shikhar Date: Sat, 25 Nov 2017 23:40:41 +0530 Subject: [PATCH 2/3] added multi core fnctionality --- RFIM_2D_main_multi_core.cpp | 45 ++++++++++++++++++++++++++++--------- make_multi.sh | 2 +- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/RFIM_2D_main_multi_core.cpp b/RFIM_2D_main_multi_core.cpp index 8b102f7..b5a6fc6 100644 --- a/RFIM_2D_main_multi_core.cpp +++ b/RFIM_2D_main_multi_core.cpp @@ -16,7 +16,10 @@ #include "Clustering.h" #include "PushRelabel.h" #include "LatticeStuff.h" - +#ifdef unix + #include +#endif +#define NUM_THREADS 1 using namespace std; @@ -29,13 +32,16 @@ int randomizer(void){ uniform_int_distribution distr(0,5000); return distr(generator); } -int blowjob(void) { - string file_name = "log.dat"; - file_name + to_string(randomizer()); - f.open(file_name,ios::app); +void *blowjob(void* thread_id) { + pthread_mutex_t mutex; - //Mat image(VER, VER, CV_8UC3); + long id = (long)thread_id; + string file_name = "log/log"; + file_name += to_string(id); + file_name = file_name + "_" + to_string(randomizer()) + ".dat"; + f.open(file_name,ios::app); + cout << file_name << endl; time_t time_begin, time_end, time_1, time_2; @@ -181,14 +187,33 @@ int blowjob(void) { } f.close(); - //system("PAUSE"); - return 0; + } -int main(void){ +int main(int argc,char *argv[]){ pid_t p = fork(); + pthread_t threads[NUM_THREADS]; + int iret; // multiple blowjobs at the same time - blowjob(); + for(int i = 0;i < NUM_THREADS;i++){ + + iret = pthread_create(&threads[i],NULL,blowjob,(void*)i); + + if (iret) { + cout << "Error:unable to create thread," << iret << endl; + exit(-1); + } + + } + + for(int i = 0;i < NUM_THREADS;i++){ + pthread_join(threads[i],NULL); + } + + // for deleting the executable file after running the program + //remove(argv[0]); + + return 0; } \ No newline at end of file diff --git a/make_multi.sh b/make_multi.sh index 21acf38..0317a01 100755 --- a/make_multi.sh +++ b/make_multi.sh @@ -1,7 +1,7 @@ #obj_file=(${1//./ }) -if g++ --std=c++14 -Wall RFIM_2D_main_multi_core.cpp LatticeStuff.cpp Clustering.cpp PushRelabel.cpp -o main ; then +if g++ --std=c++14 -Wall RFIM_2D_main_multi_core.cpp LatticeStuff.cpp Clustering.cpp PushRelabel.cpp -lpthread -o main ; then echo '*************' ./main From 1a866df89c0d4b585dc61c09094d9e884713bdee Mon Sep 17 00:00:00 2001 From: sanket deshpande Date: Sun, 26 Nov 2017 02:02:24 +0530 Subject: [PATCH 3/3] changed name to main_RFIM_2D_main_multi_core.sh script to run RFIM_2D_main_multi_core.cpp code --- make_multi.sh => make_RFIM_2D_main_multi_core.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename make_multi.sh => make_RFIM_2D_main_multi_core.sh (55%) diff --git a/make_multi.sh b/make_RFIM_2D_main_multi_core.sh similarity index 55% rename from make_multi.sh rename to make_RFIM_2D_main_multi_core.sh index 0317a01..a758455 100755 --- a/make_multi.sh +++ b/make_RFIM_2D_main_multi_core.sh @@ -2,10 +2,12 @@ #obj_file=(${1//./ }) if g++ --std=c++14 -Wall RFIM_2D_main_multi_core.cpp LatticeStuff.cpp Clustering.cpp PushRelabel.cpp -lpthread -o main ; then - echo '*************' + echo '****** RUNNING MULTI CORE RFIM SIMULATION *******' ./main else + echo ' XXXXX SOMETHING WENT WRONG XXXXX ' + echo ' XXXXX most probably your career decision ' exit fi