У меня есть серия классов обработки сигналов c ++, которые используют 32-разрядные числа с плавающей запятой в качестве основного типа данных выборки. Например, все классы осциллятора возвращают числа с плавающей запятой для каждой запрошенной выборки. Это одинаково для всех классов, все расчеты сэмплов находятся в плавающей точке.
Я портирую эти классы на iOS … и из-за проблем с производительностью я хочу работать с фиксированной точкой 8.24, чтобы получить максимальную отдачу от процессора, но есть слово, что у iOS есть существенные преимущества в производительности для вычисления целых чисел вместо числа с плавающей запятой … В настоящее время я выполняю все вычисления с плавающей запятой, а затем преобразую в SInt32 на последнем этапе перед выводом, что означает, что каждый образец на последнем этапе необходимо преобразовать.
Должен ли я просто изменить тип данных, используемый в моих классах, с Float на SInt32. Так что мои осцилляторы, фильтры и т. Д. Рассчитывают в фиксированной точке, передавая внутри SInt32 вместо плавающих значений ??
неужели это так просто? или мне нужно полностью переписать все разные алгоритмы?
Есть ли еще какое-то вуду, которое мне нужно понять, прежде чем приступить к этой миссии?
Большое спасибо за любого, кто находит время, чтобы прокомментировать это.
Это в основном миф. Производительность с плавающей точкой раньше была медленной, если вы компилировали для 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 ().
Других решений пока нет …