Nachdem ich meine Workstation von openSUSE 13.1 auf openSUSE Leap 42.1 migriert hatte funktionierten lies sich die Grafikkarte nicht mehr zum Rechnen nutzen. Irgendwie hatte es einen Fehler bei der Installation des neuen Grafiktreibers gegeben. Seine Neuinstallation löste das Problem.
Das Problem
Nach dem Update fanden CUDA nutzende Anwendungen keine Grafikkarte. So meldete Boinc No usable GPUs found
. Prinzipiell funktionierte die Grafikkarte aber. So hatte ich volle 3D-Beschleunigung, und auch nvidia-smi
meldete die erwarteten Daten:
+------------------------------------------------------+
| NVIDIA-SMI 340.93 Driver Version: 340.93 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 580 Off | 0000:01:00.0 N/A | N/A |
| 43% 49C P12 N/A / N/A | 494MiB / 1535MiB | N/A Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Compute processes: GPU Memory |
| GPU PID Process name Usage |
|=============================================================================|
| 0 Not Supported |
+-----------------------------------------------------------------------------+
Die Analyse
NVIDIA bietet CUDA zwar für einige SUSE-Varianten zum Download, aber leider nicht für Leap 42.1. Es gibt zwar Pakete für das unterliegende SLE 12, aber diese verlangen einen Grafikttreiber welcher nicht zum Kernel von Leap 42.1 passt. Deshalb habe ich mich für die Analyse auf OpenCL-Beispiel-Code zurückgezogen. Denn für OpenCL benötigt man nur die Header, welche man einfach direkt zum Code legen kann, und einen C-Compiler.
Schon der erste Versuch mit einem Beispielprogramm welches nur die OpenCL-Runtime initialisiert zeigt das Problem:
> sudo ./platform
modprobe: FATAL: Module nvidia-uvm not found.
Failed to get platforms: -1001
Das sudo
ist hier übrigens nur vorangestellt um es zu ermöglichen Kernel-Module nachzuladen. Ohne sudo
erhält man den gleichen Fehler, aber ohne die essentielle Information zum Kernelmodul.
Schnell konnte ich herausfinden, dass eigentlich alle Kernelmodule installiert sind:
> rpm -ql nvidia-gfxG03-kmp-default-340.93_k4.1.12_1-36.7.x86_64 | grep \.ko
/lib/modules/4.1.12-1-default/updates/nvidia.ko
> rpm -ql nvidia-uvm-gfxG03-kmp-default-340.93_k4.1.12_1-36.7.x86_64 | grep \.ko
/lib/modules/4.1.12-1-default/updates/nvidia-uvm.ko
> ls /lib/modules/4.1.12-1-default/updates/
nvidia.ko nvidia-uvm.ko
Allerdings war das nicht das Modulverzeichnis des aktuell laufenden Kernels:
> uname -a
Linux eddie 4.1.13-5-default #1 SMP PREEMPT Thu Nov 26 16:35:17 UTC 2015 (49475c3) x86_64 x86_64 x86_64 GNU/Linux
Wo liegen also dessen Module? /lib/modules/4.1.13-5-default/updates
existiert nicht. Das NVIDIA-Modul ist aber schnell gefunden:
> ls /lib/modules/4.1.13-5-default/weak-updates/updates/
nvidia.ko
Nur fehlt in diesem Verzeichnis das nvidia-uvm.ko
.
Die Lösung
Eine Neuinstallation des dazugehörigen Paketes lässt dann endlich auch OpenCL wieder richtig initialisieren:
> zypper in in -f nvidia-uvm-gfxG03-kmp-default
> ls /lib/modules/4.1.13-5-default/weak-updates/updates/
nvidia.ko nvidia-uvm.ko
> modprobe nvidia-uvm
> ./platform
Failed to get platforms: -1001
> sudo ./platform
NVIDIA CUDA - OpenCL 1.1 CUDA 6.5.51 - NVIDIA Corporation - FULL_PROFILE
> ./platform
NVIDIA CUDA - OpenCL 1.1 CUDA 6.5.51 - NVIDIA Corporation - FULL_PROFILE
Um die Grafikkarte tatsächlich zu verwenden war dann allerdings noch ein Neustart notwendig.