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
Répondre
É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.
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) –
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
- 1. nan, floats et ints
- 2. Comportement étrange de python impliquant des floats, ints et sqlite
- 3. SSE vs flush js commandes?
- 4. JS best practice Liste d'objets vs tableau vs Value-Pair
- 5. Flacon Python: Route vs add_url_rule, SSE
- 6. Android: enum vs statique final ints?
- 7. Doctrine Référentiel personnalisé vs Entité Méthodes Best Practice
- 8. Scheme/Racket Best Practice - Récursion vs Accumulation de variables
- 9. NEON vs Intel SSE - l'équivalence de certaines opérations
- 10. jointures sur ints vs jointures sur chars (ou varchars)
- 11. CSS Floats Right
- 12. Floats problème dans IE
- 13. jQuery slideDown + CSS Floats
- 14. Problème avec CSS Floats
- 15. NSArry of floats issue
- 16. Fond et CSS Floats
- 17. floats decimals comparaison cocos2d
- 18. SSE parallélisation
- 19. Common Practice - SplitContainer
- 20. Django FilePathField Best Practice
- 21. SQL DB Best Practice
- 22. Test d'intégration Best Practice
- 23. Refactoring CSS Best Practice
- 24. POCO Best Practice
- 25. Rails/JQuery best practice
- 26. Spring Webflow Best Practice
- 27. UISegmentedControl Best Practice
- 28. IE bug - content floats left
- 29. Perte de l'analyse syntaxique Floats
- 30. Clearing Floats without Display propriété
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 :) –
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
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