Supposons que vous voulez calculer la somme des carrés des différences de points:calcul mathématique d'optimisation (multiplication et addition)
$ \ sum_ {i = 1}^{N-1} (x_i - x_ { i + 1})^2
$le code le plus simple (l'entrée est std::vector<double> xs
, l'ouput sum2
) est:
double sum2 = 0.;
double prev = xs[0];
for (vector::const_iterator i = xs.begin() + 1;
i != xs.end(); ++i)
{
sum2 += (prev - (*i)) * (prev - (*i)); // only 1 - with compiler optimization
prev = (*i);
}
J'espère que le compilateur ne l'optimisation dans le commentaire ci-dessus. Si N
est la longueur de xs
vous avez N-1
multiplications et 2N-3
sommes (sommes signifie +
ou -
).
Supposons maintenant que vous connaissez cette variable:
x 1 $^2 + x_n^2 + 2 \ sum_ {i = 2}^{N-1} x_i^2
$et appelez-sum
. Extension du carré binomial:
$ sum_i^{N-1} (x_i-x_ {i + 1})^2 = sum
- 2 \ somme_ {i = 1}^{N-1} x_i x_ {i +1} $
si le code devient:
double sum2 = 0.;
double prev = xs[0];
for (vector::const_iterator i = xs.begin() + 1;
i != xs.end(); ++i)
{
sum2 += (*i) * prev;
prev = (*i);
}
sum2 = -sum2 * 2. + sum;
ici, j'ai N multiplications et les additions N-1. Dans mon cas N est environ 100.
Eh bien, la compilation avec g++ -O2
Je n'ai pas accéléré (j'essaie d'appeler la fonction inline 2M fois), pourquoi?
Veuillez essayer de formater les éléments LaTex correctement. Le SO le soutient. –
D'une certaine manière, je soupçonne qu'une opération matricielle pourrait aider. Essayez d'utiliser GPU ou vectoriser ceci :) –
@ Hamish1: êtes-vous sûr? Comment? @ Hamish2: une vectorisation de l'opération devrait aider, mais maintenant je ne pense qu'à une simplification du calcul mathématique. –