2010-08-14 35 views
5

J'ai lu (http://www.stereopsis.com/FPU.html) mentionné dans (What is the fastest way to convert float to int on x86). Est-ce que quelqu'un sait si la distribution lente simple (voir l'extrait ci-dessous) s'applique également à l'architecture ARM? Pour appliquer certaines astuces mentionnées dans l'article FPU, vous devez définir la précision pour les opérations en virgule flottante. Comment est-ce que je fais cela sur ARM?Conversion flottante rapide en int et précision en virgule flottante sur ARM (iPhone 3GS/4)

Quelle est la conversion float-int la plus rapide sur l'architecture ARM?

Merci!

+1

Veuillez ne pas nommer une fonction comme 'Convert' en code réel: P –

+0

@Billy: Je comprends ce que vous voulez dire. Plancher serait mieux :-) –

+0

retour dans la journée (il y a environ 15 ans) il y avait un problème de performance sur x86 en faisant normal typecasts (int) à flot, cela était dû à la float2int par défaut dans les registres fpu était un étage et pas dans le coin. Donc, pour que le code soit rapide à cette époque, un assemblage spécial a été écrit. Tout code pris à partir de ce moment s'attend à ce que la conversion float en entier utilise une opération au sol par rapport à une ronde normale. Cependant, vous pouvez obtenir un double hit en utilisant une fonction floor puis un cast en int contre juste un cast en int (round to nearest). – Medran

Répondre

10

Version courte, "non".

Cet article est ancien et ne s'applique même pas aux systèmes x86 modernes, et encore moins à ARM. Une conversion simple en nombre entier est raisonnablement rapide sur ARMv7 (iPhone 3GS/4), bien qu'il y ait un décrochage modeste déplaçant les données des registres VFP/NEON vers les registres d'usage général. Cependant, étant donné que vos données float proviennent probablement d'un calcul effectué dans les registres VFP/NEON, vous devrez payer pour ce déplacement peu importe la façon dont vous effectuez la conversion.

Je ne pense pas que ce soit une voie rentable pour l'optimisation, sauf si vous avez des traces montrant que c'est un goulot d'étranglement majeur pour votre programme. Même alors, la conversion la plus rapide est la conversion que vous ne faites pas; il vous sera presque toujours préférable de trouver des moyens algorithmiques pour éliminer les conversions de votre programme.

Si vous vraiment besoin d'optimiser les conversions, voir dans l'instruction vcvt.i32.f32, qui convertit un vecteur de deux ou quatre nombres à virgule flottante à un vecteur de deux ou quatre entiers sans déplacer les données de la NEON registres (et donc, sans encourir le décrochage que j'ai mentionné). Bien sûr, vous devrez effectuer vos prochains calculs d'entiers sur l'unité NEON pour que cela soit une optimisation rentable.

Question: Que faites-vous vraiment en train de faire? Pourquoi pensez-vous avoir besoin d'une conversion float-> int plus rapide?