1. 程式人生 > >GPGPU程式設計技術-從GLSL、CUDA到OpenCL 平方和演算法第三版

GPGPU程式設計技術-從GLSL、CUDA到OpenCL 平方和演算法第三版

//GPGPU程式設計技術-從GLSL、CUDA到OpenCL  平方和演算法第三版 增加計時函式  //
//書中程式168頁
#include <stdio.h>
#include <iostream>
#include <cuda_runtime.h> // For the CUDA runtime routines (prefixed with "cuda_")
#include <device_launch_parameters.h> //我在查詢中找到的標頭檔案 有可能有別的表達方式
#include <time.h> //計時用的函式庫


#define DATA_SIZE 1048576   //4MB 的資料
#define THREAD_NUM 256 //執行緒數 using namespace std; int anData[DATA_SIZE]; //生成隨機資料量 void GenerateNumber(int *pnNumber, int nSize) { for (int i = 0; i < nSize; i++) pnNumber[i] = rand() % 10; } //全域性函式計算平方和核心:在主機上呼叫,在裝置上執行 __global__ static void sumofSquares(int *pnNum, int* pnResult,clock_t *pclock_ttime) { int
tid = threadIdx.x; int nSum = 0; int i; int nSize = 0; if (DATA_SIZE % THREAD_NUM) nSize = DATA_SIZE / THREAD_NUM + 1; else nSize = DATA_SIZE / THREAD_NUM; //nSize 一個執行緒計算的資料量 //計時開始 clock_t clock_tstart; if ( tid == 0 ) clock_tstart = clock(); //用了一個執行緒計時,足以精確請放心 for
( i=tid ; i < DATA_SIZE ; i += THREAD_NUM) { nSum += (pnNum[i] * pnNum[i]); } pnResult[tid] = nSum; //計時結束 if ( tid == 0) *pclock_ttime = clock() - clock_tstart; //用了一個執行緒計時 } void main() { GenerateNumber(anData, DATA_SIZE); //生成隨機資料量 int *pnGpuData, *pnResult; clock_t *pclock_ttime;//儲存時間的 int *nSummat; cudaMallocHost((void**)&nSummat, sizeof(int) * THREAD_NUM); cudaMalloc ((void**)&pnGpuData, sizeof(int) * DATA_SIZE); cudaMalloc ((void**)&pnResult , sizeof(int) * THREAD_NUM); cudaMalloc((void**)&pclock_ttime, sizeof(clock_t)); cudaMemcpy(pnGpuData, anData, sizeof(int)*DATA_SIZE, cudaMemcpyHostToDevice); //本版本是基礎版本 在此基礎上學習逐漸記憶體與核心並行優化 //所以這裡只用了一個核心 sumofSquares <<< 1, THREAD_NUM , 0 >>>(pnGpuData, pnResult,pclock_ttime); cudaMemcpy(nSummat, pnResult, sizeof(int) * THREAD_NUM, cudaMemcpyDeviceToHost); clock_t pclocksum; cudaMemcpy(&pclocksum,pclock_ttime, sizeof(clock_t), cudaMemcpyDeviceToHost); //在cpu上最後加和運算 int finishsum = 0; for (size_t i = 0; i < THREAD_NUM; i++) { finishsum = finishsum + nSummat[i]; } printf("SuM = %d Time = %d\n", finishsum, pclocksum); cudaFree(pnGpuData); cudaFree(pnResult); cudaFree(pclock_ttime); cudaThreadExit(); //加上這個可以用 NVIDIA visual profiler進行分析 system("pause"); //return 0; }

執行結果:

SuM = 29887816 Time = 3994774
請按任意鍵繼續…