1.OpenCLï¼OpenGLåDirectXä¸è
çåºå«
2.OpenCV中几种卷积的源码实现方式
3.OpenCL-01: PoCL环境配置
4.认识OpenCL和它的朋友们
5.OpenCL安装过程记录
6.OpenCL(Open Computing Language,开放计算语言)杂谈
OpenCLï¼OpenGLåDirectXä¸è çåºå«
ãä»ä¹æ¯OpenCL?源码
ããOpenCLå ¨ç§°Open Computing Languageï¼æ¯ç¬¬ä¸ä¸ªé¢åå¼æç³»ç»éç¨ç®ç并è¡ç¼ç¨çå¼æ¾å¼ãå è´¹æ åï¼ä¹æ¯ä¸ä¸ªç»ä¸çç¼ç¨ç¯å¢ï¼ä¾¿äºè½¯ä»¶å¼å人å为é«æ§è½è®¡ç®æå¡å¨ãæ¡é¢è®¡ç®ç³»ç»ãææ设å¤ç¼åé«æ轻便ç代ç ï¼èä¸å¹¿æ³éç¨äºå¤æ ¸å¿å¤çå¨(CPU)ãå¾å½¢å¤çå¨(GPU)ãCellç±»åæ¶æ以åæ°åä¿¡å·å¤çå¨(DSP)çå ¶ä»å¹¶è¡å¤çå¨ï¼å¨æ¸¸æã娱ä¹ãç§ç ãå»ççåç§é¢åé½æ广éçåå±åæ¯ã
ãã
ããOpenCL 1.0主è¦ç±ä¸ä¸ªå¹¶è¡è®¡ç®APIåä¸ç§é对æ¤ç±»è®¡ç®çç¼ç¨è¯è¨ç»æï¼æ¤å¤è¿ç¹å«å®ä¹äºï¼
ãã1ãCç¼ç¨è¯è¨å¹¶è¡æ©å±åé;
ãã2ãéç¨äºåç§ç±»åå¼æå¤çå¨çåæ æ°æ®ååºäºä»»å¡å¹¶è¡è®¡ç®API;
ãã3ãåºäºIEEE æ åçæ°åæ¡ä»¶;
ãã4ãä¸OpenGLãOpenGL ESåå ¶ä»å¾å½¢ç±»APIé«æäºéã
ããä»ä¹æ¯OpenGL?
ããOpenGL™ æ¯è¡ä¸é¢åä¸æ为广æ³æ¥çº³ç 2D/3D å¾å½¢ API, å ¶èªè¯çè³ä»å·²å¬çäºåç§è®¡ç®æºå¹³å°å设å¤ä¸çæ°åä¼ç§åºç¨ç¨åºãOpenGL™ æ¯ç¬ç«äºè§çªæä½ç³»ç»æå ¶å®æä½ç³»ç»çï¼äº¦æ¯ç½ç»éæçãå¨å å«CADãå 容åä½ãè½æºã娱ä¹ã游æå¼åãå¶é ä¸ãå¶è¯ä¸åèæç°å®çè¡ä¸é¢åä¸ï¼OpenGL™ 帮å©ç¨åºåå®ç°å¨ PCãå·¥ä½ç«ãè¶ çº§è®¡ç®æºç硬件设å¤ä¸çé«æ§è½ãæå ·å²å»åçé«è§è§è¡¨ç°åå¾å½¢å¤ç软件çå¼åã
ããOpenGLï¼å ¨åOpen Graphics Libraryï¼æ¯ä¸ªå®ä¹äºä¸ä¸ªè·¨ç¼ç¨è¯è¨ã跨平å°çç¼ç¨æ¥å£çè§æ ¼ï¼å®ç¨äºä¸ç»´å¾è±¡ï¼äºç»´ç亦å¯ï¼ãOpenGLæ¯ä¸ªä¸ä¸çå¾å½¢ç¨åºæ¥å£ï¼æ¯ä¸ä¸ªåè½å¼ºå¤§ï¼è°ç¨æ¹ä¾¿çåºå±å¾å½¢åºãOpenGLçå身æ¯SGIå ¬å¸ä¸ºå ¶å¾å½¢å·¥ä½ç«å¼åçIRIS GLãIRIS GLæ¯ä¸ä¸ªå·¥ä¸æ åç3Då¾å½¢è½¯ä»¶æ¥å£ï¼åè½è½ç¶å¼ºå¤§ä½æ¯ç§»æ¤æ§ä¸å¥½ï¼äºæ¯SGIå ¬å¸ä¾¿å¨IRIS GLçåºç¡ä¸å¼åäºOpenGLãOpenGLçè±æå ¨ç§°æ¯âOpen Graphics Libraryâï¼é¡¾åæä¹ï¼OpenGL便æ¯âå¼æ¾çå¾å½¢ç¨åºæ¥å£âãè½ç¶DirectXå¨å®¶ç¨å¸åºå ¨é¢é¢å ï¼ä½å¨ä¸ä¸é«ç«¯ç»å¾é¢åï¼OpenGLæ¯ä¸è½è¢«å代ç主è§ã
ããOpen GLä»ç¶æ¯å¯ä¸è½å¤å代微软对3Då¾å½¢ææ¯çå®å ¨æ§å¶çAPIãå®ä»ç¶å ·æä¸å®ççå½åï¼ä½æ¯Silicon Graphicså·²ç»ä¸å以任ä½è®©å¾®è½¯ä¸æ¦çæ¹å¼æ¨å¹¿Open GLï¼å èå®åå¨è¾é«çé£é©ã游æå¼å人åæ¯ä¸ä¸ªæçç¬ç«ææ³ç群ä½ï¼å¾å¤éè¦çå¼å人åç®åä»ç¶å¨ä½¿ç¨Open GLãå æ¤ï¼ç¡¬ä»¶å¼ååæ£å¨è®¾æ³å 强对å®çæ¯æãDirect3Dç®åè¿ä¸è½æ¯æé«ç«¯çå¾å½¢è®¾å¤åä¸ä¸åºç¨ï¼ Open GLå¨è¿äºé¢åå æ®çç»æ²»å°ä½ãæåï¼å¼æ¾æºç 社åºï¼å°¤å ¶æ¯Mesa项ç®ï¼ä¸ç´è´åäºä¸ºä»»ä½ç±»åç计ç®æºï¼æ 论å®ä»¬æ¯å¦ä½¿ç¨å¾®è½¯çæä½ç³»ç»ï¼æä¾Open GLæ¯æã
ãã
ããä»å¹´å¹´æ£å¼å ¬å¸OpenGL3.0çæ¬ã并ä¸å¾å°äºï¼nvçæ¯æï¼å ¶å®æ¹ç½ç«ä¸æä¾é对Nå¡çsdkä¸è½½ã
ããä»ä¹æ¯DirectX?
ããDirectXæ¯ä¸ç§åºç¨ç¨åºæ¥å£ï¼APIï¼ï¼å®å¯è®©ä»¥windows为平å°ç游ææå¤åªä½ç¨åºè·å¾æ´é«çæ§è¡æçï¼å 强3då¾å½¢å声é³ææï¼å¹¶æä¾è®¾è®¡äººåä¸ä¸ªå ±åç硬件驱å¨æ åï¼è®©æ¸¸æå¼åè ä¸å¿ 为æ¯ä¸åçç硬件æ¥åä¸åç驱å¨ç¨åºï¼ä¹éä½ç¨æ·å®è£ å设置硬件çå¤æ度ãè¿æ ·è¯´æ¯ä¸æ¯æç¹ä¸å¤ªæç½ï¼å ¶å®ä»åé¢æä¹ä¸è¯´ï¼Directå°±æ¯ç´æ¥çææï¼èåè¾¹çXå代表äºå¾å¤çææï¼ä»è¿ä¸ç¹ä¸æ们就å¯ä»¥çåºDirectXçåºç°å°±æ¯ä¸ºäºä¸ºä¼å¤è½¯ä»¶æä¾ç´æ¥æå¡çã
ããDirectXæ¯ç±å¾å¤APIç»æçï¼æç §æ§è´¨åç±»ï¼å¯ä»¥å为å大é¨åï¼æ¾ç¤ºé¨åã声é³é¨åãè¾å ¥é¨ååç½ç»é¨åã
ããæ¾ç¤ºé¨åæ ä»»å¾å½¢å¤ççå ³é®ï¼å为DirectDrawï¼DDrawï¼å Direct3Dï¼D3Dï¼ï¼åè 主è¦è´è´£2Då¾åå éãå®å æ¬å¾å¤æ¹é¢ï¼æ们ææ¾mpgãDVDçµå½±ãçå¾ãç©å°æ¸¸æççé½æ¯ç¨çDDrawï¼ä½ å¯ä»¥æå®ç解æææå线çé¨åé½æ¯ç¨çDDrawãåè å主è¦è´è´£3Dææçæ¾ç¤ºï¼æ¯å¦CSä¸çåºæ¯å人ç©ãFIFAä¸ç人ç©ççï¼é½æ¯ä½¿ç¨äºDirectXç Direct3Dã
ããOpenCLãOpenGLåDirectXä¹é´ä¸å¾ä¸è¯´çæ äº
ããä¸ç对AppleçOpenCLçæ¯æå°æ为å®åå±çéè¦å ç´ ï¼æ©å¨å¹´ä»£ä¸æï¼å¾®è½¯å°±æ¾ç»åªåé»æ¢OpenGLæ为è¡ä¸çæ åï¼ä»¥æ¨è¡èªå·±çDirectXæ¾å¡è½¯ä»¶å游æå·¥å ·ã微软çDirect Xèµ·åçæç¥æ¯ä¸ºäºæ¨å¨DOS游æå¼åè 转åWindowsï¼ä»æ¤ä¹åå®å°±è¢«ç»å®å¨Windowsä¸ä¸ºPC游ææå¡ï¼æ以å®ä» æ¯æWindowsã
ããæåå¸æ°ççDirectXä¹æ¨å¨äºå¼åè 转åææ°ççWindowsï¼æ¯å¦ææ°ççDirectX 就带æ¥äºä¸å°Vistaä¸å±æ¸¸æï¼ä»èæ¨å¨äºVistaçééï¼ç¶èå®å¹¶æªè¾¾å°é¢æçææï¼å 为Vistaçé度é»ç¢äºDirectX游æçå¸åºï¼å¼åè åªè½å°ç®æ å次转åXPã
ããOpenGLåApple
ããOpenGLçå身æ¯é«ç«¯å¾å½¢å·¥ä½ç«ååSGIå¨å¹´ä»£æå¼åçIRIS Gï¼å®å¨å¹´ä»£åææ为äºå¼æºçæ åãå½æ¶å¾®è½¯å¨å®çWindows ä¸åå¸äºDirect3Dï¼å°å®ä½ä¸ºOpenGLçç«äºå¯¹æãèå¨å¹´ä»£æ«ï¼å¾®è½¯æ¾ç»åSGIè¿è¡äºFahrenheit项ç®çå¼åï¼è¯å¾å°ä¸¤è ç»åèµ·æ¥ï¼ä½æ¯æ²¡ææåãä¹å微软继ç»å¼åDirectX并ä¸GPUåååä½ï¼çä¸OpenGLä»»å ¶åå±ã
ããOpenGLä¹åå ä¹éæ¸æ¶å¤±ï¼ç´å°å¹´ä»£æ«Appleæ¾å¼äºèªå·±çQuickDraw 3Dï¼å°OpenGLä½ä¸ºMac OS Xçå®æ¹3DåºãAppleçç³»ç»ç»OpenGLç¨åºå¸¦æ¥äºä¸å°æ¥æ¤è ãä¹åOpenGLæ£å¼è¢«Linuxéç¨ï¼ç°å¨ä¸»æµç游æå¹³å°ï¼å æ¬PSPï¼PS3 åWiié½æ¯æ该ææ¯ã
ããä½æ¯å¾®è½¯çXboxä¾å¤ï¼å®éç¨äºèªå·±çDirectX å¾å½¢åºï¼èå°OpenGLæé¤å¨å¤ãå¦ä»OpenGL对DirectXæ¥è¯´æ¯ä»¥åæ´æç«äºåäºãè微软计åå¨Windows 7ä¸çDirectX å¢å 类似äºOpenCLçææ¯ï¼ä»¥å®ç°GPGPUè¿ç®ãä½æ¯AppleçOpenCLè½æ´ç´§å¯å°ä¸OpenGL代ç ååå·¥ä½ï¼è½å¸¦æ¥æ´å¹¿æ³çæ¯æã Appleè¿å°OpenCLä½ä¸ºä¸ä¸ªå è´¹çï¼å¼æºçæ åï¼è®©ä»»ä½äººé½è½åä¸å°è¯¥å¹³å°ä¸æ¥ã
ããOpenGLåOpenCL设计çç¸ä¼¼æ§ï¼ä½¿å¼åè æ´æäºå¼åãæ¯å¦å¨OpenCLä¸è¿è¡æ°æ®èæå计ç®ï¼å¯ä»¥æç¸åç对象å¨OpenGLä¸è¿è¡å¾å½¢æ¸²æãåæ¶OpenGLä¸çå¾å½¢æ¸²æå¯ä»¥å¨OpenCLä¸è¿è¡å¤çå转æ¢ã
ããOpenCLå¾å°äºGPUååNVIDIAåAMDçæ¯æï¼åæ¶æ¯æAppleï¼SONY,任天å çå¹³å°ï¼è¿æ¯æLinuxåWindowsï¼èä¸ä»»ä½å ¬å¸çå¼åè é½å¯ä»¥åä¸å°è¯¥ææ¯çåå±ä¸æ¥ã
OpenCV中几种卷积的实现方式
自从opencv引入dnn模块后,卷积实现方式不断扩展,源码以适应PC、源码手机、源码边缘计算设备的源码电影源码系统部署需求。目前,源码可调用CUDA、源码OpenCL、源码Tengine、源码Vulkan实现卷积。源码Tengine、源码Vulkan特别适用于移动设备和边缘计算,源码它们内部是源码如何实现的?
Vulkan是一个渲染库,与OpenGL、源码DirectX等GPU渲染库相比,移动设备上使用较多,而深度学习模型又需要在移动设备上部署。因此,探索是否可以使用Vulkan实现卷积等深度学习操作。
接下来,让我们看看OpenCV是如何使用Vulkan实现深度神经网络中的卷积。
打开OpenCV源码库的modules/dnn/src目录,可以看到最后一个文件夹是vkcom。"vkcom"这个名字由"Vulkan"库本身与"comp"(glsl语言的源代码后缀)组成。glsl语言可以通过以下命令编译:“vkcom”。GLSL是OpenGL着色语言,用于编写OpenGL着色器的编程语言,通常与并行处理功能强大的GPU结合使用。深度学习操作如卷积、池化都是对图像颜色的处理,因此可以将这些操作实现为着色器,用GLSL编写,然后使用Vulkan调用GPU。刷脸买单源码
Vulkan实现的卷积代码示例如下:
代码中指定了输入输出变量(第3、6、9、行)。在第行计算了输出变量convolved_image_data的值。第行开始的for循环遍历卷积核的c、w、h,计算单个像素位置的卷积结果。显然,这个卷积仅计算一个像素位置的卷积结果,卷积核的滑动过程由Vulkan管理GPU,多个GPU计算单元并行完成。
在OpenCV中,文件conv.comp首先被编译为二进制,然后将此二进制作为字符串放入conv_spv.cpp中。cpp文件定义了conv_spv数组,其中包含编译后的卷积着色器执行代码。由OpBase::createShaderModule函数将此二进制送入vkCreateShaderModule,从而调度GPU。
通过分析代码,可以看到Vulkan实现的算子被调用的方式,这同样适用于CUDA、OpenCL、Ngraph、Inference Engine等实现的算子。
Vulkan渲染库在OpenCV中的调用逻辑已经阐述完毕。Tengine是如何使用的?在convolution_layer.cpp的forward函数的行,调用了tengine_forward(tengine_graph)。
Tengine_forward来自teng_run_graph函数,我们只需调用库即可得到结果。传入的graph是卷积图,由create_conv_graph在第行创建。创造狮导航源码create_conv_graph使用create_conv_node、create_input_node生成卷积算子所需的图。
使用Tengine相对使用Vulkan、CUDA等库完成算子,要简单许多。调用库内的函数生成节点,使用节点构建图即可,无需自己实现算子内的计算。
本文概述了OpenCV中卷积实现方式的多样性,以下为总结:
本文详细分析了使用Vulkan用着色器实现卷积计算的方法及其调用路径,这个路径在分析其他类型实现时也很有用。本文还探讨了不同库算子的兼容性。当然,不同算子兼容还涉及更多细节,本文仅关注卷积forward函数的传递。
本文后半部分简要介绍了Tengine在OpenCV中的集成。发现集成过程相对简单,在convolution_layer.cpp中直接运行Tengine库构建的卷积计算图。这也表明,如果存在更好的边缘计算库,很容易集成到OpenCV中。
通过几天的分析,我们已经了解了OpenCL、Vulkan、Tengine的实现方式。可以预计,CUDA、Halide、Inference Engine nn、Inference Engine NGraph等实现也会类似。
OpenCL-: PoCL环境配置
PoCL是基于MIT许可的开源OpenCL实现,专为多设备系统优化,通过集成具有OpenCL功能的注解校验正则源码设备,提升平台多样性与互操作性。PoCL支持广泛的CPU架构(x、ARM、RISC-V)与GPU,如通过libCUDA的NVIDIA设备,利用Level Zero的Intel GPU及不同功能等级的TCE ASIP(OpenASIP)。
在wsl2环境上,Ubuntu.用于安装pocl。对于其他框架的安装,则是可选的。使用工具clinfo运行测试。
OpenCL-ICD-Loader是一个关键中间库,实现OpenCL应用程序与特定硬件厂商的OpenCL驱动之间的隔离。将文件夹OpenCL-Headers-../CL复制至OpenCL-ICD-Loader-../inc进行源码编译。使用vscode、wsl与cmake作为编译工具,参考edgelee的vscode-opencl-samples进行实施。
最后,要实现设备查询的具体步骤,参考edgelee的vscode-opencl-samples -opencl-icd-device,并根据运行结果进行相关测试与调试。这将为您提供有关设备的详细信息,确保OpenCL应用程序在不同硬件上运行时的兼容性和性能。
认识OpenCL和它的朋友们
本文旨在深入探讨OpenCL及其关联技术,阐述它们在异构计算领域的应用与特点。
OpenCL,由Apple设计并由Khronos维护,是一款并行计算编程框架。它专为解决并行度不足、带宽较小和延迟较高的问题而设计,提供高效且灵活的并行处理能力。
在图形处理领域,OpenGL和DirectX是e语言360源码主导的API,分别用于3D图形渲染。OpenGL-ES是OpenGL的子集,专为移动设备和游戏主机设计。而OpenCL则专注于GPU的通用浮点运算,适用于视频转码、卷积、池化等计算任务。CUDA、Metal和DX则代表了NVIDIA、Apple和Microsoft开发的专用API,分别针对特定硬件优化。
最新动态显示,Apple正计划弃用第三方API,转而使用自家的Metal接口。同时,Khronos集团提议合并OpenGL和OpenCL进入Vulkan,使得Vulkan在图形和计算性能上将能与DirectX相抗衡。
接下来,我们将逐一介绍每个框架的核心特性和使用流程。
OpenCL框架由主机端和设备端两部分组成。主机端负责IO处理和内核程序的提交。存储器种类繁多,包括全局、局部和私有存储器。
执行流程如下:先通过clGetPlatformIDs和clGetDeviceIDs获取平台和设备信息;接着,使用clCreateContext创建上下文,管理同一平台下的多个设备;之后,根据设备创建命令队列;程序对象包含多个内核对象,通过程序编译后,内核和内存对象通过clCreateKernel、clCreateBuffer等接口创建并配置参数;内存通过clEnqueueWriteBuffer写入内核参数;执行内核使用clEnqueueNDRangeKernel或clEnqueueTask,最后使用clEnqueueReadBuffer获取运行结果;资源回收顺序为clReleaseKernel、clReleaseProgram等。
在源代码编写方面,OpenCL C语言遵循特定规则,不支持函数指针和递归,函数调用可以内联。内核函数以__kernel限定,返回值为void,参数类型分为__read_only、__write_only和__private等。矢量数据类型支持元素级运算和标量广播。
OpenCL的编译方式多样,包括分步编译、全编译、仿真编译和硬件编译等。在开发流程中,需要提前下载并解压板机支持包(BSP),设置环境变量,通常包含c文件和cl文件。部分卡可能需要先通过仿真编译得到aocx二进制文件。接着,利用makefile编译c文件生成主机端代码,并在调试环境中运行。最终,将硬件代码加载到设备卡上执行。
值得一提的是,OpenCL代码编译依赖特定厂商的工具,如Altera的aoc编译器,现在归Intel所有,主要针对Intel FPGA。NVIDIA和IMG等厂商也提供各自的编译器,将OCL代码编译为GPU指令集。
OpenCL安装过程记录
大创项目接近尾声,决定尝试学习和使用OpenCL进行开发。在搜索安装教程时,发现大多数资料针对的是CUDA Toolkit或直接提供文件复制方式,针对Linux系统的Khronos SDK教程则主要面向Windows用户。考虑到自己对编程基础的熟练程度,决定亲自完成安装过程并记录下来,以供后来者参考。
安装环境为Ubuntu . LTS(基于Linux 5.),使用GCC版本.3.0、CMake版本3..1。
首先,从Khronos官方获取OpenCL SDK源代码。理论上,可以使用Git进行克隆,但实际情况中遇到了GitHub网络不稳定的问题。建议在稳定网络环境下使用Git或通过第三方下载工具辅助下载源代码。同时,注意SDK将某些必需文件设置为子项目(如OpenCL-SDK/external/OpenCL-Headers),需要进入子项目手动下载。
在终端中切换到下载目录,并执行CMake。配置过程会自动检测并提示缺失的依赖项,尝试自动安装。在安装过程中,遇到了OpenGL、doxygen、X_X_LIB等依赖需要手动通过apt安装。
解决完依赖项后,理论上可进行编译。在终端中运行CMake并指定安装目录。编译完成后,OpenCL库被安装到电脑中。
接下来,配置可执行文件的依赖。在/etc/ld.so.conf.d目录下创建一个opencl.conf文件,写入安装目录下的动态库路径,如在/opt/OpenCL下,则动态库路径应为/opt/OpenCL/lib。使用Vim编辑器打开并保存文件。执行ldconfig命令以应用配置。
解决编译器问题。可以简单地将/opt/OpenCL/lib和/usr/include中的内容复制到相应目录,以避免手动指定链接库。更复杂的方法是修改gcc的specs文件,使编译器不再需要-lOpenCL选项。不过,这种方法较为繁琐,本文不作深入讨论。
通过符号链接解决编译器依赖问题。运行ln命令创建链接,使得编译器可以访问/usr/lib/CL/...,实际内容仍存储在/opt/OpenCL中。在编译时仍然需要添加-lOpenCL选项。
至此,OpenCL的安装配置已完成。尝试编写一段测试代码以验证环境是否正常工作。测试代码输出CL_DEVICE_EXTENSIONS中的内容,以了解设备的扩展支持情况,例如是否支持双精度浮点数(cl_khr_fp)。
总结代码示例及其编译选项,确保测试代码能够正确执行,验证OpenCL环境配置是否正确。至此,通过详细的步骤记录,为希望学习和使用OpenCL的开发者提供了清晰的安装和配置指南。
OpenCL(Open Computing Language,开放计算语言)杂谈
OpenCL,即开放计算语言,是一个用于异构平台编程的框架,同时也是异构并行计算的行业标准,由Khronos Group维护。它适用于包括CPU、GPU、FPGA、DSP以及各类AI加速器在内的异构平台。OpenCL架构可以从四个角度展开:平台模型、内存模型、执行模型和编程模型。
在平台模型中,OpenCL由一个主机连接一个或多个OpenCL设备组成,设备内部可以进一步划分为计算单元(CU),CU则可能包含处理单元(PE),PE最终执行计算任务。OpenCL程序由两部分构成:主机代码和设备内核代码,主机运行主机代码,并将内核代码以命令形式提交至OpenCL设备进行执行。
执行模型阐述了主机如何高效地利用OpenCL设备的计算资源完成计算处理。Context代表了内核执行环境,包含设备、内核对象、程序对象、内存对象等资源。执行过程中的核心是内核,放置于设备上运行。执行前,需要创建索引空间NDRange。工作项(work-item)组织成工作组(work-group),再组织为NDRange,最终映射至设备的计算单元上。工作项可以通过全局索引或工作组索引加局部索引的方式找到。
内存模型描述了主机和设备如何看待数据。包含主机内存、全局内存、常量全局内存、本地内存和私有内存。全局内存由主机和设备共用,允许读写操作。常量全局内存允许主机读写,设备读操作。本地内存为CU内部使用,主机无法访问。私有内存为PE专用,主机和PE都无法访问。
编程模型涉及两个主要部分:主机端代码和设备端内核代码。编程过程中需要维护Context,代表执行环境。从cl源代码中创建Program对象并编译,运行时创建Kernel对象和内存对象,设置参数和输入后将Kernel送入执行队列。最终等待计算结束,获取结果。
OpenCL应用开发的基本流程包括创建Context、加载内核、分配内存、设置参数、执行内核和获取结果。示例代码提供了一个向量加法操作的实现,环境为Ubuntu .,使用了Intel CPU的OpenCL SDK。