EDITAR:
Pocos otros puntos planteados en http://rybkaforum.net/cgi-bin/rybkaforum/topic_show.pl?tid=32317 .
- GPU no tan buena para la recursividad
- GPU no tan buena para flotar
- La GPU podría funcionar mejor para el nuevo enfoque de aprendizaje automático, pero no los algoritmos tradicionales del motor
Original :
@ Maxwell86 ya ha brindado excelentes enlaces y recursos. Presta atención al motor de ajedrez zeta. Es un motor de ajedrez GPU. Desafortunadamente, GPU no ha demostrado su utilidad en la programación de ajedrez. De hecho, el proyecto del motor de ajedrez zeta no fue absolutamente a ninguna parte.
GPU funciona muy bien en cálculos flotantes y algoritmos que pueden ser paralelos. Esto requiere independencia. Pero si miramos un árbol típico min-max (o alfa-beta) (utilizado por cada motor de ajedrez)
La rama derecha depende de la rama izquierda. En particular, si podemos obtener un límite (falla alta), ni siquiera tendríamos que buscar en los nodos restantes. Desafortunadamente, esto no es algo que una GPU pueda hacer eficientemente. Es posible escribir un programa de GPU para alfa-beta, pero los subprocesos de GPU (conocidos como núcleos) deberán detenerse para esperar. A diferencia de una CPU, una perrera de GPU no puede simplemente cambiar a otra cosa (un proceso conocido como cambio de hilo o incluso cambio de proceso).
Nuestro algoritmo existente y el conocimiento del motor se derivaron para el mundo de la CPU. El algoritmo completo necesitaría ser reinvestigado para la GPU. Desafortunadamente, no hay mucho interés e investigación al respecto.
No tengo experiencia con la programación de GPU, pero, por lo general, las GPU son muy eficientes en la ejecución de comandos simples de forma paralela. Aparentemente, este no es el caso del árbol de búsqueda que se usa para los motores de ajedrez. Por lo tanto, la GPU pierde su ventaja computacional sobre una CPU.
Por supuesto, este es el estado actual de la programación de GPU para motores de ajedrez, pero la programación de GPU es relativamente nueva, por lo que tal vez encuentren soluciones para los problemas actuales en el futuro.
Aquí hay un par de enlaces interesantes, especialmente el blog sobre la implementación de un motor de ajedrez para GPU es bastante perspicaz.
fuente
El proyecto LC0 (Leela Chess Zero), una adaptación de código abierto de AlphaZero para ajedrez, muestra el beneficio de gpus, rendimiento de punto flotante y ancho de banda de memoria utilizado en grandes redes neuronales.
http://lczero.org/
https://en.wikipedia.org/wiki/AlphaZero
https://groups.google.com/forum/#!forum/lczero
fuente
Terminé mi ejecución actual en Zeta v099a, mi motor de ajedrez gpu experimental.
https://github.com/smatovic/Zeta
La conclusión real de la iteración actual es que un motor simple, con técnicas de programación de ajedrez estándar, puede ser portado a OpenCL para ejecutarse en una gpu, pero tomaría más esfuerzo hacer que el motor sea competitivo en términos de nodos computados por segundo ( velocidad), heurística (conocimiento experto) y escalado (algoritmo de búsqueda paralela).
Computer Chess, como un tema de informática, evolucionó durante décadas, comenzando en los años 40 y 50, y alcanzó un pico en 1997 con el partido Deep Blue vs. Kapsarow. Hoy en día, los motores de ajedrez se ajustan jugando miles y miles de juegos, por lo que hacer que un motor de ajedrez se ejecute en la gpu y obtener un motor de ajedrez competitivo que funcione en la gpu son dos tareas diferentes.
fuente
Tengo cierta experiencia con CUDA y programación de ajedrez (no programación de motor). Esta pregunta también vino a mi mente muchas veces. Aquí está mi opinión, nunca estudié esto.
Bueno, primero, es prácticamente seguro que con el diseño actual de los motores de ajedrez es imposible. De lo contrario, alguien simplemente lo haría.
Si podría usarlo en un diseño completamente nuevo, esa es una pregunta más importante. No hay ningún problema con las operaciones de enteros, pero está claro que debe ejecutar un código primitivo sin ramificaciones serias en muchas entidades.
En mi opinión, todos los cálculos del árbol deberían ejecutarse en la CPU.
Pero puedo imaginar (no digo que sea posible) algunas funciones de evaluación parcial que solo hacen tantas evaluaciones en las posiciones como sea posible, para darle más tiempo a la CPU, para ayudarlo a construir el árbol de una mejor manera, digamos una de esas funciones podría calcular qué tan serio se debe hacer el cálculo en cada posición.
Puede calcular el número de casillas atacadas, piezas atacadas, potencia de fuego alrededor de reyes y en algunas subregiones a bordo, cosas relacionadas con la estructura de peones, probablemente podría hacer un código optimizado para GPU para estas. Probablemente pueda obtener mucha información útil de forma gratuita (sin tiempo de CPU, sin esperas de CPU), pero tendría que ser un verdadero genio para usar la potencia total de las GPU modernas para cosas tan pequeñas.
Probablemente no sea muy interesante hacer un diseño de motores completamente nuevo para obtener, digamos, un 30% de velocidad adicional. Y para obtener, digamos, una aceleración de 20x en las GPU de última generación, tendría que hacer que las funciones de evaluación sean realmente extrañas.
Y lo último en esto es lo que veo como un problema. Puede ejecutar un código en la CPU sin pensar mucho, pero en el escenario CPU + GPU tendría que lidiar con relaciones realmente diferentes de CPU y GPU. velocidades y recuentos de núcleos. Necesitaría un código diferente para el clúster de 16 núcleos con GPU débil que en una CPU lenta con GPU súper rápida para usar todas las capacidades del hardware. Benchmarking CPU vs GPU y luego ejecutar más código en la máquina más rápida sería deseable. Pero aún así, creo que no se acercará a alimentar 3000 núcleos de bestia solo con funciones de evaluación.
Editar: solo para aclarar las cosas, la CPU enviaba regularmente conjuntos de posiciones de GPU para realizar evaluaciones parciales. Tal vez eso no estaba claro por lo que escribí.
Muchos problemas para hacer que esto funcione.
fuente
Solo veo beneficios al usar un motor de ajedrez basado en GPU y no veo ningún problema serio al hacerlo. Tal vez tenga esos problemas, intente usar un programa de ajedrez estándar, no sepa mucho sobre los demás. Acabo de comenzar a escribir un programa de ajedrez desde la primera línea, como un segundo programa basado en CUDA después de hacer algunas primeras pruebas de programación en CUDA sin un sentido específico. Pronto puedo hacer algunas primeras pruebas de rendimiento y probar juegos contra otros motores. Quizás durante la próxima semana. Acabo de comenzar a crearlo, pero ya estoy cerca, lo termino y la mayoría de las funciones ya están terminadas.
fuente