cuda学习笔记对应例子

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值