Я использую sympy.utilities.codegen
для создания C-кода, который я использую для числовых вычислений. Например, сгенерированная C-функция выглядит примерно так:
double f(double x, double y, double z){
return M_PI*sin(M_PI*x)*sin(M_PI*y) + sin(M_PI*y)*sin(M_PI*z);
}
В общем, у меня есть более крупные функции с большим количеством выражений, что проблематично для моих числовых вычислений. Поскольку я работаю с CUDA, у меня сокращенный набор регистров для вычислений. Что я хочу сделать, так это разбить выражение на более мелкие, а также сделать некоторые замены, чтобы дорогостоящие вычисления вычислялись только один раз. Вот пример того, как будет выглядеть приведенный выше код.
double f(double x, double y, double z){
double sinx = sin(M_PI*x);
double siny = sin(M_PI*y);
double sinz = sin(M_PI*z);
double result;
result = M_PI*sinx*siny;
result += siny*sinz;
return result;
}
Таким образом, очевидно, что для этих небольших функций эти замены не окупаются, но в целом это единственный способ заставить меня работать для более крупных функций. Итак, мои вопросы: существуют ли какие-либо простые встроенные опции для получения такого поведения? Наиболее важной частью для меня было бы разбить расчет на небольшие шаги. Я предполагаю, что замена может быть выполнена с помощью некоторых процедур замены строк.