darktable page lede image
darktable page lede image

Optymalizacja wydajności OpenCL

10.2.7. Optymalizacja wydajności OpenCL

Kilka parametrów w pliku $HOME/.config/darktable/darktablerc pomoże ci dostroić reponsywność OpenCL w systemie. Responsywność w tym kontekście rozumiemy jako brak opóźnień w interaktywnym trybie darktable, na przykład przy ponowieniu przetwarzania sekwencji. Do komfortowej pracy responsywność powinna być oczywiście jak najwyższa.

W celu uzyskania informacji profilującej należy wywołać darktable z terminala komendą

darktable -d opencl -d perf

Po każdym ponownym przetworzeniu sekwencji – spowodowanym przez zmianę parametrów modułów, powiększenie, przewijanie, itd. – zobaczysz czas całkowity i spędzony w każdym z jąder OpenCL. Najważniejsza informacja to całkowity czas wykonania sekwencji. Zauważ, że odczyty dla pojedynczych modułów nie będą wiarygodne, jeśli uruchamiasz OpenCL asynchronicznie (p. opencl_async_pixelpipe poniżej).

Do szybkiego przetworzenia sekwencji z OpenCL bardzo ważne jest maksymalne wykorzystanie GPU. Jakakolwiek przerwa czy nieprzetworzone dane powiększą całkowity czas przetwarzania. Ma to szczególne znaczenie dla małych buforów zdjęć, którymi posługujemy się w pracy interaktywnej. Wydajny GPU może przetworzyć je bardzo szybko. Nawet jednak krótkie przerwy w wykonaniu sekwencji mogą stać się wąskim gardłem.

Z drugiej strony wydajność darktable podczas eksportu jest determinowana mniej więcej szybkością algorytmów i prędkością GPU. Krótkie przestoje nie wywrą zauważalnego wpływu na ogólny czas eksportu.

darktable posiada już większość parametrów działających optymalnie w większości systemów. Jeśli jednak chcesz poświęcać czas na dalszą optymalizację i dostrajanie, poniżej znajduje się opis odpowiednich parametrów konfiguracyjnych.

opencl_async_pixelpipe

Ten przełącznik kontroluje, jak często sekwencja OpenCL ma być blokowana i zwracać status powodzenia/niepowodzenia dla wszystkich jąder, będących w użyciu. Dla optymalnej latencji ustaw go TRUE, darktable wykona wtedy sekwencję asynchronicznie i spróbuje wykorzystać tak mało przerwań, jak będzie to możliwe. Jeśli występują błędy OpenCL, takie jak wadliwie działające jądra, ustaw ten parametr na FALSE, darktable będze wtedy przerywać wykonanie po każdym module, co ułatwi izolowanie problemu. Znane są problemy z niektórymi starymi kartami ATI/AMD, takimi jak HD57xx, generującymi błędne wyjście, kiedy ten parametr ustawiony jest na TRUE. W razie wątpliwości ustaw go na domyślną wartość FALSE.

opencl_number_event_handles

Korzystamy z uchwytów zdarzeń, dzięki czemu możemy śledzić powodzenie/niepowodzenie jąder i informację profilera, nawet jeśli sekwencja została uruchomiona asynchronicznie. Liczba uchwytów zdarzeń jest ograniczona w sterowniku OpenCL. Są one oczywiście wielokrotnego użytku, ale w tym samym czasie można korzystać z ograniczonej ich liczby. Nie ma niestety możliwości dowiedzieć się, jaki jest ten limit; pozostaje zgadywanka. Domyślna wartość 25 jest dość zachowawcza. Możesz próbować wyższych wartości, jeśli na przykład 100 daje lepszą wydajność OpenCL. Jeśli sterownikowi brakuje uchwytów, pojawią się błędy jąder OpenCL z kodem -5 (CL_OUT_OF_RESOURCES), awarie lub przestoje systemu; w takim przypadku ogranicz ten parametr. Wartość 0 zabrania darktable korzystania z jakichkolwiek uchwytów. To uniemożliwi darktable właściwe monitorowanie powodzenia jąder OpenCL ale zmniejszy nieco narzut sterownika. Konsekwencją tego będą błędy, generujące błędne wyjście bez powiadamiania darktable; jest to opcja zalecana tylko w przypadku, kiedy działania swojego systemu jesteś bardziej niż pewien. Możesz ten parametr ustawić także na -1, co oznacza brak ograniczeń dla darktable w liczbie uchwytów zdarzeń; tej opcji nie polecamy.

opencl_synch_cache

Ten parametr ustawiony na TRUE wymusi na darktable przechwycenie buforów obrazu z GPU po każdym module i przechowanie go w pamięci podręcznej sekwencji. Jest to bardzo zasobochłonna operacja. Ma sens tylko wtedy, jeśli masz relatywnie wolną kartę graficzną. W takim przypadku darktable może zaoszczędzić trochę czasu podczas zmiany parametrów modułu, ponieważ może wrócić do zapisanego stanu pośredniego i przetworzyć tylko część sekwencji. W większości przypadków należy ten parametr ustawić na FALSE (domyślnie).

opencl_micro_nap

W idealnym przypadku zużywasz 100% czasu GPU na przetwarzanie sekwencji. I to jest dobre. Z drugiej strony GPU potrzebny jest również do aktualizowania ekranu i może się zdarzyć, że braknie mu na to czasu. Efektem może być ospała reakcja interfejsu na przesuwanie, powiększanie bądź zmianę stau suwaków. darktable może dodać mikrodrzemki do przetwarzania sekwencyjnego, żeby dać procesorowi troszkę czasu na aktualizację interfejsu i pokrewnych. Parametr opencl_micro_nap kontroluje czas trwania mikrodrzemki w milisekundach. Możesz eksperymentować z tą wartością, żeby znaleźć optymalną wartość dla systemu. Możesz zacząć od wartości 0, 100, 500 i 1000. Wartość domyślna to 1000.

opencl_use_pinned_memory

Podczas operacji kafelkowania pomiędzy gospodarzem a urządzeniem wymieniane są ogromne ilości danych z pamięci. Na niektórych urządzeniach (głównie AMD) bezpośrednie transfery z i do określonego rejonu pamięci gospodarza powodują duże obciążenie wydaności. Jest to szczególnie zauważalne podczas eksportu dużych obrazów. Ustawienie parametru na TRUE nakaże darktable użyć specjalnego bufora pośredniego dla dużych transferów danych. Na niektórych urządzeniach może to dwu- lub trzykrotnie przyspieszyć transfer danych. Sterowniki i urządzenia NVIDIA wydają się z kolei dysponować efektywniejszymi technikami transferu, nawet dla ściśle określonych obszarów pamięci. Ponieważ na tych ostatnich wzrost wydajności może nie być widoczny, a włączenie parametru może zniekształcić wyjście, dla urządzeń NVIDIA zaleca się pozostawienie opencl_use_pinned_memory na domyślnej wartości FALSE.