Rapide de multiplication/division par 2 pour des flotteurs et des doubles (C/C++)

Dans le logiciel, je suis en train d'écrire, je suis en train de faire des millions de multiplication ou de division par 2 (ou puissances de 2) de mes valeurs. J'aimerais vraiment que ces valeurs int pour que je puisse accéder à la bitshift opérateurs

int a = 1;
int b = a<<24

Cependant, je ne peux pas, et je dois coller avec du double.

Ma question est : comme il y a une représentation standard des doubles (signe, exposant mantisse), est-il un moyen de jouer avec l'exposant pour obtenir rapidement des multiplications/divisions par une puissance de 2?

Je peut même supposer que le nombre de bits va être fixe (le logiciel fonctionne sur les ordinateurs qui ont toujours 64 bits de long double)

P. S : Et oui, l'algorithme surtout n'ces opérations. C'est le goulot d'étranglement (c'est déjà multithread).

Edit : Ou suis-je totalement dans l'erreur et intelligent compilateurs déjà d'optimiser les choses pour moi?


Des résultats temporaires (avec Qt pour mesurer le temps, overkill, mais je n'ai pas de soins):

#include <QtCore/QCoreApplication>
#include <QtCore/QElapsedTimer>
#include <QtCore/QDebug>

#include <iostream>
#include <math.h>

using namespace std;

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

while(true)
{
    QElapsedTimer timer;
    timer.start();

    int n=100000000;
    volatile double d=12.4;
    volatile double D;
    for(unsigned int i=0; i<n; ++i)
    {
        //D = d*32;      //200 ms
        //D = d*(1<<5);  //200 ms
        D = ldexp (d,5); //6000 ms
    }

    qDebug() << "The operation took" << timer.elapsed() << "milliseconds";
}

return a.exec();
}

Pistes suggèrent que D = d*(1<<5); et D = d*32; exécuter dans le même temps (200 ms) alors que D = ldexp (d,5); est beaucoup plus lent (6000 ms). Je savoir que c'est un micro de référence, et que tout à coup, ma RAM a explosé parce que Chrome a soudainement demandé de calcul de Pi dans mon dos chaque fois que je lance ldexp(), donc ce test ne vaut rien. Mais je vais le garder quand même.

Sur l'autre, je vais avoir du mal à faire reinterpret_cast<uint64_t *> parce qu'il y a un const violation (qui semble être le volatile mot-clé interfère)

  • Ne présumez pas que c'est le goulot d'étranglement juste parce que c'est multithread. Nous avons eu une application multithread que nous avons trouvé était un goulot d'étranglement dans de nombreux endroits différents de ce que nous attendions? Comment exactement avez-vous profiler?
  • Comme toujours, l'application n'est pas profilé assez. Je veux dire, j'ai utilisé CacheGrind, et il semble que je passe la plupart de mon temps dans une fonction qui effectue principalement des multiplications. Il semble. Mais j'ai écrit que c'était le goulot d'étranglement parce que je suis plus intéressé par les idées théoriques derrière la multiplication par 2 que dans "la petite considérations" (bien sûr, je pourrais optimiser mes requêtes SQL, mais honnêtement, je suis assez sûr que ça va être vide de sens, comparativement à la multiplication des trucs, et, surtout, je n'aime pas ^^)
  • Rappelez-vous, 1<<5 est une constante, de sorte que le compilateur va optimiser d*32.
  • Ouais, je "sais" ^^ Mais il y a eu des discussions sur la façon de camoufler le compilateur avec des trucs bizarres (en gros, certaines opérations se résument à *32 mais le compilateur ne veut pas "voir" c'). Et il y a juste une ligne =)
  • En général, l'accès à la mémoire et les requêtes SQL sont beaucoup beaucoup plus lent alors des choses comme des multiplications en C++. Je suis désolé de dire cela, mais de "petite considérations" est peut-être précisément ce que sont la cause de votre goulot d'étranglement.
  • Que puis-je dire d'autre que : I used CacheGrind, and it seems I spend most of my time in a function that does mostly multiplications? Oui, bien sûr, la fonction rend également plus, et de répartir des données sur la pile, mais je pense avoir une bonne estimation de la situation.
  • 1) Votre boucle besoins de dérouler. 2) CacheGrind dit que vous êtes pour la plupart dans des calculs de routine? C'est une alarme! En une seule étape le code à l'assemblée, le niveau de langue et assurez-vous qu'il fait rien de plus que ce que vous attendiez. Il ne devrait pas être l'appel de quoi que ce soit. 3) le Multi-threading n'est pas de rendre le code plus rapide. Il a juste étend sur plus de processeurs, au mieux. 4) Si le rendement est ce que vous aimez, apprendre cette technique.

InformationsquelleAutor Fezvez | 2011-10-11