【梨花带雨源码】【影迷大院 源码】【grbl源码讲解】opencl 源码

时间:2024-11-21 02:39:15 编辑:古玩收藏源码 来源:qq刷步源码

1.OpenCL,OpenGL和DirectX三者的区别
2.OpenCV中几种卷积的源码实现方式
3.OpenCL-01: PoCL环境配置
4.认识OpenCL和它的朋友们
5.OpenCL安装过程记录
6.OpenCL(Open Computing Language,开放计算语言)杂谈

opencl 源码

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在第行创建。grbl源码讲解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是mobx源码 ts主导的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。