2017-02-28 2 views
0

j'ai obtenu le calcul suivant:ramification dans la déclaration suivante

if (x==0) x=1.0; 
Y = x * A 

Toute idée comment puis-je éviter le « si » branchement ci-dessus en utilisant des fonctions de serrage mathématiques/étape.

+0

pouvez-vous fournir du code autour? quelles sont les valeurs possibles pour x? – Psi

+1

Votre CPU pourrait utiliser une instruction CMOV * (en supposant qu'une instruction Intel/AMD est définie ici, mais d'autres familles de puces ont des capacités similaires) pour (re-) charger 'x', ce qui éviterait une branche si vous le souhaitez utiliser l'assemblage en ligne (ou même l'assemblage non intégré). Que votre compilateur produise ou non un tel code dépend beaucoup du compilateur, de la version du compilateur et des options que vous lui donnez. – twalberg

Répondre

1
Y=((x==0)+(x!=0)*x)*A; 

compile ce cpi -O3 sans JMP (gcc/LLVM ne) pour x86-64 (vérifié avec https://gcc.godbolt.org).

+0

Clang et GCC font aussi, si vous compilez avec -ffast-math (ICC est un peu plus lâche avec cela par défaut il semble) – harold

+0

Je pensais à l'imprécision aussi bien lors de la création de l'expression proposée mais je ne vois pas comment l'expression affichée pourrait entraîner une différence avec l'expression initiale, donc -ffast-math ne devrait faire aucune différence. Est-ce que je manque quelque chose? – FPK

+0

Bien vérifier le [code] (https://godbolt.org/g/mLoQ5W), beaucoup d'opérations au niveau du bit – harold