From 26fd92ec95e64c94ffe294edecf2498553bd4b86 Mon Sep 17 00:00:00 2001
From: Diar <mahdiarnaufal@gmail.com>
Date: Thu, 11 Apr 2019 12:12:48 +0700
Subject: [PATCH] init

---
 src/radix               | Bin 0 -> 12880 bytes
 src/radix_cuda.cu       | 135 ++++++++++++++++++++++++++++++++++++++++
 src/radix_sort_serial.c |  92 +++++++++++++++++++++++++++
 3 files changed, 227 insertions(+)
 create mode 100755 src/radix
 create mode 100644 src/radix_cuda.cu
 create mode 100644 src/radix_sort_serial.c

diff --git a/src/radix b/src/radix
new file mode 100755
index 0000000000000000000000000000000000000000..96fa5d815092724e0fa1314f38188df9cf816c1e
GIT binary patch
literal 12880
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
PO8T|R@yjfzs9XOpmeJGr

literal 0
HcmV?d00001

diff --git a/src/radix_cuda.cu b/src/radix_cuda.cu
new file mode 100644
index 0000000..244fd0d
--- /dev/null
+++ b/src/radix_cuda.cu
@@ -0,0 +1,135 @@
+  #include <stdio.h>
+  #include <stdlib.h>
+  #include <omp.h>
+  #include <sys/time.h>
+
+  int getMax(int arr[], int n);
+  void countSort(int arr[], int n, int digit, int thread_size);
+  void radixsort(int arr[], int n, int thread_size);
+  void generateArray(int arr[], int n,int seed);
+  void print(int arr[], int n);
+
+  __global__
+  void hitungDigit(int arr[], int n, long digit, int count[]){
+    int i;
+    int index = threadIdx.x;
+    int stride = blockDim.x;
+    for (i = index; i < n; i+=stride){
+      count[ (arr[i]/digit)%10 ] = count[ (arr[i]/digit)%10 ] + 1; 
+    }
+
+  }
+
+  int main(int argc, char *argv[]) {
+    if (argc != 3) {
+      printf("Usage: <program> <ukuran array> <jumlah thread>\n");
+      exit(0);
+    }
+    int array_size = strtol(argv[1], NULL, 10);
+    int thread_size = strtol(argv[2], NULL, 10);
+
+    struct timeval stop, start;
+    int * arr; 
+    cudaMallocManaged(&arr, array_size*sizeof(int));
+    int seed = 13515022;
+    generateArray(arr,array_size,seed);
+    gettimeofday(&start, NULL);
+    radixsort(arr, array_size, thread_size); 
+    gettimeofday(&stop, NULL);
+
+    printf("After sort:\n"); 
+    print(arr, array_size); 
+
+    printf("Membutuhkan %lu microsecond untuk eksekusi radix sort secara serial\n", ((stop.tv_sec - start.tv_sec)*1000000)+(stop.tv_usec - start.tv_usec));
+
+    cudaFree(arr);
+    return 0;
+  }
+
+
+  int getMax(int arr[], int n) { 
+    int max = arr[0]; 
+    for (int i = 1; i < n; i++){
+        if (arr[i] > max) {
+        max = arr[i]; 
+        }
+    }		
+    return max; 
+  } 
+
+  void generateArray(int arr[], int n,int seed){
+    int output[n];
+    srand(seed);
+    for(long i = 0; i < n; i++) {
+          output[i] = (int)rand();
+    }
+
+    for(long i = 0; i < n; i++) {
+        arr[i] = output[i];
+    }
+
+  }
+
+
+  void countSort(int arr[], int n, long digit, int thread_size) { 
+    int output[n];
+    long i;
+    int * count_global; 
+    
+    
+    cudaMallocManaged(&count_global, 10*sizeof(int));
+
+    for (int x = 0;x<10;x++) {
+      count_global[x] = 0;
+    }
+
+    hitungDigit<<<1,thread_size>>>(arr,n,digit,count_global);  
+    cudaDeviceSynchronize();  
+
+
+
+    for (i = 1; i < 10; i++){
+      count_global[i] += count_global[i - 1]; 
+    }
+    for (i = n - 1; i >= 0; i--){ 
+      output[count_global[ (arr[i]/digit)%10 ] - 1] = arr[i]; 
+      count_global[ (arr[i]/digit)%10 ]--; 
+    } 
+    for (i = 0; i < n; i++) {
+      arr[i] = output[i]; 
+    }
+    // printf("Count before free: ");  
+    // for (i = 0;i<10;i++) {
+    //   printf("%d ",count_global[i]);
+    // }
+    // printf("\n");
+
+    cudaFree(count_global);
+
+    // printf("Count after free: ");  
+    // for (i = 0;i<10;i++) {
+    //   printf("%d ",count_global[i]);
+    // }
+    // printf("\n");    
+  } 
+
+
+  void radixsort(int arr[], int n, int thread_size) { 
+    printf("Before sort:\n");
+    print(arr,n);
+    int m = getMax(arr, n); 
+    for (long digit = 1; m/digit > 0; digit *= 10) {
+      printf("Array before this sort, digit %ld:\n",digit);
+      print(arr,n);
+      countSort(arr, n, digit, thread_size); 
+      printf("Array after this sort:\n");
+      print(arr,n);
+    }		
+  } 
+
+  void print(int arr[], int n) { 
+    for (long i = 0; i < n; i++) {
+        printf("%d \n",arr[i]);
+    }
+    printf("\n");
+  } 
diff --git a/src/radix_sort_serial.c b/src/radix_sort_serial.c
new file mode 100644
index 0000000..0ac1587
--- /dev/null
+++ b/src/radix_sort_serial.c
@@ -0,0 +1,92 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <omp.h>
+#include <sys/time.h>
+
+int getMax(int arr[], int n);
+void countSort(int arr[], int n, int exp);
+void radixsort(int arr[], int n);
+void generateArray(int arr[], int n,int seed);
+void print(int arr[], int n);
+
+int main(int argc, char *argv[]) {
+  printf("%d\n",argc);
+  int array_size = strtol(argv[1], NULL, 10);
+
+  struct timeval stop, start;
+  int arr[array_size]; 
+  int seed = 13515022;
+  generateArray(arr,array_size,seed);
+  gettimeofday(&start, NULL);
+  radixsort(arr, array_size); 
+  gettimeofday(&stop, NULL);
+
+  printf("After sort:\n"); 
+  print(arr, array_size); 
+
+  printf("Membutuhkan %lu microsecond untuk eksekusi radix sort secara serial\n", ((stop.tv_sec - start.tv_sec)*1000000)+(stop.tv_usec - start.tv_usec));
+
+  return 0;
+}
+
+
+int getMax(int arr[], int n) { 
+	int max = arr[0]; 
+	for (int i = 1; i < n; i++){
+      if (arr[i] > max) {
+			max = arr[i]; 
+      }
+   }		
+	return max; 
+} 
+
+void generateArray(int arr[], int n,int seed){
+   int output[n];
+   srand(seed);
+   for(long i = 0; i < n; i++) {
+        output[i] = (int)rand();
+   }
+
+   for(long i = 0; i < n; i++) {
+      arr[i] = output[i];
+   }
+
+}
+
+
+void countSort(int arr[], int n, int digit) { 
+	int output[n];
+  long i;
+	int count[10] = {0}; 
+  for (i = 0; i < n; i++){
+    count[ (arr[i]/digit)%10 ]++; 
+  }
+
+  for (i = 1; i < 10; i++){
+		count[i] += count[i - 1]; 
+  }
+  for (i = n - 1; i >= 0; i--){ 
+    output[count[ (arr[i]/digit)%10 ] - 1] = arr[i]; 
+		count[ (arr[i]/digit)%10 ]--; 
+  } 
+  for (i = 0; i < n; i++) {
+		arr[i] = output[i]; 
+  }
+} 
+
+
+void radixsort(int arr[], int n) { 
+  printf("Before sort:\n");
+  print(arr,n);
+	int m = getMax(arr, n); 
+	for (int digit = 1; m/digit > 0; digit *= 10) {
+      countSort(arr, n, digit); 
+  }		
+} 
+
+void print(int arr[], int n) { 
+	for (long i = 0; i < n; i++) {
+      printf("%d \n",arr[i]);
+   }
+   printf("\n");
+} 
-- 
GitLab