Привет. Я пытаюсь аппроксимировать функцию
Log10 [x ^ k0 + k1], где .21 < k0 < 21, 0 < k1 < ~ 2000, а x является целым числом < 2 ^ 14.
k0 и k1 постоянны. Для практических целей можно считать k0 = 2.12, k1 = 2660. Желаемая точность - 5 * 10 -4 -4 относительная ошибка.
Эта функция практически идентична Log [x], за исключением около 0, где она сильно отличается.
Я уже придумал реализацию SIMD, которая на ~ 1.15x быстрее, чем простая таблица поиска, но хотела бы улучшить ее, если это возможно, что очень сложно из-за отсутствия эффективных инструкций.
В моей реализации SIMD используется 16-битная арифметика с фиксированной точкой для оценки полинома 3-й степени (я использую метод наименьших квадратов). Полином использует разные коэффициенты для разных диапазонов ввода. Существует 8 диапазонов и диапазон я охватывает (64) 2 ^ я (64) 2 ^ (i + 1). Рациональным позади этого является производная от Log [x] быстро убывает с x, что означает, что многочлен будет соответствовать ему более точно, так как многочлены являются точным подгоночным для функций, имеющих производную от 0 за пределами определенного порядка.
SIMD-таблицы выглядят очень эффективно с помощью одного _mm_shuffle_epi8(). Я использую SSE float для преобразования int, чтобы получить показатель экспоненты и значение, используемое для приближения фиксированной точки. Я также программировал конвейер, чтобы получить ускорение ~ 1.25x, поэтому дальнейшая оптимизация кода, вероятно, маловероятна.
Я спрашиваю, есть ли более эффективное приближение на более высоком уровне? Например:
- Можно ли разложить эту функцию на функции с ограниченным доменом типа log2 ((2 ^ x) * значение) = x + log2 (значение)
следовательно, устраняя необходимость иметь дело с разными диапазонами (поиск таблиц). Основная проблема, я думаю, заключается в добавлении термина k1, который убивает все те хорошие свойства журнала, которые мы знаем и любим, что делает невозможным. Или это?
-
Итерационный метод? не думаю, потому что метод Ньютона для log [x] уже является сложным выражением
-
Использование локальных соседних пикселей? - если диапазон 8 входов попадает в тот же диапазон аппроксимации, то я могу искать один коэффициент вместо поиска отдельных коэффициентов для каждого элемента. Таким образом, я могу использовать это как быстрый общий случай и использовать более медленный, общий код, когда это не так. Но для моих данных диапазон должен быть ~ 2000, прежде чем это свойство будет храниться в 70% случаев, что, похоже, не делает этот метод конкурентоспособным.
Пожалуйста, дайте мне некоторое мнение, особенно если вы прикладной математик, даже если вы говорите, что это невозможно. Спасибо.