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