我最近决定在我的 Slackware 当前笔记本电脑上尝试 Prime(NVIDIA 将应用程序卸载到其 GPU,而系统使用集成 GPU,在我的例子中是 Intel HD630),很快我发现在运行时无法使用 HDMI 端口集成英特尔 GPU,因为该端口连接到 nvidia GPU 卡,现在仅按需启用。我很快发现的解决方案是新的 Reverse Prime,但我似乎无法使其工作,因为奇怪的事情正在发生在引擎盖下。我正在寻求帮助,试图弄清楚发生了什么。
起初,Prime 显然在笔记本电脑屏幕上运行良好(我首先用它来运行 GPU 密集型应用程序,它按预期运行,性能完整)。您可以在 NVIDIA GPU 上运行要运行的应用程序,并为其添加一些环境变量作为前缀。但后来当我尝试__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo
进行测试时,我注意到它不能专门与 glxinfo 一起工作,给出以下错误:
name of display: :0 X Error of failed request: BadValue (integer parameter out of range for operation) Major opcode of failed request: 151 (GLX) Minor opcode of failed request: 24 (X_GLXCreateNewContext) Value in failed request: 0x0 Serial number of failed request: 39 Current serial number in output stream: 4
然后我尝试nvidia-settings --verbose
使用和不使用环境变量,也收到错误:
WARNING: NV-CONTROL extension not found on this Display. ERROR: Unable to load info from any available system ERROR: Unable to assign attribute SyncToVBlank specified on line 22 of ........ ERROR: Unable to assign attribute FSAA specified on line 24 of ........ (repeat similar message to several other video settings previously saved on nvidia-settings-rc file) ERROR: Unable to assign attribute SynchronousPaletteUpdates specified on line 38 of configuration file '/[home path, redacted]/.nvidia-settings-rc' (no Display connection).
运行nvidia-smi
通常可以提供有关 nvidia gpu 的准确信息(奇怪的是不需要使用环境变量运行)。我检查了glxinfo
没有 nvidia 变量的情况,想知道我的主 GPU 现在是否真的是 Intel,而且它确实是集成的 intel gpu。然后我运行xrandr --listproviders
并得到这个:
Providers: number : 2 Provider 0: id: 0x43 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 3 outputs: 1 associated providers: 1 name:modesetting Provider 1: id: 0xca cap: 0x2, Sink Output crtcs: 4 outputs: 1 associated providers: 1 name:modesetting
请注意,它检测到两个 GPU,但检测到第二个 (提供者1)应命名为 NVIDIA-G0,但它也被设置为模式设置, 喜欢提供商 0(英特尔 IGPU)。然后我配置了xorg.conf为了进行快速临时测试,以 NVIDIA GPU 作为主要启动 X,并运行xrandr --listproviders
.通过这样做提供商 0,现在对应于 NVIDIA,被正确识别为名称 NVIDIA-G0,并且提供者1和模式设置。我恢复了xorg.conf再次切换到 Prime/Optimus 配置(即 intel 作为活动 GPU)。运行lsmod | grep -i nvidia
表示 nvidia 驱动已加载并且新风格驱动程序如预期被阻止,因为modprobe.d配置:
nvidia_uvm 1155072 0 nvidia_drm 65536 1 nvidia_modeset 1232896 2 nvidia_drm nvidia 34177024 19 nvidia_uvm,nvidia_modeset drm_kms_helper 266240 2 nvidia_drm,i915 drm 610304 15 drm_kms_helper,nvidia_drm,i915 i2c_core 94208 12 i2c_designware_platform,videodev,i2c_hid,i2c_designware_core,drm_kms_helper,i2c_algo_bit,nvidia,i2c_smbus,i2c_i801,i915,psmouse,drm
插入 HDMI 电缆被正确识别(尽管仍然没有信号),并且根据xrandr --props
,HDMI-1-1 源列表为主同步启用:
PRIME Synchronization: 1 supported: 0, 1 link-status: Good supported: Good, Bad CONNECTOR_ID: 74 supported: 74 non-desktop: 0 range: (0, 1)
我很好奇这里发生了什么,所以我尝试继续测试 hdmi 输出Arch wiki 上的反向 PRIME 教程因为其他一切都在笔记本电脑屏幕上的 Prime 设置中正常运行(尽管不知道为什么glxinfo
并且nvidia-settings
失败),但由于提供商的名称是错误的,我决定使用其参考号,所以我运行xrandr --setprovideroutputsource 0 1
,这导致了类似的错误来自glxinfo
:
X Error of failed request: BadValue (integer parameter out of range for operation) Major opcode of failed request: 139 (RANDR) Minor opcode of failed request: 35 (RRSetProviderOutputSource) Value in failed request: 0xca Serial number of failed request: 16 Current serial number in output stream: 17
并尝试继续寻找线索xrandr --output HDMI-1-1 --auto --above eDP-1
(eDP-1 是笔记本电脑的内置屏幕),结果是:
xrandr:配置 crtc 3 失败
Xorg.0.log 上没有明显错误,但有一些错误消息在启动过程中,这似乎并没有阻止 nvidia 驱动程序工作:
[drm:nv_drm_dumb_map_offset [nvidia_drm]] *ERROR* [nvidia-drm] [GPU ID 0x00000100] Failed to lookup gem object for mapping: 0x00000006 [drm:nv_drm_dumb_map_offset [nvidia_drm]] *ERROR* [nvidia-drm] [GPU ID 0x00000100] Failed to lookup gem object for mapping: 0x00000007
以及 NVIDIA 污染内核的警告:
nvidia: module license 'NVIDIA' taints kernel. Disabling lock debugging due to kernel taint
编辑1:在怀疑 Prime 变量卸载只能在带有命令行程序的笔记本电脑本机屏幕上运行且没有图形界面后,我尝试运行一些 lutris 游戏,确实得到了相同的错误环球信息网。所以这可能与尝试连接显示器有关?
我不知道从这里该去哪里。你有什么主意吗?
系统信息:
- 笔记本电脑 Acer Nitro 5、i7 第 7 代、NVIDIA 1050
- 内核 5.10.19 已使用 TKG 的 fsync 进行了修补,Slackware 当前 64 位具有 Alienbob multilib
- NVIDIA 驱动程序 460.56,CUDA 版本 11.2,V11.2.67 构建 cuda_11.2.r11.2/compiler.29373293_0
- Xorg 服务器 1.20.10
- /etc/X11/xorg.conf(我仍然不习惯 .d snippets 模型):https://pastebin.com/0d13wDHY
- 有这个90-intel.conf在xorg.conf.d不过,旨在强制英特尔 DRI3:
Section "OutputClass" Identifier "Force DRI 3" MatchDriver "modesetting" Option "DRI" "3" EndSection
- Xorg.0.log(删除了键盘、摄像头、蓝牙无关行):https://pastebin.com/s0Ebu2AY
- 消息一些敏感数据被编辑:https://pastebin.com/w0qWzxD9
- NVIDIA 驱动程序设置为模式集(通过conf 文件modprobe.d
options nvidia-drm modeset=1
)