Сравнительный анализ прироста производительности триггерных поисковых таблиц по сравнению с реализацией cpp

Мы разрабатываем систему реального времени, которая будет выполнять расчеты sin/cos в течение критического по времени периода работы. Мы рассматриваем возможность использования таблицы поиска, чтобы повысить производительность, и я пытаюсь сопоставить преимущества и затраты на реализацию таблицы. К сожалению, мы еще не знаем, какая степень точности нам понадобится, но, вероятно, около 5-6 знаков после запятой.

Я полагаю, что сквозное сравнение триггерных функций С++ с подходами поиска уже было сделано ранее. Я надеялся, что кто-нибудь может дать мне ссылку на сайт, документирующий любой такой бенчмаркинг. Если таких результатов не существует, я был бы признателен за любые предложения о том, как я могу определить, сколько памяти требуется для таблицы поиска, предполагая заданную минимальную точность, и как я могу определить потенциальные преимущества скорости.

Спасибо!


person errah    schedule 15.09.2010    source источник


Ответы (3)


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

person Mark B    schedule 15.09.2010

Какова точность вашего ввода степени (давайте использовать градусы вместо радианов, чтобы обсуждение было «упрощенным»). Десятые доли градуса? Сотые доли градуса? Если ваша угловая точность не велика, то ваш тригонометрический результат не может быть лучше.

Я видел, как это реализовано в виде массива, индексированного сотыми долями градуса (сохранение угла как целого числа с двумя подразумеваемыми десятичными точками также помогает в расчетах - нет необходимости использовать высокоточные плавающие/двойные радианные углы).

Сохранение значений SIN от 0,00 до 90,00 градусов будет 9001 32-битным значением результата с плавающей запятой.

SIN[0] = 0,0 ... SIN[4500] = 0,7071068 ... SIN[9000] = 1,0

Если у вас есть SIN, свойство триггера COS(a) = SIN(90-a) просто означает, что вы выполняете SIN[9000-a], чтобы получить COS(a)

Если вам нужна большая точность, но у вас нет памяти для большего табличного пространства, вы можете выполнить линейную интерполяцию между двумя записями в массиве, например. SIN 45.00123 будет

SIN[4500] + 0,123 * (SIN[4501] - SIN[4500])

person franji1    schedule 16.09.2010

Единственный способ узнать характеристики производительности двух подходов — попробовать их.

Да, вероятно, есть тесты, сделанные другими, но они не работали в контексте вашего кода и не работали на вашем оборудовании, поэтому они не очень применимы к вашей ситуации.

Одна вещь, которую вы можете сделать, это посмотреть задержки инструкций в руководствах для вашего процессора. (Intel и AMD имеют эту информацию в формате PDF на своих веб-сайтах, и у большинства других производителей процессоров есть аналогичные документы)

Затем вы можете, по крайней мере, узнать, насколько быстры фактические инструкции триггера, что даст вам базовый уровень, который таблица поиска должна превзойти, чтобы быть стоящей.

Но это дает вам только приблизительную оценку одной стороны уравнения. Вы могли бы сделать аналогичную грубую оценку стоимости таблицы поиска, если вы знаете задержки кэшей ЦП и имеете приблизительное представление о задержке доступа к памяти.

Но единственный способ получить точную информацию — попробовать. Реализуйте оба варианта и посмотрите, что произойдет в вашем приложении. Только тогда вы узнаете, что лучше в вашем случае.

person jalf    schedule 16.09.2010