Cómo asignar un proceso en dos CPU

Cómo asignar un proceso en dos CPU

Tengo un servidor Ubuntu, que tiene 16 CPU. ( nproc --allmuéstrame 16)

Escribí un script bash llamado test.sha continuación:

#!/bin/bash


while :
do
    echo xxx
done

Lo ejecuté: ./test.sh >/dev/null &.

Luego utilicé el comando toppara 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.shha 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.shen más de una CPU? ¿Es porque el proceso test.shno 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 makeopción es particularmente útil y sencilla al compilar proyectos grandes con gcc.

  • Agregue la -fopenmpopció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.

información relacionada