Eu tenho um servidor Ubuntu, que possui 16 CPUs. ( nproc --all
mostre-me 16
)
Eu escrevi um script bash test.sh
com o nome abaixo:
#!/bin/bash
while :
do
echo xxx
done
Eu executei: ./test.sh >/dev/null &
.
Então usei o comando top
para 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.sh
foi 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.sh
a mais de uma CPU? É porque o processo test.sh
nã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 make
opção é particularmente útil e simples ao compilar grandes projetos com gcc
.
Adicione a
-fopenmp
opçã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.