GPGPU程式設計技術-從GLSL、CUDA到OpenCL 平方和演算法第三版
阿新 • • 發佈:2019-01-24
//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
請按任意鍵繼續…