CentOS 6编译Intel Beignet OpenCL
关于 Intel Beignet OpenCL
之前在 Linux 上为了测试 Intel 核显安装了 Intel 官方闭源的 OpenCL Drivers 库,也解决了 CentOS 6 系统下 C++ 程序的问题,不过换了一台设备之后发现该 OpenCL 库却与 i3-3220 CPU 自带的 HD Graphics 2500 核显不兼容,OpenCL 不能正确加载核显设备。
由于 Intel 闭源的 OpenCL Drivers 现在基本上不再更新了,因此我想着可以试试 Intel 官方的开源 Beignet OpenCL 实现,其 GitHub 项目主页:
https://github.com/intel/beignet/
当然如果你用的是 Intel Gen8、Gen9 等比较新的核显,大可以试试最新开源的 Intel NEO Compute Driver。
Beignet OpenCL 主页介绍编译该项目需要安装 libdrm、libdrm_intel 以及最低 3.6 版本的 LLVM,在 CentOS 6 系统下前面两个倒好解决,直接从 Freedesktop 网站上下载最新版本 libdrm 源代码编译安装即可;LLVM 略显麻烦,本文主要记录 CentOS 6 下 LLVM 升级方法。
Fedora Copr 升级 LLVM
虽然 CentOS 6 这种老系统 EPEL 自带的 LLVM 也只是 3.4.2 版本无法编译 Beignet OpenCL,不过还好 Fedora Copr 库里有人提供了编译好了的新版本 LLVM 包。
例如我找到的一个用的人比较多而且符合 Beignet OpenCL 需求的 LLVM 5.0.0 版本:
https://copr.fedorainfracloud.org/coprs/alonid/llvm-5.0.0/
作者提供了 CentOS 6、CentOS 7 及 Fedora 26 系统下的安装包,我们可以在 CentOS 6 下通过 yum 安装,依赖的包也会自动安装:
[root@cenntos ~]# curl -o /etc/yum.repos.d/alonid-llvm-5.0.0-epel-6.repo https://copr.fedorainfracloud.org/coprs/alonid/llvm-5.0.0/repo/epel-6/alonid-llvm-5.0.0-epel-6.repo [root@cenntos ~]# yum makecache [root@cenntos ~]# yum install llvm-5.0.0-devel llvm-5.0.0-static clang-5.0.0-devel
安装完成之后最好修改对应用户的 .bash_profile
文件将 /opt/llvm-5.0.0/bin
目录附加到 PATH
系统环境变量中。
不过可惜的是通过 Copr 安装的 LLVM 5.0.0 版本在 Beignet OpenCL 的链接阶段会报错退出,无法正常编译。
手工编译新版本 LLVM
看来对于 CentOS 6 这种老系统只能手工编译新版本的 LLVM 了,安装官网介绍的步骤来编译的话比较繁琐,不过还好 Linux 下相当流行的 Mesa 3D 图形库默认就是用 CentOS 6 容器来编译的,可以参考 mesa-builds 的提交记录:
Move to using a CentOS6 container
为了省事我就根据 mesa-builds 的 Dockerfile 改了一个自动编译 LLVM 3.9.1 版本的脚本,此脚本会安装 Software Collections 并使用新版本 gcc、g++ 和 Python 编译 LLVM:
yum install -y tar xz bzip2 wget git libtool automake libX11-devel libXext-devel libxcb-devel bison flex centos-release-scl yum install -y devtoolset-4-gcc devtoolset-4-gcc-c++ python27 mkdir -p /opt cd /opt && \ wget https://cmake.org/files/v3.5/cmake-3.5.2-Linux-x86_64.tar.gz && \ tar -xvf cmake-3.5.2-Linux-x86_64.tar.gz && \ rm -f cmake-3.5.2-Linux-x86_64.tar.gz cd /opt && \ wget http://llvm.org/releases/3.9.1/llvm-3.9.1.src.tar.xz && \ tar -xvf llvm-3.9.1.src.tar.xz && \ mkdir llvm-3.9.1.bld && \ cd llvm-3.9.1.bld && \ /usr/bin/scl enable devtoolset-4 python27 -- \ /opt/cmake-3.5.2-Linux-x86_64/bin/cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/opt/llvm-3.9.1 \ -DLLVM_BUILD_LLVM_DYLIB=ON \ -DLLVM_ENABLE_RTTI=ON \ -DLLVM_TARGETS_TO_BUILD=X86 \ -DLLVM_INSTALL_UTILS=ON \ /opt/llvm-3.9.1.src && \ /usr/bin/scl enable devtoolset-4 python27 -- make -j16 install
需要注意最后一行的 make 命令的线程数请根据实际硬件配置指定,我用的编译服务器配了 16GB 内存才敢指定 16 个线程。
新版本 LLVM 默认安装在 /opt
目录下,为了方便使用我先修改当前用户的 .bash_profile
文件中的 PATH
环境变量:
[root@cenntos ~]# PATH=$PATH:$HOME/bin:/opt/llvm-3.9.1/bin [root@cenntos ~]# export PATH
同时增加 LLVM 库文件目录,然后运行 ldconfig
刷新:
[root@cenntos ~]# cat /etc/ld.so.conf.d/llvm-3.9.1.conf /opt/llvm-3.9.1/lib
编译 Beignet OpenCL
安装并配置好新版本 LLVM 之后,我们就可以按照 GitHub 项目主页上的说明编译 Beignet OpenCL 了,首先安装需要的开发包:
[root@cenntos ~]# yum -y install epel-release [root@cenntos ~]# yum install -y libdrm-devel libXfixes-devel opencl-headers ocl-icd-devel [root@cenntos ~]# yum install -y zlib-devel elfutils-libelf-devel gettext ncurses-devel
检出 Beignet 源代码并使用 cmake3 编译:
[root@cenntos ~]# git clone https://github.com/intel/beignet.git [root@cenntos ~]# cd beignet && mkdir build && cd build [root@cenntos build]# /opt/cmake-3.5.2-Linux-x86_64/bin/cmake .. [root@cenntos build]# make -j8
编译成功之后,按照 Beignet 项目说明将库文件和 ICD 等相关文件安装到目标 CentOS 6 系统,然后再运行 clinfo 命令应该就能看到 i3-3220 自带核显设备了。