CPU v. GPU para motores de ajedrez


16

Las GPU son mejores en ciertos tipos de cálculos, por ejemplo, generar bitcoins y realizar simulaciones climáticas.

¿Se beneficiarían los motores de ajedrez si calcularan con GPU en lugar de CPU?

Tal vez una persona con conocimientos pueda resaltar las diferencias entre los dos y aclararnos si las GPU son (no) adecuadas para el tipo de cálculos que ejecutan los motores de ajedrez.

Respuestas:


13

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)

ingrese la descripción de la imagen aquí

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 tiene que descargar el minimax en sí. Hay ciertas subtareas (por ejemplo, búsqueda de ruta alfa de Botvinnik, hashing de placa, evaluación estática, etc.) que son muy adecuadas para GPU. Dicho esto, no tengo conocimiento de ninguna investigación en esta área.
user58697

Cierto. Pero si la búsqueda principal en sí no se puede descargar, no debería tener sentido descargar las tareas pequeñas.
HelloWorld

3
Esta es una excelente respuesta. ¿Dónde en mi pantalla está el interruptor +3? No puedo encontrarlo!
thb

7

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.



Las cosas en las que las GPU son buenas incluyen matemática fraccional, operaciones vectoriales y paralelización que requieren una sincronización mínima. Los motores de ajedrez tienen el último pero no los dos primeros.
intx13


2

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.


0

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.


0

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.


Google ha demostrado que la GPU es ideal para el aprendizaje automático, pero la GPU no es buena para la programación tradicional de ajedrez.
HelloWorld
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.