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