这篇文章的重点是啥:
关于OpenCL整体工作流程的文章有很多,比较好的有知乎华叔的文章和OpenCL 2.0 异构计算。流程他们已经讲得很详细了,我就不简单重复了,这篇博客主要是弄一个可运行代码,然后,强调一些我觉得重要的东西。
OpenCL的工作流程
创建并执行一个简单的OpenCL应用大致需要以下几步:
- 查询平台和设备信息
- 创建一个上下文
- 为每个设备创建一个命令队列
- 创建一个内存对象(数组)用于存储数据
- 拷贝输入数据到设备端
- 使用OpenCL C代码创建并编译出一个程序
- 从编译好的OpenCL程序中提取内核
- 执行内核
- 拷贝输出数据到主机端
- 释放资源
在下面的代码中,很容易找到对应的代码。
简单的可运行代码
这里复用了前面Windows下环境配置中的代码,运行时输出Result: 3
即为正确运行。
#include <CL/cl.h>
#include <iostream>
const int N = 1024;
const size_t size = N * N * sizeof(float);
const char* getErrorString(cl_int error) {
switch (error) {
// run-time and JIT compiler errors
case 0: return "CL_SUCCESS";
case -1: return "CL_DEVICE_NOT_FOUND";
case -2: return "CL_DEVICE_NOT_AVAILABLE";
case -3: return "CL_COMPILER_NOT_AVAILABLE";
case -4: return "CL_MEM_OBJECT_ALLOCATION_FAILURE";
case -5: return "CL_OUT_OF_RESOURCES";
case -6: return "CL_OUT_OF_HOST_MEMORY";
case -7: return "CL_PROFILING_INFO_NOT_AVAILABLE";
case -8: return "CL_MEM_COPY_OVERLAP";
case -9: return "CL_IMAGE_FORMAT_MISMATCH";
case -10: return "CL_IMAGE_FORMAT