EDYTOWAĆ:
Kilka innych kwestii poruszonych w http://rybkaforum.net/cgi-bin/rybkaforum/topic_show.pl?tid=32317 .
- GPU nie jest tak dobra do rekurencji
- Procesor graficzny nie jest tak dobry do pływania
- Procesor graficzny może działać lepiej w przypadku nowego podejścia uczenia maszynowego, ale nie w przypadku tradycyjnych algorytmów silnika
Oryginał :
@ Maxwell86 podał już doskonałe linki i zasoby. Zwróć uwagę na silnik zeta-szachy. To silnik szachowy na GPU. Niestety GPU nie udowodniło swojej przydatności w programowaniu szachowym. W rzeczywistości projekt silnika szachowego zeta poszedł absolutnie nigdzie.
Procesor graficzny działa bardzo dobrze na obliczeniach zmiennoprzecinkowych i algorytmach, które mogą być równoległe. To wymaga niezależności. Ale jeśli spojrzymy na typowe drzewo min-max (lub alfa-beta) (używane przez każdy silnik szachowy)
Prawa gałąź zależy od lewej gałęzi. W szczególności, jeśli możemy uzyskać odcięcie (fail-high), nie musielibyśmy nawet przeszukiwać pozostałych węzłów. Niestety, nie jest to coś, co GPU może zrobić wydajnie. Możliwe jest napisanie programu GPU dla wersji alfa-beta, ale wątki GPU (znane jako jądra) będą musiały zostać wstrzymane, aby poczekać. W przeciwieństwie do procesora, hodowla GPU nie może po prostu przejść na coś innego (proces znany jako przełączanie wątków lub nawet przełączanie procesów).
Nasza obecna wiedza na temat algorytmów i silników została opracowana dla świata procesorów. Cały algorytm musiałby zostać ponownie zbadany dla GPU. Niestety nie ma dużego zainteresowania i badań na ten temat.
Nie mam doświadczenia w programowaniu GPU, ale zazwyczaj GPU są bardzo wydajne w wykonywaniu prostych poleceń w sposób równoległy. Najwyraźniej nie jest tak w przypadku drzewa wyszukiwania używanego w silnikach szachowych. Dlatego GPU traci przewagę obliczeniową nad procesorem.
Oczywiście jest to obecny stan programowania GPU dla silników szachowych, ale programowanie GPU jest stosunkowo nowe, więc może znajdą rozwiązania dla obecnych problemów w przyszłości.
Oto kilka interesujących linków, zwłaszcza blog o implementacji silnika szachowego dla GPU jest dość wnikliwy.
źródło
Projekt LC0 (Leela Chess Zero), adaptacja AlphaZero dla szachów o otwartym kodzie, pokazuje korzyści wynikające z gpus, wydajności zmiennoprzecinkowej i przepustowości pamięci wykorzystywanych w dużych sieciach neuronowych.
http://lczero.org/
https://en.wikipedia.org/wiki/AlphaZero
https://groups.google.com/forum/#!forum/lczero
źródło
Skończyłem bieżący bieg na Zeta v099a, moim eksperymentalnym silniku szachowym GPU.
https://github.com/smatovic/Zeta
Rzeczywistym wnioskiem obecnej iteracji jest to, że prosty silnik ze standardowymi technikami programowania szachowego można przenieść do OpenCL, aby działał na GPU, ale potrzeba więcej wysiłku, aby silnik stał się konkurencyjny pod względem obliczanych węzłów na sekundę ( prędkość), heurystyki (wiedza ekspercka) i skalowania (algorytm wyszukiwania równoległego).
Szachy komputerowe, jako temat informatyki, ewoluowały przez dziesięciolecia, poczynając od lat 40. i 50., i osiągnęły jeden szczyt w 1997 r. Meczem Deep Blue vs. W dzisiejszych czasach silniki szachowe są strojone przez granie w tysiące gier, więc uzyskanie silnika gry w szachy działającego na GPU i uzyskanie konkurencyjnego silnika gry w szachy na GPU to dwa różne zadania.
źródło
Mam pewne doświadczenie z CUDA i programowaniem szachowym (nie programowaniem silnika). To pytanie również przyszło mi do głowy wiele razy. Oto moja opinia, nigdy tego nie studiowałem.
Po pierwsze, jest praktycznie pewne, że przy obecnej konstrukcji silników szachowych jest to niemożliwe. W przeciwnym razie ktoś po prostu to zrobiłby.
Czy można go użyć w zupełnie nowym designie, to większe pytanie. Nie ma problemu z operacjami na liczbach całkowitych, ale najwyraźniej jest ogromna rzecz, że musisz uruchomić prymitywny kod bez poważnego rozgałęzienia wielu jednostek.
Moim zdaniem wszystkie obliczenia drzewa powinny działać na procesorze.
Ale mogę sobie wyobrazić (nie mówię, że jest to możliwe) niektóre funkcje częściowej oceny, które po prostu dokonują jak największej liczby ocen pozycji, aby dać CPU więcej czasu, aby pomóc mu zbudować drzewo w lepszy sposób, powiedzmy jedna taka funkcja mogłaby obliczyć, jak poważne należy wykonać obliczenia dla każdej pozycji.
Możesz obliczyć liczbę zaatakowanych kwadratów, zaatakowane kawałki, siłę ognia wokół królów, aw niektórych podregionach na pokładzie, rzeczy związane ze strukturą pionków, prawdopodobnie możesz dla nich zrobić kod zoptymalizowany pod kątem GPU. Prawdopodobnie możesz uzyskać wiele przydatnych informacji za darmo (bez czasu procesora, bez czekania na procesor), ale musiałbyś być geniuszem, aby wykorzystać pełną moc nowoczesnych GPU do tak małych rzeczy.
Prawdopodobnie nie jest zbyt interesująca rzecz, aby stworzyć zupełnie nową konstrukcję silników, aby uzyskać powiedzmy 30% dodatkową prędkość. Aby powiedzieć, że powiedzmy 20-krotne przyspieszenie najnowocześniejszych układów GPU, musiałbyś sprawić, by funkcje oceny były naprawdę obce.
I ostatnia rzecz w tym, co uważam za problem. Możesz uruchamiać jeden kod na CPU bez większego zastanowienia, ale w scenariuszu CPU + GPU musiałbyś radzić sobie z naprawdę różnymi stosunkami CPU i GPU. prędkości i liczba rdzeni. Potrzebny byłby inny kod dla 16-rdzeniowego klastra ze słabym GPU niż na wolnym CPU z superszybkim GPU, aby móc korzystać z pełnych możliwości sprzętu. Pożądane byłoby porównywanie procesora z GPU, a następnie uruchamianie większej ilości kodu na szybszej maszynie. Ale nadal myślę, że nie zbliżysz się do karmienia 3000 rdzeni bestii tylko za pomocą funkcji oceny.
Edycja: Żeby było jasne, procesor regularnie wysyła tablice GPU pozycji w celu dokonania częściowej oceny. Może nie było to jasne z tego, co napisałem.
Wiele problemów, aby to zadziałało.
źródło
Widzę tylko zalety korzystania z silnika szachowego opartego na GPU i nie widzę w tym żadnych poważnych problemów. Być może masz takie problemy, spróbuj użyć standardowego programu szachowego, nie wiem zbyt wiele o innych. Właśnie zaczynam pisać program szachowy od pierwszego wiersza, jako drugi program oparty na CUDA, po tym jak wykonałem pierwsze testy programistyczne na CUDA bez konkretnej sekwencji. Wkrótce mogę przeprowadzić pierwsze testy wydajności i przetestować gry z innymi silnikami. Może w przyszłym tygodniu. Właśnie zaczynam go tworzyć, ale jestem już blisko, kończę i większość funkcji jest już ukończona.
źródło