2012-02-24 8 views
2

Lorsque vous traitez à la fois des ints et des floats dans SSE (AVX), est-ce une bonne pratique de convertir tous les ints en floats et de travailler uniquement avec des floats? Parce que nous n'avons besoin que de quelques instructions SIMD après cela, et tout ce que nous devons utiliser est d'ajouter et de comparer les instructions (<, <=, ==) que cette conversion, je l'espère, devrait conserver complètement.SSE ints vs. floats practice

+3

Idéalement, il est préférable de se débarrasser des flotteurs plutôt que des ints. Ints sont plus rapides, meilleurs et plus forts :) –

+0

Même sur SSE ??? Je ne suis pas si sûr. Nous ne pouvons pas nous débarrasser des flottants, évidemment :) Convertir int '4 -> 4.00000' est OK, mais l'égalité doit être conservée. – Cartesius00

+5

Vous allez devoir montrer un exemple de ce que vous essayez de faire. 'int'! =' float'. De plus, AVX ne prend pas encore en charge l'arithmétique d'entier large de 256 bits. (AVX2 va) Donc je peux voir pourquoi vous voudriez faire ceci. Que ce soit plus rapide dépendra beaucoup de ce que vous essayez de faire. – Mysticial

Répondre

6

Étendre mes commentaires dans une réponse.

Fondamentalement, vous PESAGE À compromis suivant:

bâton avec entier:

  • Entier SSE est faible latence, un débit élevé. (double problème sur Sandy Bridge)
  • Limité à la largeur SIMD de 128 bits.

Convertir en virgule flottante:

  • Profitez de AVX 256 bits.
  • Augmentation des temps de latence, et seulement addition/soustraction d'un seul problème (sur Sandy Bridge)
  • Incorporation de la charge de conversion initiale.
  • Restreint l'entrée à ceux qui correspondent à un float sans perte de précision.

Je dirais coller avec entier pour l'instant. Si vous ne voulez pas dupliquer le code avec les versions float, c'est votre appel.

Les seules fois où j'ai vu émuler des nombres entiers avec des nombres à virgule flottante sont plus rapides lorsque vous devez faire des divisions. Notez que je n'ai fait aucune mention de la lisibilité comme plongée dans la vectorisation manuelle implique probablement que la performance est plus importante.

+0

AVX Floating-point n'est pas un seul problème sur Sandy Bridge. Les caractéristiques exactes sont difficiles à énoncer avec concision, mais Sandy Bridge peut effectuer un ajout de FP et multiplier chaque cycle (ainsi qu'une combinaison de charge, de stockage et de permutation). Pour plus de détails, consultez le 2.1.4 du Manuel d'optimisation Intel. (En toute justice, le questionneur ne semble pas faire de multiplications, donc vous n'êtes pas tout à fait hors de la marque) –

+0

Je suis pleinement conscient du problème add + mul (avec un mélange de quelque sorte). Mais oui, je parlais de la FP-add étant un seul problème. (Bien que j'admette que j'aurais pu être un peu plus clair à ce sujet.) – Mysticial