приблизительно log10 [x ^ k0 + k1]

Приветствую. Я пытаюсь аппроксимировать функцию

Log10 [x ^ k0 + k1], где .21

k0 & k1 постоянны. Для практических целей можно принять k0 = 2,12, k1 = 2660. Требуемая точность - относительная погрешность 5 * 10 ^ -4.

Эта функция практически идентична Log [x], за исключением значения около 0, где она отличается лот.

Я уже придумал реализацию SIMD, которая примерно в 1,15 раза быстрее, чем простая таблица поиска, но я хотел бы улучшить ее, если возможно, что, на мой взгляд, очень сложно из-за отсутствия эффективных инструкций.

Моя реализация SIMD использует 16-битную арифметику с фиксированной запятой для вычисления полинома 3-й степени (я использую метод наименьших квадратов). В полиноме используются разные коэффициенты для разных входных диапазонов. Существует 8 диапазонов, и диапазон i охватывает от (64) 2 ^ i до (64) 2 ^ (i + 1). Рациональным за это является то, что производные Log [x] быстро падают с x, что означает, что полином будет соответствовать ему более точно, поскольку полиномы точно подходят для функций, у которых производная 0 сверх определенного порядка.

Поиск в таблице SIMD выполняются очень эффективно с помощью одного _mm_shuffle_epi8 (). Я использую преобразование SSE с плавающей запятой в int, чтобы получить показатель степени и значимости, используемые для приближения с фиксированной точкой. Я также программно обработал цикл, чтобы получить ~ 1,25-кратное ускорение, поэтому дальнейшая оптимизация кода, вероятно, маловероятна.

Я спрашиваю, есть ли более эффективное приближение на более высоком уровне? Например:

  1. Можно ли эту функцию разложить на функции с ограниченным доменом, например log2 ((2 ^ x) * значимое) = x + log2 (значение)

, следовательно, устраняется необходимость иметь дело с разными диапазонами (поиск по таблице). Основная проблема, я думаю, заключается в том, что добавление термина k1 убивает все те хорошие свойства журнала, которые мы знаем и любим, что делает это невозможным. Или это так?

  1. Итерационный метод? не думаю, потому что метод Ньютона для log [x] уже является сложным выражением

  2. Использование локальности соседних пикселей? - если диапазон из 8 входов попадает в один и тот же диапазон аппроксимации, то я могу искать один коэффициент, вместо того, чтобы искать отдельные коэффициенты для каждого элемента. Таким образом, я могу использовать это как быстрый общий случай и использовать более медленный общий путь кода, когда это не так. Но по моим данным, диапазон должен составлять ~ 2000, чтобы это свойство сохранялось в 70% случаев, что, похоже, не делает этот метод конкурентоспособным.

Пожалуйста, дайте мне какое-то мнение, особенно если вы прикладной математик, даже если вы говорите, что это невозможно. Спасибо.

11
задан Yale Zhang 16 January 2011 в 08:10
поделиться