#iphone #compilation #floating-point #arm #fixed-point
#iPhone #Сборник #с плавающей запятой #arm #фиксированная точка
Вопрос:
Я создаю библиотеку для iphone (speex, но я уверен, что она будет применяться и ко многим другим библиотекам), и в скрипте make есть возможность использовать фиксированную точку вместо плавающей. точка.
Поскольку процессор iphone ARM имеет расширение VFP и очень хорошо выполняет вычисления с плавающей запятой, считаете ли вы, что лучше использовать опцию с фиксированной запятой?
Если кто-то уже провел сравнительный анализ этого и хочет поделиться, я бы очень поблагодарил его.
Ответ №1:
Ну, это зависит от настройки вашего приложения, вот несколько рекомендаций
- Сначала попробуйте включить оптимизацию на 0 секунд (самый быстрый наименьший)
- Включите Relax Соответствие стандарту IEEE
- Если ваше приложение может легко обрабатывать числа с плавающей запятой в смежных ячейках памяти независимо, вам следует ознакомиться с инструкциями ARM NEON intrinsic и assembly, они могут обрабатывать до 4 чисел с плавающей запятой в одной инструкции.
- Если вы уже активно используете математику с плавающей запятой, попробуйте переключить часть своей логики на фиксированную точку (но имейте в виду, что переход от регистра NEON к регистру целых чисел приводит к полной остановке конвейера)
- Если вы уже активно используете целочисленную математику, попробуйте изменить часть своей логики на математику с плавающей запятой.
- Не забудьте профилировать перед оптимизацией
- И, прежде всего, более совершенные алгоритмы всегда будут превосходить микрооптимизацию, подобную описанной выше.
Ответ №2:
Если вы имеете дело с большими блоками последовательных данных, NEON определенно подойдет.
Плавающий или фиксированный, это хороший вопрос. NEON несколько быстрее справляется с фиксированным, но я бы сохранил собственный формат ввода, поскольку преобразования требуют времени и, в конечном итоге, дополнительной памяти.
Даже если библиотека предлагает разные форматы вывода в качестве опции, это почти всегда означает преобразования внутри библиотеки. Так что я думаю, что в этом случае float является родным. Придерживайтесь этого.
Никто не мешает вам оптимизировать лучшие алгоритмы. И обычно, чем лучше алгоритм, тем большего прироста производительности можно добиться за счет микрооптимизации из-за конвейерной обработки на современных машинах.
Однако я бы держался подальше от внутренних факторов. В сети так много сообщений с жалобами на то, что встроенные функции делают что-то сумасшедшее, особенно когда речь идет о непосредственных значениях. Это может и будет очень хлопотно, и вы вряд ли сможете что-либо оптимизировать с помощью встроенных функций.