Question

Lorsque vous traitez à la fois avec les INT et les flotteurs dans SSE (AVX), est-il une bonne pratique de convertir tous les INT en flotteurs et de travailler uniquement avec des flotteurs? Parce que nous n'avons besoin que de quelques instructions SIMD après cela, et tout ce que nous devons utiliser, c'est l'ajout et comparer les instructions (<, <=, ==) Quelle conversion, j'espère, devrait conserver complètement.

Était-ce utile?

La solution

Développez mes commentaires dans une réponse.

Fondamentalement, vous pesez le compromis suivant:

Restez avec entier:

  • INTEGER SSE est un débit à faible latence et à haut. (double problème sur Sandy Bridge)
  • Limité à la largeur SIMD 128 bits.

Convertir en point flottant:

  • Bénéficier de 256 bits AVX.
  • Latences plus élevées, et seulement l'ajout / soustraction unique (sur Sandy Bridge)
  • Entraîne une surcharge de conversion initiale.
  • Restreint la contribution à ceux qui s'adaptent dans un float sans perte de précision.

Je dirais rester avec entier pour le moment. Si vous ne souhaitez pas dupliquer le code avec le float Versions, alors c'est votre appel.

Les seules fois où j'ai vu où l'émulation des entiers avec un point flottant devient plus rapide, c'est lorsque vous devez faire des divisions.


Notez que je n'ai fait aucune mention de lisibilité car la plongée dans la vectorisation manuelle implique probablement que les performances sont plus importantes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top