Можно ли намекнуть компиляторам C на обратные функции?

#c #compiler-optimization #symbolic-math

Вопрос:

Я использую модель python sympy для решения множества задач символьной алгебры, и когда я хотел экспортировать решения в c для приложений с более высокой производительностью, я заметил, что подобные шаблоны часто появляются в моем коде:

 vec4 input_color = vec4(1.0, 0.2, 0.8, 1.0);
vec4 c31 = srgb_to_cie31(input_color);
//c31[2] *= 2.0;
vec4 output_color = cie31_to_srgb(c31);
 

Если строка 3 закомментирована, input_color проходит через функцию и сразу же через ее обратную. Для некоторых функций «люка» одна из них может быть дорогостоящей или приблизительной. Есть ли какой-либо способ, которым я могу намекнуть msvc / gcc, чтобы распознать это и скомпилировать все эти шаги?

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

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

2. Возможно, вам захочется поискать в Интернете «Математическую библиотеку C » и посмотреть, что предоставляет библиотека.

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

4. @SilvioMayolo Это больше для больших, более сложных функций. Например, многочлены большого порядка тривиальны для вычисления, но найти их обратные значения может быть чрезвычайно сложно. Метод Ньютона работает нормально, но я бы предпочел не вычислять его, если бы в этом не было необходимости. Что меня больше интересует, так это то, можно ли вообще намекнуть на то, что пара подобных функций будет распознана как обратные и скомпилирована, например, как в настоящее время работают простые операции, такие как сложение.

5. Я не знаю ни о чем подобном. АФАИК, современное состояние по-прежнему заключается в таких вещах, как «эта функция чиста».