Como atribuir um processo em duas CPUs

Como atribuir um processo em duas CPUs

Eu tenho um servidor Ubuntu, que possui 16 CPUs. ( nproc --allmostre-me 16)

Eu escrevi um script bash test.shcom o nome abaixo:

#!/bin/bash


while :
do
    echo xxx
done

Eu executei: ./test.sh >/dev/null &.

Então usei o comando toppara monitorar o uso da CPU e descobri que uma CPU foi usada quase 100% por causa do processo 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 podemos ver, o processo test.shfoi atribuído à 5ª CPU, que foi utilizada quase 100%.

É possível atribuir um processo pesado em mais de uma CPU para que possamos fazer mais uso das CPUs? Por que o sistema operacional não atribuiu o processo test.sha mais de uma CPU? É porque o processo test.shnão é pesado o suficiente ou devemos fazer alguma configuração no SO para isso?

Responder1

Um único thread não pode ser dividido entre vários núcleos:

Um programa precisa ser escrito para ter mais de um thread (um por núcleo) ou precisa haver mais de um programa. Caso contrário, você não usará os núcleos.

Escrever programas para usar mais núcleos não é trivial e nem todos os problemas podem ser paralelizados (escritos para serem executados em mais de um núcleo). Se um problema contém 20% de código essencialmente sequencial, então, com um número infinito de processadores, ele não será mais rápido que 20% do tempo de execução original (aumento de 500% na velocidade). Depois, há os overheads (comunicação entre threads).

Se você não possui nenhum aplicativo para os núcleos, é melhor vendê-lo e adquirir uma máquina mais barata.

Cada núcleo terá muito paralelismo, para lidar com um único thread, mas isso não é visível. Agora estamos lutando para tornar um único núcleo mais rápido, à medida que adicionamos núcleos. Isso funciona bem no início.

Sistemas Unix (como Gnu/Linux, por exemplo, Ubuntu) fazem um bom trabalho ao usar núcleos extras, até cerca de 2→4. O Windows da Microsoft obtém melhorias quando você tem um núcleo para o antivírus, um para o desfragmentador e outro para todo o resto.

Depois disso só fará diferença se você tiver aplicações projetadas para multi-core.

Responder2

Aqui estão exemplos de comandos Linux que podem usar vários processadores:

  • make -j
  • gcc -pipe

A makeopção é particularmente útil e simples ao compilar grandes projetos com gcc.

  • Adicione a -fopenmpopção às suas opções de construção ao chamar o gcc.

  • Tente adicionar o seguinte pragma logo acima dos loops for:

    #pragma omp parallel for
    for(i=0; i<8000000000; i++) {
        ptr[i] = i/10000;
    }
    

Por padrão, o OpenMP criará tantos threads quanto núcleos em sua máquina e compartilhará a carga de trabalho igualmente entre eles.

informação relacionada