wiele urządzeń
Szeregowanie urządzeń OpenCL można zoptymalizować w większości systemów za pomocą ustawień „profil szeregowania OpenCL”. Jeśli jednak twój system jest wyposażony w więcej niż jeden procesor graficzny, możesz ręcznie ustawić względny priorytet urządzenia. W tym celu należy wybrać „domyślny” profil planowania i zmienić ustawienia w parametrze konfiguracyjnym „opencl_device_priority”.
Ważne jest, aby zrozumieć, w jaki sposób darktable korzysta z urządzeń OpenCL. Każda sekwencja przetwarzania obrazu — aby przekonwertować dane wejściowe na końcowy wynik przy użyciu stosu historii — jest uruchamiana w kolejce przetwarzania. W darktable są cztery różne kolejki. Jedna odpowiada za przetwarzanie centralnego widoku obrazu (lub pełnego widoku) w trybie ciemni, inna przetwarza obraz podglądu (okno nawigacji). W dowolnym momencie może być uruchomiony jedna z tych dwóch kolejek, przy czym kolejki pełne i podglądowe działają równolegle. Ponadto może istnieć wiele równoległych kolejek, wykonujących eksport plików, a także wiele równoległych kolejek, generujących miniatury. Jeśli urządzenie OpenCL jest dostępne, darktable dynamicznie przypisuje je do jednej konkretnej kolejki na jeden przebieg i zwalnia go później.
Zapotrzebowanie na obliczenia różni się znacznie w zależności od typu obsługiwanej kolejki. Obraz podglądu i miniatury mają niską rozdzielczość i można je szybko przetwarzać, podczas gdy przetwarzanie widoku centralnego obrazu jest bardziej wymagające. Pełna kolejka eksportu jest jeszcze bardziej wymagająca.
Parametr konfiguracyjny „opencl_device_priority” zawiera ciąg znaków o następującej strukturze: a,b,c.../k,l,m.../o,p,q.../x,y, z...
. Każda litera reprezentuje jedno konkretne urządzenie OpenCL. W ciągu parametrów znajdują się cztery pola oddzielone ukośnikiem, z których każde reprezentuje jeden typ kolejki przetwarzania. a,b,c...
określa urządzenia, które mogą przetwarzać kolejkę środkową (pełną). Podobnie urządzenia k,l,m...
mogą przetwarzać kolejki podglądu, urządzenia o,p,q...
– kolejki eksportowe i wreszcie urządzenia x,y,z...
– kolejki miniatur. Puste pole oznacza, że żadne urządzenie OpenCL nie może obsługiwać tego typu kolejki.
darktable posiada wewnętrzny system numeracji, dzięki któremu pierwsze dostępne urządzenie OpenCL otrzymuje numer 0. Wszystkie kolejne urządzenia są numerowane kolejno. Ten numer, wraz z nazwą urządzenia, jest wyświetlany, gdy uruchamiasz darktable poleceniem darktable -d opencl
. Możesz określić urządzenie według numeru lub nazwy (wielkie/małe litery i spacje nie mają znaczenia). Jeśli masz więcej niż jedno urządzenie o tej samej nazwie, musisz użyć numerów urządzeń, aby je odróżnić.
Identyfikator urządzenia może być poprzedzony wykrzyknikiem !
, w którym to przypadku urządzenie jest wykluczone z przetwarzania danej kolejki. Możesz także użyć gwiazdki *
jako wieloznacznika, reprezentującego wszystkie urządzenia, które nie zostały wcześniej wyraźnie wymienione w tej grupie.
Kolejność sekwencji w grupie ma znaczenie – darktable odczyta listę od lewej do prawej i za każdym razem, gdy spróbuje przydzielić urządzenie OpenCL do danej kolejki, przeskanuje urządzenia w tej kolejności, biorąc pierwsze znalezione wolne urządzenie.
Jeśli proces kolejki ma zostać uruchomiony, a wszystkie procesory graficzne w odpowiedniej grupie są zajęte, darktable domyślnie automatycznie przetwarza obraz na procesorze. Możesz wymusić przetwarzanie GPU, poprzedzając listę dozwolonych GPU znakiem plus „+”. W tym przypadku darktable nie będzie używał procesora, ale raczej zawiesi przetwarzanie, dopóki następne dozwolone urządzenie OpenCL nie będzie dostępne.
Domyślne ustawienie darktable dla „opencl_device_priority” to */!0,*/*/*
.
Każde wykryte urządzenie OpenCL może przetwarzać obraz widoku centralnego. Pierwsze urządzenie OpenCL (0) nie może przetwarzać kolejki podglądu. W konsekwencji, jeśli w systemie dostępny jest tylko jeden procesor graficzny, kolejka podglądu będzie zawsze przetwarzana przez procesor, zachowując pojedynczy procesor graficzny wyłącznie dla bardziej wymagającego widoku centralnego obrazu. Jest to rozsądne ustawienie dla większości systemów. Żadne takie ograniczenia nie dotyczą kolejek eksportu i kolejek miniaturowych.
Ustawienie domyślne to dobry wybór, jeśli masz tylko jedno urządzenie. Jeśli masz kilka urządzeń, stanowi to rozsądny punkt wyjścia. Ponieważ jednak twoje urządzenia mogą mieć dość różne poziomy mocy obliczeniowej, warto zainwestować trochę czasu w optymalizację listy priorytetów.
Poniżej zamieszczamy przykład. Załóżmy, że system składa się z dwóch kart, szybkiego Radeona HD7950 oraz starszego i powolniejszego GeForce’a GTS450. darktable (uruchomione poleceniem darktable -d opencl
) zaraportuje 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.
Tutaj GeForce GTS 450 jest wykrywany jako pierwsze urządzenie, a Radeon HD7950 („Tahiti”) jako drugie. Ta kolejność zwykle nie zmieni się, chyba że konfiguracja sprzętu lub sterownika zostanie zmodyfikowana, ale lepiej jest używać nazw urządzeń niż numerów, aby być po bezpiecznej stronie.
Ponieważ GTS450 jest wolniejszy niż HD 7950, zoptymalizowany „opencl\device\priority” może wyglądać następująco: !GeForce GTS450,*/!Tahiti,*/Tahiti,*/Tahiti,*
.
GTS450 jest wyraźnie wykluczony z przetwarzania kolejki środkowego obrazu; jest to zarezerwowane dla „wszystkich” innych urządzeń (np. HD7950/Tahiti). I odwrotnie, w przypadku kolejki podglądu, Tahiti jest wykluczona, więc tylko GTS450 może wykonywać pracę.
W przypadku eksportu plików i generowania miniatur chcemy, aby wszyscy mieli ręce na pokładzie. Jednak darktable powinien najpierw sprawdzić, czy urządzenie Tahiti jest wolne, ponieważ jest szybsze. Jeśli nie jest wolne, sprawdzane są wszystkie inne urządzenia - w rzeczywistości tylko GTS450.