Поплавок к SInt32

У меня есть серия классов обработки сигналов c ++, которые используют 32-разрядные числа с плавающей запятой в качестве основного типа данных выборки. Например, все классы осциллятора возвращают числа с плавающей запятой для каждой запрошенной выборки. Это одинаково для всех классов, все расчеты сэмплов находятся в плавающей точке.

Я портирую эти классы на iOS … и из-за проблем с производительностью я хочу работать с фиксированной точкой 8.24, чтобы получить максимальную отдачу от процессора, но есть слово, что у iOS есть существенные преимущества в производительности для вычисления целых чисел вместо числа с плавающей запятой … В настоящее время я выполняю все вычисления с плавающей запятой, а затем преобразую в SInt32 на последнем этапе перед выводом, что означает, что каждый образец на последнем этапе необходимо преобразовать.

Должен ли я просто изменить тип данных, используемый в моих классах, с Float на SInt32. Так что мои осцилляторы, фильтры и т. Д. Рассчитывают в фиксированной точке, передавая внутри SInt32 вместо плавающих значений ??

неужели это так просто? или мне нужно полностью переписать все разные алгоритмы?

Есть ли еще какое-то вуду, которое мне нужно понять, прежде чем приступить к этой миссии?

Большое спасибо за любого, кто находит время, чтобы прокомментировать это.

3

Решение

Это в основном миф. Производительность с плавающей точкой раньше была медленной, если вы компилировали для armv6 в режиме большого пальца; это не проблема в armv7 который поддерживает Thumb 2 (я буду избегать дальнейшего обсуждения armv6, который больше не поддерживается в Xcode). Вы также хотите избежать использования двойных чисел, поскольку поплавки могут использовать более быстрый блок NEON (например, Advanced SIMD Instructions) — это легко сделать случайно; попробуйте включить -Wshorten,

Я также сомневаюсь, что вы получите значительно лучшую производительность при умножении на 8,24, особенно за счет использования устройства NEON. изменения float int/int32_t/SInt32 также не будет автоматически делать необходимые сдвиги для умножения 8,24.

Если вы знаете, что преобразование чисел с плавающей точкой в ​​медленные является медленным, рассмотрите возможность использования некоторых функций в Accelerate.framework, а именно vDSP_vfix16 () или vDSP_vfixr16 ().

2

Другие решения

Других решений пока нет …