2010-04-01 4 views
4

J'ai fait du codage ASM en ligne pour SSE auparavant et ce n'était pas aussi difficile pour quelqu'un qui ne connaissait pas l'ASM. Mais je note MS également fournir intrinsèque enveloppant de nombreuses instructions spéciales.Intrinsics Vs inline ASM pour le codage SSE dans VC++ 2K8

Y a-t-il une différence de performance particulière, ou une autre forte raison pour laquelle l'un devrait être utilisé au-dessus de l'autre? Pour répéter le titre, cela couvre spécifiquement les intrinsèques exposés par VC++ 2008 pour le C++ natif non managé.

Répondre

3

En général, il est préférable d'utiliser intrinsics - il est plus productif pour le programmeur et un bon compilateur (par exemple Intel ICC) va faire un travail décent de l'allocation de registre, l'ordonnancement des instructions, etc. Le compilateur Microsoft n'est pas aussi bon à cet égard mais il fait probablement encore un travail raisonnable - vous pouvez toujours passer à ICC plus tard si vous avez besoin d'obtenir de meilleures performances.

+1

L'argument productivité est le bon argument pour les intrinsèques. Pour la plupart des tâches, le code résultant sera suffisamment bon pour que les gains de productivité résultant de l'utilisation d'intrinsèques soient bien plus précieux que les performances supplémentaires de l'utilisation de l'assemblage.En réalité, seules les bibliothèques et les petites sections qui sont absolument critiques en termes de performances doivent être écrites en assembleur. –

4

Il n'existe aucun assembly en ligne dans Visual C++ pour x64. Intrinsics peut être utilisé sur x64 aussi bien. Si vous voulez porter votre code sur x64, vous devrez utiliser intrinsics.

+0

+1. Dans ce cas, ce n'est pas pertinent. Mais merci de l'avoir signalé, je ne le savais pas. –

+1

Mais vous pouvez utiliser MASM x64 si vous voulez – PhiS

1

Les intrinsèques sont identiques à leurs instructions d'assemblage équivalentes et vous devriez les utiliser si possible - le compilateur sait les traduire directement, il n'y a pas de différence de performance.

+0

Vraiment _identical_? Qu'en est-il du transfert des données dans les registres, etc., est-ce couvert/pertinent? –

+0

Je trouve souvent que je peux écrire un assemblage qui est ~ 2x plus rapide que les intrinsèques SSE équivalents en raison de l'allocation de registre de botching et/ou de la programmation d'instruction par les compilateurs. Cela dit, j'écris du code vectoriel toute la journée, tous les jours. Votre kilométrage peut varier. –

+0

@Stephen: avez-vous essayé cette comparaison avec le compilateur Intel ICC? C'est assez difficile à battre, à mon humble avis, mais je serais intéressé de savoir si vous avez été capable de le battre avec un assembleur codé à la main? –

0

Utiliser les intrinsèques. L'utilisation de l'assemblage entraînera généralement plusieurs jours de travail non-stop, seulement pour découvrir que le compilateur bat votre meilleure performance de 5%. (5% si vous êtes vraiment bon, plus probablement 30%.)