Обновить

Комментарии 11

 На чипе Intel он быстрее на крайне малую долю.

Подумал что в переводе ошибка и полез в оригинал проверять - так и есть.

On the Intel chip it's faster by a very significant margin. - На процессоре Intel он работает значительно быстрее.

А то странно прирост в 47-89% называть крайне малой долей, и при этом прирост на Apple в 4% считать заметным.

Так как это перевод - автор так и не узнает, что:

1) Аппроксимация Паде - это частный случай рациональной аппроксимации и не самый оптимальный, а просто наиболее удобный для аналитического вычисления. Оптимальный - это полученный численно минимаксом.

2) найденное им (чужое) решение тоже не самое быстрое как минимум из-за корня. Самое быстрое будет - разбить функцию на диапазоны и каждый считать по отдельности многочленом 3-й степени, коэффициенты которого получены или численно, или через многочлены Чебышева.

3) когда речь идёт об аппроксимации, первое, с чего надо начинать - это определиться с необходимой точностью. Для графики точность в 3 значащих цифры обычно более чем достаточна.

По второму пункту поясните, пожалуйста, как правильно выбирать диапазоны?

В зависимости от пункта 3. Чем больше диапазонов, тем меньше степень многочлена нужна для одной и той же точности. Для арксинуса - ну например умножить аргумент на 128 и взять целую часть - это будет индекс в таблице с коэффициентами.

2) ... Самое быстрое будет - разбить функцию на диапазоны ...

Не для всякого вычислителя, SIMD такое будет считать долго и печально, последовательно разбирая все варианты. (Интересно, сможет ли современная cuda это запараллелить, раньше не могла).

Использовать GPU наверное чересчур для этой задачи - данные будут пересылаться дольше, чем вычисляться. Да и там доступ по относительному индексу вроде бы тоже есть.

Почему чересчур? Аналогичное тому, что делает автор вполне может попасть в вертексный шейдер, особенно, если рендерим на экран. Scatter/gather - доступ быстрым не бывает, да и редко где он есть. С другой стороны, в GPU и не только бывают аппаратные приблуды для табличных функций с экстраполяцией, может быть, и предложенное вами можно где-то провернуть. Я хочу сказать, всё же HW приходится иметь в виду.

найденное им (чужое) решение тоже не самое быстрое как минимум из-за корня.

корень нынче тактов за 5-10 вроде вычисляется у х86, это пожалуй быстрее чем ещё несколько степней к полиному добавлять для получения такой же точности, а разбиения и ветвления будут имхо ещё хуже.

Возможно. Есть только один вариант это проверить - написать несколько вариантов и замерить.

Вы используете asin, чтобы текстуру в цилиндрической проекции изобразить?
Можно проецировать шар на куб и текстура будет на шести квадратах, вместо арксинуса будет деление. Самый лучший способ вычисления функции -- когда она исключается на этапе аналитических выкладок.

А в чем смысл? Если нужна скорость и такая точность можно просто таблицы использовать.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации