学习OpenCL与卷积神经网络 Day2——OpenCL主程序简单框架的构建

本文介绍了一个使用OpenCL进行矩阵运算的简易程序。该程序通过C语言在主机上和CL核中分别执行矩阵相乘,并比较结果确保正确性。文章详细展示了从平台、设备的选择到程序的编译、执行全过程。

简易程序介绍

今天我们就拿一个简单矩阵做例子
在这里插入图片描述
我们在C语言(主机上)跑一次,在CL核中跑一次,然后对比其计算结果,若计算值相同则输出结果。

CL核程序

程序很简单,就是通过dot()函数进行简单的矩阵相乘运算

__kernel void mac(__global float4*matrix,
	__global float4*vector,
	__global float* result)
{
   
   
	int i = get_global_id(0);
	result[i] = dot(matrix[i], vector[0]);
}

CL程序这里就不多加赘述

主程序分步

首先我们要对各部件进行定义

    cl_platform_id	platform_id = NULL;
	cl_uint			ret_num_platforms;
	cl_device_id	device_id = NULL;
	cl_uint			ret_num_devices;
	cl_context		context = NULL;
	cl_command_queue command_queue = NULL;
	cl_mem  mat_buff = NULL;
	cl_mem  vec_buff = NULL;
	cl_mem  res_buff = NULL;
	cl_program		program = NULL;
	cl_kernel		kernel = NULL;
	size_t			kernel_code_size;
	char			*kernel_str;
	cl_int			ret;
	FILE			*fp;
	size_t work_units_per_kernel;

这里对平台/(数量)、设备/(数量)、上下文、命令、缓存、程序、内核等进行了定义
接下来我们要对矩阵进行定义并计算

float mat[16], vec[4], result[4];
	float correct[4] = {
   
    0.0f ,0.0f,0.0f,0.0f };
for (int i = 0; i < 16; i++)
	{
   
   
		mat[i] = i * 2.0f;
	}
	for (int i = 0; i < 4; i++)
	{
   
   
		vec[i] = i * 3.0f;
		correct[0] += mat[i] * vec[i];
		correct[1] += mat[i + 4] * vec[i];
		correct[2] += mat[i + 8] * vec[i];
		correct[3] += mat[i + 12] * vec[i];
	}

至此主程序中的矩阵计算已经结束了,接下来是对OpenCL程序的设计
首先是获取连接上下文的平台及设备,以及上下文的创建

kernel_str = (char *)malloc(MAX_SOURCE_SIZE);
	ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms);
	ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id,
		&ret_num_devices);
	context = 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ivan'yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值