wtorek, 12 czerwca 2012

Szachy i komputery (17) - autor Wojtek Żuchowski


Wieloprocesorowość, liczba bitów, GPU

Silniki szachowe były dostępne w wersjach wieloprocesorowych na długo przed tym, zanim pojawiły się procesory dwurdzeniowe. Co więcej, wyjątkowo efektywnie wykorzystują wiele rdzeni.
W dziale FAQ poświęconym Rybce 2 jej twórca pisze, że wprawdzie zaprogramowanie silnika szachowego tak, aby przyzwoicie działał na wielu rdzeniach, nie jest zbyt trudne, to walka z różnymi ograniczeniami nie ma końca. Co więcej, choć na dwóch rdzeniach łatwo uzyskać znaczny przyrost wydajności, to wraz z liczbą rdzeni wykładniczo rośnie wpływ błędów w prowadzeniu wątków.
Na przykład Rybka 2 według twórcy skaluje się tak: dwa rdzenie – 1,7 wydajności pojedynczego rdzenia, cztery rdzenie – 2,8, osiem rdzeni – 4,4. Nie jest to maksimum tego, co autor zdołał uzyskać, ale „bezpieczna” wydajność publicznie dostępnej wersji.
Co ważne, podane przed chwilą proporcje dotyczą efektywnej liczby pozycji na sekundę, która bezpośrednio przekłada się na przykład na czas znalezienia posunięcia. Wprawdzie obliczenia szachowe dają się jak mało które rozbić na wiele równoległych wątków, ale szachy mają to do siebie, że do danej pozycji mogą prowadzić różne posunięcia, więc jeśli różne rdzenie liczą różne warianty, część analizy pokrywa się. Tak więc liczba pozycji liczonych przez procesor wielordzeniowy skaluje się dużo lepiej niż efektywna szybkość silnika: w stosowanym na wielu portalach benchmarku Fritza (Fritz Chess Benchmark) – niemal idealnie, w praktyce jednak, czyli w wersji wieloprocesorowej programu (jak Deep Fritz), dużo gorzej, bo do liczenia pozycji dochodzi cała heurystyka. Czyli jeśli w benchmarku Fritza szybkość liczenia pozycji wyniesie 3,95 szybkości działania na jednym rdzeniu, w wersji wieloprocesorowej programu będzie to około 3,8, jednak czas znalezienia pozycji skróci się najwyżej trzykrotnie.
W praktyce nawet obecna efektywna wielowątkowość silników jest wystarczająca, zwłaszcza na dwóch rdzeniach, na których różnica między faktyczną wydajnością a teoretyczną przekłada się najwyżej na kilkanaście punktów w rankingu Elo (na poziomie powyżej 3000 punktów), co statystycznie oznacza w bezpośrednim starciu wynik 51 procent.
Osiem oficjalnie obsługiwanych rdzeni było normą już w latach 90. Obecnie nie dziwi brak ograniczeń liczby rdzeni (przynajmniej oficjalnych), eksperymentuje się nawet z kilkuset. Na 512 procesorach (1,6-gigahercowe Itanium 2) był testowany choćby silnik Zappa.
Wyraźny przyrost wydajności można uzyskać dzięki wersji 64-bitowej, co wiąże się głównie z długością plansz bitowych (omówionych w jednym z wcześniejszych rozdziałów). We wspomnianym dziale FAQpoświęconym Rybce 2 czytamy, że przyspieszenie sięga 60 procent.
Możliwe, że nie ma co liczyć na wykorzystanie układów graficznych w obliczeniach szachowych. Takie układy górują nad procesorami ogólnego przeznaczenia przede wszystkim w obliczeniach zmiennoprzecinkowych, a szachy, choć idealnie nadają się do przetwarzania równoległego, to liczby całkowite i proste operacje logiczne. Przy tym obliczenia, które najlepiej nadawałyby się do przeniesienia na układ graficzny, są mało absorbujące dla procesora.
Na pewno coś takiego wymagałoby napisania oprogramowania od nowa. Na przykład twórca Rybki Vasik Rajlich pisze, że gdy ta technologia dojrzeje, będzie można się jej przyjrzeć, ale nie jest to coś, w co warto wchodzić przed innymi bez istotnego powodu, a na pewno nie priorytet, jeśli chodzi o zwiększanie siły gry silnika.

Brak komentarzy:

Prześlij komentarz