简易程序介绍
今天我们就拿一个简单矩阵做例子

我们在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 =

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

被折叠的 条评论
为什么被折叠?



