From 2ac775650dfb606ea4896c311584ee64b6206cd0 Mon Sep 17 00:00:00 2001
From: Seldkt <xeldkt@gmail.com>
Date: Thu, 11 Apr 2019 22:38:26 +0700
Subject: [PATCH] serial radix

---
 src/SerialRadixSortCUDA.cu | 105 +++++++++++++++++++++++++++++++++++++
 1 file changed, 105 insertions(+)
 create mode 100644 src/SerialRadixSortCUDA.cu

diff --git a/src/SerialRadixSortCUDA.cu b/src/SerialRadixSortCUDA.cu
new file mode 100644
index 0000000..e4ec5d1
--- /dev/null
+++ b/src/SerialRadixSortCUDA.cu
@@ -0,0 +1,105 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <omp.h>
+#include <sys/time.h>
+
+void rng(int* arr, int n);
+
+int getMax(int arr[], int n);
+
+void countingSort(int arr[], int n, int exp); 
+
+void radixSort(int arr[], int n);
+
+void print(int arr[], int n);
+
+
+void rng(int* arr, int arrSize) {
+    int seed = 13516042; // Ganti dengan NIM anda sebagai seed.
+    srand(seed);
+    for(int i = 0; i < arrSize; i++) {
+        arr[i] = (int)rand();
+    }
+}
+
+//fungsi cari isi array yg terbesar
+int getMax(int* arr, int arrSize) 
+{ 
+    int max = arr[0]; 
+    for (int i = 1; i < arrSize; i++){ 
+        if (arr[i] > max){ 
+            max = arr[i]; 
+		}
+	}
+    return max; 
+} 
+  
+void countingSort(int* arr, int arrSize, int exp) 
+{ 
+    int sorted[arrSize]; 
+    int i, bucket[10] = {0}; 
+
+    {
+		int local_bucket[10]={0};
+
+		//exp untuk hilangin digit di belakang digit, % 10 hilangin digit didepan digit
+		for (i = 0; i < arrSize; i++)
+		{ 
+			local_bucket[ (arr[i]/exp)%10 ]++;
+		}
+		for(i=0;i<10;i++){
+			bucket[i] += local_bucket[i];
+		}
+    }
+  
+    for (i = 1; i < 10; i++) 
+        bucket[i] += bucket[i - 1]; 
+
+	
+	for (i = arrSize - 1; i >= 0; i--) 
+		{ 
+			sorted[bucket[ (arr[i]/exp)%10 ] - 1] = arr[i];
+			bucket[ (arr[i]/exp)%10 ]--; 
+		}
+	
+    for (i = 0; i < arrSize; i++) 
+        arr[i] = sorted[i]; 
+}  
+  
+void radixSort(int* arr, int arrSize) 
+{ 
+    int maks = getMax(arr, arrSize); 
+    for (int exp = 1; maks/exp > 0; exp *= 10) 
+        countingSort(arr, arrSize, exp);
+} 
+  
+void print(int* arr, int size ) 
+{ 
+    for (int i = 0; i < size; i++) 
+        printf("%d \n", arr[i]); 
+}
+
+int main(int argc, char *argv[]) {
+		float time;
+		cudaEvent_t start, stop;
+		
+        long arrSize = strtol(argv[1], NULL, 10);//input array size  
+		
+        int arr[arrSize];
+        rng(arr, arrSize);
+
+		cudaEventCreate(&start);
+		cudaEventCreate(&stop);
+		cudaEventRecord(start, 0);
+		
+        radixSort(arr, arrSize);
+		
+		cudaEventRecord(stop, 0);
+		cudaEventSynchronize(stop);
+		cudaEventElapsedTime(&time, start, stop);
+		
+        printf("Time to generate:  %3.4f ms \n", time);
+ 
+    return 0; 
+    
+}
\ No newline at end of file
-- 
GitLab