Tengo un servidor Ubuntu, que tiene 16 CPU. ( nproc --all
muéstrame 16
)
Escribí un script bash llamado test.sh
a continuación:
#!/bin/bash
while :
do
echo xxx
done
Lo ejecuté: ./test.sh >/dev/null &
.
Luego utilicé el comando top
para monitorear los usos de la CPU y descubrí que una CPU se había utilizado casi al 100% debido al proceso test.sh
:
6411 me 20 0 11240 3052 2852 R 93.8 0.0 0:11.71 test.sh
%Cpu5 : 96.7 us, 3.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
Como vemos, el proceso test.sh
ha sido asignado en la 5ª CPU, la cual se ha utilizado casi al 100%.
¿Es posible asignar un proceso pesado en más de una CPU para que podamos hacer más uso de las CPU? ¿Por qué el sistema operativo no asignó el proceso test.sh
en más de una CPU? ¿Es porque el proceso test.sh
no es lo suficientemente pesado o deberíamos realizar alguna configuración para que el sistema operativo lo haga?
Respuesta1
Un único hilo no se puede dividir entre varios núcleos:
Es necesario escribir un programa para que tenga más de un subproceso (uno por núcleo), o debe haber más de un programa. Si no, no utilizarás los núcleos.
Escribir programas para utilizar más núcleos no es trivial y no todos los problemas se pueden paralelizar (escribir para ejecutarse en más de un núcleo). Si un problema contiene un 20% de código esencialmente secuencial, entonces, con un número infinito de procesadores, no será más rápido que el 20% del tiempo de ejecución original (aumento de velocidad del 500%). Luego están los gastos generales (comunicación entre subprocesos).
Si no tiene ninguna aplicación para los núcleos, entonces será mejor que los venda y consiga una máquina más barata.
Cada núcleo tendrá mucho paralelismo para tratar con un solo hilo, pero esto no es visible. Ahora estamos luchando por hacer que un solo núcleo sea más rápido a medida que agregamos núcleos. Esto funciona bien al principio.
Los sistemas Unix (como Gnu/Linux, por ejemplo Ubuntu), hacen un buen trabajo al utilizar núcleos adicionales, hasta alrededor de 2→4. Windows de Microsoft obtiene mejoras cuando tiene un núcleo para el escáner de virus, uno para el desfragmentador y otro para todo lo demás.
Después de eso sólo hará la diferencia si tienes aplicaciones diseñadas para multinúcleo.
Respuesta2
A continuación se muestran ejemplos de comandos de Linux que pueden utilizar varios procesadores:
make -j
gcc -pipe
La make
opción es particularmente útil y sencilla al compilar proyectos grandes con gcc
.
Agregue la
-fopenmp
opción a sus opciones de compilación cuando llame a gcc.Intente agregar el siguiente pragma justo encima de sus bucles for:
#pragma omp parallel for for(i=0; i<8000000000; i++) { ptr[i] = i/10000; }
De forma predeterminada, OpenMP creará tantos subprocesos como núcleos en su máquina y compartirá la carga de trabajo de manera uniforme entre ellos.