cuda笔记-GPU多线程的奇偶排序
生活随笔
收集整理的這篇文章主要介紹了
cuda笔记-GPU多线程的奇偶排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先說明奇偶排序:
算法的思路是先排奇數序號的相鄰2個,或者偶數序號的相鄰兩個,然后一直到序列有序為止,如下代碼:
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include <iostream>using namespace std;void swap(int *a, int *b) {int t;t = *a;*a = *b;*b = t; } void printArray(int a[], int count) {int i;for (i = 0; i < count; i++)printf("%d ", a[i]);printf("\n"); } void Odd_even_sort(int a[], int size) {bool sorted = false;int count = 1;while (!sorted){sorted = true;for (int i = 1; i < size - 1; i += 2){if (a[i] > a[i + 1]){swap(&a[i], &a[i + 1]);sorted = false;}}for (int i = 0; i < size - 1; i += 2){if (a[i] > a[i + 1]){swap(&a[i], &a[i + 1]);sorted = false;}}cout << "count:" << count << endl;} } int main(void) {int a[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };int n = sizeof(a) / sizeof(*a);Odd_even_sort(a, n);printArray(a, n);getchar();return 0; }程序運行截圖如下:
這個奇偶排序還有個特點:
奇偶排序實際上在多處理器環境中很有用,處理器可以分別同時處理每一個奇數對,然后又同時處理偶數對。因為奇數對是彼此獨立的,每一刻都可以用不同的處理器比較和交換。這樣可以非常快速地排序。
?
下面就用cuda來實現下,其中有個要說明的地方:
cuda中__syncthreads()的作用:block內部用于線程同步,就是同一block內所有線程執行至__syncthreads()處等待全部線程執行完畢后再繼續。
代碼如下:
#include "cuda_runtime.h" #include "device_launch_parameters.h" #include <iostream> #include "curand.h" #include "curand_kernel.h" #include <stdio.h> #include <iostream>using namespace std;#pragma comment(lib, "cudart.lib") #pragma comment(lib, "curand.lib")void Matrix_init(float *a, int N) {curandGenerator_t gen;curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_MRG32K3A);curandSetPseudoRandomGeneratorSeed(gen, 11ULL);curandGenerateUniform(gen, a, N); }__global__ void sort(float *a, int N) {int x = threadIdx.x;extern __shared__ float s_a[];s_a[x] = a[x];__syncthreads();for (int i = 0; i < N; i++){int j = i % 2;int idx = 2 * x + j;if (idx + 1 < N && s_a[idx] < s_a[idx + 1]) {float tmp = s_a[idx];s_a[idx] = s_a[idx + 1];s_a[idx + 1] = tmp;}__syncthreads();}a[x] = s_a[x];__syncthreads(); }int main() {int m = 16;int N = 256;float *p_d, *p_h, *p_hs;p_h = (float*)malloc(N * sizeof(float));p_hs = (float*)malloc(N * sizeof(float));cudaMalloc((void**)&p_d, N * sizeof(float));Matrix_init(p_d, N);cudaMemcpy(p_h, p_d, N * sizeof(float), cudaMemcpyDeviceToHost);for (int i = 0; i < N; i++) {if (i % m == 0) {printf("\n");}cout << " " << p_h[i] << " ";}cout << endl << "sort:" << endl;sort << <1, N, N * sizeof(float) >> > (p_d, N);cudaMemcpy(p_h, p_d, N * sizeof(float), cudaMemcpyDeviceToHost);for (int i = 0; i < N; i++) {if (i%m == 0) printf("\n");cout << " " << p_h[i] << " ";}cudaFree(p_d);free(p_h);free(p_hs);getchar();return 0; }程序運行截圖如下:
?
總結
以上是生活随笔為你收集整理的cuda笔记-GPU多线程的奇偶排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt工作笔记-Qt5中中文编码方面的笔记
- 下一篇: 计算机图形学Web前端笔记-图形平移放缩