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、当调用发生错误时输出错误信息,并返回true
2、未发生错误时返回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、当调用发生错误时输出错误信息,并返回true
2、未发生错误时返回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 *DataHost1
2、int NumberOfDataHost1
3、int **DataDevice1
参数说明:
1、主机数据1
2、主机数据数目
3、设备数据1指针
作用:
1、初始化cuda计算数据
2、成功返回true
3、失败返回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 *DataDevice1
2、int NumberOfDataDevice1
参数说明:
1、设备数据1
2、设备数据数目
作用:
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 *DataDevice1
2、int NumberofDataHost1
3、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;
}