diff --git a/src/radix b/src/radix new file mode 100755 index 0000000000000000000000000000000000000000..96fa5d815092724e0fa1314f38188df9cf816c1e Binary files /dev/null and b/src/radix differ diff --git a/src/radix_cuda.cu b/src/radix_cuda.cu new file mode 100644 index 0000000000000000000000000000000000000000..244fd0d6eba81114b44e92667fa2ecb84a771174 --- /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 0000000000000000000000000000000000000000..0ac1587774f97dc09b7f81f09e286cfecb2435d1 --- /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"); +}