Nvidia, oddawaj moje OpenCL

Jednym z uroków użytkowania dystrybucji oznaczonych skrótem LTS (Long Term Support) jest błogie przeświadczenie o nieomylności deweloperów i ekipy testującej wydanie dopuszczone do użytkowania z takim właśnie nobilitującym skrótem. Dlatego wyrwani z tej błogości czujemy się paskudnie, gdy okazuje się, że nasz nieomylny LTS jednak płata jakieś figle. Takim kubłem zimnej wody dla wielu fotografów i użytkowników Ubuntu 14.04 i Minta 17 (oraz pochodnych) okazały się niedomówienia podczas instalacji sterowników Nvidii, które zamiast przenosić nas na wyższy poziom sprawnego wykorzystania sprzętu, pozbawiły system obsługi OpenCL. Jak skutecznie może być to uciążliwe z pewnością przekonali się wszyscy użytkujący oprogramowanie korzystające z mocy obliczeniowych kart graficznych (Darktable, Aftershot Pro, inne).

Zabrzmiało dramatycznie, jednak uściślijmy – problemy z OpenCL występują tylko podczas instalowania sterowników innych, niż te repozytoryjne o numerze 331.xx (czyli domyślne dla LTSa). Niemniej – w sieci różnie o tym piszą i są osoby które miały z tym problemy również na tej wersji. Czym to się objawia? Brakiem obsługi OpenCL w programach które to potrafią. Łatwo to sprawdzić uruchamiając Darktable w terminalu:

darktable -d opencl

Jeżeli wynikiem jest:

[opencl_init] opencl related configuration options:
[opencl_init]
[opencl_init] opencl: 1
[opencl_init] opencl_library: ”
[opencl_init] opencl_memory_requirement: 768
[opencl_init] opencl_memory_headroom: 300
[opencl_init] opencl_device_priority: ‘*/!0,*/*/*’
[opencl_init] opencl_size_roundup: 16
[opencl_init] opencl_async_pixelpipe: 0
[opencl_init] opencl_synch_cache: 0
[opencl_init] opencl_number_event_handles: 25
[opencl_init] opencl_micro_nap: 1000
[opencl_init] opencl_use_pinned_memory: 0
[opencl_init] opencl_use_cpu_devices: 0
[opencl_init] opencl_avoid_atomics: 0
[opencl_init] opencl_omit_whitebalance: 0
[opencl_init]
[opencl_init] trying to load opencl library: ‘
[opencl_init] could not find opencl runtime library ‘libOpenCL’
[opencl_init] no working opencl library found. Continue with opencl disabled
[opencl_init] FINALLY: opencl is NOT AVAILABLE on this system.
[opencl_init] initial status of opencl enabled flag is OFF.

Czyli jak mówią ostatniej linijki – ‘could not find opencl runtime library ‘libOpenCL” – program nie skorzysta z uroczych możliwości przyśpieszenia obróbki dzięki wykorzystaniu naszej karty graficznej.

Ale jest pewien sposób i jeżeli ktoś nie stroni od użytkowania terminala i wpisania/wyedytowania paru komend to jest dla niego nadzieja.

Na początku uściślijmy, jakie pakiety są nam potrzebne, aby zadziało OpenCL oferowane przez Nvidia. W moim przypadku lista paczek to:

ii libcuda1-340 340.24-0ubuntu1~xedgers14.04.1 amd64 NVIDIA CUDA runtime library
ii nvidia-340 340.24-0ubuntu1~xedgers14.04.1 amd64 NVIDIA binary driver – version 340.24
ii nvidia-340-uvm 340.24-0ubuntu1~xedgers14.04.1 amd64 NVIDIA Unified Memory kernel module
ii nvidia-libopencl1-340 340.24-0ubuntu1~xedgers14.04.1 amd64 NVIDIA OpenCL Driver and ICD Loader library
ii nvidia-opencl-icd-340 340.24-0ubuntu1~xedgers14.04.1 amd64 NVIDIA OpenCL ICD
ii nvidia-settings 340.24-0ubuntu1~xedgers14.04.1 amd64 Tool for configuring the NVIDIA graphics driver

Jak widać, korzystam z nowszych sterowników 340.24 oferowanych w repozytorium ppa:xorg-edgers/ppa. Pokrótce rzecz wyjaśniając, problem z OpenCL wynika z faktu, że podczas startu systemu nie jest wczytywany moduł nvidia-uvm, a nawet jeśli się załaduje – to nie tworzy odpowiedniego urządzenia w /dev/nvidia-uvm. Dlatego rozwiązaniem jest przekonanie systemu, aby jednak załadował moduł nvidia-uvm i utworzył odpowiednie urządzenie.

Pierwsza rzecz to błahostka:

sudo bash -c 'echo "nvidia-uvm" >> /etc/modules'

Z drugą jest gorzej, bo jak zgrabnie utworzyć urządzenie? Z pomocą przyjdzie nam udev i odpowiednia regułka. Na początek otwieramy do edycji plik (którego nie ma) /etc/udev/rules.d/70-nvidia-uvm.rules:

sudo gedit /etc/udev/rules.d/70-nvidia-uvm.rules

… i wklejamy doń:

KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/bin/mknod -m 666 /dev/nvidia-uvm c $(grep nvidia-uvm /proc/devices | cut -d \  -f 1) 0; /bin/chgrp video /dev/nvidia-uvm'"

Zapisujemy – gotowe.

Jak to przetestować? Albo uruchomić ponownie komputer, albo wykonać w terminalu polecenie:

sudo modprobe nvidia-uvm
 

5 komentarzy

  1. A jak sprawdzić, czy OpenCL działa poprawnie, jeśli nie ma się zainstalowanego żadnego programu który go wykorzystuje? Ewentualnie jakie jeszcze programy korzystają z OpenCL? Obstawiam, że Gimp nie, a Krita, DiGiKam…?

  2. A u mnie tam działają,mimo najnowszych sterów :
    [opencl_init] opencl related configuration options:
    [opencl_init]
    [opencl_init] opencl: 1
    [opencl_init] opencl_library: ”
    [opencl_init] opencl_memory_requirement: 768
    [opencl_init] opencl_memory_headroom: 300
    [opencl_init] opencl_device_priority: ‘*/!0,*/*/*’
    [opencl_init] opencl_size_roundup: 16
    [opencl_init] opencl_async_pixelpipe: 0
    [opencl_init] opencl_synch_cache: 0
    [opencl_init] opencl_number_event_handles: 25
    [opencl_init] opencl_micro_nap: 1000
    [opencl_init] opencl_use_pinned_memory: 0
    [opencl_init] opencl_use_cpu_devices: 0
    [opencl_init] opencl_avoid_atomics: 0
    [opencl_init] opencl_omit_whitebalance: 0
    [opencl_init]
    [opencl_init] trying to load opencl library: ”
    [opencl_init] opencl library ‘libOpenCL’ found on your system and loaded
    [opencl_init] could not get platforms: -1001
    [opencl_init] FINALLY: opencl is NOT AVAILABLE on this system.
    [opencl_init] initial status of opencl enabled flag is OFF.
    [mipmap_cache] cache is empty, file `/home/jarek/.cache/darktable/mipmaps-6738614b7541347007931464b20e0959096cf713′ doesn’t exist

    Mój sterownik :
    glxinfo | grep OpenGL
    OpenGL vendor string: NVIDIA Corporation
    OpenGL renderer string: GeForce 9600 GT/PCIe/SSE2
    OpenGL core profile version string: 3.3.0 NVIDIA 340.24
    OpenGL core profile shading language version string: 3.30 NVIDIA via Cg compiler
    OpenGL core profile context flags: (none)
    OpenGL core profile profile mask: core profile
    OpenGL core profile extensions:
    OpenGL version string: 3.3.0 NVIDIA 340.24
    OpenGL shading language version string: 3.30 NVIDIA via Cg compiler
    OpenGL context flags: (none)
    OpenGL profile mask: (none)
    OpenGL extensions:

  3. Mi niestety ale opisany sposób nie pomógł w aktywacji opencl.
    Czy nie ma jakiegoś skryptu który zrobi to sam i skutecznie ?

  4. OpenCL działa bez dobrze ze sterownikami NVIDIA 304.123
    Zainstalowałem przez Synaptic opencl dla sterownika 304.123 następnie w ustawieniach systemu sam sterownik o tym numerze,restart i wszystko hula…

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Post comment

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.