Executa o programa com velocidade de CPU menor?

6

Seria muito útil executar programas específicos em um ambiente Linux com uma velocidade de clock da CPU fixa (menor) (digamos, runat 400mhz ./my-program --argument-of="my program" para obter essa velocidade de clock).

Eu preciso disso para gerar atrasos entre cada instrução assembly do meu programa, e isso não me mataria se o atraso não fosse exato (digamos, se dependesse do agendador do SO, como é quase certo). / p>

O objetivo é tornar a eficiência dos algoritmos muito explícita ao programar aplicações não tão pesadas na escola (ter uma CPU 3GHz dificulta a percepção de algoritmos lentos que são executados por pouco tempo e podem ser realmente otimizados). Além disso, pode ser útil para detectar condições de corrida em tempo real, talvez.

Você conhece alguma dessas ferramentas? Existe algum tipo de intérprete que eu poderia hackear para conseguir isso? O gdb pode me ajudar de maneira relativamente fácil? Eu acho que é o mais próximo de controlar a execução de um programa Linux que eu conheço.

A execução do sistema de lacunas em uma VM com limite de CPU pode ser outra opção, já que ela fornece essa ilusão - uma CPU com velocidade menor - mas ou seria melhor executar programas individuais.

    
por mgarciaisaia 17.10.2013 / 01:38

5 respostas

3

Acho que o aplicativo que você está procurando é chamado de cpulimit . Este não é um comando que normalmente está incluído em um sistema, então você terá que instalá-lo através do gerenciador de pacotes distros (Ubuntu / Debian) ou da fonte.

Ubuntu / Debian

$ apt-cache search cpulimit
cpulimit - tool for limiting the CPU usage of a process

Assim, a instalação seria assim:

$ sudo apt-get install cpulimit

Da fonte

Faça o download da seguinte forma:

$ wget https://github.com/opsengine/cpulimit/archive/master.zip \
       -O cpulimit-master.zip

Descompacte & construir:

$ unzip cpulimit-master.zip ; cd cpulimit-master ; make

Uso

Você pode instalá-lo com make install , mas por enquanto vamos usá-lo apenas no diretório em que o criamos:

$ pwd
/home/saml/tst/96387/cpulimit-master
$ src/cpulimit -e firefox -l 30

Isso limitará o processo chamado firefox a 30% do uso da CPU disponível.

Você também pode aplicá-lo a processos em execução depois de terem sido chamados:

$ pgrep firefox
1234

$ src/cpulimit -p 1234 -l 30

Você pode ver o restante do uso de cpulimit :

$ src/cpulimit 
Error: You must specify a cpu limit percentage
Usage: cpulimit [OPTIONS...] TARGET
   OPTIONS
      -l, --limit=N          percentage of cpu allowed from 0 to 400 (required)
      -v, --verbose          show control statistics
      -z, --lazy             exit if there is no target process, or if it dies
      -i, --ignore-children  don't limit children processes
      -h, --help             display this help and exit
   TARGET must be exactly one of these:
      -p, --pid=N            pid of the process (implies -z)
      -e, --exe=FILE         name of the executable program file or path name
      COMMAND [ARGS]         run this command and limit it (implies -z)

Report bugs to <[email protected]>.

Também há um bom tutorial sobre seu uso aqui no cyberciti.biz, intitulado: Linux Limitar o uso da CPU por processo .

OBSERVAÇÃO: Lembre-se de que ele está limitando o uso da CPU como uma porcentagem. Portanto, se você tiver uma caixa quad core (4 cpus), precisará limitá-la de 0% a 400%.

    
por 17.10.2013 / 03:25
1

Você pode ser capaz de definir o relógio do seu processador, mas globalmente, não para um programa específico. Processadores não funcionam dessa maneira. Os processadores destinados a ambientes com limitação de energia (especialmente laptops e outros dispositivos móveis) tendem a suportar várias velocidades.

Você pode, em princípio, alterar a velocidade do processador (se suportado) quando o processo estiver agendado e redefinir a velocidade do processador quando outro processo for agendado. Não tenho conhecimento de nenhum software que suporte isso, provavelmente exigiria uma modificação bastante pesada no kernel.

Você pode executar seu programa dentro de uma máquina virtual lenta, como o Qemu (sem KVM, para obter a emulação de software puro) ou Bochs.

Correr com uma velocidade de CPU menor provavelmente não expõe mais condições de corrida.

Se o seu programa é multithreaded, você pode forçá-lo a usar um único processador ou um conjunto específico de processadores com taskset , por exemplo. taskset 3 myprogram para ser executado apenas nas CPUs # 0 e # 1. Forçar o programa a ser executado em uma única CPU provavelmente exibirá menos condições de corrida.

Para o seu caso de uso, em vez de executar seu programa mais lentamente, execute-o várias vezes. Por exemplo, se você pretende que seu programa tenha uma certa velocidade em dispositivos que são cerca de 10 vezes mais lentos do que o seu computador, teste-o executando o programa 10 vezes seguidas. A execução do programa várias vezes aumenta a probabilidade de correr em condições de corrida.

    
por 17.10.2013 / 02:28
1

Outra opção é usar um hardware lento - algum tipo de placa baseada em ARM barata como Raspbery Pi ou (um pouco mais poderosa) Compulab Trimslice deve fazer. Eles têm uma quantidade limitada de memória, CPU lenta, mas podem rodar um sistema Linux completo - o Fedora, o Debian e algumas outras distros possuem uma versão ARM.

    
por 17.10.2013 / 03:46
0

The goal is to make algorithms efficiency very explicit when programming not-that-heavy applications

A maneira normativa de fazer isso é repetir o processo um grande número de vezes. Se você tiver dois algoritmos diferentes que executam a mesma tarefa (não tão pesada) X e quiser compará-los, você os dedica a repetir a tarefa X mil ou um milhão de vezes. Isso pode exigir que você escreva um programa simples (alto nível) para orientar o benchmark; contanto que o mesmo programa de driver execute todos os testes, você obterá uma comparação realista de quão rápido um está em relação ao outro.

    
por 17.10.2013 / 02:23
0

Você pode usar o cpufreq-info para procurar todas as velocidades de clock da CPU suportadas pela sua cpu. E você pode usar o cpufreq-set para selecionar uma velocidade de clock da cpu.

    
por 17.10.2013 / 03:45