Design: Proposta: Sinalizadores de nível de conformidade Fp IEEE para Wasm (FP-Fast-Math para Wasm Scalar e SIMD)

Criado em 12 jan. 2021  ·  7Comentários  ·  Fonte: WebAssembly/design

Compiladores nativos como gcc, clang, msvc permitem que os desenvolvedores definam níveis de conformidade fp IEEE por meio de pragmas ou sinalizadores de tempo de compilação como /fp(strict-fast), ffast-math, -ffp-contract, etc. Esses sinalizadores são benéficos para uma ampla gama de aplicações (por exemplo, ML-convolutions, DSP, motores gráficos/física de baixa precisão...) onde os desenvolvedores preferem trocar a precisão portátil em favor do desempenho.

Os ganhos de desempenho podem ser significativos dependendo das configurações e compiladores específicos usados. Essas dicas/preferências do desenvolvedor permitem que os compiladores executem com segurança mais otimizações matemáticas de Fp, melhor seleção de instruções (fusão/fma), restrições de intervalo de valores e validações relaxadas.

Atualmente, esses sinalizadores quando especificados pelos desenvolvedores para Wasm são consumidos pela cadeia de ferramentas do desenvolvedor e podem honrar alguns dependendo da ferramenta específica usada (por exemplo, https://github.com/WebAssembly/binaryen/pull/3155). Essas informações de preferências serão descartadas e não estiverem disponíveis/visíveis para os tempos de execução se desejarem usá-las.

Os tempos de execução do Wasm podem se beneficiar de ter os meios para acessar esses sinalizadores/dicas do desenvolvedor para tomar suas próprias decisões sobre otimização e seleção de instruções quando for seguro fazê-lo. Isso será particularmente útil para realizar otimizações de tempo de execução adicionais, especialmente em compiladores AOT wasm. Isso também ajuda a resolver algumas das preocupações de desempenho conhecidas no codegen FP Wasm SIMD, como arredondamento, mín./máx., etc. Um nível alto, isso permitirá que os tempos de execução não dependam de ferramentas de desenvolvedor para certas otimizações de FP e remove um bloqueador para Wasm para acompanhar o desempenho nativo mais de perto.

Existe o precedente da JVM 1.2 relaxando a conformidade com IEEE como o modo padrão e introduzindo o modificador 'strictfp' para garantir a portabilidade em uma granularidade de classe/interface/método. Existe a oportunidade de explorar uma abordagem mais compatível com versões anteriores para Wasm.

Gostaria de propor um mecanismo para codificar sinalizadores de conformidade fp IEEE no binário Wasm para serem consumidos pelos mecanismos de tempo de execução. Como é o caso das linguagens nativas, os próprios sinalizadores podem ser tratados como opcionais e seu uso pode ser uma escolha dos tempos de execução. O impacto se manifestará como desempenho aprimorado, semântica consistente em uma determinada plataforma e menor portabilidade de plataforma. O mecanismo proposto permitirá a marcação inequívoca de seções de código dentro de um binário Wasm com essas preferências/dicas na granularidade de um bloco de instruções.

O design pode ser resolvido em detalhes à medida que avançamos. Uma opção é introduzir uma nova seção personalizada com entradas marcando preferências e deslocamentos de segmento de código e outra opção é introduzir uma nova instrução para marcar segmentos de código com essas preferências do desenvolvedor, como na JVM. Os sinalizadores específicos para suporte podem ser discutidos e incorporados à medida que prosseguimos (por exemplo, -fp-finate-math-only, -fp-no-signed-zeros..)

Este mecanismo complementará as discussões para adicionar instruções de aproximação Escalar / Vetorial FMA e FP às especificações Wasm e/ou SIMD.

Este problema é para rastrear o interesse neste tópico e discutir isso na sincronização de CG.

Comentários muito úteis

Projetos típicos que usam o -ffast-math do gcc/clang estão compilando para código nativo. Os desenvolvedores de aplicativos que os utilizam normalmente testam todas as variantes de código nativo que eles mesmos criam. E como todos os ISAs de hardware populares têm comportamento de ponto flutuante totalmente determinístico, uma vez que os desenvolvedores testaram essas variantes, eles podem ter certeza de que o comportamento não mudará para seus usuários. Atualmente, o ponto flutuante do WebAssembly também funciona dessa maneira; é totalmente determinístico, assim como os ISAs de hardware, portanto, as suposições de longa data dos desenvolvedores sobre a capacidade de adicionar -ffast-math e testar se "funciona para eles" são mantidas.

Um sinalizador -ffast-math no nível do WebAssembly significaria que o WebAssembly não se assemelha mais a um ISA de hardware a esse respeito e não mantém mais essas suposições. Os desenvolvedores testariam o binário que produzem, mas ao enviar o wasm para seus usuários, eles devem esperar poder executá-lo em diferentes hardwares ou mecanismos diferentes. Com sinalizadores de matemática rápida no nível do WebAssembly, o WebAssembly não se comportaria como um ISA, e os usuários poderiam ver resultados de ponto flutuante diferentes dos que o desenvolvedor testou.

Também vale a pena ressaltar que os projetos que usam esses sinalizadores não estão perdendo ao compilar para o WebAssembly hoje. Por exemplo, muitas das otimizações habilitadas por -fassociative-math são otimizações orientadas a loops que o LLVM pode fazer antes de produzir o WebAssembly.

Todos 7 comentários

Como o rigor das operações fp afeta a semântica de um programa, eu esperaria que a melhor maneira de tornar possível uma semântica mais permissiva fosse introduzir novas instruções em vez de uma seção personalizada ou construção de bloco. Já temos os mecanismos de especificação necessários para lidar com o não determinismo flutuante devido às nossas regras de propagação de NaN, então espero que seja simples introduzir novas instruções de ponto flutuante que permitam mais resultados possíveis.

Como contexto adicional, a JVM, por sua vez, está considerando remover strictfp e suportar apenas a semântica estrita.

a melhor maneira de tornar possível uma semântica mais permissiva seria introduzir novas instruções em vez de uma seção personalizada ou construção de bloco.

A introdução de novas instruções é útil, mas não será dimensionada muito bem ou removerá completamente a dependência da cadeia de ferramentas. As instruções com bom suporte de plataforma como fma, recíproca etc são boas candidatas para a adição de novas instruções. Existe uma variedade considerável de
-fassociative-math -ffast-math -fno-honor-nans -ffinate-math-only -fdenormal-fp-math -fno-strict-float-cast-overflow -fno-math-errno -fno-trapping-math ...
A maioria dessas são dicas para permitir otimizações de fp mais agressivas, levantando restrições em transformações algébricas, nans, zeros assinados, armadilhas, arredondamentos etc. Expressar todos os sinalizadores úteis como novas instruções não é o ideal imo.

Como contexto adicional, a JVM, por sua vez, está considerando remover o strictfp e suportar apenas a semântica estrita.

Obrigado @sunfishcode por este contexto adicionado! Eu não sabia dessa nova atualização e parece que a motivação é consolidar as variantes da biblioteca de matemática. Olhando mais de perto, o Java strict-fp parece ser um pouco mais especializado e não é uma boa representação do intervalo de pontos de controle oferecidos pelo gcc/clang. -ffast-math sinalizadores e sinalizadores associados parecem ser bastante populares em repositórios nativos a partir de uma pesquisa rápida no github. Eu pretendo analisar os usos dos sinalizadores acima e os pargmas associados

Projetos típicos que usam o -ffast-math do gcc/clang estão compilando para código nativo. Os desenvolvedores de aplicativos que os utilizam normalmente testam todas as variantes de código nativo que eles mesmos criam. E como todos os ISAs de hardware populares têm comportamento de ponto flutuante totalmente determinístico, uma vez que os desenvolvedores testaram essas variantes, eles podem ter certeza de que o comportamento não mudará para seus usuários. Atualmente, o ponto flutuante do WebAssembly também funciona dessa maneira; é totalmente determinístico, assim como os ISAs de hardware, portanto, as suposições de longa data dos desenvolvedores sobre a capacidade de adicionar -ffast-math e testar se "funciona para eles" são mantidas.

Um sinalizador -ffast-math no nível do WebAssembly significaria que o WebAssembly não se assemelha mais a um ISA de hardware a esse respeito e não mantém mais essas suposições. Os desenvolvedores testariam o binário que produzem, mas ao enviar o wasm para seus usuários, eles devem esperar poder executá-lo em diferentes hardwares ou mecanismos diferentes. Com sinalizadores de matemática rápida no nível do WebAssembly, o WebAssembly não se comportaria como um ISA, e os usuários poderiam ver resultados de ponto flutuante diferentes dos que o desenvolvedor testou.

Também vale a pena ressaltar que os projetos que usam esses sinalizadores não estão perdendo ao compilar para o WebAssembly hoje. Por exemplo, muitas das otimizações habilitadas por -fassociative-math são otimizações orientadas a loops que o LLVM pode fazer antes de produzir o WebAssembly.

Sim, quaisquer decisões que afetem a precisão/comportamento da flutuação devem ser inseridas no módulo Wasm pelas ferramentas. Novas instruções podem ser adicionadas para comportamentos que não podem ser expressos com as atuais.

Tivemos uma discussão sobre esse tema na última reunião do CG com a adição da nova instrução como meio alternativo para o objetivo. Parece haver um interesse geral em resolver isso através da última direção. Não tenho objeções se as expectativas do desenvolvedor sobre ganhos de desempenho puderem ser mantidas por otimizações da cadeia de ferramentas e pela introdução de variantes de instrução ausentes. Nesse caso, não há necessidade de justificar a propagação desses sinalizadores para o runtime comprometendo o nível de abstração do Wasm. Será bom entender as instruções da variante semântica que são necessárias para atingir esse objetivo. Temos algumas novas instruções identificadas no contexto do SIMD que podem precisar ser estendidas para corresponder às necessidades das ferramentas de instruções para expressar totalmente os sinalizadores de matemática rápida. Continuará olhando nessa direção.

Obrigado pelo feedback.

Conteúdo usado para discussão de CG. Wasm ffast-math.pptx

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

artem-v-shamsutdinov picture artem-v-shamsutdinov  ·  6Comentários

bobOnGitHub picture bobOnGitHub  ·  6Comentários

jfbastien picture jfbastien  ·  6Comentários

cretz picture cretz  ·  5Comentários

ghost picture ghost  ·  7Comentários