VS2017 CUDA编程学习实例2:CUDA实现秩排序
生活随笔
收集整理的這篇文章主要介紹了
VS2017 CUDA编程学习实例2:CUDA实现秩排序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 前言
- 1. C++ CUDA實(shí)現(xiàn)秩排序
- 3. 執(zhí)行結(jié)果
- 總結(jié)
- 學(xué)習(xí)資料
VS2017 CUDA編程學(xué)習(xí)1:CUDA編程兩變量加法運(yùn)算
VS2017 CUDA編程學(xué)習(xí)2:在GPU上執(zhí)行線程
VS2017 CUDA編程學(xué)習(xí)3:CUDA獲取設(shè)備上屬性信息
VS2017 CUDA編程學(xué)習(xí)4:CUDA并行處理初探 - 向量加法實(shí)現(xiàn)
VS2017 CUDA編程學(xué)習(xí)5:CUDA并行執(zhí)行-線程
VS2017 CUDA編程學(xué)習(xí)6: GPU存儲(chǔ)器架構(gòu)
VS2017 CUDA編程學(xué)習(xí)7:線程同步-共享內(nèi)存
VS2017 CUDA編程學(xué)習(xí)8:線程同步-原子操作
VS2017 CUDA編程學(xué)習(xí)9:常量內(nèi)存
VS2017 CUDA編程學(xué)習(xí)10:紋理內(nèi)存
VS2017 CUDA編程學(xué)習(xí)實(shí)例1:CUDA實(shí)現(xiàn)向量點(diǎn)乘
VS2017 CUDA編程學(xué)習(xí)11:CUDA性能測量
VS2017 CUDA編程學(xué)習(xí)12:CUDA流
前言
今天跟大家分享如何使用CUDA實(shí)現(xiàn)秩排序。
1. C++ CUDA實(shí)現(xiàn)秩排序
這里使用了共享內(nèi)存和同步的概念實(shí)現(xiàn)秩排序
詳細(xì)代碼如下所示:
#include <stdio.h> #include <iostream> #include <cuda.h> #include <cuda_runtime.h> //#include <cuda_runtime_api.h> #include <device_launch_parameters.h>#ifndef __CUDACC__ #define __CUDACC__ #endif#define ARRAY_SIZE 5 #define THREADS_PER_BLOCK 5__global__ void rankSort(int* d_a, int* d_b) {int count = 0;int tid = threadIdx.x;int ttid = threadIdx.x + blockIdx.x * blockDim.x;int val = d_a[ttid];__shared__ int cache[THREADS_PER_BLOCK];for (int i = tid; i < ARRAY_SIZE; i += THREADS_PER_BLOCK){cache[tid] = d_a[i];//等待當(dāng)前塊所有線程完成共享內(nèi)存數(shù)據(jù)填充__syncthreads();//統(tǒng)計(jì)共享內(nèi)存中小于當(dāng)前值得數(shù)量for (int j = 0; j < THREADS_PER_BLOCK; j++){if (val > cache[j]){count++;//等待所有線程完成統(tǒng)計(jì)工作__syncthreads();}}}d_b[count] = val; }int main() {//定義主機(jī)(CPU)和設(shè)備(GPU)變量int h_a[ARRAY_SIZE] = { 5, 9, 3, 4, 8 };int h_b[ARRAY_SIZE];int *d_a, *d_b;//分配設(shè)備內(nèi)存cudaMalloc(&d_a, ARRAY_SIZE * sizeof(int));cudaMalloc(&d_b, ARRAY_SIZE * sizeof(int));//拷貝數(shù)據(jù):從CPU到GPUcudaMemcpy(d_a, h_a, ARRAY_SIZE * sizeof(int), cudaMemcpyHostToDevice);//調(diào)用內(nèi)核函數(shù)rankSort << <ARRAY_SIZE / THREADS_PER_BLOCK, THREADS_PER_BLOCK >> > (d_a, d_b);//等待內(nèi)核函數(shù)運(yùn)行完成cudaDeviceSynchronize();//拷貝數(shù)據(jù):從GPU到CPUcudaMemcpy(h_b, d_b, ARRAY_SIZE * sizeof(int), cudaMemcpyDeviceToHost);//打印秩排序結(jié)果printf("秩排序的結(jié)果:\n");for (int i = 0; i < ARRAY_SIZE; i++){printf("%d\n", h_b[i]);}//釋放GPU內(nèi)存cudaFree(d_a);cudaFree(d_b);system("pause");return 0; }3. 執(zhí)行結(jié)果
總結(jié)
為了更好的理解CUDA編程的理論知識(shí),實(shí)踐是必不可少的,只有更多的實(shí)踐才能更好的理解新的知識(shí),實(shí)踐出真知啊。
學(xué)習(xí)資料
《基于GPU加速的計(jì)算機(jī)視覺編程》
總結(jié)
以上是生活随笔為你收集整理的VS2017 CUDA编程学习实例2:CUDA实现秩排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QueryDSL
- 下一篇: QImage 图像处理