Compilador Intel Fortran: dicas sobre otimização na compilação

21

Começarei com minha experiência pessoal em nosso laboratório. Nos 9 e 10 dias da ifort, costumávamos ser bastante agressivos com as otimizações, compilando com -O3 e sinalizadores específicos do processador (-xW -xSSE4.2 por exemplo). Mas a partir do ifort 11, começamos a notar:
1. algumas inconsistências nos resultados (porque a semântica não foi preservada)
2. ganhos menores em comparação com -O2.

Portanto, atualmente, geralmente compilamos com -O2 e -xhost. Você tem sugestões melhores com o ifort 11? Isso mudará mais uma vez quando passarmos para a ifort 12? Desde já, obrigado.

FrenchKheldar
fonte
7
As otimizações não beneficiam todos os códigos de maneira uniforme. Portanto, acho que uma pergunta melhor seria "Como posso criar um perfil do meu código para saber quais otimizações do compilador são eficazes?"
precisa saber é o seguinte
1
Porque a semântica não foi preservada ou porque algo foi reordenado? Isso pode estar se afastando um pouco do tópico, mas seria bom ver um trecho de código que reproduz o problema. Pode ser que algo tenha sido reordenado de uma maneira que você não gosta, mas que o compilador acha que deve estar bem. Minha experiência é que a Intel 12 faz um trabalho melhor de vetorização do que qualquer um dos seus antecessores, portanto, esperaria que mais mudanças estivessem chegando quando você mudar para a versão mais recente.
Bill Barth
Eu pensei que dizer que a semântica não era preservada era equivalente a ordenar não era preservado. Enfim, percebo que minha pergunta é (também?) Genérica e não queria me deter em detalhes. Tivemos vários problemas com o intel 10, alguns eram erros de compilação e outros foram deixados sem explicação. Então, com 11, jogamos pelo seguro e ficamos felizes com o desempenho. Mas talvez estejamos jogando muito seguro, e eu queria saber se a comunidade tinha algum conselho.
precisa saber é o seguinte

Respostas:

16

É altamente recomendável que todos os nossos usuários iniciem -O3 -xHost -ipoo ifort 11 e o ifort 12. Se houver transformações específicas de ponto flutuante ativadas pelo O3 que afetem a precisão de alguns de seus cálculos, você pode desativá-los especificamente com -fp-model precise -fp-model except(ou, de maneira mais drástica -fp-model strict) enquanto mantém as outras otimizações habilitadas pelo O3, como bloqueio de loop para cache, fusão e desenrolamento de loop e otimizações de acesso à memória.

Aconselho tentar o material do modelo de ponto flutuante em arquivos individuais e descobrir onde isso faz diferença, em vez de desativá-lo globalmente; pode ser um aumento de velocidade de aproximadamente 15% e você deseja mantê-lo onde isso não afeta seus cálculos. Se não tiver certeza de onde a precisão está sendo afetada, você pode ativar e desativar os sinalizadores de modelo de ponto flutuante desses arquivos ou tocar nos modos de arredondamento .

Recentemente, fizemos uma breve conversa com nossos usuários sobre sinalizadores de otimização, focando nos compiladores gnu e intel para x86; você pode ver os slides dessa palestra aqui .

Aliás, enquanto estamos falando sobre a escolha de sinalizadores de otimização para o seu código, de vez em quando também vale a pena examinar a saída de -vec-report para ver onde o compilador tentou vetorizar um loop e não conseguiu; Às vezes, há pequenas alterações que você pode fazer no seu loop, o que pode resultar na possibilidade de vetorização (que pode ser uma aceleração de 4x). Da mesma forma, para o relatório -opt- geral .

nullglob
fonte
Gostei da sua resposta, mas tentei novamente com um dos nossos casos de teste e -O3 -xhost -fp-model precise -fp-model exceptresultou em uma desaceleração de 30% . Eu vou olhar novamente para a caracterização ea -vec-reporttentar ver o que está acontecendo ...
FrenchKheldar
2
Over -O2 -xhost? Isso é interessante; é muito incomum, mas pode acontecer. Em casos como esse, o otimizador está fazendo algo que tem boas razões para pensar que melhorará a velocidade, mas acaba piorando as coisas. Normalmente, para código científico, que possui uma estrutura bastante direta, isso não acontece. Em casos como esse, a Otimização guiada por perfil - software.intel.com/sites/products/documentation/hpc/compilerpro/… - geralmente pode ajudar.
5

Trabalho para uma empresa que produz aplicativos grandes e altamente técnicos no Fortran com o IFort - os aplicativos são muito críticos para o desempenho, pois a velocidade (mantendo a precisão) é o principal ponto de venda.

Sempre compilamos com -O3 e, pelo que sei, as principais coisas que -O3 fazem são desenrolar e pré-buscar em loop. Suspeito que a maioria dos aplicativos de computação científica se beneficie bastante com eles, principalmente as otimizações de loop. Não vemos erros de compilador há algum tempo (embora tenhamos visto alguns erros de vinculador ao usar o Ifort em um Mac). Nós usamos 11.1.095.

Eu espero que isso ajude.

OscarB
fonte
4

Sei que essa resposta provavelmente é muito, muito tarde, mas para otimização agressiva, a opção "-fast" parece ser a solução mais fácil. Trechos da página do manual:

-fast
    Maximizes speed across the entire program.
    Description:
    This option maximizes speed across the entire program.

    It sets the following options:
     - On Linux* systems: -ipo, -O3, -no-prec-div, -static, and -xHost
     - On OS X* systems: -ipo, -mdynamic-no-pic, -O3, -no-prec-div, and -xHost
     - On Windows*  systems:  /O3,  /Qipo,  /Qprec-div-,  and /QxHost

    NOTE: Option fast sets some aggressive optimizations that may not be appropriate for all
    applications. The resulting executable may not run on processor types different from the
    one on which you compile. You should make sure that you understand the individual optimi-
    zation options that are enabled by option fast.
user5428
fonte