¿El uso de todos los núcleos reduce la eficiencia?

¿El uso de todos los núcleos reduce la eficiencia?

Tengo un programa (bueno, script php) que realiza una búsqueda de texto bastante pesada: carga un archivo de 2 MB y 40 MB y los busca para encontrar dónde está presente cada palabra que aparece en el primero en el segundo.

Tengo una CPU de 4 núcleos (computadora personal). Cuando comienzo a ejecutar el proceso, el uso de la CPU aumenta al 25%, carga de 1. Empiezo a ejecutar el proceso nuevamente en un archivo separado y el uso de la CPU aumenta al 50%, carga de 2. ¿Esto reduce la eficiencia de los procesos individuales? ? es decir. ¿Hacer que cada uno tarde más en completarse que si se ejecutaran por separado? ¿Qué pasa si ejecuto 4 procesos, aumentando el uso de mi CPU al 100%? ¿Corrían más lento entonces?

Supongo que ejecutar los dos procesos en paralelo se completará más rápido que si los ejecutara en serie, ¿es correcto? ¿Seguiría siendo cierto si ejecutara más de dos, digamos 3 o 4? ¿O más? ¿Dónde está el cuello de botella en esto? Supongo que siempre que mantenga el número de procesos igual o menor que el número de núcleos, entonces la CPU puede manejarlo, pero ¿qué pasa con el acceso a la memoria? ¿Tendrían que esperar los procesos mientras leen la memoria?

Respuesta1

Respuesta corta: compárelo.

Respuesta larga: cada proceso individual tardará más en completarse (debido al escalado de frecuencia), pero en general lo más eficiente es cargar cada núcleo al 100%.

Respuesta2

Depende de muchas cosas que ejecutar cosas en paralelo mejorará el rendimiento o lo degradará. Como:

  1. Si realiza muchas E/S y utiliza archivos grandes en la comparación, entonces el cuello de botella será el disco y no la CPU y, con seguridad, su rendimiento disminuirá.
  2. Al mismo tiempo, si sus archivos son lo suficientemente grandes para la RAM que tiene en su sistema y ejecuta más de un proceso, entonces el cuello de botella será la RAM y nuevamente habrá IO en la máquina.

Por lo tanto, esto va caso por caso. Pero en su caso, estoy bastante seguro de que su rendimiento solo mejorará si ejecuta las cosas en paralelo, y no veo un escenario en el que pueda degradar su eficiencia, a menos que me esté perdiendo algún punto, lo cual no puedo. No pienso en.

Respuesta3

Parece que no tienes mucha espera de E/S, ni en el disco duro ni en la red. Suponiendo que tenga GB de RAM, los archivos de 42 MB deberían cargarse fácilmente en la RAM. En ese punto, cuatro procesos paralelos deberían brindarle los mejores resultados. Verá cambios de contexto menores cuando sea necesario ejecutar procesos normales del sistema operativo.

En los sistemas NUMA, cada núcleo tiene un grupo de memoria asignado. El rendimiento puede degradarse cuando el kernel migra un proceso a un núcleo diferente porque los archivos todavía están en el grupo de memoria del núcleo original. Honestamente, no estoy seguro de que eso se aplique a las computadoras personales.

Respuesta4

Generalmente, sí. Ignora la parte de codificación por un momento.

Los procesadores multinúcleo modernos tienen un modo de refuerzo si solo se utiliza una pequeña cantidad de núcleos, lo que aumentará un poco la frecuencia. Como tal, el uso de todos los núcleos hace que el núcleo individual sea más pequeño. Los detalles dependen del procesador.

DICHO ESO: El total seguirá siendo mayor ya que el impulso individual normalmente es MUY pequeño (unos cientos de Mhz) en comparación con obtener otro núcleo. Como tal, es mejor que utilices todos los coers. El impulso se realizó principalmente para aquellos casos que no escalan bien y necesitan una alta frecuencia por núcleo, lo que incluye juegos de un solo subproceso;)

Para hacer su pregunta sobre el acceso a la memoria. Espero que sepa que un servidor moderno tiene una velocidad de acceso a la memoria superior a 50 GB (es decir, gigabytes) por segundo desde DRAM, más desde cachés. Por lo tanto, es poco probable que llegues a esto. IO puede ser un problema, pero esto será visible porque la CPU no alcanza su máximo y las estadísticas de espera de IO aumentan. El almacenamiento en caché ayuda mucho aquí.

información relacionada