Замена вызова math.h exp таблицей поиска

Мне было интересно, есть ли смысл модифицировать код для использования таблицы поиска для math.h exp, или это было сделано автоматически clang++ при задании флага -O3.

Если это не так, есть ли #pragma, который это делает?

пояснение

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

Пример

Скажем, я собирался запустить exp(-a*x), где a не является константой времени компиляции, но после того, как он будет установлен один раз, он не будет изменен. Точно так же x может быть одним из 10 возможных значений, каждое из которых устанавливается один раз и больше не изменяется.


person Alex Petrosyan    schedule 10.04.2018    source источник
comment
таблица поиска для параметров с плавающей запятой?   -  person 463035818_is_not_a_number    schedule 10.04.2018
comment
Кстати, для подобных вопросов это отличный инструмент: godbolt.org   -  person 463035818_is_not_a_number    schedule 10.04.2018
comment
Очень маловероятно, что он есть, поскольку и разрешение, и диапазон будут зависеть от приложения. И поиск поплавков между граничными значениями, вероятно, не такой быстрый.   -  person Jacques de Hooge    schedule 10.04.2018
comment
Если бы это можно было сделать вообще, то, вероятно, exp() было бы закодировано в библиотеке.   -  person Barmar    schedule 10.04.2018
comment
у вас есть конкретная проблема? для целых чисел, возможно, стоит рассмотреть таблицу и даже для чисел с плавающей запятой, если у вас есть некоторые предсказуемые шаблоны вызова (например, exp(i*x), где i — целое число, а x — постоянное число с плавающей запятой). В нынешнем виде вопрос слишком широк имхо   -  person 463035818_is_not_a_number    schedule 10.04.2018
comment
comment
@user463035818 user463035818 именно так. Итак, я должен хранить массив значений вызовов?   -  person Alex Petrosyan    schedule 10.04.2018
comment
каков именно ваш вариант использования?   -  person 463035818_is_not_a_number    schedule 10.04.2018
comment
Я не понимаю. Если вы вызываете функцию несколько раз с одними и теми же аргументами, почему бы не вызвать ее один раз и не запомнить результат? Это было бы более эффективно, так как код функции не нужно было бы выполнять много раз. (Это было бы спорным, если бы внутри функции была переменная volatile.)   -  person Thomas Matthews    schedule 10.04.2018


Ответы (1)


Я не очень разбираюсь в специфике clang, поэтому не могу подробно рассказать о том, что он делает. Но я могу рассуждать о том, что он может сделать.

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

Если аргумент не является константой времени компиляции, а несколько вызовов одной и той же функции используют один и тот же аргумент (и нет задействованных изменчивых объектов), то оптимизатор может повторно использовать результат, если он знает, что функции не имеют побочных действий. последствия. Эту оптимизацию я бы порекомендовал вам сделать вручную, просто потому, что лучше все равно не повторяться.

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

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

person eerorika    schedule 10.04.2018
comment
Итак, как мне указать, что объекты являются энергонезависимыми? - person Alex Petrosyan; 11.04.2018
comment
@AlexPetrosyan, воздерживаясь от использования volatile. - person eerorika; 11.04.2018
comment
Я провел некоторое тестирование с моей реализацией таблицы поиска... При компиляции с -O3 он автоматически "кэширует" дорогостоящие операции. Моя попытка мемоизации определенно делает код медленнее. - person Alex Petrosyan; 11.04.2018
comment
@AlexPetrosyan: Вы, вероятно, заметили оптимизацию, известную как устранение общего подвыражения (CSE). Если компилятор обнаруживает два вызова известной чистой функции с одинаковыми аргументами, он обычно удаляет второй вызов. (Чистые функции не имеют побочных эффектов. Очевидно, что вы не можете удалить два вызова std::printf) - person MSalters; 11.04.2018