• [^] # Re: -march

    Posté par . En réponse au journal Recherche de valeur dans un tableau et l'écosystème des compilateurs C++. Évalué à 2.

    Il me semble que par défaut GCC cible la plateforme hôte, comme si on passait -march=native.

    Chez moi la valeur par défaut est x86-64 (amd64 avec extensions jusqu'à sse2 si j'ai bien compris).

    Mes résultats plus détaillés sont :

     c c_unr cpp sse2
    default 8.56 5.49 4.39 3.91
    core2 5.42 5.16 4.38 3.89
    sandybridge 5.45 5.51 4.34 3.93
    haswell 5.42 5.47 4.35 3.89
    broadwell 5.42 5.47 4.35 3.86
    skylake 5.39 5.47 4.31 4.70
    

    Je regarde le code désassemblé avec objdump et je n'y comprends rien. Pour find_int_c le code machine est exactement le même entre default et core2, à partir de haswell add 0ドルx1,%rcx est remplacé par inc %rcx mais ce n'est pas ce qui fait la différence. Pareil pour find_int_sse2, à partir de sandybridge les instructions SSE2 sont remplacées par leurs équivalents AVX, mais il n'y a aucune différence entre broadwell et skylake. Des idées sur ce qui peut se passer ?

    Pour la boucle déroulée sur core2, au moins je vois des différences : des instructions sont réordonnées par rapports aux autres architectures.