Eu tenho um servidor Ubuntu, que tem 16 CPUs. ( nproc --all
me mostre 16
)
Eu escrevi um script bash chamado test.sh
como abaixo:
#!/bin/bash
while :
do
echo xxx
done
Eu executei: ./test.sh >/dev/null &
.
Então eu usei o comando top
para monitorar os usos 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 na 5ª CPU, que foi usada 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
em mais de uma CPU? É porque o processo test.sh
não é pesado o suficiente ou devemos fazer alguma configuração para o sistema operacional fazer isso?
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 rodar em mais de um núcleo). Se um problema contiver 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 velocidade de 500%). Depois, há os overheads (comunicação entre threads).
Se você não tiver nenhum aplicativo para os núcleos, é melhor vendê-lo e obter uma máquina mais barata.
Cada núcleo terá uma tonelada de 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 usando 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, outro para o desfragmentador e outro para todo o resto.
Depois disso só fará diferença se você tiver aplicativos projetados para multi-core.
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 arquivosgcc
.Adicione a
-fopenmp
opção às suas opções de compilação ao chamar gcc.Tente adicionar o seguinte pragma logo acima de seus loops for:
Por padrão, o OpenMP criará tantos threads quanto núcleos em sua máquina e compartilhará a carga de trabalho uniformemente entre eles.