VS2017 CUDA编程学习实例3:CUDA实现直方图统计
生活随笔
收集整理的這篇文章主要介紹了
VS2017 CUDA编程学习实例3:CUDA实现直方图统计
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 前言
- 1. C++ CUDA實現直方圖統計
- 3. 執行結果
- 總結
- 學習資料
VS2017 CUDA編程學習1:CUDA編程兩變量加法運算
VS2017 CUDA編程學習2:在GPU上執行線程
VS2017 CUDA編程學習3:CUDA獲取設備上屬性信息
VS2017 CUDA編程學習4:CUDA并行處理初探 - 向量加法實現
VS2017 CUDA編程學習5:CUDA并行執行-線程
VS2017 CUDA編程學習6: GPU存儲器架構
VS2017 CUDA編程學習7:線程同步-共享內存
VS2017 CUDA編程學習8:線程同步-原子操作
VS2017 CUDA編程學習9:常量內存
VS2017 CUDA編程學習10:紋理內存
VS2017 CUDA編程學習實例1:CUDA實現向量點乘
VS2017 CUDA編程學習11:CUDA性能測量
VS2017 CUDA編程學習12:CUDA流
VS2017 CUDA編程學習實例2:CUDA實現秩排序
前言
今天跟大家分享如何使用CUDA實現直方圖統計,這個功能在圖像處理中經常被用到,比如直方圖歸一化處理,OTSU閾值分割等。
1. C++ CUDA實現直方圖統計
這里使用了共享內存,同步以及原子加法操作的概念實現直方圖統計
詳細代碼如下所示:
#include<stdio.h> #include <iostream> #include <cuda.h> #include <cuda_runtime.h> #include <device_launch_parameters.h> #include <device_atomic_functions.h>#define SIZE 1000 #define NUM_BIN 256__global__ void histogram_without_atomic(int* d_a, int* d_b) {int tid = threadIdx.x + blockIdx.x * blockDim.x;int item = d_a[tid];if (tid < SIZE){d_b[item]++;} }__global__ void histogram_atomic(int* d_a, int* d_b) {int tid = threadIdx.x + blockIdx.x * blockDim.x;int item = d_a[tid];if (tid < SIZE){atomicAdd(&(d_b[item]), 1);} }__global__ void histogram_shared_memory(int* d_a, int* d_b) {int tid = threadIdx.x + blockIdx.x * blockDim.x;int offset = blockDim.x * gridDim.x;__shared__ int cache[NUM_BIN];cache[threadIdx.x] = 0;//等待所有線程初始化共享內存完成__syncthreads();while (tid < SIZE){atomicAdd(&(cache[d_a[tid]]), 1);tid += offset;}//等待所有線程完成直方圖累加操作__syncthreads();//累加每個塊的直方圖統計結果atomicAdd(&(d_b[threadIdx.x]), cache[threadIdx.x]); }int main() {//定義CPU變量int h_a[SIZE];int h_b[NUM_BIN];for (int i = 0; i < SIZE; i++){h_a[i] = i % NUM_BIN;//初始化數據,數據值范圍:0~NUM_BIN-1}for (int i = 0; i < NUM_BIN; i++){h_b[i] = 0;}//定義GPU變量int* d_a, *d_b;//分配GPU內存cudaMalloc(&d_a, SIZE * sizeof(int));cudaMalloc(&d_b, NUM_BIN * sizeof(int));//拷貝數據:從CPU到GPUcudaMemcpy(d_a, h_a, SIZE * sizeof(int), cudaMemcpyHostToDevice);cudaMemcpy(d_b, h_b, NUM_BIN * sizeof(int), cudaMemcpyHostToDevice);//調用內核函數//histogram_without_atomic << <((SIZE + NUM_BIN - 1) / NUM_BIN), NUM_BIN >> > (d_a, d_b);//histogram_atomic << <((SIZE + NUM_BIN - 1) / NUM_BIN), NUM_BIN >> > (d_a, d_b);histogram_shared_memory << <((SIZE + NUM_BIN - 1) / NUM_BIN), NUM_BIN >> > (d_a, d_b);//等待GPU所有線程執行結束cudaDeviceSynchronize();//拷貝數據:從GPU到CPUcudaMemcpy(h_b, d_b, NUM_BIN * sizeof(int), cudaMemcpyDeviceToHost);//打印結果printf("直方圖統計結果:\n");for (int i = 0; i < NUM_BIN; i++){printf("數據為 %d 的統計數量:%d\n", i, h_b[i]);}//釋放內存cudaFree(d_a);cudaFree(d_b);system("pause");return 0; }3. 執行結果
因為結果較長,這里只截取部分結果圖,如下所示:
總結
為了更好的理解CUDA編程的理論知識,實踐是必不可少的,只有更多的實踐才能更好的理解新的知識,實踐出真知啊。
學習資料
《基于GPU加速的計算機視覺編程》
總結
以上是生活随笔為你收集整理的VS2017 CUDA编程学习实例3:CUDA实现直方图统计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt pro文件语法
- 下一篇: CUDA编程注意