Ce n'est pas évident que ce branchement soit inliné, il aurait été bien d'avoir un extrait du code assembleur, et de comparer avec une version sans multiplication.
.L31:movrdx,QWORDPTR[r8]movsxecx,BYTEPTR[rdi+rax]movedx,DWORDPTR[rdx+rax*4]movesi,ecximulecx,edxaddr12d,ecxtestedx,edxsetnedlandedx,esimovBYTEPTR[rdi+rax],dlmovrdx,rax; à partir de là on gère le compteur de la boucle etaddrax,1; la condition de sortie.cmpr9,rdxjne.L31; on a un seul jump par itération.
et celui avec les branches :
.L70:movBYTEPTR[rdi+rax],0; usable_column[i] = 0.L53:leardx,[rax+1]; gestion du compteur de la boucle, sans intéretcmprcx,rax; pour la comparaison de la sortie asmje.L52; saut pour sortir de la boucle.L59:movrax,rdx; fin de la gestion du compteur de la boucle.L55:cmpBYTEPTR[rdi+rax],0je.L53; un premier jump hors gestion du compteur de la bouclemovrdx,QWORDPTR[rsi]movedx,DWORDPTR[rdx+rax*4]testedx,edxje.L70; là on a un jump qui va nous permettre de faire; l'affectation usable_column[i] = 0 puis d'enchaîner avec; la gestion du compteur de la boucle.; Ça fusionne les deux sauts du code initial (le test; if (v==0) puis le saut pour reboucler.addr12d,edx; result += vleardx,[rax+1]; à nouveau de la gestion du compteur de bouclecmprcx,raxjne.L59
[^] # Re: best-rating == column-major
Posté par Julien Jorge (site web personnel) . En réponse au journal Exercices de programmation et benchmarks. Évalué à 2. Dernière modification le 12 février 2020 à 09:17.
Bien vu ! Voici une version sur Compiler Explorer où on peu voir le corps de la version branchless :
et celui avec les branches :