Counter-Strike 2

Counter-Strike 2

Not enough ratings
Cómo funciona el Multithreading y cómo impacta en el CSGO?
By J4NZU
[Multithreading CSGO] - Cómo funciona el Multithreading y cómo impacta en el CSGO?
   
Award
Favorite
Favorited
Unfavorite
Introducción
¡Hola a todos!

Esta guía tiene como objetivo poder entender el concepto de Multiprogramación y cómo impacta en el desarrollo y consumo de videojuegos. Para esto se introducirán algunos conceptos como Concurrencia y Paralelismo, Multithreading y Multiprocessing, con sus similitudes y diferencias, explicados con algunos ejemplos simples para poder entenderlos mejor. Una vez que tengamos estos conceptos claros, trataremos de analizar cómo impacta en el rendimiento del CSGO en nuestra computadora. Exploraremos las configuraciones que el mismo juego ofrece para aprovechar estos conceptos y trataremos de generar algunas conclusiones de cuál sería la configuración ideal para poder mejorar el rendimiento en nuestro CPU.

Descargo de conocimiento

Todo el contenido y explicación de esta guía esta sujeto a conocimientos de Multiprogramación y datos oficiales de CSGO expuestos en internet por las entidades oficiales. Sin embargo, en muchas ocasiones no existe documentación oficial para responder todas nuestras preguntas por parte del desarrollador oficial, por lo que tendremos que asumir ciertas hipótesis y supuestos para poder aproximarnos a una realidad mas precisa.
Multiprogramacion: Multithreading vs Multiprocessing
En simples palabras, cuando hablamos de multiprogramación nos referimos a la técnica que se emplea para que un procesador o CPU pueda ejecutar diversas tareas “a la vez”. Más correctamente, nos referimos a que un procesador puede ejecutar tareas de manera concurrente o en paralelo, pero estas definiciones requieren un poco más de explicación.

Concurrencia implica que el procesador pueda estar ejecutando tareas simultáneamente pero no exactamente al mismo tiempo, mientras que en el paralelismo puede ocurrir que si se ejecuten exactamente al mismo tiempo.

Tomemos como ejemplo una persona que desea preparar una ensalada, en donde solo tiene que realizar 3 simples tareas
  • Cortar un tomate
  • Lavar una lechuga
  • Cocinar un huevo

Una vez que realice esas tareas, podrá juntar todo lo trabajado en un recipiente y tendrá su ensalada.

Una persona ordenada podría elegir hacer las 3 tareas en un orden y no comenzar una tarea hasta terminar la otra, por ejemplo, primero cortar el tomate, luego lavar la lechuga y finalmente cocinar el huevo. En este ejemplo, la persona está realizando las tareas de manera secuencial (siguiendo una secuencia de pasos).

Otra persona más pragmática, puede elegir empezar a cortar el tomate y dejar la tarea sin terminar, luego poner en remojo la lechuga y empezar a cocinar el huevo; volver a terminar de cortar el tomate, finalmente secar la lechuga y sacar el huevo cocinado. Observen que acá las tareas se están realizando a la vez pero la persona tiene que pausar por un momento la tarea que está haciendo para poder empezar o terminar la otra tarea, y esto ocurre porque hay una sola persona trabajando. En este caso, la persona está preparando su ensalada de manera concurrente.

Ahora bien, busquemos un caso para el paralelismo. Para que podamos preparar la ensalada haciendo las tareas a la vez hace falta otra persona que ayude en la cocina. Por lo que cualquiera de las dos anteriores personas debe llamar a un tercero para que les ayude y puedan, por ejemplo, cortar el tomate y lavar la lechuga al mismo tiempo. No hay que confundirse, uno de los dos podría empezar antes la tarea (o bien terminarla antes) pero en el momento que ambos están trabajando con su ingrediente lo están haciendo de forma paralela.

Todo muy lindo, pero ¿cómo se aplica esto a la multiprogramación?
Para poder emplear la técnica de la multiprogramación existen dos elementos importantes que se pueden usar: Threads (Hilos) y Process (Procesos). Cuando un programa se ejecuta (imaginemos un videojuego de disparos altamente competitivo) se ejecuta en un proceso de nuestro sistema operativo (Windows, Linux, etc). El programa podría estar corriendo y ejecutando tareas una tras de otra o bien podría elegir hacerlo “a la vez”.

No es la intención de esta guía dar una explicación en detalle de ambos elementos, pero sí mencionar algunas cosas importantes. Cuando los desarrolladores deciden utilizar Threads para ejecutar tareas a la vez, hablamos de Multithreading, mientras que si deciden usar procesos hablamos de Multiprocessing.

Como bien se mencionó antes, los programas se ejecutan en procesos. Si los desarrolladores eligen usar hilos, el programa se va a ejecutar únicamente en un solo proceso pero el programa realizará las tareas de manera concurrente. Imaginense los hilos como líneas de ejecución que el proceso elige para hacer tareas, en nuestro ejemplo de la ensalada, la persona ordenada era nuestro proceso y tenía 3 hilos de ejecución (cortar tomate, lavar lechuga y cocinar huevo), donde él mismo elegía cuando dejar una tarea pendiente para dedicarse a realizar otra y luego retomar la que había dejado en espera.

En el caso que elijan usar procesos, cada uno de esos procesos ejecutan una parte del programa encargada de realizar sus tareas correspondientes, en este caso podríamos hablar de paralelismo.

Pero, ¿por qué podríamos hablar de paralelismo y no hablamos de paralelismo en este caso? Quien se encarga de ejecutar ese proceso (con ese programa), es el procesador, pero ese proceso se ejecuta en una unidad de cómputo, mejor conocida hoy como núcleo o core. Entonces, para que podamos hablar de paralelismo necesitamos que ese programa se ejecute en procesos distintos y a su vez estos procesos sean ejecutados por núcleos distintos del procesador.

Sin más detalle, el sistema operativo es el encargado de elegir que core ejecutará cada proceso del sistema y a veces puede elegir que un proceso que está siendo ejecutado por un core específico cambie de core ejecutor, esto es, que el core que ejecutaba el proceso deje de hacerlo para que lo ejecute otro core (recordemos esto último para más adelante).

Con esto podemos concluir que cuando hablamos de Threads (hilos) estamos ejecutando tareas de manera concurrente mientras que cuando hablamos de Process (procesos) potencialmente podemos hablar de paralelismo.
Multithreading en CSGO
Una vez entendido la diferencia entre Concurrencia-Paralelismo y Threads-Procesos, podemos revisar que nos ofrecen los desarrolladores de CSGO para aprovechar la multiprogramación.

Revisando la documentación oficial de valve definen una serie de parámetros de lanzamiento que son aplicables a todos los juegos desarrollados con el motor Source (y en particular para el CSGO). En uno de ellos encontramos el siguiente parámetro

-threads
Number of threads to allocate for the thread pool, default is 3

En este caso nos permite configurar el threadpool, esto es, la cantidad de threads que van a estar disponibles para hacer tareas que requiera el juego. No es que la aplicación decida por sí sola cuántos threads usar, si no que nosotros podemos configurarla al arrancar el juego, su valor por defecto es 3. Es importante entender que los threads estarán disponibles, pero no necesariamente estarán realizando trabajo, solamente ejecutan tareas cuando el programa lo requiera. Por otro lado, no habla en ningún momento de la utilización de procesos o Multiprocessing.

Para el análisis de Multithreading en CSGO vamos a tomar las siguientes hipótesis
Consideramos que VALVE se refiere correctamente a threads (es decir que cuando nos dicen que usan threads, es lo que mencionamos más arriba)
Para la sección de pruebas, debemos mencionar brevemente el concepto Hyperthreading (que seguramente algunos les sonará familiar, solo es otro caso particular que aplica a lo que hemos visto pero con algunas condiciones diferentes).
Nos basamos únicamente en la información disponible que provee VALVE como desarrollador oficial del juego.

La primera conclusión importante que podemos observar acá es que el CSGO no usa procesos, en cambio usa Threads y por lo tanto solamente podemos hablar de concurrencia.

Lo segundo que podemos deducir es que entonces el juego se ejecutará en un solo proceso y por lo tanto solo un núcleo estará dedicado a trabajar con este proceso.

Si recuerdan lo que habíamos remarcado, el sistema operativo también podría decidir que el núcleo encargado de ejecutar el CSGO deje de hacerlo y que otro núcleo tome esa ejecución. Este cambio de núcleos representa un costo para el sistema operativo y por lo tanto impacta en el rendimiento del juego.
Pero entonces, ¿tener más núcleos en mi procesador no aporta nada en el rendimiento del CSGO? ¿Sirve para algo la configuración de lanzamiento -threads?

La realidad es que no sabemos bien a ciencia cierta qué es lo que realiza el programa al aplicar la concurrencia y tampoco conocemos con mucho detalle qué es lo que realiza cada thread (Valve no ha proporcionado esa información o bien no la hemos encontrado). Pero una cosa podemos asumir, el juego corre en un solo proceso. Si nuestra computadora solamente (y digo SOLAMENTE) corriera el CSGO tendremos SOLAMENTE un único proceso que será ejecutado por un core a la vez. En este caso es como querer matar a una mosca con una bazooka, no tiene mucho sentido y podría ser contraproducente (por el cambio de cores que ya hablamos.

Pero nuestra computadora no corre solo el juego, continuamente está procesando muchas más tareas del Sistema Operativo u otros softwares que tengamos instalados. Tener múltiples core ayuda al CPU a distribuir la carga de trabajo a otros cores, lo que hace que el core que corra el proceso de CSGO tenga menos carga y pueda rendir mejor.

Seguramente habrán encontrado algunos mitos, como quienes dicen que si nuestra PC tiene 4 cores, debemos configurar -threads 4, o si tiene 8 cores usar -threads 8 para mejorar el rendimiento y aumentar FPS (y la discusión también sigue con el Hyperthreading, pueden googlearlo si desean). Con todo lo que vimos hasta ahora estamos en condiciones de poder decir que este mito es falso y que no hay razones para creer que esto sea cierto, ya que como dijimos, los threads viven en un único proceso (y por lo tanto en un solo núcleo). Cada proceso tiene su propio contexto, y dentro de ese contexto, están los threads.

¿Cómo podemos entonces saber que configuración de threads usar para que nuestro rendimiento sea óptimo, aumentar nuestros FPS y que el juego funcione mejor? Dedicaré la siguiente sección a mostrar una serie de pruebas en mi computadora para determinar cuál es la configuración que mejor rendimiento da y trataremos de definir alguna estrategia para que cada uno pueda encontrar su mejor configuración.
Pruebas
En este punto explicaré muy brevemente el concepto de Hyperthreading. Esto es, la capacidad de algunos procesadores de virtualizar sus núcleos. Es decir, pueden lograr simular que tiene más núcleos de los que realmente tiene. Por ejemplo, un procesador de 8 núcleos con hyperthreading, tiene la capacidad de simular que tiene el doble, 16 núcleos. Por lo tanto para el Sistema Operativo, existirán 16 núcleos y por lo tanto 16 unidades de cómputo (sí, donde corren los procesos).

Las pruebas constan de 1 benchmark (FPS benchmark) repetido 3 veces con la misma configuración y las mismas condiciones, cambiando el número del parámetro threads. La configuración de la PC de pruebas es la siguiente.

  • Procesador AMD Ryzen 7 5800X
  • NVIDIA Geforce RTX 3070
  • 32 GB de Ram
  • Windows 11 Pro 64 bits

1 thread




2 threads




4 threads




8 threads


16 threads

Conclusiones
Como se puede observar, el cambio más significativo se encuentra en el cambio de la configuración pasando de 1 thread a 2 threads, mientras que para 4 y 8 estos valores no varían mucho y empieza a ser contraproducente en los 16 threads.

Gracias a estas pruebas podremos razonar las siguientes conclusiones sobre el multithreading en CSGO.

  • No es necesario tener un gran procesador con muchos núcleos, ya que realmente el juego corre solo sobre uno de ellos. Esto es importante porque podemos ahorrarnos $$$ al momento de elegir un procesador que queramos comprar si deseamos jugar CSGO (o juegos similares con engine Source). Por lo que en la opinión de esta guía, vale más la frecuencia del reloj del procesador que la cantidad de núcleos que tenga.
  • Corroboramos que el mito de configurar -threads a la misma cantidad que núcleos físicos (o lógicos) aumentará nuestros FPS en el juego es falso. Esto depende que cada CPU y solo probando las distintas configuraciones podremos obtener el valor óptimo. Aunque en algunos casos si pueda coincidir el número de threads con la cantidad de cores.
  • La recomendación aquí es dejar el valor por default (3). Y es importante revisar que en alguna configuración previa que hayamos realizado no tengamos esta configuración en valor 1, porque disminuye el rendimiento de nuestra PC.

Espero que esta guía sea de utilidad a aquellos que desean expandir sus conocimientos en estas áreas o haya despertado alguna curiosidad que los impulse a investigar más del tema. Y por supuesto, espero que ayude a cada uno en su configuración del juego para poder sacarle más provecho y aumentar el rendimiento lo más que se pueda.

Saludos!
J4NZU-.
5 Comments
J4NZU  [author] 5 Jan, 2023 @ 6:31pm 
Muchas gracias Fantasmita y Fury <3
J4NZU  [author] 5 Jan, 2023 @ 6:31pm 
Erika, para responder mas concretamente tu pregunta, me dirias cual es tu procesador? Saludos!
Fantasmita22 2 Jan, 2023 @ 5:37pm 
Que grande J4anzu :praisesun::metallove:
MONSTER 2 Jan, 2023 @ 4:12pm 
resumido no nesecito poner -threads 6 el cual es mi proce en mi caso cuando puedo poner 4 threads?
F u r y 2 Jan, 2023 @ 5:32am 
Lo mejor que vi en años sobre el cs , te felicito sos crack!