2010-08-14 1 views
5

Я читал (http://www.stereopsis.com/FPU.html), упомянутый в (What is the fastest way to convert float to int on x86). Кто-нибудь знает, применимо ли медленное простое использование (см. Ниже) для архитектуры ARM?Быстрое преобразование с плавающей точкой в ​​точку и точность с плавающей точкой на ARM (iPhone 3GS/4)

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

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

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

Спасибо!

+1

Пожалуйста, не называйте функцию, подобную этой 'Convert' в реальном коде: P –

+0

@Billy: Я получаю вашу точку. Пол был бы лучше :-) –

+0

назад в тот же день (примерно 15 лет назад) была проблема с производительностью на x86 при выполнении обычных типов (int) afloat, это было связано с положением float2int по умолчанию в регистрах fpu было слово и не рядом. Так что для быстрого кода в эту эпоху была написана специальная сборка. Любой код, взятый с этого времени, будет ожидать конвертации с плавающей точкой в ​​целое число, чтобы использовать операцию над полом в сравнении с обычным раундом. Однако вы можете получить двойной удар с использованием функции floor, а затем cast to int вместо простого нажатия на int (от раунда до ближайшего). – Medran

ответ

10

Краткая версия, «нет».

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

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

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

Вопрос: Что вы такое действительно пытается сделать? Почему, по-вашему, вам нужна более быстрая конвертация float-> int?

 Смежные вопросы

  • Нет связанных вопросов^_^