AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 76935442
Accepted
Stef1611
Stef1611
Asked: 2023-08-19 21:52:20 +0800 CST2023-08-19 21:52:20 +0800 CST 2023-08-19 21:52:20 +0800 CST

Como é possível explicar a grande diferença de velocidade de execução entre dois processadores?

  • 772

Eu escrevi um programa fortran para simular o sistema molecular. Eu o desenvolvi em um computador desktop cujo processador é um Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz. Depois, para iniciar a simulação em larga escala, usei blades de computação cujos processadores são AMD Opteron(tm) Processor 6176 @ 2.3 GHz. Fiquei surpreso porque o tempo de execução é aumentado por um fator de cerca de 3.

Então, decidi aprender a usar perf, asm, ... para otimizar o programa. Depois de muita coisa, finalmente escrevi este pequeno programa e ainda tenho um fator de cerca de 3.

program simple_pgm

    integer :: i, res
    
    res = 0
    do i=1,1000000000
        res = res + i
    enddo
    write(*,*) res

end program simple_pgm

Comando de compilação:gfortran -g -Wall -O2 simple.f90 -o simple

Quando olhei annotate MAIN__no perf report -n, o código assembler é mais ou menos o mesmo.

No processador i7:

     │    res = 0
     │    do i=1,1000000000
     │      mov  $0x1,%eax
     │      xchg %ax,%ax
     │    res = res + i
1095 │10:   add  %eax,%edx
     │    do i=1,1000000000
 1   │      add  $0x1,%eax
     │      cmp  $0x3b9aca01,%eax
     │    ↑ jne  10
     │    enddo

E no Opteron:

     │    res = 0                                                                                                                                  
     │    do i=1,1000000000                                                                                                                         
     │      mov    $0x1,%eax                                                                                                                        
     │    program simple_pgm                                                                                                                        
     │      sub    $0x220,%rsp                                                                                                                      
     │      nop                                                                                                                                     
     │    res = res + i
1972 │10:   add    %eax,%edx                                          
     │    do i=1,1000000000
1524 │      add    $0x1,%eax                                          
     │      cmp    $0x3b9aca01,%eax                                                                                                                 
     │    ↑ jne    10                                                                                                                               
     │    enddo

Gostaria de saber porque na samplecoluna, para a instrução add $0x1,%eax, o valor é muito grande para o processador Opteron ( 1524). E isso poderia explicar o fator de velocidade de execução?

Obrigado pela resposta. Como estou aprendendo ASM, processador e arquitetura de computador, perf, ... (muitas coisas para um iniciante), quaisquer comentários, sugestões serão apreciadas. Estou ciente de que posso estar no caminho errado.

performance
  • 1 1 respostas
  • 56 Views

1 respostas

  • Voted
  1. Best Answer
    harold
    2023-08-19T22:31:48+08:002023-08-19T22:31:48+08:00

    AMD Opteron 6176 usou a microarquitetura K10, versus Intel Core i7 6700 usando a microarquitetura Skylake. O K10 é muito antigo, aparentemente muito antigo para ter suas informações listadas no uops.info ou para estar disponível em analisadores de código.

    Seguindo as informações de microarquitetura de Agner Fogs , parece que o K10 precisava de pelo menos 2 ciclos por iteração de pequenos loops. O Skylake não tem essa limitação e, neste caso específico, deve ser capaz de atingir 1 ciclo por iteração.

    0,25 ns por iteração (supondo que o i7 6700 funcione a 4 GHz turbo) é quase (mas não totalmente) 3 vezes mais rápido que 0,63 ns por iteração (supondo que o Operon funcione a 3,2 GHz turbo, essa informação não é muito bem suportada e talvez a frequência turbo máxima não tenha sido usada).

    • 4

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve