From 9a9e2025b877612caa8141ab6e5ddab024e149cf Mon Sep 17 00:00:00 2001 From: 13513005 <13513005@ld5-01.if.itb.ac.id> Date: Fri, 12 Feb 2016 16:52:39 +0700 Subject: [PATCH] bucketmpi.c done --- "\\" | 119 +++++++++++++++++++++++++++++++++++++++++++ bucket | Bin 0 -> 13346 bytes bucketmpi.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 261 insertions(+) create mode 100644 "\\" create mode 100755 bucket create mode 100644 bucketmpi.c diff --git "a/\\" "b/\\" new file mode 100644 index 0000000..7189c8a --- /dev/null +++ "b/\\" @@ -0,0 +1,119 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <assert.h> +#include <mpi.h> + +using namespace std; + + +int main(int argc, char* argv[]){ + double starttime, endtime; + int proceso_id; + char processor_name[MPI_MAX_PROCESSOR_NAME]; + int namelen; + int numprocsused; + int SIZE; + unsigned int receivedElement; + unsigned int value; + unsigned int array[100000]; + int c, d, i; + unsigned int j; + unsigned int min = array[0]; + unsigned int max = array[0]; + int elementQtyArray[100000]; + int increaseOf, iteration, pridetas; + int issiunte; + int lastIndex, indexi; + unsigned int recvArray[100000]; + int elementQtyUsed; + unsigned int localArray[100000]; + int li; + + MPI_Status stat; + MPI::Init(); + + MPI_Comm_size(MPI_COMM_WORLD, &numprocsused); + proceso_id = MPI::COMM_WORLD.Get_rank(); + MPI_Get_processor_name(processor_name, &namelen); + + if(proceso_id == 0){ + starttime = MPI_Wtime(); + + for(i=0;i<SIZE;i++){ + if (array[i] < min) + min = array[i]; + if (array[i] > max) + max = array[i]; + } + + for(d=1;d<SIZE;d++){ + elementQtyArray[d] = 0; + } + + for(d=0;d<SIZE;d++){ + increaseOf = max/(numprocsused-1) + iteration = 1; + pridetas = 0; + for(j=increaseOf;j<=max;j=j+increaseOf){ + if (array[d] <= j){ + elementQtyArray[iteration++]; + pridetas = 1; + break; + } + iteration++; + } + if(pridetas = 9){ + elementQtyArray[iteration-1]++; + } + } + + for(i=1;i<numprocsused;i++){ + MPI_Send(&elementQtyArray[i], 1, MPI_INT, i, -2, MPI_COMM_WORLD); + } + + for(d=0;d<SIZE;d++){ + increaseOf = max/(numprocsused-1); + iteration = 1; + issiunte = 0; + for(j=increaseOf;j<=max;j=j+increaseOf){ + if (array[d] <= j){ + MPI_Send(&array[d], 1, MPI_UNSIGNED, iteration, -4, MPI_COMM_WORLD); + issunte = 1; + break; + } + iteration++; + } + if (issunte = 0){ + MPI_Send(&array[d], 1, MPI_UNSIGNED, iteration-1, -4, MPI_COMM_WORLD); + } + } + lastIndex = 0; + indexi = 0; + for(i=0;i<numprocsused;i++){ + MPI_Recv(&recvArray[0], elementQtyArray[i], MPI_UNSIGNED, i, 1000, MPI_COMM_WORLD, &stat); + if (lastIndex == 0){ + lastIndex = elementQtyArray[i]; + } + for(j=0;j<elementQtyArray[i];j++){ + array[indexi] = recvArray[j]; + indexi++; + } + } + + endtime = MPI_Wtime(); + } else { + MPI_Recv(&elementQtyUsed, 1, MPI_INT, 0, -2, MPI_COMM_WORLD, &stat); + + for(li=0;li<elementQtyUsed;li++){ + MPI_Recv(&receivedElement, 1, MPI_UNSIGNED, 0, -4, MPI_COMM_WORLD, &stat); + localArray[li] = receivedElement; + } + sort(localArray, localArray+elementQtyUsed); + + MPI_Send(localArray, elementQtyUsed, MPI_UNSIGNED, 0, 1000, MPI_COMM_WORLD); + } + MPI::Finalize(); + + return 0; +} diff --git a/bucket b/bucket new file mode 100755 index 0000000000000000000000000000000000000000..95d1dfa7861a3efe33c82da020a35a48acec31ac GIT binary patch literal 13346 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 literal 0 HcmV?d00001 diff --git a/bucketmpi.c b/bucketmpi.c new file mode 100644 index 0000000..d079883 --- /dev/null +++ b/bucketmpi.c @@ -0,0 +1,142 @@ +#include "mpi.h" +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <time.h> +#include <assert.h> + +int main(int argc, char* argv[]){ + + double starttime, endtime; + int processor_id; + char processor_name[MPI_MAX_PROCESSOR_NAME]; + int namelen; + int num_process; + int t, d, i, j; + + MPI_Status stat; + MPI_Init(NULL,NULL); + + MPI_Comm_size(MPI_COMM_WORLD, &num_process); + MPI_Comm_rank(MPI_COMM_WORLD, &processor_id); + MPI_Get_processor_name(processor_name, &namelen); + unsigned int received_element; + srand(time(NULL)); + + if(processor_id == 0) { + int SIZE; + unsigned int value; + + scanf("%d", &SIZE); + unsigned int *array = malloc (SIZE * sizeof(unsigned int)); + for(i=0; i<SIZE; i++){ + array[i] = rand() % SIZE; + } + + starttime = MPI_Wtime(); + unsigned int min = array[0]; + unsigned int max = array[0]; + + for(i=0; i<SIZE; i++){ + if (array[i] < min){ + min = array[i]; + } + if (array[i] > max){ + max = array[i]; + } + } + + int *num_bucket = malloc (sizeof(int) *num_process); + for(d=1; d < num_process; d++){ + num_bucket[d] = 0; + } + if (num_process != 1){ + for(d=0; d < SIZE; d++){ + int increaseOf = max/(num_process-1); + int iteration = 1; + int annexed = 0; + for(j=increaseOf; j<=max; j=j+increaseOf){ + if(array[d] <= j){ + num_bucket[iteration]++; + annexed = 1; + break; + } + iteration++; + } + if (annexed == 0){ + num_bucket[iteration-1]++; + } + } + for(i=1; i<num_process; i++){ + MPI_Send(&num_bucket[i], 1, MPI_INT, i, 0, MPI_COMM_WORLD); + } + for(d=0; d < SIZE; d++){ + int increaseOf = max/(num_process-1); + int iteration = 1; + int message = 0; + for (j = increaseOf; j <= max; j = j + increaseOf) { + if(array[d] <= j) { + MPI_Send(&array[d], 1, MPI_UNSIGNED, iteration, 1, MPI_COMM_WORLD); + message = 1; + break; + } + iteration++; + } + if (message == 0) + MPI_Send(&array[d], 1, MPI_UNSIGNED, iteration-1, 1, MPI_COMM_WORLD); + } + + int lastIndex = 0; + int current_index = 0; + for(i=1; i<num_process; i++){ + unsigned int * recvArray = malloc(sizeof(unsigned int)*num_bucket[i]); + MPI_Recv(&recvArray[0], num_bucket[i], MPI_UNSIGNED, i, 2, MPI_COMM_WORLD, &stat); + if(lastIndex == 0){ + lastIndex = num_bucket[i]; + } + for(j=0; j<num_bucket[i]; j++){ + array[current_index] = recvArray[j]; + current_index++; + } + } + } + + endtime = MPI_Wtime(); + + int c; + for(c=0; c<SIZE; c++){ + printf("%d, ", array[c]); + } + + printf("\nIt took %f seconds \n", endtime-starttime); + printf("Numbers: %d \n", SIZE); + printf("Processes: %d \n", num_process); + + } else { + int element_used; + MPI_Recv(&element_used, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &stat); + unsigned int *localArray = malloc(sizeof(unsigned int)*element_used); + int li; + for(li = 0; li<element_used; li++){ + MPI_Recv(&received_element, 1, MPI_UNSIGNED, 0, 1, MPI_COMM_WORLD, &stat); + localArray[li] = received_element; + } + + int c; + for (c = 1 ; c <= element_used-1; c++) { + d = c; + + while ( d > 0 && localArray[d] < localArray[d-1]) { + t = localArray[d]; + localArray[d] = localArray[d-1]; + localArray[d-1] = t; + + d--; + } + } + MPI_Send(localArray, element_used, MPI_UNSIGNED, 0, 2, MPI_COMM_WORLD); + } + + MPI_Finalize(); + return 0; +} -- GitLab