Problema

Estou tentando calcular o desempenho de CPU / GPU FLOPS, mas não tenho certeza se estou fazendo isso corretamente .

Digamos que temos:

  • Uma CPU Kaby Lake (clock: 2,8 GHz, núcleos: 4, threads: 8)
  • Uma GPU Pascal (clock: 1,3 GHz, núcleos: 768).

Esta página do Wiki diz que as CPUs Kaby Lake computam 32 FLOPS (FP32 de precisão única) e cartões Pascal calculam 2 FLOPS (FP32 de precisão única), o que significa que podemos calcular o desempenho total de FLOPS usando as seguintes fórmulas:

CPU:

TOTAL_FLOPS = 2.8 GHz * 4 cores * 32 FLOPS = 358 GFLOPS 

GPU:

TOTAL_FLOPS = 1.3 GHz * 768 cores * 2 FLOPS = 1996 GFLOPS 

Perguntas

  1. [RESOLVIDO] A maioria dos guias que eu” vi (como este) estão usando núcleos físicos na fórmula. O que eu não entendo é por que não usa threads (núcleos lógicos) em vez disso? Não foram criados threads especificamente para dobrar o desempenho dos cálculos de ponto flutuante? Por que os estamos ignorando então?

  2. [RESOLVIDO] Estou fazendo tudo corretamente? Não consegui encontrar uma única fonte confiável para calcular FLOPS, todas as informações na Internet são contraditórias. Para a CPU i7 7700HQ Kaby Lake, encontrei valores de FLOPS tão baixos quanto 29 GFLOPS , embora a fórmula acima forneça 358 GFLOPS. Não sei no que acreditar.

  3. Existe uma biblioteca de plataforma cruzada (Win, Mac, Linux) em Node.js / Python / C ++ que apenas retorna todos os Estatísticas de GPU como núcleos de sombreamento, relógio, conjuntos de instruções disponíveis (ou valores FP32, FP64 FLOPS) para que eu pudesse calcular o desempenho teórico máximo sozinho? É bastante ridículo que não possamos obter as estatísticas FLOPS da CPU / GPU diretamente, em vez disso, tem que baixar e analisar uma página wiki para obter o valor. Mesmo ao usar C ++, parece (eu não sei) que temos que baixar o kit de ferramentas CUDA de 2 GB apenas para obter acesso às informações básicas da GPU da Nvidia, como a quantidade de núcleos – o que tornaria praticamente impossível fazer o aplicativo disponível para outros, já que ninguém faria download de um aplicativo de 2 GB.

Comentários

  • Como uma resposta parcial I acredite no que você está chamando de ” threads ” é um truque que permite a um núcleo hospedar o que parece ser duas threads por vez (hiper -threading) embora seja real, tendo apenas um núcleo físico real com o qual computar. Não estou totalmente certo sobre os detalhes de como a Intel fez isso, mas acho que tem a ver com o preenchimento de buracos em pipelines e tal. Em princípio, isso não acontecerá se você estiver computando algo pesado, mas para muitos casos de uso mais comuns para um sistema operacional de desktop, isso faz sentido. Se você estiver interessado na taxa de transferência de computação real, embora isso geralmente não seja co unted.
  • @KyleMandli obrigado pelo esclarecimento, suponho que faz sentido
  • Uma parte do cálculo proposto é a frequência. Presumo que você esteja ciente de que, com hardware moderno, não há a frequência. A frequência operacional será diferente com base na temperatura e consumo de energia (por exemplo, a maioria das GPUs), ou uso e utilização do conjunto de instruções (por exemplo, a maioria das CPUs x86) e, possivelmente, todos os fatores mencionados.
  • Você ‘ terei que substituir MHz em todos os lugares por GHz.
  • Não há ‘ s nenhum ” desempenho ” real. Por exemplo, ao multiplicar matrizes grandes em GPUs Volta, meu desempenho ” real ” está próximo do teórico, 90 Tops / segundo. Enquanto treinava resnet-50, ele ‘ é mais parecido com 20 Tops / segundo – medium.com/@yaroslavvb/…

Resposta

Você pode calcular as taxas GFLOP isso forma, mas os números não fazem sentido no hardware de hoje:

  • As operações de ponto flutuante requerem um número variável de ciclos de clock. Uma adição é geralmente mais barata do que uma multiplicação, mas geralmente cada uma leva mais de um ciclo de clock de 2,8 bilhões de ciclos.

  • Quando você tem hyperthreading, você tem dois threads em execução em um núcleo, mas o núcleo ainda terá apenas um unidade de adição de ponto flutuante e, portanto, os dois threads não podem executar adições de ponto flutuante ao mesmo tempo.

  • As operações de ponto flutuante consomem muita energia e a energia é convertida em calor. Quando você faz muitos FLOPs, os processadores superaquecem e diminuem suas frequências de clock.

  • Se você usar as instruções corretas, poderá fazer operações de ponto flutuante e multiplicação e adição (FMA) que tornam uma multiplicação e adição mais rápida do que fazer essas operações separadamente.

  • Da mesma forma, com instruções SIMD, um núcleo pode fazer a mesma operação em vários pedaços de dados ao mesmo tempo – digamos, adicionar quatro pares de números de ponto flutuante juntos, resultando em 4 FLOPs ao mesmo tempo. Mas isso exige que haja um problema em que um algoritmo realmente exija que isso aconteça, em vez de usar os resultados da primeira adição na segunda. Como consequência, as instruções SIMD apenas contribuem para a velocidade com que alguns algoritmos podem ser executados, mas não outros.

  • Mais importante, você geralmente deseja fazer operações nos dados da memória, mas mover dados da memória principal para o processador leva muito mais tempo do que realmente fazer qualquer operação nos dados – como um fator de 100 a mais (ordem de magnitude). Portanto, você geralmente não vê nem mesmo uma pequena fração do desempenho de ponto flutuante teórico dos processadores em aplicativos reais: geralmente, substancialmente menos de 10% do desempenho de pico teórico.

Em outras palavras, calcular o desempenho de pico tornou-se um negócio sem sentido: não tem muito a ver com o desempenho real de um processador.

Comentários

  • Você também pode discutir como as unidades de ponto flutuante SIMD podem aumentar o desempenho de pico teórico.
  • Obrigado por sua contribuição, pessoal, eu entendo esses pontos e entendo como as instruções avançadas conjuntos afetam o desempenho do ponto flutuante. Acho que ‘ ficarei com o máximo teórico por enquanto. Gostaria que houvesse pelo menos uma fórmula que se aproximasse do desempenho real do FLOPS naquele momento é necessário para a CPU calcular uma função específica.
  • @AlekseyHoffman Não há fórmula, apenas medidas. div id = “fd68a555a6”>

s por que a lista dos 500 melhores se baseia em medidas reais de desempenho, não em desempenho superior teórico.

  • @BrianBorchers Sim, boa ideia.
  • Resposta

    Você sabe ler em russo – como calcular FLOPS .

    GHz não mostra FLOPS. Um processador com o mesmo GHz pode ser muito mais rápido do que outro com o mesmo GHz.

    P.S. gpu-s ” rx 590 ” e muito antigo ” r7 250x ” têm quase o mesmo GHz. Mas … isso não é correto comparar o desempenho deles)

    Comentários

    • Olá, bem-vindo ao scicomp! Em stackexchange é melhor ter uma postagem independente (veja aqui ). Por favor, para melhorar a postagem, tente editar a resposta com as informações principais do artigo.

    Deixe uma resposta

    O seu endereço de email não será publicado. Campos obrigatórios marcados com *