Comment minimiser les opérations de points flottants dans le code ci-dessous

StackOverflow https://stackoverflow.com/questions/9463493

  •  13-11-2019
  •  | 
  •  

Question

J'ai besoin de minimiser la quantité totale de flops dans le code suivant, quelqu'un peut-il jeter un coup d'œil rapide et me dire où mettre mes efforts? J'ai essayé plusieurs analyseurs de perfomance, mais les résultats n'étaient pas pertinents.

int twoDToOneD(int i, int j, int nRows)
{
return j*nRows + i;
}

double* addMatrices(int m, int n, double* A, double* B, bool add)
{
double* C = new double[m*n];
double* pA = A;
double* pB = B;
double* pC = C;

int i = m*n;

while(i--)
{
    if(add)
    {
        *pC = *pA + *pB;
    } else 
    {
        *pC = *pA - *pB;
    }

    pC++;
    pA++;
    pB++;
}

return C;
}

Merci, Cho

Était-ce utile?

La solution

D'accord, je n'ai pas lu toutes les dernières lignes, mais il semble que vous l'êtes simplement:

  1. générer des INTS aléatoires
  2. les stocker comme doubles
  3. les ajouter
  4. les ajouter et les multiplier

IOW - Je ne vois aucune utilisation de la fraction du tout, et un entier de taille appropriée sera supérieur. Si c'est vrai, vous pouvez supprimer chaque flop du programme;)

S'il ne s'agit pas d'un signal précis, vous pouvez toujours l'utiliser dans une plage appropriée, puis à l'échelle du signal, stocker en entier, puis ramener le résultat dans la plage appropriée dans certains cas.

Pour Mul / Add de taille appropriée, l'utilisation des entiers sera beaucoup plus rapide et nécessitera potentiellement beaucoup moins de mémoire - vous pouvez également leur appliquer des instructions SIMD.

Au-delà de cela - votre amélioration de la localité du cache, minimisant la branche et minimisant les allocations dynamiques pourraient également rendre le programme plusieurs fois plus rapidement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top