From 1f9441e81ea3b5dbbd56f847e86bae775a74ab71 Mon Sep 17 00:00:00 2001 From: Yora <13516067@std.stei.itb.ac.id> Date: Thu, 11 Apr 2019 22:12:26 +0700 Subject: [PATCH] radixsort paralel --- src/radix_sort_cuda.cu | 118 ----------------------------- src/radix_sort_par3.cu | 165 ----------------------------------------- 2 files changed, 283 deletions(-) delete mode 100644 src/radix_sort_cuda.cu delete mode 100644 src/radix_sort_par3.cu diff --git a/src/radix_sort_cuda.cu b/src/radix_sort_cuda.cu deleted file mode 100644 index 356cdad..0000000 --- a/src/radix_sort_cuda.cu +++ /dev/null @@ -1,118 +0,0 @@ -// C++ implementation of Radix Sort -#include <iostream> -#include <cstdlib> -#include <time.h> -using namespace std; - -// A utility function to get maximum value in arr[] -int getMax(int arr[], int n) -{ - int mx = arr[0]; - for (int i = 1; i < n; i++) - if (arr[i] > mx) - mx = arr[i]; - return mx; -} - -// A function to do counting sort of arr[] according to -// the digit represented by exp. -__global__ void countSort(int arr[], int n, int exp) -{ - int *output= (int*)malloc(sizeof(int)*n); // output array - int i, count[10] = {0}; - - // Store count of occurrences in count[] - for (i = 0; i < n; i++) - count[ (arr[i]/exp)%10 ]++; - - // Change count[i] so that count[i] now contains actual - // position of this digit in output[] - for (i = 1; i < 10; i++) - count[i] += count[i - 1]; - - // Build the output array - for (i = n - 1; i >= 0; i--) - { - output[count[ (arr[i]/exp)%10 ] - 1] = arr[i]; - count[ (arr[i]/exp)%10 ]--; - } - - // Copy the output array to arr[], so that arr[] now - // contains sorted numbers according to current digit - for (i = 0; i < n; i++) - arr[i] = output[i]; -} - -// The main function to that sorts arr[] of size n using -// Radix Sort -void radixsort(int arr[], int n) -{ - int *d_arr; - // Find the maximum number to know number of digits - int m = getMax(arr, n); - - // Do counting sort for every digit. Note that instead - // of passing digit number, exp is passed. exp is 10^i - // where i is current digit number - - cudaMalloc((void**)&d_arr,sizeof(int)*n); - cudaMemcpy(d_arr, arr, sizeof(int)*n,cudaMemcpyHostToDevice); - - for (int exp = 1; m/exp > 0; exp *= 10) { - countSort<<<1,32>>>(arr, n, exp); - cudaMemcpy(arr, d_arr, sizeof(int)*n, cudaMemcpyDeviceToHost); - } - - cudaFree(d_arr); -} - -// A utility function to print an array -void print(int arr[], int n) -{ - for (int i = 0; i < n; i++) - cout << arr[i] << "\n"; -} - -void rng(int* arr,int n){ - int seed = 13516067; - srand(seed); - for (long i=0; i<n; i++){ - arr[i] = (int) rand(); - } -} - - -timespec diff(timespec start, timespec end) -{ - timespec temp; - if ((end.tv_nsec - start.tv_nsec) < 0) { - temp.tv_sec = end.tv_sec - start.tv_sec - 1; - temp.tv_nsec = 1000000000 + end.tv_nsec - start.tv_nsec; - } else { - temp.tv_sec = end.tv_sec - start.tv_sec; - temp.tv_nsec = end.tv_nsec - start.tv_nsec; - } - return temp; -} - -// Driver program to test above functions -int main() -{ - timespec start, stop; - - int n; - cout<<"Masukkan nilai N\n"; - cin>>n; - int arr[n]; - rng(arr,n); - clock_gettime(CLOCK_REALTIME, &start); - radixsort(arr,n); - clock_gettime(CLOCK_REALTIME, &stop); - print(arr,n); - - timespec duration = diff(start, stop); - long time = duration.tv_sec * 1000000 + duration.tv_nsec/1000; - printf("\n%d.%09d s\n", duration.tv_sec, duration.tv_nsec); - - return 0; -} \ No newline at end of file diff --git a/src/radix_sort_par3.cu b/src/radix_sort_par3.cu deleted file mode 100644 index e9e1a90..0000000 --- a/src/radix_sort_par3.cu +++ /dev/null @@ -1,165 +0,0 @@ -// C++ implementation of Radix Sort -#include <iostream> -#include <cstdlib> -#include <time.h> -#include <cuda.h> -#include <cuda_runtime.h> -#define MAX_THREAD 32 - -using namespace std; - - -// A utility function to get maximum value in arr[] -int getMax(int arr[], int n) -{ - int mx = arr[0]; - for (int i = 1; i < n; i++) - if (arr[i] > mx) - mx = arr[i]; - return mx; -} - -__global__ void storeCount(int *count, int *arr, int n, int exp){ - __shared__ s_Count[MAX_THREAD][10]={0}; - - int idx = threadIdx.x; - - if(n<=MAX_THREAD){ - s_Count[idx][(arr[idx]/exp)%10 ]++; - } else{ - int block = (int) ceil(n/MAX_THREAD); - int index = idx * block; - int last_index; - if(idx+1==MAX_THREAD){ - last_index = n; - } else{ - last_index= index + block; - } - for (int i = index; i < last_index; i++){ - s_Count[idx][(arr[i]/exp)%10 ]++; - } - } - - if(idx==0){ - for (i = 1; i<MAX_THREAD;j++){ - for(int j=0; j<10;j++){ - s_Count[0][j]+=sCount[i][j]; - } - } - for (j =0; j<10;j++){ - count[j]=s_Count[0][j]; - } - } - -} - -// A function to do counting sort of arr[] according to -// the digit represented by exp. -void countSort(int arr[], int n, int exp) -{ - int *d_arr; - - int *output= (int*)malloc(sizeof(int)*n); // output array - int i; - int d_count[10] = {0}; - int h_count[10]; - cudaMalloc((void**)&d_arr,sizeof(int)*n); - cudaMemcpy(d_arr, arr, sizeof(int)*n,cudaMemcpyHostToDevice); - - // Store count of occurrences in count[] - storeCount<<<1,32>>>(d_count,d_arr,n,exp); - cudaMemcpy(h_count, d_count, 10,cudaMemcpyDeviceToHost); - - // Change count[i] so that count[i] now contains actual - // position of this digit in output[] - for (i = 1; i < 10; i++) - h_count[i] += h_count[i - 1]; - - // Build the output array - for (i = n - 1; i >= 0; i--) - { - output[h_count[ (arr[i]/exp)%10 ] - 1] = arr[i]; - h_count[ (arr[i]/exp)%10 ]--; - } - - // Copy the output array to arr[], so that arr[] now - // contains sorted numbers according to current digit - for (i = 0; i < n; i++) - arr[i] = output[i]; - - cudaFree(d_arr); - //cudaFree(d_count); -} - -// The main function to that sorts arr[] of size n using -// Radix Sort - -void radixsort(int *arr, int n) -{ - - int m = getMax(arr, n); - - // Do counting sort for every digit. Note that instead - // of passing digit number, exp is passed. exp is 10^i - // where i is current digit number - - - //cudaMemcpy(d_arr, arr, sizeof(int)*n,cudaMemcpyHostToDevice); - for (int exp = 1; m/exp > 0; exp *= 10) - countSort(arr,n,exp); - -} - -// A utility function to print an array -void print(int arr[], int n){ - for (int i = 0; i < n; i++) - cout << arr[i] << "\n"; -} - -void rng(int* arr,int n){ - int seed = 13516067; - srand(seed); - for (long i=0; i<n; i++){ - arr[i] = (int) rand(); - } -} - - -timespec diff(timespec start, timespec end) -{ - timespec temp; - if ((end.tv_nsec - start.tv_nsec) < 0) { - temp.tv_sec = end.tv_sec - start.tv_sec - 1; - temp.tv_nsec = 1000000000 + end.tv_nsec - start.tv_nsec; - } else { - temp.tv_sec = end.tv_sec - start.tv_sec; - temp.tv_nsec = end.tv_nsec - start.tv_nsec; - } - return temp; -} - -// Driver program to test above functions -int main(int argc, char *argv[]) -{ - timespec start, stop; - - - int n; - n= atoi(argv[1]); - int arr[n]; - rng(arr,n); - - - clock_gettime(CLOCK_REALTIME, &start); - radixsort(arr,n); - clock_gettime(CLOCK_REALTIME, &stop); - print(arr,n); - - timespec duration = diff(start, stop); - long time = duration.tv_sec * 1000000 + duration.tv_nsec/1000; - printf("\n%d.%09d s\n", duration.tv_sec, duration.tv_nsec); - - //deallocate host memory - - return 0; -} -- GitLab