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 istnieje pięć różnych kolejek. Jedna odpowiada za przetwarzanie centralnego widoku obrazu (lub pełnego widoku) w trybie ciemni, inna przetwarza obraz podglądu (okno nawigacji, potrzebne również dla histogramów i wewnętrznych procedur, odpowiednich dla wyjściowego pełnego widoku). Jeszcze inna kolejka potrzebna jest dla pokazania drugiego okna ciemni. W dowolnym momencie może być uruchomiona jedna z tych trzech 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 lub drugiego okna jest bardziej wymagające. Pełna kolejka eksportu jest jeszcze bardziej wymagająca.
Parametr konfiguracyjny “opencl_device_priority” przechowuje łańcuch znakowy o następującej strukturze:
a,b,c.../d,e,f.../g,h,i.../j,k,l.../m,n,o...
Każda litera reprezentuje jedno konkretne urządzenie OpenCL. W ciągu parametrów znajduje się pięć pól oddzielonych 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 d, e, f...
mogą przetwarzać kolejki podglądu, urządzenia g, h, i...
– kolejki eksportowe, urządzenia j, k, l...
– kolejki miniatur i wreszcie urządzenia m, n, o...
– kolejki podglądu drugiego okna. 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 jego nazwy kanonicznej (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,*/*/*/!0,*
.
Każde wykryte urządzenie OpenCL może przetwarzać obraz widoku centralnego. Pierwsze urządzenie OpenCL (0) nie może przetwarzać obu kolejek 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. Ograniczenia te nie dotyczą kolejek eksportu ani kolejek miniatur.
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, szybkiej Nvidii Quadro RTX 4000 oraz powolniejszego GeForce’a GTS 1050. 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 'NVIDIA GeForce GTX 1050'
[opencl_init] 1 'NVIDIA CUDA Quadro RTX 4000'
[opencl_init] FINALLY: opencl is AVAILABLE on this system.
z nazwami kanonicznymi, pokazanymi powyżej jako nvidiagforcegtx1050
i nvidiacudaquadrortx4000
Tutaj GeForce GTX 1050 jest wykrywany jako pierwsze urządzenie, a Quadro RTX 4000 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ż GTX 1050 jest wolniejszy niż RTX 4000, zoptymalizowany „opencl_device_priority” może wyglądać następująco:
!nvidiagforcegtx1050,*/!nvidiacudaquadrortx4000,*/nvidiacudaquadrortx4000,*/nvidiacudaquadrortx4000,*/!nvidiacudaquadrortx4000
.
GTX 1050 jest explicite wykluczony z przetwarzania kolejki środkowego obrazu; jest to zarezerwowane dla „wszystkich” innych urządzeń (np. RTX 4000). I odwrotnie, w przypadku kolejki podglądu, RTX 4000 jest wykluczona, więc tylko GTX 1050 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 RTX 4000 jest dostępne, ponieważ jest szybsze. Jeśli nie jest wolne, sprawdzane są wszystkie inne urządzenia - w rzeczywistości tylko GTX 1050.