From b1cd708f01da49a47897c37379ff1411f35a62a9 Mon Sep 17 00:00:00 2001
From: Chairuni Aulia Nusapati <chairuni.aulia.nusapati@gmail.com>
Date: Fri, 19 Feb 2016 13:10:39 +0700
Subject: [PATCH] add new Bucket Sort

---
 omp_bucketSort                                | Bin 0 -> 9676 bytes
 omp_bucketSort.c                              | 227 +++++++-----------
 omp_bucketSort.dSYM/Contents/Info.plist       |  20 ++
 .../Contents/Resources/DWARF/omp_bucketSort   | Bin 0 -> 11462 bytes
 omp_hello                                     | Bin 0 -> 9136 bytes
 omp_hello.c                                   |  22 ++
 omp_hello.dSYM/Contents/Info.plist            |  20 ++
 .../Contents/Resources/DWARF/omp_hello        | Bin 0 -> 9817 bytes
 omp_trap                                      | Bin 0 -> 9052 bytes
 omp_trap_basic                                | Bin 0 -> 9000 bytes
 10 files changed, 145 insertions(+), 144 deletions(-)
 create mode 100755 omp_bucketSort
 create mode 100644 omp_bucketSort.dSYM/Contents/Info.plist
 create mode 100644 omp_bucketSort.dSYM/Contents/Resources/DWARF/omp_bucketSort
 create mode 100755 omp_hello
 create mode 100644 omp_hello.c
 create mode 100644 omp_hello.dSYM/Contents/Info.plist
 create mode 100644 omp_hello.dSYM/Contents/Resources/DWARF/omp_hello
 create mode 100755 omp_trap
 create mode 100755 omp_trap_basic

diff --git a/omp_bucketSort b/omp_bucketSort
new file mode 100755
index 0000000000000000000000000000000000000000..40538c133d664a192acf04803d51ca38f0b6bf10
GIT binary patch
literal 9676
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

literal 0
HcmV?d00001

diff --git a/omp_bucketSort.c b/omp_bucketSort.c
index 858364b..4a4baaa 100644
--- a/omp_bucketSort.c
+++ b/omp_bucketSort.c
@@ -1,154 +1,93 @@
-/* 
- * Copyrights http://www.cs.usfca.edu/~peter/cs625/code/trap/omp_trap.c
- * File:    omp_bucketSort.c
- * Purpose: omp_bucketSort
- *
- * Input:   a, b, n
- * Output:  estimate of integral from a to b of f(x)
- *          using n trapezoids.
- *
- * Compile: Using gcc
- *    gcc -g -Wall -fopenmp -o omp_trap omp_trap.c
- * Usage:   ./omp_trap <number of threads>
- *
- * Notes:    
- * 1.  The function f(x) is hardwired.
- * 2.  This version uses OpenMP's parallel for with variable
- *     scope specified, and static partitioning.
- */
+//file: omp_bucketSort.c
+//praktikan: 13513008 Muhammad Ridwan, 13513054 Chairuni Aulia Nusapati
 
 #include <stdio.h>
+#include <time.h>
 #include <stdlib.h>
 #include <math.h>
 #include <assert.h>
 #include <omp.h>
 
-int thread_count; /* also number of buckets */
-
-
-int *create_rand_nums(int num_elements, int MAX_RAND) {
-	int *rand_nums = (int *)malloc(sizeof(int) * num_elements); 
-	assert(rand_nums != NULL); 
-	int i; 
-	for (i = 0; i < num_elements; i++) { 
-		rand_nums[i] = rand()%MAX_RAND; 
-	} 
-	return rand_nums; 
-} 
-
-int main(int argc, char* argv[]) {
-    int n; /* number of elements */
-    int *rand_nums = NULL;
-    
-   //double  integral;   /* Store result in integral   */
-   //double  a, b;       /* Left and right endpoints   */
-   //int     n;          /* Number of trapezoids       */
-
-   if (argc != 3) {
-      fprintf(stderr, "usage: %s <number of threads>\n", argv[0]);
-      exit(0);
-   }
-   thread_count = strtol(argv[1], NULL, 10);
-   n = strtol(argv[2], NULL, 10);
-
-   //printf("Enter a, b, and n\n");
-   //scanf("%lf %lf %d", &a, &b, &n);
-   
-   //randomize
-   rand_nums = create_rand_nums(n, n);
-   
-   //maks buckets
-   int buckets[thread_count][n];
-   
-   //assign initial buckets capacity to buckets
-   for(int i = 0; i < thread_count; i++){
-     buckets[i][0] = 0;
-   }
-   
-   //determine interval
-   int range = n/thread_count; //bisa jadi thread_count - 1
-   
-   //assign to buckets
-   for(int i = 0; i < n; i++){
-       int temp = rand_nums[i];
-       buckets[temp/range][buckets[temp/range][0]+1] = temp;
-       buckets[temp/range][0] += 1;
-   }
-   
-   printf("BEFORE:\n");
-   for(int i = 0; i < n; i++){
-        printf("%d\n",rand_nums[i]);
-   }
-   
-   
-    printf("IN BUCKETS:\n");
-   for(int i = 0; i < thread_count; i++){
-       for (int j = 1; j <= buckets[i][0]; j++){
-           printf("%d, ",buckets[i][j]);
-       }
-       printf("\n");
-   }
-   
-   sort(buckets);
-   
-    printf("AFTER:\n");
-   for(int i = 0; i < thread_count; i++){
-       for (int j = 1; j <= buckets[i][0]; j++){
-           printf("%d\n",buckets[i][j]);
-       }
-   }
-   /* OpenMP starts from here */
-   //integral = Trap(a, b, n);
-
-   return 0;
-}  /* main */
-
-void sort(int** buckets){
-    //int c, d, t;
-//#  pragma omp parallel for schedule(static) default(none) \
-//      shared(buckets) private(c, d, t) \ num_threads(thread_count)
-#pragma omp parallel num_threads(thread_count)
-    //sort
-    
-    for (int c = 1 ; c <= buckets[omp_get_thread_num()][0]; c++) {
-        int d = c;
-        while ( d > 0 && buckets[omp_get_thread_num()][d] < buckets[omp_get_thread_num()][d-1]) {
-            int t          = buckets[omp_get_thread_num()][d];
-            buckets[omp_get_thread_num()][d]   = buckets[omp_get_thread_num()][d-1];
-            buckets[omp_get_thread_num()][d-1] = t; 
-            d--;
-        }
+int thread_count; // thread number, also number of buckets
+
+int *create_rand_nums(int num_elements, int MAX_RAND){
+  int *rand_nums = (int *)malloc(sizeof(int) * num_elements);
+  assert(rand_nums != NULL);
+  int i;
+  for (i = 0; i < num_elements; i++){
+    rand_nums[i] = rand()%MAX_RAND;
+  }
+  return rand_nums;
+}
+
+int main(int argc, char* argv[]){
+  int n; // number of elements
+  int *rand_nums = NULL; // random numbers
+
+  if(argc != 3){
+    fprintf(stderr, "usage: %s <number of threads> <number of elements>\n", argv[0]);
+    exit(0);
+  }
+
+  thread_count = atoi(argv[1]);
+  n = atoi(argv[2]);
+
+  // randomize
+  rand_nums = create_rand_nums(n, n);
+
+  //max buckets
+  int buckets[thread_count][n];
+
+  //assign initial buckets capacity to buckets
+  for(int i = 0; i <thread_count; i++){
+    buckets[i][0] = 0;
+  }
+
+  // determine interval
+  int range = n/thread_count;
+
+  // assign to buckets
+  for (int i = 0; i < n; i++){
+    int temp = rand_nums[i];
+    buckets[temp/range][buckets[temp/range][0]+1] = temp;
+    buckets[temp/range][0] += 1;
+  }
+
+  printf("Your random elements: \n");
+  for (int i = 0; i < n; i++){
+    printf("%d\n", rand_nums[i]);
+  }
+
+  printf("\n");
+
+  //sort using OpenMP
+  clock_t begin, end;
+  begin = clock();
+  int my_rank;
+  #pragma omp parallel num_threads(thread_count) shared(buckets, thread_count) private(my_rank)
+  {
+    my_rank = omp_get_thread_num();
+    int c, d, t;
+    int numel = buckets[my_rank][0];
+    for (c = 1; c <= numel; c++){
+      d = c;
+      while(d>1 && buckets[my_rank][d] < buckets[my_rank][d-1]){
+        t = buckets[my_rank][d];
+        buckets[my_rank][d] = buckets[my_rank][d-1];
+        buckets[my_rank][d-1] = t;
+        d--;
+      }
     }
- }
+  }
+  end = clock();
 
+  printf("Your %d elements sorted by %d threads: \n", n, thread_count);
+  for (int i = 0; i < thread_count; i++){
+    for (int j = 1; j <= buckets[i][0]; j++){
+      printf("%d\n", buckets[i][j]);
+    }
+  }
+  printf("execution time: %f\n", (double)(end-begin)/CLOCKS_PER_SEC);
 
-
-
-/*------------------------------------------------------------------
- * Function:    Trap
- * Purpose:     Use trapezoidal rule to compute definite integral
- * Input args:  
- *    a: left endpoint
- *    b: right endpoint
- *    n: number of trapezoids
- * Return value:  Estimate of Integral from a to b of f(x)
- */
-/*double Trap(double a, double b, int n) {
-   double  h, x, integral = 0.0;
-   int  i; 
-
-   h = (b-a)/n;
-   integral += (f(a) + f(b))/2.0;
-#  pragma omp parallel for schedule(static) default(none) \
-      shared(a, h, n) private(i, x) \
-      reduction(+: integral) num_threads(thread_count)
-   for (i = 1; i <= n-1; i++) {
-      x = a + i*h;
-      integral += f(x);
-   }
-
-   integral = integral*h;
-
-   return integral;
-}*/  /* Trap */
-
+  return 0;
+} /* main */
\ No newline at end of file
diff --git a/omp_bucketSort.dSYM/Contents/Info.plist b/omp_bucketSort.dSYM/Contents/Info.plist
new file mode 100644
index 0000000..a73cd32
--- /dev/null
+++ b/omp_bucketSort.dSYM/Contents/Info.plist
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+	<dict>
+		<key>CFBundleDevelopmentRegion</key>
+		<string>English</string>
+		<key>CFBundleIdentifier</key>
+		<string>com.apple.xcode.dsym.omp_bucketSort</string>
+		<key>CFBundleInfoDictionaryVersion</key>
+		<string>6.0</string>
+		<key>CFBundlePackageType</key>
+		<string>dSYM</string>
+		<key>CFBundleSignature</key>
+		<string>????</string>
+		<key>CFBundleShortVersionString</key>
+		<string>1.0</string>
+		<key>CFBundleVersion</key>
+		<string>1</string>
+	</dict>
+</plist>
diff --git a/omp_bucketSort.dSYM/Contents/Resources/DWARF/omp_bucketSort b/omp_bucketSort.dSYM/Contents/Resources/DWARF/omp_bucketSort
new file mode 100644
index 0000000000000000000000000000000000000000..38133ddb6d823ea384d5b4280eb7048611255a44
GIT binary patch
literal 11462
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

literal 0
HcmV?d00001

diff --git a/omp_hello b/omp_hello
new file mode 100755
index 0000000000000000000000000000000000000000..6621cb5057a6a504e9db9bb12e366f994ee00744
GIT binary patch
literal 9136
zcmeHNU1(fI6rN4iG}M}I+Nx1wy@p0(k-bT)HX_BOWbJKDlTDgP^<}u(z5Angf4KK<
z$SQ$ARa{~qk45O4PxV0`{ec=<=pTsSgZQ8r6lE(F1VKVAS-*4d%;xTH>a)l_<jl->
z&YUx6&YgkTnS6cw_st!Qh1wZgYGaIbgOz(2dxt4#G4>Ex19Ki9Jsx{4Ha$twMhZ2;
zZ4vqT4jnn4iJh5g?Bd!-8f8pi#KsVg%hZE&$5?Qv<x#W0gI$;mROf`Aa07+ek{@$!
zJEb|hE^797N%-3@dPpn{I)%RuA@Kb1jA0fH3$kW^>%!kL(VsBoy-qFhC2Ysa=F_4>
zv%kLG-h6w7p0J-9d_%#xk>M#z&lz5?W`85X-<ohj7;EFMMBlXv=6q~)X4KaW->>1j
z%J1v@uH;w7$9dl5b~!g!FnQ6j?&?pvq4nX9i}FwFL=xww{%`&wu&4M2gaKi{KU#Oh
zlD782_=$;^V`C@e8djR-2~6~fa7I4dJh)QE`moOisjV>9iK-KI4{Aw@!dM32J=DXf
zDL<sY2K+GUb8yfDhxei#2NThrC8i<wf#q66vxPFS-_;^zjJAmaCY@TcE!E7<smZdL
z1SWa}OmUolwfN-^D=+-^(PJ;}-T&tY-yVPrsY5_JT|Ou=$w0{O64^EHLmG$XM>?9L
zSGI|<3kltHBR~}CLarDciXxWmoEM+pF0}JTm@-_C8NE)IZO6z(k4YQy-Z~zVShs5!
zFOlGOeZVKsi{`hcc;D+Of$4h$6l5UCK#+kT13?CY3<MeYe`jD;tNfy!y`@wZZ)ug%
zy0#o!*UqkWYRl|%9R1iun!Q%JT74UJC3a^ycIPt^RW5m&m7^m-)d>`zg4y-U!eONP
z5+E$9bgrw!HkM~MU|hMPtsGr~#O+<BbNcF*jaFIQsD4qa)vjNz^=mlF)%s7m<+xi;
zxMdvW_{yV?qZ&P3>+eRrN@r_!^H*4A?x)uG)S?6V&2Ol6l3LfOb%t6O(b5dlEGQ|f
zkW-wDW#~zzKdBT_C~4Ys-X;pYIn6=~kx*pUj?PsK^bBP5o9xCWT!5yi6HypS))jfT
zElkJt`#Qqos9=PWi0o#-KMOm;F16UH5I5Sr56O?hZm(yx&3JUu-?Ee4Wc>%!6ya@A
zhsE!~E>ZW0TJ{g>AOk@Lf(!&12r>|4Ajm+Ffgl4x27(L(83-~EWZ=J_f$qM@EJe9z
zgdY3c$8bKE%_s4AJ!P>~W<|P3`0>e8abDCd-82o8ggp@AS&pX-hv!Q<?p=)7q*8n;
zPfR^XGq7ib7x9$sqzDZH;bq$?kV8<2<Ndas=Q7+_FcKxlz#F<wVGQK-Y@R*sUc;~<
zdMj*a7kW|rP4_DodZ*kg5|YceN;KJ%P53Zysy)Q6man`*db;C?qM&z4Y8Sx=e3)eP
zwkhvz2-B^SACvuC!hT-ZODyf>{f)HuW3vBP*e?ouiKV@~$C37aoFt*371Uimf9HXB
z1Iu_mbTPeTdh?}QHPXxZ(<L1s{yh4s3IEiD|MD=U-K9;GFs|bc&siPsgPtzj9soZG
z?g7)AI%s4&ox;>v+pugkk<qhODWBC#W>(LaY`v&ES#`2#<WI#_MvD;tYhf0m38v2L
zmYOP<STwf!Tt+RI=achC`18*Wn@3(xA1V$XGSi8nTy7AQ&Z{%3nn=8Hcx-ww9xX8L
tt}^beG8aVM6`smR2R)@9i*DPjR^g{{$85V->O$Wxk^4jLjFvsg{sFTH!4d!f

literal 0
HcmV?d00001

diff --git a/omp_hello.c b/omp_hello.c
new file mode 100644
index 0000000..cdf1def
--- /dev/null
+++ b/omp_hello.c
@@ -0,0 +1,22 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <omp.h>
+
+void Hello(void); /* Thread function */
+
+int main(int argc, char* argv[]){
+	/* Get number of threads form command line */
+	int thread_count = strtol(argv[1], NULL, 10);
+
+#	pragma omp parallel num_threads(thread_count)
+	Hello();
+
+	return 0;
+} /* main */
+
+void Hello(void){
+	int my_rank = omp_get_thread_num();
+	int thread_count = omp_get_num_threads();
+
+	printf("Hello from thread %d of %d\n", my_rank, thread_count);
+} /* Hello */
\ No newline at end of file
diff --git a/omp_hello.dSYM/Contents/Info.plist b/omp_hello.dSYM/Contents/Info.plist
new file mode 100644
index 0000000..ae70f05
--- /dev/null
+++ b/omp_hello.dSYM/Contents/Info.plist
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+	<dict>
+		<key>CFBundleDevelopmentRegion</key>
+		<string>English</string>
+		<key>CFBundleIdentifier</key>
+		<string>com.apple.xcode.dsym.omp_hello</string>
+		<key>CFBundleInfoDictionaryVersion</key>
+		<string>6.0</string>
+		<key>CFBundlePackageType</key>
+		<string>dSYM</string>
+		<key>CFBundleSignature</key>
+		<string>????</string>
+		<key>CFBundleShortVersionString</key>
+		<string>1.0</string>
+		<key>CFBundleVersion</key>
+		<string>1</string>
+	</dict>
+</plist>
diff --git a/omp_hello.dSYM/Contents/Resources/DWARF/omp_hello b/omp_hello.dSYM/Contents/Resources/DWARF/omp_hello
new file mode 100644
index 0000000000000000000000000000000000000000..7e526962fe8201b03f7e06e43e9808eb64320d3c
GIT binary patch
literal 9817
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
BqAvgd

literal 0
HcmV?d00001

diff --git a/omp_trap b/omp_trap
new file mode 100755
index 0000000000000000000000000000000000000000..5581549b923575a932f7dc16a245b21f3d3a902f
GIT binary patch
literal 9052
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

literal 0
HcmV?d00001

diff --git a/omp_trap_basic b/omp_trap_basic
new file mode 100755
index 0000000000000000000000000000000000000000..37aa306554eff49241aff44a880d7596b48da3c0
GIT binary patch
literal 9000
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

literal 0
HcmV?d00001

-- 
GitLab