欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

基于ubuntu平台 介绍和配置OpenCL

程序员文章站 2022-03-11 15:48:00
Reference Resources:https://blog.csdn.net/wd1603926823/article/details/79139172#commentBox(Intel核显--OpenCL环境--Linux)https://blog.csdn.net/chifredhong/article/details/73931017( OpenCL浅析(1)-GPU和FPG......

Reference Resources:https://blog.csdn.net/wd1603926823/article/details/79139172#commentBox

(Intel核显--OpenCL环境--Linux)

https://blog.csdn.net/chifredhong/article/details/73931017( OpenCL浅析(1)-GPU和FPGA平台搭建)

https://blog.csdn.net/greenlight_74110/article/details/78461464 ('clinfo'找不到Intel GPU(Intel HD graphics))

OpenCL简介

OpenCL是由非盈利性组织Khronos Group组织发布的针对异构设备进行并行化计算的一套开源的API以及程序语言。

它提供两种并行化的模式,包括任务并行以及数据并行,目前针对GPU的引用,主要是以数据并行为主。OpenCL API是按照 C API定义的,由C和C++封装而成。使用OpenCL C语言编写的代码可以在支持OpenCL的设备上运行。OpenCL C是C99语言的子集,并适当地扩展到众多异构设备上执行数据并行代码的能力。

所谓异构设备,就是指底层硬件架构有较大不同的设备,比如CPU与GPU,FPGA(可编程门阵列),CPU中负责分支预测及跳转的控制单元和cache占据较大的面积,而ALU(算术逻辑单元)占据的比重远远小于GPU中的ALU面积比重,换句话说,CPU强于控制,弱于计算,而GPU强于计算,弱于控制。


基于ubuntu平台 介绍和配置OpenCL

上图中,绿色部分是逻辑计算单元,红色的存储单元,橙黄色的是控制单元。


安装OpenCL前的准备

OpenCL是一系列库和头文件,需要根据硬件安装对应的SDK,也就是说,如果希望使用Intel CPU作为并行设备,则必须安装Intel SDK,如果使用NVIDIA GPU作为并行设备,则必须安装NVIDIA SDK。这里给出在Intel CPU和NVIDIA GPU运行OpenCL的配置方法,可以根据自己的硬件情况选择,注意,虚拟机无法使用NVIDIA设备。新手推荐使用Intel SDK,安装方便,把系统搞崩溃的可能性较小。


clinfo是一个显示OpenCL平台和设备的软件,安装后,在命令行输入clinfo即可验证。

sudo apt-get install clinfo


OpenCL平台和OpenCL设备
一个opencl平台通常对应一个供应商。它负责为其设备提供opencl实现。例如,具有i7-4790 intel cpu的机器将会有一个opencl平台,大概命名为“intel opencl”,该平台将包括两个opencl设备:一个是intel cpu本身,另一个是intel hd graphics 4600 GPU。这个“intel opencl”平台正在为这两个设备提供opencl实现,并负责管理它们。
让我们再来一个例子,但这次是从Windows生态系统外面。运行os x的macbook和intel iris pro gpu和专用的geforce卡都将显示一个名为“apple”的opencl平台。两个gpus和cpu将显示为属于此平台的设备。这是因为“苹果”平台是为所有三种设备提供opencl实现的平台

但请记住:
1、opencl平台可以有一个或多个设备。
2、相同的设备可以具有来自不同供应商的一个或多个opencl实现。换句话说,opencl设备不仅可以属于一个平台。
3、该平台的opencl版本不一定与设备的opencl版本相同。

ICD和ICD loader
1、icd(可安装的客户端驱动程序),它是针对某个特定设备的专门的opencl实现,也就是opencl运行时。可以在amdocl.so/dll或intelopencl.so/dll这样的文件中找到它。它是指允许多个opencl平台共存的模型。它并不是核心功能,而是opencl的扩展。

2、icd loader(在opencl.dll / libopencl.so中):OpenCL Installable Client Driver (ICD) Loader是实现OpenCL应用程序与各硬件厂商提供的OpenCL驱动(platform)之间隔离的中间库。它用于管理同一系统中的多个icds

它与opencl应用程序相关联,并作为icd的占位符。
应用程序调用icd加载程序库导出的函数。然而,icd加载器根据所选的opencl平台决定要重定向到哪个icd。
icd加载机制是必需的,因为供应商的opencl实现通常只支持该供应商的硬件,但您可能希望在同一个opencl应用程序中使用来自不同供应商的多个设备。
基于ubuntu平台 介绍和配置OpenCL

icd只是一个可选的opencl扩展,标识符是cl_khr_icd。当你安装了某个厂商的SDK,就会在操作系统的注册表上添加相应的注册表项。opencl icd loader允许应用程序调用clIcdGetPlatformIDsKHR函数获取所有已经安装的平台的列表,从中选择一个平台,并将opencl api调用发送到底层实现。 khronos注册表中提供了icd加载程序库的源代码https://github.com/KhronosGroup/OpenCL-ICD-Loader。

注意,一台机器可以有几个opencl平台,每个平台都有自己的驱动程序和opencl版本,总是只有一个icd加载程序。 icd加载器充当所有安装的opencl平台的主管,并为所有opencl调用提供了唯一的入口点。基于平台ID,它将opencl主机调用分配到正确的驱动程序。

这样你就可以编译icd(windows上的opencl.dll或者linux上的libopencl.so),而不是直接给所有可能的驱动程序编译。在运行时,opencl应用程序将搜索icd并加载它。 icd依次在注册表(Windows)或特殊目录(linux)中查找注册的opencl驱动程序。您的软件的每个opencl调用将由icd解决,这将进一步调度请求到所选的opencl平台。

ICD loader在Windows上如何枚举Vendors?
在Windows上,和厂商想关的库文件是设定在注册表中的。ICD loader会扫描注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors的值,当DWORD中的每个值都为0时,ICD loader打开由名称指定的动态链接库,使用LoadLibraryA的值。例如,如果注册表[HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors]包含下列值"c:\\vendor a\\vndra_ocl.dll"=dword:00000000,那么ICD loader将打开"c:\vendor a\vndra_ocl.dll"库文件


添加Vendors
在成功加载了一个厂商ICD库后,ICD loader会从库文件中查询下列函数clIcdGetPlatformIDsKHR, clGetPlatformInfo, 和clGetExtensionFunctionAddress.如果其中任意一个函数不存在,则ICD loader会关闭并且忽略这个厂商的ICD库。
接下来,ICD loader查询可用的ICD-enable 平台,这个过程使用库中的clIcdGetPlatformIDsKHR函数。 对于每一种平台上,ICD加载器查询 平台的扩展字符串来验证cl_khr_icd的 支持,然后使用clGetPlatformInfo函数查询平台的厂商ICD扩展后缀 ,函数使用CL_PLATFORM_ICD_SUFFIX_KHR参数, 如果其中任何一个步骤失败,ICD loader将忽略 厂商ICD并继续到下一个。

正式安装

机器配置

本子型号:HP 15-ay179TX,cpu双核,主频2.5GHZ。

cpu采用Kaby Lake(GT2)架构,集成核显 intel  HD Graphics 620。

核显和集成显卡类似,一个集成在CPU内,一个焊接在主板上,均无法更换,占用主机内存。

独立显卡可以更换,且有独立显存。

本机独显型号: AMD  R5  M430  显存2G


安装之前的clinfo 如下:

基于ubuntu平台 介绍和配置OpenCL

基于ubuntu平台 介绍和配置OpenCL

从反馈信息中可以看到 只有一个平台 intel Gen OCL  Driver, 但是 平台下面并没有设备。


按照:https://software.intel.com/en-us/articles/sdk-for-opencl-gsg  来安装。

一、安装Intel OpenCL driver

官网给出了脚本直接安装:https://software.intel.com/sites/default/files/managed/f6/77/install_OCL_driver.sh_.txt  我之前都是自己新建一个txt将这段脚本复制过去,结果安装时总是出错,不能复制!要直接下载。

不会下载的来这找:https://download.csdn.net/download/bluenapa/10898959

下载命令:

-c      表示支持断点下载

wget -c xxxxxxxxxxxx

然后按照官网执行

mv   xxx   xxxxx   类似于重命名

sudo su  升级到超级用户?

$ mv install_OCL_driver.sh_.txt install_OCL_driver.sh
$ chmod 755 install_OCL_driver.sh
$ sudo su
$ ./install_OCL_driver.sh install 

基于ubuntu平台 介绍和配置OpenCL

始终报错,重新执行下载安装也没有用。安装失败。

、安装 opencl   sdk

没有找到脚本(install_SDK_prereq_ubuntu.sh_.txt)去安装,决定手动下载SDK然后安装。

sdk 下载地址(需要注册登录 intel 账号):https://signin.intel.com/Email?TARGET=https%3A%2F%2Fregistrationcenter.intel.com%2Fen%2Fforms%2F%3Fproductid%3D2863

安装中的几张图:

基于ubuntu平台 介绍和配置OpenCL基于ubuntu平台 介绍和配置OpenCL

最后的结果如下:

基于ubuntu平台 介绍和配置OpenCL

基于ubuntu平台 介绍和配置OpenCL

基于ubuntu平台 介绍和配置OpenCL

出现两个platfrom:一个是 Experimental OpenCL  2.1 CPU Only Platfrom,这个平台上有一个设备,是 i5-7200U  CPU。

另一个平台是 Intel   Gen   OCL  Driver ,下边没有设备。

目测这样的结果是有问题的。。。。。。。。。

果然,在运行kinect_briage的时候结果如下:

基于ubuntu平台 介绍和配置OpenCL


本文地址:https://blog.csdn.net/Bluenapa/article/details/85916194

相关标签: linux