1. Dados

1. Dados

Tenho uma tarefa computacional programada em Matlab, que consiste no processamento de grandes quantidades de dados que são lidos na memória na inicialização. O tempo de execução varia de horas a dias. A tarefa é de thread único.

Para executar esta tarefa, tenho várias máquinas Linux diferentes à minha disposição. As máquinas estão sob diferentes quantidades de carga do sistema devido a tarefas já em execução, que continuarão em execução no futuro próximo. Todas as máquinas têm arquitetura AMD64, mas diferem em termos de número de núcleos físicos, número de núcleos virtuais e modelo de CPU, incluindo velocidade de clock e outros fatores.

Minha pergunta:Existe uma forma principista de escolher uma das máquinas para execução da tarefa, com o objetivo de finalizá-la o mais rápido possível?


A parte a seguir foi atualizada com base na resposta de Doktoro Reichard.

Minha ideia aproximada de como obter uma indicação aproximada de qual máquina será mais rápida é combinar dois aspectos:

(1) Estime quão grande parte de seus recursos de processamento uma máquina alocaria para minha tarefa se fosse executada ali, o que chamo de "velocidade relativa": se a máquina estiver ociosa, minha tarefa será executada na velocidade relativa 1 por definição. Se a carga atual for L e o número de núcleos for C, depois de enviar minha tarefa a carga será L+1 e a velocidade relativa de execução será R = min(C / (L+1), 1). O operador min porque o processo não pode utilizar mais de um núcleo. – Este cálculo está correto como um indicador da velocidade de processamento alcançável em relação ao ideal possível na máquina, dada a sua carga atual? E o número relevante C é o número de núcleos físicos ou o número de núcleos virtuais, sendo este último duas vezes maior por causa do hyperthreading?

(2) Estime a rapidez com que a tarefa seria executada relativamente nas diferentes máquinas se todas estivessem ociosas, com base em um indicador de desempenho da máquina. Esta não deve ser a velocidade do clock, mas um benchmark escolhido adequadamente.

A máquina é então escolhida com base em qual delas tem o maior produto dos números (1) e (2).

Responder1

Isso não terá uma resposta definitiva principalmente devido à forma como os computadores funcionam, mas tentarei dar algumas orientações sobre como descobrir qual é o mais rápido.

Analisarei suas afirmações para lhe dizer o que você pode ou não descobrir.

1. Dados

Desde os primeiros parágrafos, você afirmou que carregou e leu todos os dados na memória. Isso é bom para velocidade, pois em termos de largura de banda a memória é incomparável. Se o seu programa usou um disco (independentemente de ser um HDD, SSD ou pen drive), pode ser uma possibilidade que pode ser um gargalo na velocidade de execução do seu programa.

Isso se deve à velocidade de transferência. A RAM tem acesso quase direto ao processador. Os discos precisam passar por uma conexão com largura de banda muito menor que a RAM e, no caso dos HDD's, leva-se em consideração o tempo necessário para buscar e armazenar os dados.

2. SO

O sistema operacional usado tem alguma influência na velocidade, mas pode ser considerado residual.

3. Arquitetura do processador (ou conjuntos de instruções)

Este é um aspecto relevante. Embora você tenha declarado que as máquinas usavam processadores AMD64, pode haver algumas diferenças nos conjuntos de instruções usados.

Considere por exemplo oOpterone aSempronsérie de processadores. Uma diferença fundamental entre eles é que o último temSSE3apoiar.

SSE3 permite maneiras mais novas e eficientes de lidar com dados (especificamente operações de array), operações que em conjuntos de instruções anteriores seriam realizadas usando processos menos eficientes.

Então, neste aspecto,mais recenteprocessadores sãomais rápido por design, pois suportam conjuntos de instruções mais eficientes.

4. Carga do sistema

Este é o último prego no caixão, como você pode dizer. Você não pode calcular a carga de um computador de forma linear, a menos que saiba como cada programa funciona. Dito isto, você pode ter 10.000 processos em execução, mas com uma carga residual ou com um único processo multithread, desperdiçando todo o tempo do processador.

Porém... vamos analisar isso melhor. Adicionar processos implica adicionar algum tipo de dado ao sistema subjacente, para que ele saiba que o processo existe e quanto tempo o processador deve estar preparado para isso. Neste aspecto,menos processossãomelhorarpara velocidade, já que o kernel/processador pode decidir melhor quanto tempo será disponibilizado.

Outra coisa a considerar é a prioridade que o kernel dá aos processos. Os processos com maior prioridade ocuparão a maior parte do tempo do processador.

Em última análise, você pode conceber um sistema que possa dar prioridade máxima ao seu processo e deixar todos os outros processos esperando eternamente até que seu processo seja interrompido. Neste, a velocidade do seu processo será determinada pela CPU.

5. CPU

Vamos considerar seus pontos: núcleos e velocidade de clock da CPU.

Pode ser concebível que o kernel possa transferir alguns processos para outros núcleos. Em um caso limite, seu processo pode ter um núcleo completo designado para ele. Neste aspecto, mais núcleos podem permitir que mais processos sejam executados simultaneamente (e, consequentemente, mais rápido).

Não sei muito sobre multi-threading, então deixarei isso para quem entende.

Velocidade do relógionão éum indicador claro da eficiência do processador. Para fundamentar isso, apresento a “batalha” entre o uso dos processadores Intel e PowerPC em hardware Apple. A Apple argumentou que a principal razão para preferir os processadores PowerPC à Intel, apesar do aumento da velocidade dos processadores Intel, foi que o PowerPC teve um desempenho melhor, porque eles podiam lidar com mais operações por segundo do que seu rival. No final, a Apple optou pela Intel devido a preocupações com energia e outros fatores econômicos.

FLOPS(para operações de ponto flutuante por segundo) é uma medida de desempenho do computador, especialmente em campos de cálculos científicos que fazem uso intenso de cálculos de ponto flutuante, semelhantes às instruções mais antigas e mais simples por segundo. Esta poderia ser uma medida melhor do que a velocidade do clock, se o seu trabalho depende muito desses tipos de operações que, para você usar o Matlab, podem ser uma possibilidade.

No entanto, não é uma quantidade muito divulgada (pois depende deque tipo deoperações que você está executando). Encontrei alguns benchmarks emOverclock.net. Aponto estes dois:

  • AMD Phenom Ix4 9850@2,83 GHzRAM 754 MHz 5-5-5-15GLOPS: 27,5
  • AMD Phenom IIx2 555@4,12 GHzRAM 1000 MHz 5-5-5-18GLOPS:26

Como você pode ver, mesmo processadores com o dobro da velocidade podem ter desempenho pior do que processadores com metade da velocidade.

Resultado final

Não existe uma fórmula claravocê pode usar para estimar o tempo de execução, devido à infinidade de fatores envolvidos no processamento de um programa. Resumi algumas regras básicas (tentei classificá-las porimportância):

  • É mais rápido ter todos os dados (ou os mais usados) na RAM. (o armazenamento de dados é o principal gargalo em qualquer processo).
  • Quanto menos processos rodando na mesma máquina, melhor.
  • Mais núcleos são melhores.
  • Os processadores mais novos são mais rápidos por design.
  • A velocidade da CPU é umduroindicador de velocidade (conforme a latência da RAM e outros fatores intervêm)
  • Você pode pedir à máquina que dê ao seu processo a prioridade mais alta. A máquinavou tentarpara alocar mais tempo ao seu processo. (quando eu digovou tentar, quero dizer que a máquina não tem obrigação de dar mais tempo ao seu processo, ela tenta equilibrar tudo, por isso existe o 2º item).

Ainda estou um pouco hesitante em fornecer uma fórmula completa, mas acredito que posso lhe dar umamuito, muito aproximadoum, com base na saída dos seus comentários. Não posso falar sobre multithreading, então considerarei todos os núcleos independentes. Para esta demonstração é assumido o seguinte:

  • Todos os processos têm a mesma carga.
  • Os processos não estão esperando por entrada/saída.
  • A velocidade da memória éassumidonão ser um fator.
  • Todos os processos são de thread único. Eles têm a mesma prioridade.

Com isso, o gargalo será a capacidade da CPU. Portanto, para qualquer CPU, a carga relativa de qualquer processo seria a seguinte:

R = min(C / N ; 1)

Sendo R a carga relativa, C o número de núcleos na CPU e N o número de processos ativos. No entanto, isso pressupõe que o sistema possa distribuir de maneira uniforme e perfeita toda a carga pelos núcleos, o que pode nem sempre ser verdade.

Com a carga relativa da CPU, multiplique-a pela unidade de medida (UM) de sua escolha (por exemplo, GHz ou GFLOPS) e então você terá uma medida de quão "rápido" o processo pode ser.

Speed = R * UM

Então, com isso, sua fórmula está correta. Mas por favor,bonito por favorobserve a quantidade de suposições que tive que fazer. Isto está longe de ser um caso real. Isto não lhe dará uma quantidade exata, mas sim, umapalpite fundamentado.

Seu segundo ponto é igual ao primeiro (na verdade, você responde à sua pergunta). Em suma, ééo indicador de desempenho da máquina (como R = 1), então a questão aqui é como escolher um. Isso é algo que você mesmo deve analisar: você pode usar GHz vezes o número de núcleos, ou GFLOPS ou alguma combinação dos dois.

Existem programas (que eu deveria ter lembrado antes ao escrever a primeira resposta) que podem fazer alguns benchmarks em CPUs e a partir deles você pode obter alguns valores que podem ajudar na sua decisão. Eu tenho o SiSoftware Sandra (que tem, na minha versão bastante antiga, um benchmark Processor Arithmetic), mas suponhohá outros.

Neste caso, multiplicar 1) e 2) não daria nenhuma diferença, a menos que você usasse unidades de medida diferentes.

informação relacionada