In this post, I’ll check whether disabling VT-d virtualization support may improve the performance of the Intel Arc GPU in recent Meteor Lake or Lunar Lake SoC using a Khadas Mind Maker Kit with an Intel Core Ultra 7 258V CPU with Intel Arc 140V graphics running Ubuntu 24.10.
A few days ago, I read a post on Phoronix about Intel publishing tips to improve the performance of Intel GPUs in Linux:
- Keep the system updated with the latest kernel and Mesa versions.
- Ensure SoC firmware is up-to-date. These firmware updates currently require installing the Windows graphics driver; firmware updates via
fwupd
are in progress. - Use Wayland where possible, as it supports additional modifiers for better performance.
- For MTL (Meteor Lake) and newer integrated GPUs, disable VT-d if virtualization is not needed.
- For discrete GPUs:
- Enable
ReBAR
_ - Enable
ASPM
_
- Enable
I was especially curious about the line about disabling VT-d virtualization on Meteor Lake of newer processors. So I decided to check this tip with the Khadas Mind Maker Kit, aka Khadas Mind 2 AI Maker Kit with a Lunar Lake SoC. I could install Ubuntu 24.10 albeit without WiFi, because only Bluetooth is recognized from the AX211 module… I’ll check later, and I ended up using a 2.5GbE USB-C adapter instead to update the OS before testing.
I could confirm that Wayland was enabled as is now usually the case in Ubuntu.
We can check whether VT-D / IOMMU virtualization is enabled by looking for DMAR in the kernel log:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
jaufranc@Mind-2-AI-Maker-Kit-CNX:~$ dmesg | grep -i DMAR [ 0.005536] ACPI: DMAR 0x000000006DA01000 0000C0 (v01 ALASKA A M I 01072009 AMI 01000013) [ 0.005566] ACPI: Reserving DMAR table memory at [mem 0x6da01000-0x6da010bf] [ 0.098883] DMAR: Host address width 38 [ 0.098884] DMAR: DRHD base: 0x000000fc800000 flags: 0x0 [ 0.098892] DMAR: dmar0: reg_base_addr fc800000 ver 7:1 cap e9de008cee690402 ecap 1aca9a00f0ef5e [ 0.098895] DMAR: DRHD base: 0x000000fc810000 flags: 0x0 [ 0.098898] DMAR: dmar1: reg_base_addr fc810000 ver 7:1 cap e9de008cee690402 ecap 1aca9a00f0ef5e [ 0.098901] DMAR: DRHD base: 0x000000fc820000 flags: 0x1 [ 0.098907] DMAR: dmar2: reg_base_addr fc820000 ver 7:1 cap e9de008cee690402 ecap 1ac89800f0efda [ 0.098976] DMAR: SATC flags: 0x1 [ 0.098979] DMAR-IR: IOAPIC id 2 under DRHD base 0xfc820000 IOMMU 2 [ 0.098980] DMAR-IR: HPET id 0 under DRHD base 0xfc820000 [ 0.098980] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping. [ 0.100911] DMAR-IR: Enabled IRQ remapping in x2apic mode [ 0.616635] DMAR: No RMRR found [ 0.616636] DMAR: No ATSR found [ 0.616637] DMAR: IOMMU feature nwfs inconsistent [ 0.616639] DMAR: IOMMU feature dit inconsistent [ 0.616639] DMAR: IOMMU feature sc_support inconsistent [ 0.616640] DMAR: IOMMU feature dev_iotlb_support inconsistent [ 0.616641] DMAR: dmar1: Using Queued invalidation [ 0.616645] DMAR: dmar0: Using Queued invalidation [ 0.616646] DMAR: dmar2: Using Queued invalidation [ 0.618560] DMAR: Intel(R) Virtualization Technology for Directed I/O |
It’s there and the last line even shows Intel VT-d (Intel Virtualization Technology for Directed I/O). I’ll run some Unigine benchmarks and glmark2-wayland. I initially ran sbc-bench.sh to optimize the system for performance and check throttling just in case:
1 |
sudo ./sbc-bench.sh -R |
This command does not run any benchmarks and only monitors CPU frequency, memory, and temperature. As such it requires very little CPU usage (confirmed with htop), and in theory, it should not impact the results, but somehow it hammered the benchmark score. Here’s Unigine Heaven Benchmark 4.0 with sbc-bench.sh:
If I stop sbc-bench.sh and run the benchmark again:
It also impacts the Superposition benchmark. I can’t figure out why, but I stopped using it for the rest of the review. Here are the results of the Unigine Superposition v1.1 GPU benchmark with Intel VT-d enabled.
Finally, I ran glmark2-wayland in off-screen mode:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
jaufranc@Mind-2-AI-Maker-Kit-CNX:~$ glmark2-wayland --off-screen ======================================================= glmark2 2023.01 ======================================================= OpenGL Information GL_VENDOR: Intel GL_RENDERER: Mesa Intel(R) Graphics (LNL) GL_VERSION: 4.6 (Compatibility Profile) Mesa 24.2.3-1ubuntu1 Surface Config: buf=32 r=8 g=8 b=8 a=8 depth=24 stencil=0 samples=0 Surface Size: 800x600 windowed ======================================================= [build] use-vbo=false: FPS: 1785 FrameTime: 0.560 ms [build] use-vbo=true: FPS: 2202 FrameTime: 0.454 ms [texture] texture-filter=nearest: FPS: 2022 FrameTime: 0.495 ms [texture] texture-filter=linear: FPS: 2012 FrameTime: 0.497 ms [texture] texture-filter=mipmap: FPS: 2009 FrameTime: 0.498 ms [shading] shading=gouraud: FPS: 2012 FrameTime: 0.497 ms [shading] shading=blinn-phong-inf: FPS: 2023 FrameTime: 0.495 ms [shading] shading=phong: FPS: 1999 FrameTime: 0.500 ms [shading] shading=cel: FPS: 1998 FrameTime: 0.501 ms [bump] bump-render=high-poly: FPS: 1715 FrameTime: 0.583 ms [bump] bump-render=normals: FPS: 2160 FrameTime: 0.463 ms [bump] bump-render=height: FPS: 1998 FrameTime: 0.501 ms [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 1900 FrameTime: 0.526 ms [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 1358 FrameTime: 0.736 ms [pulsar] light=false:quads=5:texture=false: FPS: 2054 FrameTime: 0.487 ms [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 992 FrameTime: 1.009 ms [desktop] effect=shadow:windows=4: FPS: 1187 FrameTime: 0.843 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 1325 FrameTime: 0.755 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 684 FrameTime: 1.463 ms [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 1418 FrameTime: 0.705 ms [ideas] speed=duration: FPS: 1526 FrameTime: 0.655 ms [jellyfish] <default>: FPS: 1674 FrameTime: 0.598 ms [terrain] <default>: FPS: 551 FrameTime: 1.816 ms [shadow] <default>: FPS: 1819 FrameTime: 0.550 ms [refract] <default>: FPS: 667 FrameTime: 1.500 ms [conditionals] fragment-steps=0:vertex-steps=0: FPS: 1980 FrameTime: 0.505 ms [conditionals] fragment-steps=5:vertex-steps=0: FPS: 1984 FrameTime: 0.504 ms [conditionals] fragment-steps=0:vertex-steps=5: FPS: 1966 FrameTime: 0.509 ms [function] fragment-complexity=low:fragment-steps=5: FPS: 1970 FrameTime: 0.508 ms [function] fragment-complexity=medium:fragment-steps=5: FPS: 1958 FrameTime: 0.511 ms [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 1886 FrameTime: 0.530 ms [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 1961 FrameTime: 0.510 ms [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 1964 FrameTime: 0.509 ms ======================================================= glmark2 Score: 1718 ======================================================= |
Now that we have benchmark results with VT-d enabled, I rebooted the computer to enter the BIOS and find settings to disable VT-d.
I initially went to Advanced->CPU Configuration, and from there set Intel (VMX)Virtualization Technology to Disabled. But it didn’t help because this is for VT-x, and I wanted to disable VT-d…
I eventually found VT-d Configuration in Advanced->System Agent (SA) Configuration->VT-d setup menu. But it was not super useful either, since VT-d Enabled can’t be changed to Disabled in the BIOS.
Since we are using Linux, I disabled VT-d with the following line in /etc/default/grub:
1 |
GRUB_CMDLINE_LINUX="intel_iommu=off" |
Before running the command to update grub:
1 |
sudo update-grub |
After a reboot, we can see IOMMU is disabled, and VT-d does not show up anymore in the kernel log:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
jaufranc@Mind-2-AI-Maker-Kit-CNX:~$ dmesg | grep -i DMAR [ 0.005303] ACPI: DMAR 0x000000006DA01000 0000C0 (v01 ALASKA A M I 01072009 AMI 01000013) [ 0.005333] ACPI: Reserving DMAR table memory at [mem 0x6da01000-0x6da010bf] [ 0.036575] DMAR: IOMMU disabled [ 0.097931] DMAR: Host address width 38 [ 0.097932] DMAR: DRHD base: 0x000000fc800000 flags: 0x0 [ 0.097940] DMAR: dmar0: reg_base_addr fc800000 ver 7:1 cap e9de008cee690402 ecap 1aca9a00f0ef5e [ 0.097947] DMAR: DRHD base: 0x000000fc810000 flags: 0x0 [ 0.097950] DMAR: dmar1: reg_base_addr fc810000 ver 7:1 cap e9de008cee690402 ecap 1aca9a00f0ef5e [ 0.097953] DMAR: DRHD base: 0x000000fc820000 flags: 0x1 [ 0.098047] DMAR: dmar2: reg_base_addr fc820000 ver 7:1 cap e9de008cee690402 ecap 1ac89800f0efda [ 0.098081] DMAR: SATC flags: 0x1 [ 0.098083] DMAR-IR: IOAPIC id 2 under DRHD base 0xfc820000 IOMMU 2 [ 0.098084] DMAR-IR: HPET id 0 under DRHD base 0xfc820000 [ 0.098085] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping. [ 0.099728] DMAR-IR: Enabled IRQ remapping in x2apic mode |
Let’s repeat the benchmarks to test the Intel Arc GPU without VT-d.
The FPS got to 46.4 without VT-d against 42.0 with. That’s a small improvement of 4.4 FPS or a little over 10 percent.
We did not see any improvement in the Superposition benchmark with a slightly lower score of 3210 points vs 3286 points, or a drop of 2.4 percent.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
jaufranc@Mind-2-AI-Maker-Kit-CNX:~$ glmark2-wayland --off-screen ======================================================= glmark2 2023.01 ======================================================= OpenGL Information GL_VENDOR: Intel GL_RENDERER: Mesa Intel(R) Graphics (LNL) GL_VERSION: 4.6 (Compatibility Profile) Mesa 24.2.3-1ubuntu1 Surface Config: buf=32 r=8 g=8 b=8 a=8 depth=24 stencil=0 samples=0 Surface Size: 800x600 windowed ======================================================= [build] use-vbo=false: FPS: 1779 FrameTime: 0.562 ms [build] use-vbo=true: FPS: 2442 FrameTime: 0.410 ms [texture] texture-filter=nearest: FPS: 2274 FrameTime: 0.440 ms [texture] texture-filter=linear: FPS: 2230 FrameTime: 0.448 ms [texture] texture-filter=mipmap: FPS: 2195 FrameTime: 0.456 ms [shading] shading=gouraud: FPS: 2175 FrameTime: 0.460 ms [shading] shading=blinn-phong-inf: FPS: 2212 FrameTime: 0.452 ms [shading] shading=phong: FPS: 2122 FrameTime: 0.471 ms [shading] shading=cel: FPS: 2109 FrameTime: 0.474 ms [bump] bump-render=high-poly: FPS: 1788 FrameTime: 0.559 ms [bump] bump-render=normals: FPS: 2371 FrameTime: 0.422 ms [bump] bump-render=height: FPS: 2321 FrameTime: 0.431 ms [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 1929 FrameTime: 0.518 ms [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 1402 FrameTime: 0.714 ms [pulsar] light=false:quads=5:texture=false: FPS: 2151 FrameTime: 0.465 ms [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 995 FrameTime: 1.006 ms [desktop] effect=shadow:windows=4: FPS: 1401 FrameTime: 0.714 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 1170 FrameTime: 0.855 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 490 FrameTime: 2.042 ms [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 1176 FrameTime: 0.851 ms [ideas] speed=duration: FPS: 1511 FrameTime: 0.662 ms [jellyfish] <default>: FPS: 1744 FrameTime: 0.573 ms [terrain] <default>: FPS: 385 FrameTime: 2.598 ms [shadow] <default>: FPS: 1809 FrameTime: 0.553 ms [refract] <default>: FPS: 681 FrameTime: 1.470 ms [conditionals] fragment-steps=0:vertex-steps=0: FPS: 2053 FrameTime: 0.487 ms [conditionals] fragment-steps=5:vertex-steps=0: FPS: 2063 FrameTime: 0.485 ms [conditionals] fragment-steps=0:vertex-steps=5: FPS: 2048 FrameTime: 0.488 ms [function] fragment-complexity=low:fragment-steps=5: FPS: 2087 FrameTime: 0.479 ms [function] fragment-complexity=medium:fragment-steps=5: FPS: 2051 FrameTime: 0.488 ms [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 2048 FrameTime: 0.488 ms [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 2037 FrameTime: 0.491 ms [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 2006 FrameTime: 0.499 ms ======================================================= glmark2 Score: 1794 ======================================================= |
The glmark2-wayland score was slightly higher (1,794 vs 1,718) with VT-d disabled or a 4.4% improvement. So there appears to be some small benefit when disabling VT-d on Intel Lunar Lake SoCs.
Another difference was the Unigine Heaven score in Windows 11 with DirectX was much higher (81.2 FPS / 2,045 points) than in Linux with OpenGL. Linux scores are always a little lower in this benchmark, but here the gap is quite large. Also, when I tested the GEEKOM GT1 Mini PC with an Intel Core Ultra 9 185H “Meteor Lake” SoC (Intel Arc graphics @ 2.35 GHz with 8 Xe cores) in Ubuntu 24.10, it scored much higher too (77.6 FPS / 1,956 points). The Intel Arc Graphics 140V found in the Core Ultra 7 258V SoC also features 8 Xe cores but only clocked up to 1.95 GHz, meaning the score should be somewhat lower, but not that much. Lunar Lake processors are very new, so I decided to upgrade the Linux kernel to Linux 6.13-rc1 provided by Canonical to see if I could see any improvements:
1 2 3 4 5 |
wget https://kernel.ubuntu.com/mainline/v6.13-rc1/amd64/linux-headers-6.13.0-061300rc1-generic_6.13.0-061300rc1.202412012327_amd64.deb wget https://kernel.ubuntu.com/mainline/v6.13-rc1/amd64/linux-headers-6.13.0-061300rc1_6.13.0-061300rc1.202412012327_all.deb wget https://kernel.ubuntu.com/mainline/v6.13-rc1/amd64/linux-image-unsigned-6.13.0-061300rc1-generic_6.13.0-061300rc1.202412012327_amd64.deb wget https://kernel.ubuntu.com/mainline/v6.13-rc1/amd64/linux-modules-6.13.0-061300rc1-generic_6.13.0-061300rc1.202412012327_amd64.deb sudo dpkg -i *.deb |
I also had to disable Secure Boot in the BIOS to boot the system with an unsigned kernel or it would not boot with the error “bad shim signature”.
It gets better at 48 FPS in Unigine Heaven Benchmark 4.0 although the gap is still large. Upgrading to Linux 6.13 and disabling VT-d allowed us to gain 6.2 FPS or almost a respectable 15 percent improvement in frame rate.
The Superposition benchmark remains unimpacted…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
jaufranc@Mind-2-AI-Maker-Kit-CNX:~$ glmark2-wayland --off-screen ======================================================= glmark2 2023.01 ======================================================= OpenGL Information GL_VENDOR: Intel GL_RENDERER: Mesa Intel(R) Graphics (LNL) GL_VERSION: 4.6 (Compatibility Profile) Mesa 24.2.3-1ubuntu1 Surface Config: buf=32 r=8 g=8 b=8 a=8 depth=24 stencil=0 samples=0 Surface Size: 800x600 windowed ======================================================= [build] use-vbo=false: FPS: 2002 FrameTime: 0.500 ms [build] use-vbo=true: FPS: 2546 FrameTime: 0.393 ms [texture] texture-filter=nearest: FPS: 2387 FrameTime: 0.419 ms [texture] texture-filter=linear: FPS: 2278 FrameTime: 0.439 ms [texture] texture-filter=mipmap: FPS: 2305 FrameTime: 0.434 ms [shading] shading=gouraud: FPS: 2302 FrameTime: 0.435 ms [shading] shading=blinn-phong-inf: FPS: 2283 FrameTime: 0.438 ms [shading] shading=phong: FPS: 2223 FrameTime: 0.450 ms [shading] shading=cel: FPS: 2236 FrameTime: 0.447 ms [bump] bump-render=high-poly: FPS: 1906 FrameTime: 0.525 ms [bump] bump-render=normals: FPS: 2480 FrameTime: 0.403 ms [bump] bump-render=height: FPS: 2421 FrameTime: 0.413 ms [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 2007 FrameTime: 0.498 ms [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 1435 FrameTime: 0.697 ms [pulsar] light=false:quads=5:texture=false: FPS: 2276 FrameTime: 0.439 ms [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 1037 FrameTime: 0.964 ms [desktop] effect=shadow:windows=4: FPS: 1456 FrameTime: 0.687 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 1393 FrameTime: 0.718 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 714 FrameTime: 1.401 ms [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 1536 FrameTime: 0.651 ms [ideas] speed=duration: FPS: 1630 FrameTime: 0.614 ms [jellyfish] <default>: FPS: 1874 FrameTime: 0.534 ms [terrain] <default>: FPS: 511 FrameTime: 1.958 ms [shadow] <default>: FPS: 2074 FrameTime: 0.482 ms [refract] <default>: FPS: 691 FrameTime: 1.448 ms [conditionals] fragment-steps=0:vertex-steps=0: FPS: 2119 FrameTime: 0.472 ms [conditionals] fragment-steps=5:vertex-steps=0: FPS: 2110 FrameTime: 0.474 ms [conditionals] fragment-steps=0:vertex-steps=5: FPS: 2105 FrameTime: 0.475 ms [function] fragment-complexity=low:fragment-steps=5: FPS: 2104 FrameTime: 0.475 ms [function] fragment-complexity=medium:fragment-steps=5: FPS: 2096 FrameTime: 0.477 ms [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 2062 FrameTime: 0.485 ms [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 2100 FrameTime: 0.476 ms [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 2077 FrameTime: 0.482 ms ======================================================= glmark2 Score: 1901 ======================================================= |
glmark2-wayland score further improved to 1901 points, or a 10.7 percent improvement compared to having Linux 6.11 and VT-d enabled.
So what we learned here is that disabling VT-d may indeed lead to improved GPU performance in Linux, but it depends on the workload. Upgrading the Linux kernel also proved to have some benefits since the Intel Core Ultra 7 258V Lunar Lake is quite new, and some software optimizations are still possible. The Khadas Mind Maker Kit’s BIOS does not allow us to disable VT-d, so I haven’t tested this in Windows, but some Redditors found out that disabling VT-d did improve the performance/frame rate of some Windows games, while others did not see any benefit.
Jean-Luc started CNX Software in 2010 as a part-time endeavor, before quitting his job as a software engineering manager, and starting to write daily news, and reviews full time later in 2011.
Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress
You can use the backport iwlwifi drivers and update Wi-Fi firmware to fix the Wi-Fi.
https://docs.khadas.com/products/maker-kit/mind-2-ai-maker-kit/troubleshooting/fix-ubuntu#fix-wi-fi-issue
I don’t know well what features are covered by VT-d, but at least here by disabling IOMMU you disabled quite more (it’s very likely that VT-d relies on IOMMU and goes away without it). IOMMU is like an MMU but between the CPU and external devices. It can be seen as a remapping and/or a firewall between bus-master devices and the RAM. It’s well known that disabling it significantly improves network performance for example. On some machines you can even see a 5x performance ratio between with and without it, because the delays it adds to very small and frequent operations just set a limit that cannot be passed. At least it’s not surprising. Also I suspect that the unigine benchmark that doesn’t change essentially runs within the GPU only, so it’s probably not impacted by the CPU<->GPU communication.