From a3b893f971cfc7006af51fbbecbe4117740ef91b Mon Sep 17 00:00:00 2001 From: bbod Date: Sat, 29 Feb 2020 02:21:45 -0700 Subject: [PATCH] first commit --- HW2/.idea/HW2.iml | 8 + HW2/.idea/codeStyles/codeStyleConfig.xml | 5 + HW2/.idea/misc.xml | 6 + HW2/.idea/modules.xml | 8 + HW2/.idea/workspace.xml | 73 ++++++++ HW2/Bomb.cpp | 54 ++++++ HW2/a.out | Bin 0 -> 23800 bytes HW2/pachinko.cpp | 63 +++++++ HW3/a.out | Bin 0 -> 64828 bytes HW3/parallelSort.cpp | 73 ++++++++ HW3/test.cpp | 160 ++++++++++++++++++ HW4/bitonic.cpp | 33 ++++ HW5/a.out | Bin 0 -> 34472 bytes HW5/main.cpp | 127 ++++++++++++++ Mandelbrot/gather.cpp | 33 ++++ Mandelbrot/main.cpp | 136 +++++++++++++++ .../.idea/Parallel_Mandelbrot.iml | 2 + .../.idea/codeStyles/codeStyleConfig.xml | 5 + Parallel_Mandelbrot/.idea/misc.xml | 7 + Parallel_Mandelbrot/.idea/modules.xml | 8 + Parallel_Mandelbrot/.idea/workspace.xml | 78 +++++++++ Parallel_Mandelbrot/a.out | Bin 0 -> 93228 bytes Parallel_Mandelbrot/gather.cpp | 33 ++++ Parallel_Mandelbrot/main.cpp | 155 +++++++++++++++++ Parallel_Mandelbrot/scatter.cpp | 35 ++++ Parallel_Mandelbrot/seahorse.txt | 7 + Parallel_Mandelbrot/testGather.cpp | 0 cs5500.s20 | 1 + example/a.out | Bin 0 -> 23908 bytes example/cubeICN.cpp | 70 ++++++++ .../.idea/codeStyles/codeStyleConfig.xml | 5 + example/pachinco/.idea/misc.xml | 6 + example/pachinco/.idea/modules.xml | 8 + example/pachinco/.idea/pachinco.iml | 8 + example/pachinco/.idea/workspace.xml | 68 ++++++++ example/pachinco/a.out | Bin 0 -> 23760 bytes example/pachinco/pachinko.cpp | 55 ++++++ example/parallelRoundRobin.cpp | 33 ++++ example/parallellHello.cpp | 42 +++++ example/serialHello.cpp | 9 + example/test.cpp | 10 ++ run/a.out | Bin 0 -> 23908 bytes 42 files changed, 1424 insertions(+) create mode 100644 HW2/.idea/HW2.iml create mode 100644 HW2/.idea/codeStyles/codeStyleConfig.xml create mode 100644 HW2/.idea/misc.xml create mode 100644 HW2/.idea/modules.xml create mode 100644 HW2/.idea/workspace.xml create mode 100644 HW2/Bomb.cpp create mode 100755 HW2/a.out create mode 100644 HW2/pachinko.cpp create mode 100755 HW3/a.out create mode 100644 HW3/parallelSort.cpp create mode 100644 HW3/test.cpp create mode 100644 HW4/bitonic.cpp create mode 100755 HW5/a.out create mode 100644 HW5/main.cpp create mode 100644 Mandelbrot/gather.cpp create mode 100644 Mandelbrot/main.cpp create mode 100644 Parallel_Mandelbrot/.idea/Parallel_Mandelbrot.iml create mode 100644 Parallel_Mandelbrot/.idea/codeStyles/codeStyleConfig.xml create mode 100644 Parallel_Mandelbrot/.idea/misc.xml create mode 100644 Parallel_Mandelbrot/.idea/modules.xml create mode 100644 Parallel_Mandelbrot/.idea/workspace.xml create mode 100755 Parallel_Mandelbrot/a.out create mode 100644 Parallel_Mandelbrot/gather.cpp create mode 100644 Parallel_Mandelbrot/main.cpp create mode 100644 Parallel_Mandelbrot/scatter.cpp create mode 100644 Parallel_Mandelbrot/seahorse.txt create mode 100644 Parallel_Mandelbrot/testGather.cpp create mode 120000 cs5500.s20 create mode 100755 example/a.out create mode 100644 example/cubeICN.cpp create mode 100644 example/pachinco/.idea/codeStyles/codeStyleConfig.xml create mode 100644 example/pachinco/.idea/misc.xml create mode 100644 example/pachinco/.idea/modules.xml create mode 100644 example/pachinco/.idea/pachinco.iml create mode 100644 example/pachinco/.idea/workspace.xml create mode 100755 example/pachinco/a.out create mode 100644 example/pachinco/pachinko.cpp create mode 100644 example/parallelRoundRobin.cpp create mode 100644 example/parallellHello.cpp create mode 100644 example/serialHello.cpp create mode 100644 example/test.cpp create mode 100755 run/a.out diff --git a/HW2/.idea/HW2.iml b/HW2/.idea/HW2.iml new file mode 100644 index 0000000..bc2cd87 --- /dev/null +++ b/HW2/.idea/HW2.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/HW2/.idea/codeStyles/codeStyleConfig.xml b/HW2/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..8f1a3b7 --- /dev/null +++ b/HW2/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/HW2/.idea/misc.xml b/HW2/.idea/misc.xml new file mode 100644 index 0000000..28a804d --- /dev/null +++ b/HW2/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/HW2/.idea/modules.xml b/HW2/.idea/modules.xml new file mode 100644 index 0000000..d5ad6c9 --- /dev/null +++ b/HW2/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/HW2/.idea/workspace.xml b/HW2/.idea/workspace.xml new file mode 100644 index 0000000..36a04e1 --- /dev/null +++ b/HW2/.idea/workspace.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1579920470301 + + + + + + \ No newline at end of file diff --git a/HW2/Bomb.cpp b/HW2/Bomb.cpp new file mode 100644 index 0000000..ae0aad8 --- /dev/null +++ b/HW2/Bomb.cpp @@ -0,0 +1,54 @@ +#include +#include +#include +#include + +//#include "/usr/local/include/mpi.h" +#define MCW MPI_COMM_WORLD + +using namespace std; + +int main(int argc, char **argv){ + + int rank, size; + int data; + int dest; + MPI_Init(&argc, &argv); + MPI_Comm_rank(MCW, &rank); + MPI_Comm_size(MCW, &size); + srand(rank); + + if(rank == 0){ + data = rand % 20; + cout << "Timer is set to " << data << endl; + } + + while(1) { + MPI_Recv(&data, 1, MPI_INT, MPI_ANY_SOURCE, 0, MCW, MPI_STATUS_IGNORE); + dest = rank++; + + if (!(rand() % 5)) { + data = -1; + for (int i = 0; i < size; ++i) + MPI_Send(&data, 1, MPI_INT, i, 0, MCW); + } + + if (data != 0) { + data--; + } else { + dest = rank - 1; + if (dest < 0) + dest = size - 1; + } + + MPI_Send(&data, 1, MPI_INT, dest, 0, MCW); + + + cout<<"rank "<Al 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 +#include +#include +#include +#include + +//#include "/usr/local/include/mpi.h" +#define MCW MPI_COMM_WORLD + +using namespace std; + +int main(int argc, char **argv){ + + int rank, size; + int data; + int dest; + MPI_Init(&argc, &argv); + MPI_Comm_rank(MCW, &rank); + MPI_Comm_size(MCW, &size); + srand(time(NULL)); + + + if(rank==0){ + for(int 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 Jexn3`{~xX{3v&Pf literal 0 HcmV?d00001 diff --git a/HW3/parallelSort.cpp b/HW3/parallelSort.cpp new file mode 100644 index 0000000..13046aa --- /dev/null +++ b/HW3/parallelSort.cpp @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include +#include +#include + + +//#include "/usr/local/include/mpi.h" +#define MCW MPI_COMM_WORLD + +using namespace std; + +int main(int argc, char **argv){ + + int rank, size; + int data; + int dest; + MPI_Init(&argc, &argv); + MPI_Comm_rank(MCW, &rank); + MPI_Comm_size(MCW, &size); + srand(rank); + int masterArray[size*20]; + + + //if master process create array and scatter: + if(rank == 0){ + for(int i = 0; i < size * 20; i++){ + masterArray[i] = rand()%100 + 1; + } + } + + int subArray[20]; + MPI_Scatter(masterArray, 20, MPI_INT,subArray,20, MPI_INT,0,MCW); + vector subVector; + for(int i = 0; i < 20; i++){ + subVector.push_back(subArray[i]); + } + sort(subVector.begin(), subVector.end()); + for(int i = 0; i < 20; i++){ + subArray[i] = subVector[i]; + } + + int mainArray[20*size]; + MPI_Gather(&subArray, 20, MPI_INT, mainArray, 20, MPI_INT, 0, MCW); + + if(rank == 0){ + vector mainVector; + for(int i = 0; i < 20*size; i++){ + mainVector.push_back(mainArray[i]); + } + inplace_merge(mainVector.begin(), mainVector.begin() + 20, mainVector.begin() + 40); + inplace_merge(mainVector.begin() + 40, mainVector.begin() + 60, mainVector.end()); + inplace_merge(mainVector.begin(), mainVector.begin() + 40, mainVector.end()); + cout << "------Original Array------" << endl; + for(int i = 0; i < 20*size; i++){ + cout << " " << masterArray[i]; + } + cout << endl << endl<<"------Sorted Array-----" << endl << endl; + for(int i = 0; i < 20*size; i++){ + cout <<" " << mainVector[i]; + } + cout << endl; + + + } + + MPI_Finalize(); + + return 0; +} + diff --git a/HW3/test.cpp b/HW3/test.cpp new file mode 100644 index 0000000..00d7188 --- /dev/null +++ b/HW3/test.cpp @@ -0,0 +1,160 @@ +#include +#include +#include +#include +#include "mpi.h" + +void High(int bit); +void Low(int bit); +int Comparison(const void * x, const void * y); + +#define MASTER 0 +#define NUMBER 10 + +int * array; +int array_size; +int process_rank; +int num_processes; +double start_time; +double end_time; + + +int main(int argc, char * argv[]) { + MPI_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD, &num_processes); + MPI_Comm_rank(MPI_COMM_WORLD, &process_rank); + + array_size = atoi(argv[1]) / num_processes; + array = (int *)malloc(array_size * sizeof(int)); + srand(time(NULL)); + int i, j; + for (i = 0; i < array_size; i++) { + array[i] = rand() % (atoi(argv[1])); + } + + MPI_Barrier(MPI_COMM_WORLD); + int stages = (int)(log2(num_processes)); + if (process_rank == MASTER) { + printf("Number of Processes is: %d\n", num_processes); + timer_start = MPI_Wtime(); + } + + qsort(array, array_size, sizeof(int), Comparison); + for (i = 0; i < stages; i++) { + for (j = i; j >= 0; j--) { + + printf("%d ",process_rank>>(i+1)); + if (((process_rank >> (i + 1)) % 2 == 0 && (process_rank >> j) % 2 == 0) || ((process_rank >> (i + 1)) % 2 != 0 && (process_rank >> j) % 2 != 0)) { + Low(j); + } + else { + High(j); + } + } + } + + MPI_Barrier(MPI_COMM_WORLD); + + if (process_rank == MASTER) { + end_time = MPI_Wtime(); + + printf("Sample sorted array for verification(10 elements)\n"); + + for (i = 0; i < array_size; i++) { + if ((i % (array_size / NUMBER)) == 0) { + printf("%d ", array[i]); + } + } + printf("Time in seconds : %f\n", end_time - start_time); + } + + free(array); + MPI_Finalize(); + return 0; +} +void High(int j) { + int i, max; + + + int counter_receive; + int * buffer_recieve = (int *)malloc((array_size + 1) * sizeof(int)); + MPI_Recv(&max, 1, MPI_INT, process_rank ^ (1 << j), 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE ); + + + int counter_send = 0; + int * buffer_send = (int *)malloc((array_size + 1) * sizeof(int)); + MPI_Send(&array[0], 1, MPI_INT, process_rank ^ (1 << j), 0, MPI_COMM_WORLD); + + + for (i = 0; i < array_size; i++) { + if (array[i] < max) { + buffer_send[counter_send + 1] = array[i]; + counter_send++; + } + else { + break; + } + } + MPI_Recv(buffer_recieve, array_size, MPI_INT, process_rank ^ (1 << j), 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE ); + counter_receive = buffer_recieve[0]; + buffer_send[0] = counter_send; + MPI_Send(buffer_send, counter_send, MPI_INT, process_rank ^ (1 << j), 0, MPI_COMM_WORLD); + + for (i = 1; i < counter_receive + 1; i++) { + if (buffer_recieve[i] > array[0]) { + array[0] = buffer_recieve[i]; + } + else { + break; + } + } + + qsort(array, array_size, sizeof(int), ComparisonFunc); + free(buffer_send); + free(buffer_recieve); +} + +void Low(int j) { + int i, min; + + + int counter_send = 0; + int * buffer_send = (int *)malloc((array_size + 1) * sizeof(int)); + MPI_Send(&array[array_size - 1],1,MPI_INT,process_rank ^ (1 << j),0,MPI_COMM_WORLD); + int counter_receive; + int * buffer_recieve = (int *)malloc((array_size + 1) * sizeof(int)); + MPI_Recv(&min,1,MPI_INT,process_rank ^ (1 << j),0,MPI_COMM_WORLD,MPI_STATUS_IGNORE); + + + for (i = 0; i < array_size; i++) { + if (array[i] > min) { + buffer_send[counter_send + 1] = array[i]; + counter_send++; + } + else { + break; + } + } + + buffer_send[0] = counter_send; + MPI_Send(buffer_send,counter_send,MPI_INT,process_rank ^ (1 << j),0,MPI_COMM_WORLD); + MPI_Recv(buffer_recieve,array_size,MPI_INT,process_rank ^ (1 << j),0,MPI_COMM_WORLD,MPI_STATUS_IGNORE); + + for (i = 1; i < buffer_recieve[0] + 1; i++) { + if (array[array_size - 1] < buffer_recieve[i]) { + + array[array_size - 1] = buffer_recieve[i]; + } + else { + break; + } + } + qsort(array, array_size, sizeof(int), ComparisonFunc); + free(buffer_send); + free(buffer_recieve); + +} + +int Comparison(const void * x, const void * y) { + return (*(int *)x - *(int *)y); +} \ No newline at end of file diff --git a/HW4/bitonic.cpp b/HW4/bitonic.cpp new file mode 100644 index 0000000..96f86e3 --- /dev/null +++ b/HW4/bitonic.cpp @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include +#include +#include + + +//#include "/usr/local/include/mpi.h" +#define MCW MPI_COMM_WORLD + +using namespace std; + +int main(int argc, char **argv){ + + int rank, size; + int data = [5, 10, 3, 6, 8, 34, 45, 23, 68, 79, 20, 27, 99]; + int arraySize; + int dest; + MPI_Init(&argc, &argv); + MPI_Comm_rank(MCW, &rank); + MPI_Comm_size(MCW, &size); + srand(rank); + + arraySize = i + + MPI_Finalize(); + + return 0; +} + + diff --git a/HW5/a.out b/HW5/a.out new file mode 100755 index 0000000000000000000000000000000000000000..f59b3bc84db9802f5291dae65e9c6c1964999061 GIT binary patch literal 34472 zcmeHw3v^u7b@m-ewqzcj0i47M0go|G?f5mLm!)7D8SC0tSR%r<2;p@-8jY=SMi1s; zY+5C9h9SCKhF_~c1heQv?N9rAW&M9pQV0&Myd=Y7R7&vx{S!C8N)$@S9qI&yl31Y* z>bK81cjnHOOSba}^o+RLT$ff|6 z*hf{PfqhW{;9;lNe;I^9{-aAc4#6ckbOL&g5ZqMTss$4*;SW1aT}JKNM?=dLaw+UYe5dWQrNg6%Y{ z^vO;RGCK7ecWhKQed(6%+*)7{Ol2;CZQ6@~VZRau!l5ix-Q8s|6TmamGs%#>QGN46 z{fVy6euysvfz!!mOH!SUFTm_$M7pb%`Om#fKBx$)lEaLZP?zQG);%|gyPQ3Ei24ps9fu}i`H zTnB#wl}ZxusO>U5sb2^1oWy`Wc$*}RV_@#P6HhQi`dN%Hs7lgaJp0-u$$hOPU5YfS zu+L41DL4^sMOcn7+s6e1zh{QRg~)Rwz%5AYVv+E=P_T7f+x}1+VESB*Kzx*b;h(;A z2^%1CCZ z=te|03SPSWzREr966bQ=wG#J ztyk2cc5AHok^{YvkH39?BpT>gdy}OZ>2s(izZ9 zl%kzf^dwI`yN_kOswJXG7#pZUGG-|H5EW>NZpvMaT)kziUY89m5u*I`6B|!XYVvVi z9@AS4?Xh-bK2fhH=!p`=KdOxUv`Ep889ye9nw(aWRliIQktnWV+FqBBZ*lFFS=gP#92W#p|Q#gSI@$Ed2}f0oJ=t>k@PH$Lpp z7?I526qNlM^mj;WdWz}f!)t`JnPXVyTFXX_GOPtNe~s)^Vlc}Lr5H2opqEtQ|6~g& z#R}deE|Wu~J0zy|bNWAXtb8lqm%hbYU~$%{Q^vEY?BVJf6V<|?QV^lCs4 z)vqW6*%MF^$gZ%}BVkxQN@R|H#Og`B-any=@eHr$HtT`j2xaL*lw~}|ix->4FUiMH zcH?9(&?skD(mCQ`x(`Ck}CvA`e(0LCZg$7@aZ|FPgezs_EI<mI8fwFl8q_4oaO@{vng9v%%aa%p&gVm!% zrjpltkk?bG-WPbiv{?`IwosNnL|Mkwym-`7Oy{U5rYz$W)Pz=t&0;uaM=J3!+Tv=X zl-@K(lXLB;Gg-xT#Cp-6q(WG<vwM>XAddr0IC7O$PEt5q--<{(x2L5^`02^%aDdQ0vS71O z7!=%hzu;WbOCnCM&*j5d6g04ajEx&(i%?MqO`V7xHQZT3R`KghdU^Vqf)I@BoIW|f zOqVkFEmQOcLvf6PYqXj=g7YlN_!Z9nNfhUi2_wdv$I4qaj7|nL5ddCB&ma%muD$~H>KeE~AMM5S*dSMM1!ZlD7HD8o`#zO2NtGSFK3G3RQD zMq=X&K==XCP*yedYsa+TzG3J?RI)S`pMvXVC(63quV9uzPxYho(19)eN^$U?wa)rp;am&sYh@Y~zdDn{#L?esW2^$?anOZIqS}-`Vl! z9j4I)7X?>9t+%ilM$yWd>a=i~q9cs_a-O2!U#7%=zCJ_0nZ-LxXZoDxW;>KH>}LKaO3(t_=k*plDkR^nfCEpf*2 zGSNa^i63?3x1hvR4zrcjmR44y9+x4$&m}n@bOSt05o2`KMwfO}d+m7`*VG&DYAvs1 zX#VjIYw|0MGhKd#@U)E{5)y3u9;?aNh1??!bFdII%yYf*OD#5

^_MBC5%wg3u@@ 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 +#include +#include +#include +#include +#include +#define MCW MPI_COMM_WORLD +using namespace std; +int main(int argc, char **argv){ + int rank, size; + int data; + int dest; + int N = 6; + MPI_Init(&argc, &argv); MPI_Comm_rank(MCW, &rank); + MPI_Comm_size(MCW, &size); + + int slice= N/size; + int* C=(int*)malloc(sizeof(int) *(N/size)); + bool finished; + //random number generator + std::random_device dev; + std::mt19937 rng(dev()); + std::uniform_int_distribution dist5(1,5); // distribution in range [1, 6] + + //initialize array + int **strip; + int **world, *worldData; + if(rank == 0){ + worldData = (int *)malloc(sizeof(int)*N*N); + world = (int **)malloc(sizeof(int*) * N); + for(int i = 0; i < N; i++) { + world[i] = &(worldData[i*N]); + } + + //Sets up world + for(int i = 0; i < N; i++){ + for( int j =0; j < N; j++){ + if(dist5(rng) == 1){ + world[i][j] = 1; + }else{ + world[i][j] = 0; + } + cout << world[i][j] << " ";; + } + cout << endl; + } + cout << endl << endl; + finished = false; + } + MPI_Barrier(MCW); + + + + do{ + //Give everyone the current state of 2d array. +// MPI_Bcast (&&world, N, MPI_INT, 0, MCW); + + int from = rank * N/size; + int to = ((rank+1) * N/size); + + //Do Computations. + for(int i = 0; i < N; i++){ + // Scatter the random numbers to all processes + MPI_Scatter (worldData, N/size, MPI_INT, C, N/size, MPI_INT, 0, MCW); + for(int j = from; j < to; j++){ +// cout << "From " << from<<" TO: " << to <<" process: " << rank <<" j: " << j << " i: " << i<< endl; + int neighbors = 0; + //Above 3 cells + if(i - 1 >= 0) + if(world[i-1][j]==1) + neighbors++; + if(j-1 >= 0) + if(world[i-1][j-1]==1) + neighbors++; + if(j+1 < N) + if(world[i-1][j+1]==1) + neighbors++; + //Below 3 Cells + if(i + 1 < N) + if(world[i+1][j]==1) + neighbors++; + if(j-1 >= 0) + if(world[i+1][j-1]==1) + neighbors++; + if(j+1 < N) + if(world[i+1][j+1]==1) + neighbors++; + //To the side of us same row + if(j + 1 < N) + if(world[i][j+1]==1) + neighbors++; + if(j - 1 >= 0) + if(world[i][j-1]==1) + neighbors++; + //If neighbors are to many or few i die. + if(neighbors > 3 || neighbors <2) + C[0]=0; + //If my neighbors = 2/3 I live, or if I am dead and neighbors = 3 I come alive. + else if(neighbors == 3){ + C[0]=1; + }else{ + C[0]=world[i][j]; + } + } + //Gather all of it back up. + MPI_Gather (&C[0], N/size, MPI_INT, worldData, N/size, MPI_INT, 0, MCW); + + + } + if(rank == 0){ + for(int x = 0; x < N; x++){ + for( int y = 0; y < N; y++){ + cout << world[x][y] << " "; + } + cout << endl; + } + cout << endl << endl << endl; + finished = true; + for( int i = 0; i +#include +#include +#include + +//#include "/usr/local/include/mpi.h" +#define MCW MPI_COMM_WORLD + +using namespace std; + +int main(int argc, char **argv){ + + int rank, size; + int data; + int bigData[16]; + MPI_Init(&argc, &argv); + MPI_Comm_rank(MCW, &rank); + MPI_Comm_size(MCW, &size); + data = rank; + + MPI_Gather(&data,1,MPI_INT,bigData,1,MPI_INT,0,MCW); + if(!rank)for(int i=0;i +#include +#include +#include +#include +#include +#include +#include + +#define MCW MPI_COMM_WORLD +using namespace std; + +const int Master = 0; + +struct Color { + int red; + int green; + int blue; +}; + +struct MandelbrotConfig { + int width; + int height; + double xComplexMin; + double xComplexMax; + double yComplexMin; + double yComplexMax; + double maxIterations; + Color colorOne; + Color colorTwo; + string outputFileName; +}; + +MandelbrotConfig readConfig(string configFile){ + ifstream fin; + MandelbrotConfig config; + + fin.open(configFile); + if (fin){ + fin >> config.width >> config.height; + fin >> config.xComplexMin >> config.xComplexMax; + fin >> config.yComplexMin >> config.yComplexMax; + fin >> config.maxIterations; + fin >> config.colorOne.red >> config.colorOne.green >> config.colorOne.blue; + fin >> config.colorTwo.red >> config.colorTwo.green >> config.colorTwo.blue; + fin >> config.outputFileName; + fin.close(); + + } + if(!fin){ + cout << "Could not open File"; + } + return config; +} +Color getPixelColor(Color color1, Color color2, double iterations, double maxIterations) { + Color colorReturn; + double myColorR = static_cast((color2.red - color1.red) / maxIterations); + double myColorG = static_cast((color2.green - color1.green) / maxIterations); + double myColorB = static_cast((color2.blue - color1.blue) / maxIterations); + colorReturn.red = (color1.red + (iterations * myColorR)); + colorReturn.green = (color1.green + (iterations * myColorG)); + colorReturn.blue = (color1.blue + (iterations * myColorB)); + return colorReturn; +} + +void writeFile(MandelbrotConfig config, std::vector> array){ + ofstream fout; + fout.open(config.outputFileName); + fout << "P3" << endl; + fout << config.width << " " << config.height << endl; + fout << "255" << endl; + for(int i = 0; i < config.height; i++){ + for(int j = 0; j < config.width; j++){ + Color Pixel = array[i][j]; + fout << Pixel.red << " " << Pixel.green << " " << Pixel.blue << " "; + } + fout << endl; + } + fout.close(); +} + +void drawMandelbrot(MandelbrotConfig config, int world_rank){ + double pixelWidth = ((config.xComplexMax-config.xComplexMin)/config.width); + double pixelHeight = ((config.yComplexMax-config.yComplexMin)/config.height); + std::vector> pixels(config.height, std::vector (config.width)); + std::vector sub_pixels; + for (int i = 0; i < config.height; i++){ + if(world_rank == 0){ + MPI_Scatter(*pixels, config.width, MPI_Vector, sub_pixels, + config.width, MPI_Vector, 0, MCW); + } + else{ + for (int j = 0; j< config.width; j++) { + double x0 = config.xComplexMin + j * pixelWidth; + double y0 = config.yComplexMin + i * pixelHeight; + double x = 0; + double y = 0; + double iteration = 0; + while ((x * x) + (y * y) < (2 * 2) && + iteration < config.maxIterations) { + double xtemp = (x * x) - (y * y) + x0; + y = 2 * x * y + y0; + x = xtemp; + iteration = iteration + 1; + } + Color Pixel = getPixelColor(config.colorOne, config.colorTwo, + iteration, config.maxIterations); + pixels[i][j] = Pixel; + } + } + } + writeFile(config, pixels); +} + +int main(int argc, char *argv[]) { + string configFile; + MandelbrotConfig config; + + // Read in config file location from user + cout << "Mandelbrot Config File: "; + cin >> configFile; + // Read config file contents into MandelbrotConfig struct instance + config = readConfig(configFile); + // Compute and write specified mandelbrot image to PPM file + // drawMandelbrot(config); + int rank , size; + int data; + MPI_Init (&argc , &argv); + MPI_Comm_rank(MCW , &rank); + MPI_Comm_size(MCW , &size); + + + drawMandelbrot(config); + MPI_Finalize(); + return 0; +} diff --git a/Parallel_Mandelbrot/.idea/Parallel_Mandelbrot.iml b/Parallel_Mandelbrot/.idea/Parallel_Mandelbrot.iml new file mode 100644 index 0000000..f08604b --- /dev/null +++ b/Parallel_Mandelbrot/.idea/Parallel_Mandelbrot.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Parallel_Mandelbrot/.idea/codeStyles/codeStyleConfig.xml b/Parallel_Mandelbrot/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..8f1a3b7 --- /dev/null +++ b/Parallel_Mandelbrot/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/Parallel_Mandelbrot/.idea/misc.xml b/Parallel_Mandelbrot/.idea/misc.xml new file mode 100644 index 0000000..8822db8 --- /dev/null +++ b/Parallel_Mandelbrot/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/Parallel_Mandelbrot/.idea/modules.xml b/Parallel_Mandelbrot/.idea/modules.xml new file mode 100644 index 0000000..c6fda71 --- /dev/null +++ b/Parallel_Mandelbrot/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Parallel_Mandelbrot/.idea/workspace.xml b/Parallel_Mandelbrot/.idea/workspace.xml new file mode 100644 index 0000000..ffde803 --- /dev/null +++ b/Parallel_Mandelbrot/.idea/workspace.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1581819888474 + + + + + + \ No newline at end of file diff --git a/Parallel_Mandelbrot/a.out b/Parallel_Mandelbrot/a.out new file mode 100755 index 0000000000000000000000000000000000000000..757f837b86c77240940d1d0ceb4a1d06ec87a21b GIT binary patch literal 93228 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

mE@SK$rF8C6`9fG?A8#ikDK)I&(3yup83LYYy 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 W?iMSx+U6sd2V@>N3P*jTe)%6jSycr9 literal 0 HcmV?d00001 diff --git a/Parallel_Mandelbrot/gather.cpp b/Parallel_Mandelbrot/gather.cpp new file mode 100644 index 0000000..dfc7ef4 --- /dev/null +++ b/Parallel_Mandelbrot/gather.cpp @@ -0,0 +1,33 @@ + +#include +#include +#include +#include + +//#include "/usr/local/include/mpi.h" +#define MCW MPI_COMM_WORLD + +using namespace std; + +int main(int argc, char **argv){ + + int rank, size; + int data; + int bigData[16]; + MPI_Init(&argc, &argv); + MPI_Comm_rank(MCW, &rank); + MPI_Comm_size(MCW, &size); + data = rank; + + MPI_Gather(&data,1,MPI_INT,bigData,1,MPI_INT,0,MCW); + if(rank == 0)for(int i=0;i +#include +#include +#include +#include +#include +#include +/// +/// http://wili.cc/blog/mandelbrot-mpi.html +/// +#define MCW MPI_COMM_WORLD +using namespace std; + +const int Master = 0; + +struct Color { + int red; + int green; + int blue; +}; + +struct MandelbrotConfig { + int width; + int height; + double xComplexMin; + double xComplexMax; + double yComplexMin; + double yComplexMax; + double maxIterations; + Color colorOne; + Color colorTwo; + string outputFileName; +}; + +MandelbrotConfig readConfig(string configFile){ + ifstream fin; + MandelbrotConfig config; + + fin.open(configFile); + if (fin){ + fin >> config.width >> config.height; + fin >> config.xComplexMin >> config.xComplexMax; + fin >> config.yComplexMin >> config.yComplexMax; + fin >> config.maxIterations; + fin >> config.colorOne.red >> config.colorOne.green >> config.colorOne.blue; + fin >> config.colorTwo.red >> config.colorTwo.green >> config.colorTwo.blue; + fin >> config.outputFileName; + fin.close(); + + } + if(!fin){ + cout << "Could not open File"; + } + return config; +} +Color getPixelColor(Color color1, Color color2, double iterations, double maxIterations) { + Color colorReturn; + double myColorR = static_cast((color2.red - color1.red) / maxIterations); + double myColorG = static_cast((color2.green - color1.green) / maxIterations); + double myColorB = static_cast((color2.blue - color1.blue) / maxIterations); + colorReturn.red = (color1.red + (iterations * myColorR)); + colorReturn.green = (color1.green + (iterations * myColorG)); + colorReturn.blue = (color1.blue + (iterations * myColorB)); + return colorReturn; +} + +void writeFile(MandelbrotConfig config, std::vector > array){ + ofstream fout; + fout.open(config.outputFileName); + fout << "P3" << endl; + fout << config.width << " " << config.height << endl; + fout << "255" << endl; + for(int i = 0; i < config.height; i++){ + for(int j = 0; j < config.width; j++){ + Color Pixel = array[i][j]; + fout << Pixel.red << " " << Pixel.green << " " << Pixel.blue << " "; + } + fout << endl; + } + fout.close(); +} + +void drawMandelbrot(MandelbrotConfig config, int rank, int &worldsize){ + double pixelWidth = ((config.xComplexMax-config.xComplexMin)/config.width); + double pixelHeight = ((config.yComplexMax-config.yComplexMin)/config.height); + std::vector > pixels(config.height, std::vector (config.width)); + std::vector sub_pixels; + + int *displace; + displace = (int *)calloc(worldsize,sizeof(int)); + int *dim_list; + dim_list = (int *)calloc(worldsize,sizeof(int)); + int j = 0; + for (int i=0; i> configFile; + // Read config file contents into MandelbrotConfig struct instance + config = readConfig(configFile); + // Compute and write specified mandelbrot image to PPM file + // drawMandelbrot(config); + } + + + + drawMandelbrot(config, rank, size); + MPI_Finalize(); + return 0; +} diff --git a/Parallel_Mandelbrot/scatter.cpp b/Parallel_Mandelbrot/scatter.cpp new file mode 100644 index 0000000..17bad38 --- /dev/null +++ b/Parallel_Mandelbrot/scatter.cpp @@ -0,0 +1,35 @@ + + +#include +#include +#include +#include + +//#include "/usr/local/include/mpi.h" +#define MCW MPI_COMM_WORLD + +using namespace std; + +int main(int argc, char **argv){ + + int rank, size; + int data; + int bigData[16]; + cout << rank; + if(!rank)cout << endl << rank;for(int i=0;i<16;++i)bigData[i]=i; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MCW, &rank); + MPI_Comm_size(MCW, &size); + + MPI_Scatter(bigData,1,MPI_INT,&data,1,MPI_INT,0,MCW); + cout<<"rank"<+kjP>j@KAFRk0)@Cwr_;0V;G`4x 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 +#include +#include +#include + +//#include "/usr/local/include/mpi.h" +#define MCW MPI_COMM_WORLD + +using namespace std; + +void allPrint(int data){ + int array[64]; + int rank, size; + + MPI_Comm_rank(MCW, &rank); + MPI_Comm_size(MCW, &size); + + MPI_Gather(&data,1,MPI_INT,array,1,MPI_INT,0,MCW); + if(!rank){ + for(int i=0;i + + + \ No newline at end of file diff --git a/example/pachinco/.idea/misc.xml b/example/pachinco/.idea/misc.xml new file mode 100644 index 0000000..28a804d --- /dev/null +++ b/example/pachinco/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/example/pachinco/.idea/modules.xml b/example/pachinco/.idea/modules.xml new file mode 100644 index 0000000..d63645e --- /dev/null +++ b/example/pachinco/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/example/pachinco/.idea/pachinco.iml b/example/pachinco/.idea/pachinco.iml new file mode 100644 index 0000000..bc2cd87 --- /dev/null +++ b/example/pachinco/.idea/pachinco.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/example/pachinco/.idea/workspace.xml b/example/pachinco/.idea/workspace.xml new file mode 100644 index 0000000..3c889ec --- /dev/null +++ b/example/pachinco/.idea/workspace.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1579061749869 + + + + + + \ No newline at end of file diff --git a/example/pachinco/a.out b/example/pachinco/a.out new file mode 100755 index 0000000000000000000000000000000000000000..7a4ef03bf4ab6a9fa450af5fe33bc556cbe19e61 GIT binary patch literal 23760 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 TRjh;Xe2>``3+=^jfU*AtGyZLO literal 0 HcmV?d00001 diff --git a/example/pachinco/pachinko.cpp b/example/pachinco/pachinko.cpp new file mode 100644 index 0000000..172eccf --- /dev/null +++ b/example/pachinco/pachinko.cpp @@ -0,0 +1,55 @@ + +#include +#include +#include +#include +#include