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 自带核显设备了。

发表评论





*