Оптимизация компиляции для iPhone: с плавающей запятой или с фиксированной запятой?

#iphone #compilation #floating-point #arm #fixed-point

#iPhone #Сборник #с плавающей запятой #arm #фиксированная точка

Вопрос:

Я создаю библиотеку для iphone (speex, но я уверен, что она будет применяться и ко многим другим библиотекам), и в скрипте make есть возможность использовать фиксированную точку вместо плавающей. точка.

Поскольку процессор iphone ARM имеет расширение VFP и очень хорошо выполняет вычисления с плавающей запятой, считаете ли вы, что лучше использовать опцию с фиксированной запятой?

Если кто-то уже провел сравнительный анализ этого и хочет поделиться, я бы очень поблагодарил его.

Ответ №1:

Ну, это зависит от настройки вашего приложения, вот несколько рекомендаций

  1. Сначала попробуйте включить оптимизацию на 0 секунд (самый быстрый наименьший)
  2. Включите Relax Соответствие стандарту IEEE
  3. Если ваше приложение может легко обрабатывать числа с плавающей запятой в смежных ячейках памяти независимо, вам следует ознакомиться с инструкциями ARM NEON intrinsic и assembly, они могут обрабатывать до 4 чисел с плавающей запятой в одной инструкции.
  4. Если вы уже активно используете математику с плавающей запятой, попробуйте переключить часть своей логики на фиксированную точку (но имейте в виду, что переход от регистра NEON к регистру целых чисел приводит к полной остановке конвейера)
  5. Если вы уже активно используете целочисленную математику, попробуйте изменить часть своей логики на математику с плавающей запятой.
  6. Не забудьте профилировать перед оптимизацией
  7. И, прежде всего, более совершенные алгоритмы всегда будут превосходить микрооптимизацию, подобную описанной выше.

Ответ №2:

Если вы имеете дело с большими блоками последовательных данных, NEON определенно подойдет.

Плавающий или фиксированный, это хороший вопрос. NEON несколько быстрее справляется с фиксированным, но я бы сохранил собственный формат ввода, поскольку преобразования требуют времени и, в конечном итоге, дополнительной памяти.

Даже если библиотека предлагает разные форматы вывода в качестве опции, это почти всегда означает преобразования внутри библиотеки. Так что я думаю, что в этом случае float является родным. Придерживайтесь этого.

Никто не мешает вам оптимизировать лучшие алгоритмы. И обычно, чем лучше алгоритм, тем большего прироста производительности можно добиться за счет микрооптимизации из-за конвейерной обработки на современных машинах.

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