Como sei se meu código está sendo vetorizado pelo compilador?

9

Como exemplificado pela resposta de Jed Brown a Custos de pesquisas versus cálculos , o uso de operações de ponto flutuante vetorizado versus não vetorizado resulta em código muito mais rápido. Muitos compiladores modernos afirmam que podem executar a vetorização automática. Como faço para que partes do meu código estão sendo vetorizadas com êxito?

Matthew Emmett
fonte

Respostas:

10

Com o compilador Intel de qualquer vintage moderno -O3 -vec-report3,. O nível de otimização três garante que ele está tentando vetorizar, e o relatório de vetor informará o que está fazendo.

A página GNU sobre vetorização diz que está ativada por padrão no nível de otimização 3, mas não consigo encontrar o equivalente a vec-report.

Bill Barth
fonte
Obrigado pela resposta rápida. Eu não sabia sobre -vec-report3. Você tem uma preferência do compilador quando se trata desse tipo de coisa (vetorização automática)?
Matthew Emmett
Os compiladores Intel são realmente bons, mas apenas para chips intel. Você só precisa adicionar todos os pragmas corretos (o #pragma ivdep é mais fácil). O GCC 4.7 ficou muito melhor, mas olhando para algum código com um colega que ainda possui bugs (como nenhuma vetorização dentro dos pragmas do openmp).
aterrel
11
Eu recomendaria verificar novamente como o compilador Intel se sai com a vetorização nos chips AMD. Não tenho 100% de certeza de que os problemas do passado ainda existam.
Bill Barth
2
@ BillBarth Sim, ainda é um problema. Consulte o Aviso de otimização (em muitos lugares, por exemplo, software.intel.com/sites/products/collateral/hpc/compilers/… ). A AMD venceu a batalha judicial exigindo que a Intel divulgue que são anticoncorrenciais, e não para fazê-las deixar de ser. en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler#Criticism Agner Fog nas soluções alternativas: agner.org/optimize/blog/read.php?i=49
Jed Brown
@JedBrown, com certeza o SSE ainda é estranho, mas qual é a história do AVX? Esses links indicam que tudo deve ficar bem (já que as duas empresas implementam o AVX), mas eu não testei em uma máquina Bulldozer.
Bill Barth
8

Dentro da coleção do compilador GNU, você tem a opção -ftree-vectorizer-verbose=nonde nhá um número entre 0 e 6 que imprimirá informações semelhantes a icc/ ifort.

Pedro
fonte
5

Com os compiladores GNU, adicionar adicionará -Wa,-ahl=asm.so código de montagem gerado a asm.s.

Com os compiladores Intel, adicionar adicionará -fcode-asm -Faasm.so código gerado a asm.s.

Você pode inspecionar o código da montagem e procurar operações de ponto flutuante do vetor.

Matthew Emmett
fonte
Concordo plenamente que inspecionar a saída do assembly é a única maneira confiável de determinar se o código é realmente vetorizado. Não há nada que exija que os compiladores sejam honestos sobre suas reivindicações para vetorizar código.
11133 Jeff