1.OpenCL安装过程记录
2....查了半天没看懂,源码能简单明了的告诉我是干什么的有什么功能吗_百度知 ...
3.OpenCLï¼OpenGLåDirectXä¸è
çåºå«
4.OpenCL-01: PoCL环境配置
5.认识OpenCL和它的朋友们
6.在RK3588 GPU 安装TVM
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的开发者提供了清晰的安装和配置指南。
...查了半天没看懂,怎么增加指标源码能简单明了的告诉我是干什么的有什么功能吗_百度知 ...
1. OpenCL是一种图形处理单元(GPU)的通用运算应用程序接口(API)。
2. 它允许显卡执行通用浮点运算,例如视频转码,这项任务原本由CPU处理。
3. 随着显卡计算能力的提升,转码等任务可以高效地交给显卡完成。
4. OpenCL提供的接口使得程序员无需直接管理显卡资源,只需专注于算法,即可自动实现CPU到GPU的任务移交。
5. OpenCL是一个为异构计算平台设计的编程框架,支持CPU、GPU等多种处理器。
6. 它由基于C标准的语言编写kernels(设备上运行的函数)和一组定义控制平台的API组成。
7. OpenCL支持任务分割和数据分割的并行计算方法。
8. 作为开放工业标准之一,OpenCL与OpenGL(三维图形)和OpenAL(计算机音频)类似,扩展了GPU的应用范围。
9. OpenCL由非盈利组织Khronos Group管理,旨在促进技术发展。
. API提供给应用程序和开发人员访问一组例程的能力,无需访问源码或理解内部机制,从而简化了软件开发过程。
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ï¼èä¸ä»»ä½å ¬å¸çå¼åè é½å¯ä»¥åä¸å°è¯¥ææ¯çåå±ä¸æ¥ã
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是主导的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指令集。
在RK GPU 安装TVM
在RK GPU上安装TVM
RK搭载的ARM Mali G GPU,具备约GFLOPS的单精度运算能力,并支持OpenCL 2.1。本次将通过编译安装带有OpenCL功能的TVM,并在RK上运行模型。
配置OpenCL编译选项是关键步骤。首先,在RK系统中使用`sudo find / -name *mali.so`查找libmali.so,这是包含OpenCL相关操作的动态库。然后,在build/config.cmake文件中,将USE_OPENCL项目填写为libmali.so的地址。
接着,将OpenCL头文件目录CL放置于`/usr/include`中,并将路径添加到`~/.bashrc`的PATH变量中。执行命令于tvm的build目录下进行编译。
在完成编译后,需先卸载已有的TVM版本。具体操作为:通过`pip3 uninstall tvm`命令进行卸载,接着进入源码目录`apache-tvm-src-v0..0/python`,删除指定的目录与文件。之后,进入tvm目录继续清理,确保环境整洁。
安装TVM的过程如下:进入`apache-tvm-src-v0..0/python`目录执行相关安装命令。最后,通过验证步骤确认安装正确,查看输出结果,以确保TVM在RK GPU上运行正常。
参考官方文档以获取更多详细信息:tvm.apache.org/docs/install/