cuda学习笔记对应例子

来源:互联网 发布:nginx 403 forbidden 编辑:程序博客网 时间:2024/05/03 14:30

cuda学习笔记对应例子,有详细注释

/***********************************************cuda头文件***********************************************/#include "cuda_runtime.h"#include "device_launch_parameters.h"/***********************************************标准c头文件***********************************************/#include <stdio.h>#include <stdlib.h>/***********************************************错误处理函数***********************************************//***********************************************中文函数名:cuda调用api发生错误英文函数名:CudaCallApiHadError返回值类型:bool参数:1、cudaError_t Error_code参数说明:1、错误代码作用:1、当调用发生错误时输出错误信息,并返回true2、未发生错误时返回false***********************************************/bool CudaCallApiHadError(cudaError_t Error_code){if (Error_code != cudaSuccess){printf("Cuda had an error:%s", cudaGetErrorString(Error_code));return true;}else{return false;}}/***********************************************中文函数名:cuda调用核函数时发生错误英文函数名:CudaCallKernelHadError返回值类型:bool参数:无参数说明:无作用:1、当调用发生错误时输出错误信息,并返回true2、未发生错误时返回false***********************************************/bool CudaCallKernelHadError(){cudaError_t Error_code;Error_code=cudaGetLastError();if (Error_code != cudaSuccess){printf("Cuda had an error:%s", cudaGetErrorString(Error_code));return true;}else{return false;}}/***********************************************初始化数据***********************************************//***********************************************中文函数名:cuda初始化数据例子英文函数名:CudaInitDataDemo返回值类型:bool参数:1、int *DataHost12、int NumberOfDataHost13、int **DataDevice1参数说明:1、主机数据12、主机数据数目3、设备数据1指针作用:1、初始化cuda计算数据2、成功返回true3、失败返回false***********************************************/bool CudaInitDataDemo(int *DataHost1, int NumberOfDataHost1, int **DataDevice1){int DataDeviceLen;DataDeviceLen = NumberOfDataHost1*sizeof(int);if (CudaCallApiHadError(cudaMalloc(DataDevice1, DataDeviceLen))){return false;}else{if (CudaCallApiHadError(cudaMemcpy(*DataDevice1, DataHost1, DataDeviceLen, cudaMemcpyHostToDevice))){cudaFree(*DataDevice1);return false;}else{return true;}}}/***********************************************反初始化数据***********************************************//***********************************************中文函数名:cuda反初始化数据例子英文函数名:CudaUinitDataDemo返回值类型:void参数:1、int *DataDevice1参数说明:1、设备数据1作用:1、初始化cuda计算数据***********************************************/void CudaUinitDataDemo(int *DataDevice1){cudaFree(DataDevice1);}/***********************************************核函数***********************************************//***********************************************中文函数名:cuda内核函数例子英文函数名:CudaKernelDemo返回值类型:void参数:1、int *DataDevice12、int NumberOfDataDevice1参数说明:1、设备数据12、设备数据数目作用:1、每个数据加1***********************************************/__global__ void CudaKernelDemo(int *DataDevice1, int NumberOfDataDevice1){unsigned int Idx;Idx = threadIdx.x + blockDim.x *threadIdx.y + blockDim.x*blockDim.y *threadIdx.z +(blockIdx.x + gridDim.x*blockIdx.y)*blockDim.x*blockDim.y*blockDim.z;if (Idx == 0){printf("gridDim.x:%d,gridDim.y:%d,blockDim.x:%d,blockDim.y:%d,blockDim.z:%d\n", gridDim.x, gridDim.y, blockDim.x, blockDim.y, blockDim.z);}if (Idx >= NumberOfDataDevice1){return;}else{DataDevice1[Idx] = DataDevice1[Idx] + 1;printf("DeviceData1[%d]=%d\n", Idx, DataDevice1[Idx]);return;}}/***********************************************从设备获取结果***********************************************//***********************************************中文函数名:cuda从设备获取数据例子英文函数名:CudaGetDataFromDeviceDemo返回值类型:bool参数:1、int *DataDevice12、int NumberofDataHost13、int **DataHost1参数说明:1、设备数据2、设备数据数目3、主机数据指针作用:1、演示核函数的调用方法2、打印结果***********************************************/bool CudaGetDataFromDeviceDemo(int *DataDevice1, int NumberofDataHost1, int **DataHost1){if (CudaCallApiHadError(cudaMemcpy(*DataHost1, DataDevice1, NumberofDataHost1, cudaMemcpyDeviceToHost))){return false;}else{return true;}}/***********************************************调用cuda***********************************************//***********************************************中文函数名:cuda调用核函数例子英文函数名:CudaKernelDemo返回值类型:void参数:无参数说明:无作用:1、演示核函数的调用方法2、打印结果***********************************************/void CudaCallKernelDemo(){int DataHost1[100] = {1};int *DataHost2;int NumberOfDataHost1 = 100;int *DataOfDevice1;int NumberOfDataDevice1;int i;DataHost2 = (int *)malloc(100 * sizeof(int));for (i = 0; i < 100; i++){DataHost1[i] = 1;DataHost2[i] = 0;}NumberOfDataDevice1 = NumberOfDataHost1;dim3 GridDim, BlockDim;GridDim = { 2, 2, 1 };BlockDim = { 5, 10, 1 };CudaInitDataDemo(DataHost1, NumberOfDataHost1, &DataOfDevice1);CudaKernelDemo<<<GridDim, BlockDim >>>(DataOfDevice1, NumberOfDataDevice1);CudaCallKernelHadError();CudaGetDataFromDeviceDemo(DataOfDevice1, NumberOfDataDevice1*sizeof(int), &DataHost2);for (i = 0; i < NumberOfDataDevice1; i++){printf("DataHost1[%d]:%d\n", i, DataHost1[i]);printf("DataHost2[%d]:%d\n", i, DataHost2[i]);}CudaUinitDataDemo(DataOfDevice1);free(DataHost2);}/***********************************************主函数***********************************************/int main(){CudaCallKernelDemo();getchar();getchar();    return 0;}


0 0