darktable page lede image
darktable page lede image

Wiele urządzeń OpenCL – ustawienia ręczne

10.2.9. Wiele urządzeń OpenCL – ustawienia ręczne

Harmonogramy urządzeń OpenCL na najpopularniejszych systemach mogą być optymalizowane przy pomocy ustawienia profil szeregowania OpenCL. Jeśli jednak system wyposażony jest w kilka różnych GPU, możesz chcieć ustawiać hierarchię ręcznie. W tym celu wybierz domyślny profil szeregowania, a ustawienia wprowadź dla parametru opencl_device_priority.

Zrozumieć trzeba, w jaki sposób darktable korzysta z urządzeń OpenCL. Każda seria przetworzeń zdjęcia – od obrazu wejściowego do efektu końcowego, przy wykorzystaniu określonych czynności – wykonywana jest w tak zwanej sekwencji. W darktable rozróżniamy cztery typy sekwencji. Jedna odpowiedzialna jest za przetworzenie zdjęcia w centrum (pełnego widoku) w trybie ciemni, kolejna przetwarza podgląd (okno nawigacji) w lewym górnym rogu w trybie ciemni. Spośród tych dwóch sekwencji naraz można wykonywać tylko jedną – z sekwencją pełną i podglądu, pracującymi równolegle. Dodatkowo wiele równoległych sekwencji może w tym samym czasie obsługiwać eksport do plików i tworzyć miniaturki. Jeśli urządzenie OpenCL jest dostępne, darktable przydziela je dynamicznie do określonej sekwencji i po jednym przebiegu je zwalnia.

Zapotrzebowanie na moc obliczeniową zależy od typu sekwencji. Podgląd zdjęć i miniaturki mają niskie rozdzielczości i są przetwarzane szybko; główny widok zdjęcia jest bardziej wymagający, nie mówiąc już o sekwencji eksportu obrazu.

Parametr konfiguracyjny opencl_device_priority przechowuje łańcuch znakowy o następującej strukturze:

a,b,c.../k,l,m.../o,p,q.../x,y,z...

Każda litera reprezentuje inne urządzenie OpenCL. Cztery pola w łańcuchu znakowym parametru oddziela ukośnik, każde pole reprezentuje inny typ sekwencji. a,b,c... określa urządzenia, mogące przetwarzać sekwencję obrazu środkowego (pełną). Analogicznie urządzenia k,l,m... przetwarzają sekwencję podglądu, urządzenia o,p,q... – sekwencje eksportu, wreszcie x,y,z... – sekwencje miniaturek. Puste pole oznacza, że żadne z urządzeń OpenCL nie może obsłużyć danego typu sekwencji.

darktable posiada wewnętrzny system numeracji, w którym pierwsze dostępne urządzenie OpenCL otrzyma numer 0, a pozostałe – kolejne. Numer razem z nazwą urządzenia wyświetlany jest, jeśli uruchomisz darktable poprzez darktable -d opencl. Możesz podać urządzenie albo przez numer, albo przez nazwę (wielkość liter i białe spacje nie mają znaczenia). Jeśli masz więcej, niż jedno urządzenie – wszystkie z tą samą nazwą – dla ich rozróżnienia musisz skorzystać z ich numerów.

Identyfikator urządzenia może być poprzedzony wykrzyknikiem !, co wyłączy go z przetwarzania tej sekwencji. Możesz skorzystać również z gwiazdki * jako wieloznacznika, reprezentuje ona wszystkie urządzenia nie wspomniane wcześniej jawnie w tej grupie.

Kolejność sekwencji w grupie ma znaczenie. darktable odczyta listę od lewej do prawej i ilekroć spróbuje zaalokować urządzenie OpenCL do sekwencji, przeskanuje urządzenia w takim właśnie porządku, rezerwując pierwsze, które znajdzie.

Jeśli sekwencja ma się rozpocząć, a wszystkie GPU w odpowiedniej grupie są zajęte, darktable automatycznie przetworzy obraz na CPU. Można wymusić przetwarzanie na GPU przez poprzedzenie listy dozwolonych GPU znakiem plusa +. darktable nie użyje wtedy CPU, lecz wstrzyma proces aż do momentu zwolnienia się odpowiedniego urządzenia OpenCL.

domyślne ustawienie darktable dla opencl_device_priority to:

*/!0,*/*/*

Każde wykryte urządzenie OpenCL może przetwarzać środkowy obraz. Pierwsze urządzenie (0) nie może przetwarzać sekwencji podglądu. Jeśli więc masz tylko jeden GPU, sekwencja podglądu będzie zawsze uruchamiana na CPU, a darktable zarezerwuje GPU tylko dla bardziej wymagającej sekwencji obrazu środkowego. Jest to odpowiednie ustawienie dla większości systemów. Na sekwencje eksportu i miniaturek nie są nałożone żadne ograniczenia.

Opcja domyślna jest dobrym wyborem, jeśli masz tylko jedno urządzenie. Jeśli masz ich kilka, jest to dobry punkt wyjścia. Ponieważ jednak urządzenia te mogą się różnić zdolnościami obliczeniowymi, warto poświęcić chwilę czasu na przemyślenie i optymalizację konfiguracji.

Oto przykład. Załóżmy, że mamy system z dwiema kartami, szybkim radeonem HD7950 i starszą i wolniejszą GeForce GTS450. darktable (uruchomiony przez darktable -d opencl) pokaże następujące urządzenia:

[opencl_init] successfully initialized.
[opencl_init] here are the internal numbers and names of
                          OpenCL devices available to darktable:
[opencl_init]           0       'GeForce GTS 450'
[opencl_init]           1       'Tahiti'
[opencl_init] FINALLY: opencl is AVAILABLE on this system.

GeForce GTS 450 została więc wykryta jako pierwsze urządzenie; Radeon HD7950 ('Tahiti') jako drugie. Normalnie kolejność się nie zmieni, o ile nie zmieni się sprzęt ani konfiguracja sterowników. Lepiej jednak korzystać z nazw urządzeń, niż z numerów – na wszelki wypadek.

Ponieważ GTS450 jest wolniejsza, niż HD7950, zoptymalizowany opencl_device_priority może wyglądać tak:

!GeForce GTS450,*/!Tahiti,*/Tahiti,*/Tahiti,*

GTS450 jest jawnie wyłączone z obsługi sekwencji centralnego zdjęcia; jest to zarezerwowane dla wszystkich innych urządzeń (czyli HD7950/Tahiti). Zupełnie odwrotnie skonfigurowaliśmy to dla sekwencji podglądu. Tutaj Tahiti jest wyłączone, więc pracę wykona tylko GTS450.

Do eksportu oraz generowania miniaturek potrzebujemy wszystkich sił. darktable powinien jednak najpierw sprawdzić, czy urządzenie Tahiti jest wolne, ponieważ jest szybsze. Jeśli nie, sprawdzane są wszystkie inne urządzenia – czyli w tym przypadku tylko GTS450.