Быстрое преобразование с плавающей точкой в ​​int и точность с плавающей точкой на ARM (iPhone 3GS / 4) - PullRequest
5 голосов
/ 14 августа 2010

Я прочитал (http://www.stereopsis.com/FPU.html) упоминается в ( Какой самый быстрый способ конвертировать float в int на x86 ). Кто-нибудь знает, применяется ли медленное простое приведение (см. Фрагмент ниже)и к архитектуре ARM?

inline int Convert(float x)
{
  int i = (int) x;
  return i;
}

Чтобы применить некоторые приемы, упомянутые в статье о FPU, необходимо установить точность для операций с плавающей запятой. Как это сделать в ARM?

Чтосамое быстрое преобразование числа с плавающей точкой в ​​архитектуру ARM?

Спасибо!

1 Ответ

10 голосов
/ 15 августа 2010

Короткая версия, "нет".

Эта статья древняя и даже не относится к современным системам x86, не говоря уже о ARM. Простое приведение к целому числу достаточно быстро на ARMv7 (iPhone 3GS / 4), хотя и происходит скромное смещение данных из регистров VFP / NEON в регистры общего назначения. Однако, учитывая, что ваши float данные, вероятно, поступают из вычислений, выполненных в регистрах VFP / NEON, вам придется платить за этот шаг независимо от того, как вы выполняете преобразование.

Я не думаю, что это выгодный путь для оптимизации, если у вас нет следов, показывающих, что это является основным узким местом для вашей программы. Даже тогда самое быстрое преобразование - это преобразование, которое вы не делаете; вам почти всегда будет выгоднее найти алгоритмические способы исключения конверсий из вашей программы.

Если вам действительно нужно оптимизировать преобразования, посмотрите на инструкцию vcvt.i32.f32, которая преобразует вектор из двух или четырех чисел с плавающей запятой в вектор из двух или четырех целых чисел без перемещение данных из регистров NEON (и, следовательно, без остановки, о которой я говорил). Конечно, вам нужно будет выполнить последующие целочисленные вычисления на устройстве NEON, чтобы это было выгодной оптимизацией.

Вопрос: Что вы действительно пытаетесь сделать? Как вы думаете, почему вам нужно более быстрое преобразование с плавающей точкой -> int?

...