diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..08ebed660055f08e934969eebb6ab6140d901aa7 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +make: src/radix_sort_cuda.cu + nvcc src/radix_sort_cuda.cu -o radix_sort diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d962a8bf7e6972cba2e416a22987ce5ab6407551 --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +### Petunjuk Penggunaan: +1. Lakukan command make pada terminal. +```$ make``` +2. Jalankan program dengan command yang telah disediakan. +```$./radix_sort <numnber of array elements>"``` + +### Pengerjaan Tugas +Muhammad Farhan - 13516093 +1. Mengerjakan semua bagian + +### Laporan Pengerjaan +#### Deskripsi Solusi Paralel + +#### Analisis Solusi + +#### Pemetaan *Thread* ke Komputasi dan Jumlah *Thread per Block* yang Digunakan + +#### Pengukuran Kinerja +1. N = 5000 +2. N = 50000 +3. N = 100000 +4. N = 200000 +5. N = 400000 + +#### Analisis Perbandingan Kinerja Serial dan Paralel diff --git a/src/radix_sort_cuda.cu b/src/radix_sort_cuda.cu new file mode 100644 index 0000000000000000000000000000000000000000..f1be3b1442b6905e90d2f2247a75b84f2d7c274f --- /dev/null +++ b/src/radix_sort_cuda.cu @@ -0,0 +1,118 @@ +#include <stdio.h> +#include <stdio.h> +#define SEED 13516093 + +void rng(int* arr, int n); +void radixSortSerial(int* arr, int n); +void radixSortParallel(int* arr, int n); +int isMatch(int* arr1, int* arr2, int n); + +int main(int argc, char** argv) { + int n; + int *arr; + int *arr_d; + cudaEvent_t startTime, stopTime; + float elapsedTime; + + if (argc < 2) { + printf("Usage: ./radix_sort_cuda <number of array elements>"); + return 0; + } + + n = strtol(argv[1], NULL, 10); + arr = (int*)malloc(n*sizeof(int)); + rng(arr, n); + cudaEventCreate(&startTime); + cudaEventCreate(&stopTime); + + + // Serial Radix Sort + cudaEventRecord(startTime, 0); + + radixSortSerial(arr, n); + + cudaEventRecord(stopTime, 0); + cudaEventSynchronize(stopTime); + cudaEventElapsedTime(&elapsedTime, startTime, stopTime); + printf("Serial Radix Sort: %lf\n", elapsedTime); + + + // CUDA Radix Sort + cudaMalloc((void**)&arr_d, sizeof(int) * n); + cudaMemcpy(arr_d, arr, sizeof(int)*n, cudaMemcpyHostToDevice); + + cudaEventRecord(startTime, 0); + + radixSortParallel(arr, n); + + cudaEventRecord(stopTime, 0); + cudaEventSynchronize(stopTime); + cudaEventElapsedTime(&elapsedTime, startTime, stopTime); + printf("Parallel Radix Sort: %lf\n", elapsedTime); + + return 0; +} + +void rng(int* arr, int n) { + srand(SEED); + + for (int i = 0; i < n; i++) + arr[i] = (int)rand(); +} + +int getMax(int* arr, int n) { + int temp = 0; + + for (int i = 0; i < n; i++) + if (arr[i] > temp) temp = arr[i]; + + return temp; +} + +// Serial Sort +void countSortSerial(int *arr, int n, int exp) { + int count[10] = {0}; + int output[n]; + + for (int i = 0; i < n; i++) { + int digit = (arr[i]/exp)%10; + count[digit]++; + } + + for (int i = 1; i < 10; i++) + count[i] += count[i-1]; + + for (int i = n-1; i>= 0; i--) { + int digit = (arr[i]/exp)%10; + output[count[digit]-1] = arr[i]; + count[digit]--; + } + + for (int i = 0; i < n; i++) + arr[i] = output[i]; +} + +void radixSortSerial(int* arr, int n) { + int max = getMax(arr, n); + + for (int exp = 1; max/exp > 0; exp *= 10) + countSortSerial(arr, n, exp); +} + +// Parallel Sort +__global__ void countSortParallel(int *arr, int n, int digit) { + +} + +void radixSortParallel(int *arr, int n) { + int max = getMax(arr, n); + int *arr_d; + + cudaMalloc((void**)&arr_d, n*sizeof(int); + cudaMemcpy(arr_d, arr, n*sizeof(int), cudaMemcpyHostToDevice); + + for (int digit = 1; max/digit > 0; digit *= 10) + countSort<<<1,1>>>(arr_d, n, digit); + + cudaMemcpy(arr, arr_d, n*sizeof(int), cudaMemcpyDeviceToHost); +} diff --git a/test/README.md b/test/README.md deleted file mode 100644 index fcb37d95caa74bc95d1cb01dea18a5eacff5d72e..0000000000000000000000000000000000000000 --- a/test/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Announcement - -Please place your sample input and output here. \ No newline at end of file