奇偶冒泡排序的CUDA实现

由于奇偶冒泡排序分奇下标和偶下标排序,这就确保了在一轮排序【奇/偶】过程中,隔一个处理一个,同一轮的排序中被处理的各元素是互不影响的,所以可以并行处理。。。事实上,奇偶冒泡排序在串行CPU上本没一点优势,他揍是为并行而生.


[cpp]  view plain copy
  1. #include <cuda.h>  
  2. #include <time.h>  
  3. #include <stdio.h>  
  4. #include <stdlib.h>  
  5. #include <math.h>  
  6. #include <pz_cpy>  
  7. #include "cuPrintf.cu"  
  8. bool InitGPUSet()  
  9. {  
  10.     cudaDeviceProp tCard;  
  11.     int num = 0;  
  12.     if(cudaSuccess == cudaGetDeviceCount(&num))  
  13.     {  
  14.         for(int i = 0; i < num; ++ i)  
  15.         {  
  16.             cudaSetDevice(i);  
  17.             cudaGetDeviceProperties(&tCard, i);  
  18.             printf("GPU: %s/n", tCard.name);  
  19.         }  
  20.     }  
  21.     else  return false;  
  22.     return true;  
  23. }  
  24. bool InitCuPrint()  
  25. {  
  26.     cudaError_t err = cudaPrintfInit();  
  27.     return 0 == strcmp("no error", cudaGetErrorString(err));  
  28. }  
  29. __global__ void even_sort(int* ary, int size)  
  30. {  
  31.     int tid = threadIdx.x;//线程从0开始编号  
  32.     if(1 == (tid + 1 ) % 2)//第奇数个轮回  
  33.     {  
  34.         cuPrintf("before swap %d/n", tid);  
  35.         for(int i = 0; i < size; ++ i)  cuPrintf("%d ", ary[i]);  
  36.         cuPrintf("/n");  
  37.         if(ary[tid] > ary[tid + 1] && tid + 1 < size)  
  38.         {  
  39.             int tp = ary[tid];  
  40.             ary[tid] = ary[tid + 1];  
  41.             ary[tid + 1] = tp;  
  42.             cuPrintf("after swap %d/n", tid);  
  43.             for(int i = 0; i < size; ++ i)  cuPrintf("%d ", ary[i]);  
  44.             cuPrintf("/n");  
  45.         }  
  46.     }  
  47.     __syncthreads();  
  48.     //cuPrintf("block: %d/t", bid);  
  49.     //for(int i = 0; i < size; ++ i)  cuPrintf("%d ", ary[i]);  
  50.     //cuPrintf("/n");  
  51. }  
  52. __global__ void odd_sort(int* ary, int size)  
  53. {  
  54.     int tid = threadIdx.x;//线程从0开始编号  
  55.     if(0 == (tid + 1 ) % 2)//第奇数个轮回  
  56.     {  
  57.         /*cuPrintf("before swap %d/n", tid); 
  58.         for(int i = 0; i < size; ++ i)  cuPrintf("%d ", ary[i]); 
  59.         cuPrintf("/n");*/  
  60.         if(ary[tid] > ary[tid + 1] && tid + 1 < size)  
  61.         {  
  62.             int tp = ary[tid];  
  63.             ary[tid] = ary[tid + 1];  
  64.             ary[tid + 1] = tp;  
  65. /* 
  66.             cuPrintf("after swap %d/n", tid); 
  67.             for(int i = 0; i < size; ++ i)  cuPrintf("%d ", ary[i]); 
  68.             cuPrintf("/n"); 
  69.             */  
  70.         }  
  71.     }  
  72.     //__syncthreads();  
  73. }  
  74. int main(void)  
  75. {  
  76.     const int SIZE = 27;  
  77.     const int BLOCK_SIZE = SIZE;  
  78.     const int THREAD_SIZE = SIZE;  
  79.     if(!InitGPUSet())  puts("GPU failed");  
  80.     else  if(!InitCuPrint())  puts("cuPrintf failed");  
  81.     else  
  82.     {  
  83.         int ary[SIZE];// = {6, 5, 4, 3, 2, 1};  
  84.         srand(time(0));  
  85.         for(int i = 0; i < SIZE; ++ i)  ary[i] = rand() % 100;  
  86.         for(int i = 0; i < SIZE; ++ i)  printf("%d ", ary[i]);  
  87.         puts("");  
  88.         int* gary;  
  89.         cudaMalloc((void**) &gary, SIZE * sizeof(int));  
  90.         cudaMemcpy(gary, ary, SIZE * sizeof(int), cudaMemcpyHostToDevice);  
  91.         for(int i = 0; i < BLOCK_SIZE; ++ i)  
  92.         {  
  93.             even_sort<<<1, THREAD_SIZE, 0>>>(gary, SIZE);  
  94.             //cudaPrintfDisplay(stdout, false);  
  95.             odd_sort<<<1, THREAD_SIZE, 0>>>(gary, SIZE);  
  96.         }  
  97.         //cudaPrintfEnd();  
  98.         cudaMemcpy(ary, gary, SIZE * sizeof(int), cudaMemcpyDeviceToHost);  
  99.         for(int i = 0; i < SIZE; ++ i)  printf("%d ", ary[i]);  
  100.         puts("");  
  101.         cudaFree(gary);  
  102.     }  
  103.     return 0;  
  104. }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言可以通过奇偶冒泡排序算法来对数组进行排序。奇偶冒泡排序是一种改进的冒泡排序算法,它通过同时进行奇数和偶数次的冒泡操作来提高排序效率。下面是奇偶冒泡排序实现步骤: 1. 首先,定义一个需要排序的数组。 2. 使用两个标志位oddSorted和evenSorted,初始值都为0,用于标记奇数和偶数轮的冒泡操作是否已经完成。 3. 进入循环,直到oddSorted和evenSorted都为1时结束循环。 4. 在奇数轮中,从第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。遍历完所有奇数索引位置后,将oddSorted标志位置为1。 5. 在偶数轮中,从第二个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。遍历完所有偶数索引位置后,将evenSorted标志位置为1。 6. 每完成一轮奇数和偶数的冒泡操作,都检查一次数组是否已经有序。如果有序,则将oddSorted和evenSorted都置为1,结束循环。 7. 循环结束后,数组就已经按照从小到大的顺序排列好了。 下面是奇偶冒泡排序的C语言代码示例: ```c #include <stdio.h> void oddEvenBubbleSort(int arr[], int n) { int oddSorted = 0; int evenSorted = 0; while (!oddSorted || !evenSorted) { oddSorted = 1; evenSorted = 1; // 奇数轮冒泡 for (int i = 1; i < n - 1; i += 2) { if (arr[i] > arr[i + 1]) { int temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; oddSorted = 0; } } // 偶数轮冒泡 for (int i = 0; i < n - 1; i += 2) { if (arr[i] > arr[i + 1]) { int temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; evenSorted = 0; } } } } int main() { int arr[] = {5, 2, 8, 9, 1}; int n = sizeof(arr) / sizeof(arr[0]); printf("排序前的数组:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } oddEvenBubbleSort(arr, n); printf("\n排序后的数组:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值