Vou traduzir o meu post anterior (página 4) para melhor compreensão.
Antes, no entanto, alguns breves esclarecimentos para melhor compreensão do texto. O texto em itálico são comentários meus. Sou formado em ciência da computação, assim, pude compreender o que está escrito. O que um compilador faz é traduzir código de alto nível (no caso, C++), para código de baixo nível (assembly). A máquina (processador) só lida com esse código de baixo nível, no entanto, é impraticável que se programe nesse nível, por isso a necessidade de linguagem em alto nível que seja traduzida (papel do compilador).
http://hardware.slashdot.org/hardware/0 ... 2237.shtml (comentário do Eponymous Cowboy em referência a essa matéria sobre a Futuremark)
Eponymous Cowboy escreveu:
I'll give 10:1 odds that Futuremark simply compiled their benchmark with Intel's C++ compiler.
I wrote a detailed explanation [slashdot.org] back in 2005 about how the Intel C++ compiler generates separate code paths for memory operations to make AMD processors appear significantly slower, and how you can trick the compiled code into believing your AMD processor is an Intel one to see incredibly increased performance. See this article [slashdot.org] for additional details.
Vou dar uma chance de 10:1 que a Futuremark simplesmente compilou seu benchmark usando o compilador de C++ da Intel.
Eu escrevi uma
explanação detalhada [slashdo.org] ainda em 2005 sobre como o compilador de C++ da Intel gera caminhos de código distintos para operações de memória para fazer parecer que os processadores AMD são significativamente mais lentos, e como você pode enganar o código compilado fazendo-o acreditar que seu processador AMD é um Intel para ver um incrível aumento na performance. Veja
este artigo [slashdot.org] para mais detalhes.
========
Agora a explanação (
link explanação) a que ele fez referência. Era uma resposta a matéria com título "AMD Alleges Intel Compilers Create Slower AMD Code" ou "AMD alega que compiladores Intel criam código mais lento para AMD"
link matériaEponymous Cowboy escreveu:
It's true--and they know about it
I noticed this problem back in January of 2004, with Intel C++ 8.0, and went through heck over nine months with Intel's customer support to get it fixed until I eventually had to abandon their compiler.
On any non-Intel processors, it specifically included an alternate code path for "memcpy" that actually used "rep movsb" to copy one byte at a time, instead of (for example) "rep movsd" to copy a doubleword at a time (or MMX instructions to copy quadwords). This was probably the most brain-dead memcpy I'd ever seen, and was around 4X slower than even a typical naive assembly memcpy:
push ecx
shr ecx, 2
rep movsd
pop ecx
and ecx, 3
rep movsb
They responded with completely ridiculous answers, such as:
"Our 8.0 memcpy was indeed optimized for a Pentium(r)4 Processor,when we reworked this routine we used the simplest, most robust, and straightforward implementation for older processors so that we didn't need the extra code to check for alignment, length, overlap, and other conditions."
BS. I went and added the following line to the beginning of my source code:
extern "C" int __intel_cpu_indicator;
then I added:
__intel_cpu_indicator = -512;
to the "main" function.
This forced Intel C++ to use the "Pentium 4" memcpy regardless of which processor in in the machine. It turns out that their special "Pentium 4" memcpy which I tested thoroughly in all kinds of situations, and it worked perfectly fine on an AMD Athlon and a Pentium III. I pointed this out to them.
I received the following response:
"The fast mempcy is over 2000 lines of hand coded assembly, with lots of special cases where different code paths are chosen based on relative alignment of the source and destination. ... If the performance of memcpy/memset only are improved for Pentium III will that satisfy you?"
I answered "No," saying that I needed support for AMD processors as well. I also gave them a copy of my own memcpy routine that was 50% faster than theirs--and just used MMX. They closed the support issue and did nothing to resolve it.
I switched back to Visual C++.
É verdade -- e eles sabem dissoEu notei esse problema ainda em janeiro de 2004, com o
(compilador) Intel C++ 8.0, e passei pelo diabo por 9 meses com o suporte ao cliente da Intel para arrumar isso até que eu eventualmente tive que abandonar o compilador deles.
Em qualquer processador não-Intel, o compilador especificamente incluía um caminho alternativo de código para "memcpy" que na realidade usava "rep movsb" para copiar um byte por vez, ao invés de (por exemplo) "rep movsd" para copiar uma doubleword
(que, se eu não me engano, tem 8 bytes) por vez (ou instruções MMX para copiar quadwords). Essa provavelmente a tradução de código para "memcpy" mais estúpida que eu já vi, e era aproximadamente 4X mais lenta do que uma típica e inocente tradução assembly de memcpy:
push ecx
shr ecx, 2
rep movsd
pop ecx
and ecx, 3
rep movsb
Suas respostas foram completamente ridículas, tais como:
"Nossa memcpy 8.0 foi realmente otimizada para um processador Pentium(r)4, quando nós retrabalhamos essa rotina nós usamos a implementação mais simples, mais robusta, e mais direta para processadores mais antigos para que não tivessemos a necessidade de código extra para checar por alinhamento, tamanho, sobreposição, e outras condições."
Papo-furado. Eu fui e adicionei a seguinte linha no começo do meu código fonte:
extern "C" int __intel_cpu_indicator;
depois adicionei:
__intel_cpu_indicator = -512;
na função "main".
Isso forçou o
[código compilado] Intel C++ a usar o memcpy do "Pentium 4" a despeito de qual processador estivesse na máquina. Aconteceu que o memcpy especial deles para "Pentium 4", que eu testei exaustivamente em todos os tipos de situação, funcionou perfeitamente bem em um processador Athlon AMD e em um Pentium III. Eu disse isso a eles.
Eu recebi a seguinte resposta:
"O memcpy rápido tem mais de 2000 linhas assembly programadas à mão, com muitos casos particulares onde diferentes caminhos de código são escolhidos baseados no alinhamento relativo da fonte e do destino. ... Se a performance do memcpy/memset somente forem melhoradas para Pentium III isso irá satisfazer você?"
Eu respondi "Não," dizendo que eu precisava de suporte para processadores AMD também. Eu também dei a eles uma cópia da minha própria rotina para memcpy que era 50% mais rápida que a deles -- e só usava MMX. Eles fecharam o chamado de suporte e não fizeram nada para resolver a questão.
Eu voltei para o Visual C++
(compilador de C++ da Visual).
===========================
A matéria sobre a (
link alegação da AMD)
CmdrTaco escreveu:
AMD Alleges Intel Compilers Create Slower AMD Code
edxwelch writes "In AMD's recient anti-trust lawsuit AMD have examined the Intel compiler and found that it deliberatly runs code slower when it detects that the processor is an AMD. "To achieve this, Intel designed the compiler to compile code along several alternate code paths. ... By design, the code paths were not created equally. If the program detects a "Genuine Intel" microprocessor, it executes a fully optimized code path and operates with the maximum efficiency. However, if the program detects an "Authentic AMD" microprocessor, it executes a different code path that will degrade the program's performance or cause it to crash.""
AMD alega que compiladores Intel criam código mais lento para AMD
edxwelch escreveu "Na recente ação anti-truste da AMD, a AMD tem examinado o compilador Intel e descobriu que ele deliberadamente roda código mais lento quando ele detecta que se trata de um processador AMD. "Para conseguir isso, a Intel projetou seu compilador para compilar código ao longo de diversos caminhos de código alternativos... Por projeto, os caminhos de código não foram criados igualmente. Se o programa detecta um microprocessador "Genuine Intel"
(Genuinamente Intel), então ele executa um caminho de código totalmente otimizado e opera com eficiência máxima. No entanto, se o programa detecta um microprocessador "Authentic AMD"
(AMD Autêntico), ele executa um caminho de código diferente que irá degradar a performance do programa ou então causar sua falha (crash).