Bottom line up front: Even with its variance, OpenVINO backend has light-speed prompt processing compared to Vulkan. According to my small dataset, the larger the model gets, the faster OpenVINO can generate tokens compared to Vulkan.
On my way to the llama.cpp Github to make sure I wasn’t hallucinating the SYCL speeds being slower than the Vulkan speeds, I saw that an OpenVINO build has been whipped up. So, naturally, I dropped what I was doing to chase the mere thought of faster generation speeds on Intel GPUs.
I should’ve known, like getting anything to work with Intel Arc, it was gonna put up a fight.
I won’t bore any of you with the details, but here’s some things you’d wanna know if you’re gonna try this out:
- openVINO wasn’t compatible with Ubuntu-based distros out the box. It’d point that out and refuse to proceed with OpenVINO installation - just install through APT. Just be sure to install
libtbb-dev, and replaceinclude(“${OpenVINO_DIR}/../3rdparty/tbb/lib/cmake/TBB/TBBConfig.cmake”)withfind_package(TBB REQUIRED)inside ggml/src/ggml-openvino/CMakeLists.txt within the llama.cpp source that you pulled. - You may find OpenVINO is in the wrong place for you to find your setupvars.sh, so you’ll have to find them yourself. Instead of
source /opt/intel/openvino/setupvars.shwhere the docs think it should be, it may specifies its version in the path:source /opt/intel/openvino_2026.0/setupvars.sh, and you’ll have to account for that.
After not being able to build with –parallel and having to keep threads at 2 (cmake --build build/ReleaseOV -j <not a lot.>), I’m finally in! Works just how it should, models-dir and everything.
Now that everything’s in place, I’m gonna fly off the rails.*
I’m gonna test a few of these validated models, Qwen2.5 1.5b and Llama 3.1 8b, both at Q4_K_M. The following are with all default options except flash attention set to 1 for both Vulkan and OpenVINO, as per the docs. Note, you have to set your GPU use with export GGML_OPENVINO_DEVICE=GPU, if you have multiple GPUs, it’s gonna be GPU.n, where “n“ is the index from 0, 0 for me was integrated graphics. Mayble I’ll throw in some SYCL tests for the hell of it.
With one Intel Arc A770 16GB, and all models at Q4_K_M quantization:
LLAMA 3.2 1B FOR OPENVINO: pp512 = 16305.12 ± 641.85 / tg128 = 88.67 ± 0.62
LLAMA 3.2 1B FOR VULKAN: pp512 = 6233.56 ± 75.12 / tg128 = 119.60 ± 9.12
LLAMA 3.2 1B FOR SYCL: pp512 = 3886.68 ± 16.82 / tg128 = 67.93 ± 0.10
QWEN2 1.5B FOR OPENVINO: pp512 = 11503.96 ± 203.70 / tg128 = 65.00 ± 2.15
QWEN2 1.5B FOR VULKAN: pp512 = 4198.28 ± 27.11 / tg128 = 89.93 ± 0.14
QWEN2 1.5B FOR SYCL: It legit failed.
HUNYUAN 7B FOR OPENVINO: pp512 = 4078.31 ± 24.72 / tg128 = 34.54 ± 0.50
HUNYUAN 7B FOR VULKAN: pp512 = 952.66 ± 2.70 / tg128 = 31.41 ± 0.38
HUNYUAN 7B FOR SYCL: pp512 = 952.66 ± 2.70 / tg128 = 31.41 ± 0.38
MISTRAL 7B FOR OPENVINO: pp512 = 3960.63 ± 21.57 / tg128 = 34.83 ± 0.23
MISTRAL 7B FOR VULKAN: pp512 = 969.09 ± 2.67 / tg128 = 36.16 ± 0.57
MISTRAL 7B FOR SYCL: pp512 = 692.41 ± 1.82 / tg128 = 24.61 ± 0.02
LLAMA 3.1 8B FOR OPENVINO: pp512 = 11503.96 ± 203.70 / tg128 = 65.00 ± 2.15
LLAMA 3.1 8B FOR VULKAN: pp512 = 3930.39 ± 36.31 / tg128 = 33.87 ± 0.08
DEEPSEEK-LLAMA 8B FOR OPENVINO: pp512 = 3676.43 ± 44.08 / tg128 = 33.56 ± 0.48
DEEPSEEK-LLAMA 8B FOR VULKAN: pp512 = 966.74 ± 3.54 / tg128 = 31.79 ± 0.46
DEEPSEEK-LLAMA 8B FOR SYCL: pp512 = 691.32 ± 1.97 / tg128 = 23.71 ± 0.01
QWEN3 8B FOR OPENVINO: pp512 = 3844.23 ± 21.79 / tg128 = 32.61 ± 0.07
QWEN3 8B FOR VULKAN: pp512 = 928.37 ± 2.43 / tg128 = 30.23 ± 0.42
One thing both Vulkan and SYCL have over OpenVINO here is that they can run multiple GPUs. I checked the docs and even consulted with the robot (Gemini), according to it the device option was export GGML_OPENVINO_DEVICE="MULTI:GPU.n,GPU.m,...", but that didn’t work nor was any evidence of that found in the OpenVINO docs the llama.cpp Github directed me towards. Whatever, search party’s over for now.
*I would have tested more models, but that list of validated models doesn’t seem to be a suggestion. Any model I tried to run on OpenVINO outside of that list would spit out “test_prompt: failed to decode prompt batch, res = -3 / main: error: failed to run prompt warmup“, even when dropping the batch size on the floor. I just wanted to see a larger model run and thought “hey, if Mistral 7B runs, what about Ministral 14B?“.
No.
I thought it was just the GPU, and switched to the CPU - nope. I then ditched my hopes for running a larger model and tried LFM2.5 350M. Million with an M. That made the terminal start yelling even louder with a “ggml/src/ggml-backend.cpp:809: pre-allocated tensor (cache_r_l0 (view) (copy of )) in a buffer (OPENVINO0) that cannot run the operation (CPY)“.
The OpenVINO build is still a work in progress, so I’m not gonna run with these conclusions just yet, there’s still a lot of development to be done… Promising… It’s promising. My CPU is a 13th gen, so I don’t have any NPU to test, and there is an option to select it (export GGML_OPENVINO_DEVICE=NPU) so I assume there’s support. If anyone has a Core Ultra to test, socket or mobile, I’d like to see that.