Beignet is an open source implementation of the OpenCL specification - a generic
compute oriented API. This code base contains the code to run OpenCL programs on
Intel GPUs which basically defines and implements the OpenCL host functions
required to initialize the device, create the command queues, the kernels and
the programs and run them on the GPU. The code base also contains the compiler
part of the stack which is included in
backend/. For more specific information
about the compiler, please refer to
The project depends on the following external libaries:
- libdrm libraries (libdrm and libdrm_intel)
- Various LLVM components
- If run with X server, beignet needs XLib, Xfixes and Xext installed. Otherwise, no X11 dependency.
And if you want to work with the standard ICD libOpenCL.so, then you need two more packages (the following package name is for Ubuntu):
If you don't want to enable ICD, or your system doesn't have ICD OpenCL support, you can still link to the beignet OpenCL library. You can find the beignet/libcl.so in your system's library installation directories.
Note that the compiler depends on LLVM (Low-Level Virtual Machine project). Right now, the code has been compiled with LLVM 3.3/3.4. It will not compile with anything older.
LLVM 3.3 , 3.4 and 3.5 are supported. Till now, the recommended LLVM/CLANG version is 3.5. There are some severe OpenCL related regression in clang 3.4 version.
Note about LLVM 3.4
- If you want to try Clang/LLVM 3.4, you need to disable terminfo: --disable-terminfo. It's a llvm 3.4 bug.
Please be noted that the code was compiled on GCC 4.6, GCC 4.7 and GCC 4.8. Since the code uses really recent C++11 features, you may expect problems with older compilers.
How to build and install
The project uses CMake with three profiles:
- Debug (-g)
- RelWithDebInfo (-g with optimizations)
- Release (only optimizations)
Basically, from the root directory of the project
> mkdir build
> cd build
> cmake ../ # to configure
CMake will check the dependencies and will complain if it does not find them.
The cmake will build the backend firstly. Please refer to: OpenCL Gen Backend to get more dependencies.
Once built, the run-time produces a shared object libcl.so which basically
directly implements the OpenCL API. A set of tests are also produced. They may
be found in
> make install
It installs the following six files to the beignet/ directory relatively to your library installation directory. - libcl.so - libgbeinterp.so - libgbe.so - ocl_stdlib.h, ocl_stdlib.h.pch - beignet.bc
It installs the OCL icd vendor files to /etc/OpenCL/vendors, if the system support ICD. - intel-beignet.icd
How to run
After build and install of beignet, you may need to check whether it works on your platform. Beignet also produces various tests to ensure the compiler and the run-time consistency. This small test framework uses a simple c++ registration system to register all the unit tests.
You need to call setenv.sh in the utests/ directory to set some environment variables firstly as below:
> . setenv.sh
will run all the unit tests one after the others
> ./utest_run some_unit_test0 some_unit_test1
will only run
On all supported target platform, the pass rate should be 100%. If it is not, you may need to refer the "Known Issues" section.
- 3rd Generation Intel Core Processors
- Intel “Bay Trail” platforms with Intel HD Graphics
- 4th Generation Intel Core Processors, need kernel patch currently, see below for details:
GPU hang issues. To check whether GPU hang, you could execute dmesg and check whether it has the following message:
[17909.175965] [drm:i915_hangcheck_hung] *ERROR* Hangcheck timer elapsed...If it does, there was a GPU hang. Usually, this means something wrong in the kernel, as it indicates the OCL kernel hasn't finished for about 6 seconds or even more. If you think the OCL kernel does need to run that long and have confidence with the kernel, you could disable the linux kernel driver's hang check feature to fix this hang issue. Just invoke the following command on Ubuntu system:
# echo -n 0 > /sys/module/i915/parameters/enable_hangcheck
But this command is a little bit dangerous, as if your kernel really hang, then the gpu will lock up forever until a reboot.
Almost all unit tests fail on Linux kernel 3.15/3.16. There is a known issue in some versions of linux kernel which enable register whitelist feature but miss some necessary registers which are required for beignet. The problematic version are around 3.15 and 3.16 which have commit f0a346b... but haven't commit c9224f... If it is the case, you can apply c9224f... manually and rebuild the kernel or just disable the parse command by invoke the following command (use Ubuntu as an example):
# echo 0 > /sys/module/i915/parameters/enable_cmd_parser
Some unit test cases, maybe 20 to 30, fail on 4th Generation (HSW) platform. The 4th Generation Intel Core Processors's support requires some Linux kernel modification. You need to apply the patch at: https://01.org/zh/beignet/downloads/linux-kernel-patch-hsw-support
Precision issue. Currently Gen does not provide native support of high precision math functions required by OpenCL. We provide a software version to achieve high precision, which you can turn on through
export OCL_STRICT_CONFORMANCE=1. But be careful, this would make your CL kernel run a little longer.
cl_khr_gl_sharing. This extension highly depends on mesa support. It seems that mesa would not provide such type of extensions, we may have to hack with mesa source code to support this extension. This feature used to work with a previous mesa git version. But now, it's simply broken.
In terms of the OpenCL 1.2 spec, beignet is quite complete now. We can pass almost all the piglit OpenCL test cases now. And the pass rate for the OpenCV test suite is also good which is about 99%. There are still some remains work items listed as below, most of them are extension support and performance related.
Performance tuning. There are some major optimizations need to be done, Peephole optimization, convert to structured BBs and leverage Gen's structured instructions, and optimize the extreme slow software based sin/cos/... math functions due to the native math instruction lack of necessary precision. And all the code is inlined which will increase the icache miss rate significantly. And many other things which are specified partially in here.
Complete cl_khr_gl_sharing support. We lack of some APIs implementation such as clCreateFromGLBuffer,clCreateFromGLRenderbuffer,clGetGLObjectInfo... Currently, the working APIs are clCreateFromGLTexture,clCreateFromGLTexture2D. We may need to find a graceful way to co-work with mesa.
Check that NDRangeKernels can be pushed into different queues from several threads.
No state tracking at all. One batch buffer is created at each "draw call" (i.e. for each NDRangeKernels). This is really inefficient since some expensive pipe controls are issued for each batch buffer.
Valgrind reports some leaks in libdrm. It sounds like a false positive but it has to be checked. Idem for LLVM. There is one leak here to check.
More generally, everything in the run-time that triggers the "FATAL" macro means that something that must be supported is not implemented properly (either it does not comply with the standard or it is just missing)
Beignet project was created by Ben Segovia. Since 2013, Now we have a team in Intel China OTC graphics team continue to work on this project. The official contact for this project is: Zou Nanhai (firstname.lastname@example.org).
How to contribute
You are always welcome to contribute to this project, just need to subscribe to the beignet mail list and send patches to it for review. The official mail list is as below: http://lists.freedesktop.org/mailman/listinfo/beignet
Documents for OpenCL application developers
The wiki URL is as below: http://www.freedesktop.org/wiki/Software/Beignet/