Ir para o conteúdo

NVIDIA PHYSX usando instruções x87 para calcular física na CPU (Instruções do Pentium 3)

David Kanter, do famoso site https://www.realworldtech.com, emitiu um artigo de respeito e vem por mais lenha na fogueira contra o NVIDIA PHYSX, uma tecnologia proprietária e usada como massa de manobra pela NVIDIA para tentar vender mais placas de vídeos a despeito de melhores efeitos de física nos jogos. Segundo seu artigo, as instruções de ponto flutuante x87 são antigas, do início da década passada, e tem sido a um bom tempo depreciadas em favor das instruções SSE2 que são muito mais eficientes (e logo AVX). A Intel começou a desencorajar o uso de instruções x87 do P4 no final de 2000. AMD também divulga que o x87 é obsoleto desde o K8 em 2003, processadores compatíveis com x86-64 já detém também o suporte para SSE2; A VIA e seu processador C7 já inclui suporte ao SSE2 desde 2005. Em versões de 64 bits do Windows, x87 tem sua execução somente em modo usuário onde limites de recursos e performances são pré-estabelecidos, reforçando a proibição de rodar totalmente em modo kernel (mais desempenho). Quase todo mundo na indústria tem recomendado SSE ao invés do x87 desde 2005 e não há razões para usar o x87, a menos que tenha software para rodar em um Pentium embutido ou 486.

x87 usa uma pilha de 8 registros com precisão estendida em ponto flutuante de 80 bits . No entanto um registrador funcional do x87 é primeiramente armazenado na memória com um formato de 64 bits que trunca 16 bits extras para obedecer as limitações dos PCs de duas décadas anteriores. Devido a esta truncagem, códigos de execução x87 podem retornar resultados visivelmente diferentes se dados transitarem para fora e para dentro do cache. Instruções x87 são escalares por natureza, e mesmo os CPUs de mais alto desempenho só podem executar duas operações por ciclo de x87, o que é uma limitação não desejável para um software.

Em contraste, SSE tem 16 registros com 128 bits de largura. Números de ponto flutuante podem ser armazenados em uma precisão única (32 bits) ou precisão dupla (64 bits) de formato. Um agrupamento de dados (ou seja, vetorização) de instruções SSE2 podem realizar duas operações de precisão dupla, ou quatro operações de precisão simples. Assim, uma CPU Nehalem como Xangai ou pode executar 4 operações de precisão dupla, ou 8 operações por ciclo de precisão única. Com o futuro AVX, veremos a evolução para 8 ou 16 operações, respectivamente. SSE também vem em uma variedade escalar, onde apenas uma operação é executada por instrução. No entanto, o código SSE escalar ainda é um pouco mais rápido do que o código x87 porque não há mais tantos registros, instruções SSE tem ligeiramente menor latência do que o x87 equivalentes e instruções de manipulação de pilha não são necessários. Além disso, acessos à memória não temporal via SSE são substancialmente mais rápidos (2X por exemplo, para processadores AMD), pois eles usam um modelo de consistência relaxada.

Então, por que PhysX ainda está usando o arcaico x87?

O hardware PPU (criado pela falecida/vendida/comprada empresa AGEIA) original tinha apenas 32 bits de ponto flutuante de precisão única, nem mesmo 64 bits de precisão dupla, e muito menos a precisão estendida de 80 bits x87. Na verdade e provavelmente o PhysX usa somente precisão simples na GPU, pois é acelerado desde o G80, que não tem precisão dupla. As evidências sugerem que PhysX só precisa de precisão única até os mais recentes modelos da NVIDIA.

Qualquer sistema de jogos comprados desde 2005, terá suporte SSE2, para piorar, a PPU da AGEIA só foi lançada a partir de 2006. Ageia foi comprada pela Nvidia em 2008, e quase todos os CPU vendidos desde então (com exceção de alguns modelos diferenciados) tem suporte SSE2. PhysX também não está mirando em nenhuma CPU de tecnologia embutida x86 existente no mercado, ele é somente projetado para os jogos.

A verdade é que não há nenhuma razão técnica para PhysX estar usando código x87. PhysX usa x87 porque a Ageia, e agora a Nvidia desejam que seja assim. Para complicar, Nvidia PhysX já foi portado para os consoles e curiosamente usa extensões AltiVec para as CPUs PowerPC, que são muito semelhantes ao SSE. Se levaria cerca de um ou dois dias para começar a rodar instruções PhysX SSE2 com código que rodaria melhor em qualquer CPU a partir de 2005, claro, não descartando, algumas semanas de testes de compatibilidade. De fato, para compatibilidade com versões anteriores, PhysX poderia escolher no momento da instalação se deve usar uma versão SSE2 ou tem uma versão x87 – apenas para o caso de alguém que ainda mora numa caverna a mais de 15 anos e ainda tem um Pentium Overdrive se decidisse a tentar rodar algum jogo atual.

A verdade é que Ageia e Nvidia usaram e usam o PhysX para destacar as vantagens do seu hardware sobre a CPU em cálculos de física. No caso da Nvidia, eles também estão usando PhysX para se diferenciarem das GPUs AMD. A única finalidade do PhysX é um diferencial competitivo para tornar o hardware da Nvidia parecer ter um bom aspecto e vender mais GPUs. Basicamente, a estratégia de comércio das GPUs da Nvidia, é fazer elas parecerem ser muito melhores do que as CPUs no cálculo de física.

Porém, usando instruções antigas x87 definitivamente faz com que o GPU funcione melhor, já que o processador terá um desempenho bem pior do que se o código fosse corretamente gerado para processar instruções SSE.

Realisticamente, a Nvidia poderia usar SSE com precisão única para PhysX, se eles quisessem tirar proveito do CPU. Cada instrução deve executar até quatro operações SIMD por ciclo, ao invés de apenas uma operação escalar como acontece no x87. Na teoria, isso poderia quadruplicar o desempenho do PhysX em uma CPU, mas a realidade é que os ganhos são, provavelmente, na faixa de 100% no Nehalem atual e geração de processadores Westmere. Mesmo assim, isso já é um bom avanço e e poderia facilmente passar alguns jogos do modo “slow motion” para a zona dos jogáveis FPS 30 FPS quando em uso da CPU. Para colocar em contexto, aqui está uma citação de marketing da Nvidia:

[Em Cryostasis], com simulação de alta granularidade, usado comumente em efeitos de água, destruições, e partículas, a CPU apresenta-se como totalmente inadequada para a entrega de framerates jogáveis. GPUs que não suportam o PhysX se tornam um gargalo, independentemente da capacidade do hardware de gráficos. GPUs GeForce com suporte a física em suas GPUs apresentam um ganho de performance de 2x a 4x, proporcionando uma performance excelente e escalabilidade em todos os modelos de GPUs da empresa.

O ganho de performance 2-4X parece respeitável no papel. Na realidade, porém, se a CPU pode executar 2X mais rápido usando corretamente código SSE, a diferença de desempenho cairia substancialmente e em alguns casos, desaparecem completamente. Infelizmente, é difícil determinar o quanto custa ao desempenho o uso do x87. Sem acesso ao código fonte para PhysX, não podemos fazer uma comparação justa , colocando PhysX usando x87 contra PhysX usando SSE . A comparação mais próxima seria a de comparar os três pacotes principais física (Havok pela Intel, Nvidia PhysX e de código-fonte aberto Bullet) sobre um determinado tipo de teste, executando na CPU. Havok é quase certo que é altamente otimizado para vetorização do SSE, dados os recursos internos da Intel e também a sua ênfase no uso de extensões como conjunto de instruções SSE e AVX esperados. Bullet provavelmente não é tão altamente otimizado como Havok, mas está disponível em código fonte, portanto, um teste de x87 vs SSE é possível.

Mas não só comparação de física revelariam as diferenças entre o x87 vs SSE, também seria interessante mostrar o impacto do multi-threading. O site TechReport fez um review que já demonstra que em alguns casos (por exemplo no jogo SACRED II), PhysX só usa um dos vários núcleos disponíveis em um processador multi-core. Nvidia esclareceu que CPU PhysX é, por padrão thread simples e para usar o multi-threading é necessário o desenvolvedor fazer. Nvidia PhysX demonstrou que pode usar multi-threaded usando CUDA no topo de suas GPUs. Claramente, com a codificação adequada e infra-estrutura, PhysX poderia aproveitar vários núcleos numa CPU moderna. Por exemplo, Westmere possui seis núcleos, e usando dois núcleos para a física poderia facilmente render um ganho de desempenho 2X ou 100%. Combinado com os benefícios da SSE sobre x87, é fácil ver como uma CPU multi-core usando usando 2-3 núcleos poderia igualar os ganhos do PhysX de uma GPU.

Enquanto que um cliente da NVIDIA pode se frustrar ao ver PhysX se arrastando na sua CPU, ele não deverá se surpreender. Nvidia não tem obrigação de otimizar os produtos do seu concorrente. PhysX não é executado em cima de GPUs AMD, e ninguém espera razoavelmente que ele um dia o fará. Não só por causa do desenvolvimento extra e os custos de suporte, mas também a AMD nunca iria querer dar à Nvidia versões iniciais de seus produtos para testes. Nvidia PhysX é exclusivo, e ele provavelmente vai continuar assim. No caso do PhysX no CPU, não existem custos significativos extras (e, francamente usar SSE é mais fácil do usar x87 ). Para Nvidia, diminuir o desempenho médio dos processadores usando instruções x87 , faz o segmento de GPUs se tornarem melhores nesta tarefa. Essa tática põe em cheque comparações de CPU vs GPU feitas com PhysX, e este jogo que a empresa faz, já consegue fazer o PhysX se pagar por enquanto nesta encarnação.

O ponto é que a Nvidia está livre para mancar o PhysX via CPU usando o código x87 com threads simples, se assim o desejarem. Essa escolha, no entanto, não beneficia os desenvolvedores e os consumidores , e lança dúvidas substanciais sobre os supostos benefícios de desempenho de execução PhysX em uma GPU, ao invés de uma CPU. Já existe um debate amplo e controverso sobre as vantagens de CPUs e GPUs , e o PhysX é uma outra parte desse quebra-cabeça, mas que parece cria mais perguntas, ao invés de respostas.

Mesmo hoje utilizando uma VGA mid-end dedicada somente para processar Physx nos novos jogos o desempenho pode cair bruscamente.

Temos como exemplo Máfia II que sugere como requisito recomendado uma GTX 285 dedicada para gerenciar os efeitos do Physx.

Gostou? Nos ajude compartilhando!
Postado por
Notícias sobre games, jogos e tecnologia!
Siga em:
Assine nosso Newsletter
Assine nossa newsletter e receba nossa seleção de conteúdo sobre games e entretenimento diretamente em seu email.
DEIXE SEU COMENTÁRIO
Gostou? Discordou? Comente! Sua opinião vale ouro e nos ajuda a melhorar cada vez mais!
Img de rastreio