O que significam os termos “CPU bound” e “I / O bound”?

O que significam os termos “CPU bound” e “I / O bound”?

É muito intuitivo:

Um programa está ligado à CPU se for mais rápido se a CPU for mais rápida, isto é, passa a maior parte do tempo simplesmente usando a CPU (fazendo cálculos). Um programa que calcula novos dígitos de π será tipicamente ligado à CPU, é apenas um número de processamento.

Um programa é ligado a E / S se for gfaster se o subsistema de E / S for mais rápido. Qual sistema de E / S exato pode ser usado? Eu normalmente o associo com disco, mas é claro que a comunicação em rede ou a comunicação em geral também é comum. Um programa que olha através de um arquivo enorme para alguns dados pode se tornar vinculado a E / S, já que o gargalo é a leitura dos dados do disco (na verdade, esse exemplo talvez seja meio antiquado hoje em dia com centenas de MB / s vindo de SSDs).

Limite de CPU significa que a taxa na qual o processo progride é limitada pela velocidade da CPU. Uma tarefa que executa cálculos em um pequeno conjunto de números, por exemplo, multiplicando pequenas matrizes, provavelmente está vinculada à CPU.

Limite de E / S significa que a taxa na qual um processo avança é limitada pela velocidade do subsistema de E / S. Uma tarefa que processa dados do disco, por exemplo, contando o número de linhas em um arquivo, provavelmente está vinculada a E / S.

Limite de memory significa que a taxa na qual um processo avança é limitada pela quantidade de memory disponível e pela velocidade desse access à memory. Uma tarefa que processa grandes quantidades de dados na memory, por exemplo, multiplicação de matrizes grandes, provavelmente é o Memory Bound.

Cache ligado significa a taxa na qual o progresso de um processo é limitado pela quantidade e velocidade do cache disponível. Uma tarefa que simplesmente processa mais dados do que os que se ajustam no cache será vinculada ao cache.

O Limite de E / S seria mais lento que o Limite de Memória seria mais lento que o Limite de Cache seria mais lento que o Limite de CPU.

A solução para o limite de E / S não é necessariamente obter mais memory. Em algumas situações, o algoritmo de access poderia ser projetado em torno das limitações de E / S, Memória ou Cache. Veja Cache Oblivious Algorithms .

Limite de CPU significa que o programa é afunilado pela CPU, ou unidade de processamento central, enquanto que o limite de E / S significa que o programa é afunilado por E / S ou input / saída, como leitura ou gravação em disco, rede etc.

Em geral, ao otimizar programas de computador, tenta-se descobrir o gargalo e eliminá-lo. Saber que o seu programa está ligado à CPU ajuda, de modo que não se otimize desnecessariamente outra coisa.

[E por “gargalo”, quero dizer a coisa que faz o seu programa ser mais lento do que seria de outra forma.]

multi-threading é um caso em que a distinção é importante, conforme explicado nos exemplos abaixo.

Exemplo de RAM I / O bound: sum vetorial

Considere um programa que some todos os valores de um único vetor:

#define SIZE 1000000 unsigned int is[SIZE]; unsigned int sum = 0; size_t i = 0; for (i = 0; i < SIZE; i++) /* Each one of those requires a RAM access! */ sum += is[i] 

Paralelizar isso dividindo a matriz igualmente para cada um de seus núcleos é de utilidade limitada em desktops modernos comuns. C ++ benchmark em: https://github.com/cirosantilli/algorithm-cheat/blob/ea16f6bba12e7dcc32c0cbbbcdc74bcc2fd2d05b/src/cpp/interactive/sum_array_parallel.cpp

Testado no GCC 5.2.1, Ubuntu 15.10 com um Intel Core i5-3210M de 4 núcleos, Lenovo T430. Exemplos de resultados típicos (variável desde multi-threaded):

 Time N Threads Comment --------- ---------- -------- 0.045962 none 0.0487619 1 Worse than 0 threads because of startup overhead. 0.0329526 2 0.0302511 3 0.0232993 4 Best time. Only about 2x as fast. 0.0281021 5 Worse than 4 threads because we don't have that many colors, which generate overhead. 

O cálculo não foi 4x mais rápido como esperado com 4 threads!

A razão é que todos os processadores compartilham um único barramento de memory vinculado à RAM:

 CPU 1 --\ Bus +-----+ CPU 2 ---\__________| RAM | CPU 3 ---/ +-----+ CPU 4 --/ 

então o barramento de memory rapidamente se torna o gargalo, não o processador.

Isso acontece porque a adição de dois números exige um único ciclo de CPU; as leituras de memory levam cerca de 100 ciclos de CPU em hardware de 2016.

Portanto, o trabalho da CPU feito por byte de dados de input é muito pequeno, e chamamos isso de um processo vinculado a E / S.

A única maneira de acelerar ainda mais essa computação seria acelerar os accesss individuais à memory com um novo hardware de memory, por exemplo, memory multicanal .

Atualizar para um clock de CPU mais rápido, por exemplo, não seria muito útil.

Outros exemplos

  • a multiplicação de matrizes é limitada pela CPU na RAM e nas GPUs. A input contém:

     2 * N**2 

    números, mas:

     N ** 3 

    multiplicações são feitas, e isso é suficiente para a paralelização valer a pena para o prático N. grande

    É por isso que as bibliotecas gostam:

    existir.

    O uso do cache faz uma grande diferença na velocidade das implementações. Veja por exemplo este exemplo de comparação de GPU didático .

  • As GPUs têm um gargalo de I / O na transferência de dados para a CPU.

    Eles são projetados para que a saída de renderização (um retângulo de pixels) possa ser enviada diretamente para a memory de vídeo, para evitar a ida e volta da CPU.

  • Networking é o exemplo protótipo do IO-bound.

    Mesmo quando enviamos um único byte de dados, ainda é preciso muito tempo para chegar ao destino.

    Paralelizar solicitações de rede pequenas, como solicitações HTTP, pode oferecer enormes ganhos de desempenho.

    Se a rede já estiver com capacidade total (por exemplo, baixando um torrent), a paralelização ainda pode aumentar a latência (por exemplo, você pode carregar uma página da web "ao mesmo tempo").

  • Uma operação de limite de CPU C ++ fictícia que leva um número e o analisa bastante:

    • serial
    • paralelo

Como descobrir se você é um limite de CPU ou IO

Não-RAM IO ligado como disco, rede: ps aux , em seguida, se CPU% / 100 < n threads . Se sim, você está vinculado a E / S, por exemplo, as read bloqueio estão apenas aguardando dados e o agendador está ignorando esse processo. Em seguida, use outras ferramentas como sudo iotop para decidir qual IO é o problema exatamente.

RAM-IO ligado: difícil de dizer, como o tempo de espera da RAM é incluído nas medições de CPU% . Talvez o melhor que você possa fazer seja estimar as falhas de cache.

Veja também:

Outra maneira de expressar a mesma ideia:

  • Se a aceleração da CPU não acelera seu programa, ela pode estar ligada a E / S.

  • Se a aceleração da E / S (por exemplo, usando um disco mais rápido) não ajudar, seu programa pode estar limitado à CPU.

(Eu usei “pode ​​ser” porque você precisa levar outros resources em conta. A memory é um exemplo).

Quando seu programa está esperando por E / S (ou seja, um disco de leitura / gravação ou rede de leitura / gravação, etc), a CPU está livre para fazer outras tarefas, mesmo se o seu programa for interrompido. A velocidade do seu programa dependerá em grande parte da rapidez com que o IO pode acontecer e, se você quiser acelerar, precisará acelerar o I / O.

Se o seu programa está executando muitas instruções de programa e não está esperando por E / S, então é dito que está ligado à CPU. Acelerar a CPU fará o programa rodar mais rápido.

Em ambos os casos, a chave para acelerar o programa pode não ser acelerar o hardware, mas otimizar o programa para reduzir a quantidade de I / O ou CPU de que ele precisa, ou fazer com que ele faça I / O enquanto também faz uso intensivo de CPU coisa.

O limite de E / S refere-se a uma condição na qual o tempo necessário para concluir um cálculo é determinado principalmente pelo período gasto na espera de que as operações de input / saída sejam concluídas.

Este é o oposto de uma tarefa que está sendo ligada à CPU. Esta circunstância surge quando a taxa na qual os dados são solicitados é mais lenta do que a taxa que é consumida ou, em outras palavras, mais tempo é gasto solicitando dados do que processando-os.

Processos vinculados a E / S: gastam mais tempo fazendo E / S do que cálculos, têm muitos picos curtos de CPU. Processos vinculados à CPU: passe mais tempo fazendo cálculos, poucas rajadas de CPU muito longas

Processo encadernado de E / S: – Se a maior parte da vida útil de um processo é gasta no estado de i / o, o processo é ligado / não ao processo.exemplo: -calculator, internet explorer

Processo encadernado da CPU: – Se a maior parte da vida útil do processo for gasta na cpu, o processo é ligado à cpu.