IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Optimisation de code


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par d�faut Optimisation de code
    Bonjour tous,

    Voila j'aimerai optimiser le code ci dessous, pour donner une id�e une multiplication en moins dans la 3eme boucle for c'est 1s de temps de calcul mon r�ve serait de pouvoir supprimer la racine carre ^^ sachant que je connais a^2 je voudrais a^3

    Notes:
    - les vecteurs sont des classes de Eigen3
    - TmpParamForBS c'est des constantes pr�-calcul�es
    - Cette fonction r�alise une int�gration en type double.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    void Truc::get_precalc_B_optimized(const Vector3d & m, Vector3d & b,const TmpParamForBS & tmp)
    {
        Vector3d OM=Mrot.transpose()*(m-pos);
        b=Vector3d(0,0,0);
     
        double omx=OM[0];
        double omy=OM[1];
        double omz=OM[2];
        double omx_dl2_L2=omx-tmp.dl2_L2;
     
        std::vector<double> rx_list(tmp.rk);
        for(int k=0;k<tmp.rk;k++) rx_list[k]=(-k*tmp.dl+omx_dl2_L2);
        std::vector<double> rx2_list(tmp.rk);
        for(int k=0;k<tmp.rk;k++) rx2_list[k]=rx_list[k]*rx_list[k];
     
        for(int i=0;i<tmp.ri;i++)
        {
            double alpha=i*tmp.dtheta+tmp.dtheta2;
            double co=cos(alpha);
            double si=sin(alpha);
     
            for(int j=0;j<tmp.rj;j++)
            {
                Vector3d Btemp(0,0,0);
                double ray = j*tmp.de+tmp.R_de2;
                double omy_ray_c = omy-ray*co;
                double omz_ray_s = omz-ray*si;
                double si_r2_co_r1 = si*omz_ray_s+co*omy_ray_c;
                double omy_ray_c2_omz_ray_s2 = omy_ray_c*omy_ray_c+omz_ray_s*omz_ray_s;
     
                for(int k=0;k<tmp.rk;k++)
                {
                    double rx=rx_list[k];
                    double nr2=rx2_list[k]+omy_ray_c2_omz_ray_s2;
                    double nr= sqrt(nr2);
                    //if(nr>quantom_zero)
                    {
                        Btemp+= Vector3d(si_r2_co_r1, -co*rx, -si*rx)/(nr2*nr);
                    }
                }
     
                b+= (tmp.tmp1*j + tmp.tmp2)*Btemp;
            }
        }
        b*=Mu0_Pi4*tmp.J ;
        b=Mrot*b;
    }
    Je suis preneur de toute id�e

    merci d'avance pour vos suggestions.

  2. #2
    Membre confirm�
    Inscrit en
    Avril 2013
    Messages
    93
    D�tails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 93
    Par d�faut
    Salut,

    Je te conseillerai d�j� de d�clarer toutes tes variables double (ray, omy_ray_c, ...) en-dehors des boucles. Comme �a tu ne les d�clare qu'une seule fois et pas, dans le pire des cas, tmp^3.

    J'essayerai de calculer les indices 2 et 3 de Vector3d plus tot. Je sais pas si ce que je te propose est correct, j'ai fait vite fait.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    void Truc::get_precalc_B_optimized(const Vector3d & m, Vector3d & b,const TmpParamForBS & tmp)
    {
        Vector3d OM=Mrot.transpose()*(m-pos);
        b=Vector3d(0,0,0);
     
        double omx=OM[0];
        double omy=OM[1];
        double omz=OM[2];
        double omx_dl2_L2=omx-tmp.dl2_L2;
     
        std::vector<double> rx_list(tmp.rk);
        for(int k=0;k<tmp.rk;k++) 
    		rx_list[k]=(-k*tmp.dl+omx_dl2_L2);
     
        std::vector<double> rx2_list(tmp.rk);
     
    	for(int k=0;k<tmp.rk;k++) 
    		rx2_list[k]=rx_list[k]*rx_list[k];
     
    	//++++++
    	std::vector<double> vecTmp1(tmp);
    	std::vector<double> vecTmp2(tmp);
     
    	double omy_ray_c = 0.0;
    	double omz_ray_s = 0.0;
    	double omy_ray_c2_omz_ray_s2 = 0.0;
    	double ray = 0.0;
     
    	double rx = 0.0;
    	double nr2 = 0.0;
    	double nr = 0.0;
            double ray = 0.0;
            double si_r2_co_r1 = 0.0;
    	//++++++
     
    	for(int i=0;i<tmp.ri;i++)
    	{
    		double alpha=i*tmp.dtheta+tmp.dtheta2;
    		double co=cos(alpha);
    		double si=sin(alpha);
     
    		//++++++
    		for(int k=0;k<tmp.rk;k++)
    		{
    			vecTmp1[k] = -co*rx_list[k];
    			vecTmp2[k] = -si*rx_list[k];
    		}		
    		//++++++
     
    		for(int j=0;j<tmp.rj;j++)
    		{
    			Vector3d Btemp(0,0,0);
     
    			ray = j * tmp.de + tmp.R_de2;
     
    			omy_ray_c = omy - ray * co;
    			omz_ray_s = omz - ray * si;
    			omy_ray_c2_omz_ray_s2 = omy_ray_c * omy_ray_c + omz_ray_s * omz_ray_s;
     
    			si_r2_co_r1 = si * omz_ray_s + co * omy_ray_c;
     
    			for(int k=0;k<tmp.rk;k++)
    			{
    				nr2 = rx2_list[k] + omy_ray_c2_omz_ray_s2;
    				nr = sqrt(nr2);
     
    				//if(nr>quantom_zero)
    				{
    					Btemp += Vector3d(si_r2_co_r1, vecTmp1[k], vecTmp2[k]) / (nr2*nr);
    				}
    			}
    			bFirst = false;
     
                b+= (tmp.tmp1*j + tmp.tmp2)*Btemp;
            }
        }
        b*=Mu0_Pi4*tmp.J ;
        b=Mrot*b;
    }

  3. #3
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Citation Envoy� par pepito3364 Voir le message
    Je te conseillerai d�j� de d�clarer toutes tes variables double (ray, omy_ray_c, ...) en-dehors des boucles. Comme �a tu ne les d�clare qu'une seule fois et pas, dans le pire des cas, tmp^3.
    Je suis pas s�r qu'il y ait un quelconque int�r�t pour un type primitif.
    C'est l'appel � un constructeur/destructeur qui est p�nalisant.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  4. #4
    Membre confirm�
    Inscrit en
    Avril 2013
    Messages
    93
    D�tails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 93
    Par d�faut
    �a va d�pendre du compilateur et notamment des options de compilation. Mais j'ai d�j� observ� des gains de perf avec ce genre de petites optim.
    Je suis pas expert, mais j'ai l'impression que le compilateur n'a pas besoin de remettre la variable sur un registre et vu le nombre de variable dans la fonction, on doit pouvoir utiliser un registre pour une variable. Certains compilateur doivent g�rer �a correctement je suppose.
    Il faudrait voir le code asm dans les 2 cas.

  5. #5
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    A ce stade l�, tu obtiendras plus de performance en travaillant sur l'organisation m�moire de tes donn�es (bloc contig�e en m�moire, faire le moins de saut possible dans le bloc, surtout valable avec les boucles for dans une autre boucle for, fais un maximum de traitement sur des m�moires contig�es)
    Sinon un petit truc mais bon tu vas pas avoir de grande diff�rence je pense;
    Ce code la:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    std::vector<double> rx_list(tmp.rk);
    for(int k=0;k<tmp.rk;k++) 
        rx_list[k]=(-k*tmp.dl+omx_dl2_L2);
     
    std::vector<double> rx2_list(tmp.rk);
     
    for(int k=0;k<tmp.rk;k++) 
        rx2_list[k]=rx_list[k]*rx_list[k];
    Deviens:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    for(int k=0;k<tmp.rk;++k)
    {
        double val = (-k*tmp.dl+omx_dl2_L2);
        rx_list[k]=val;
        rx2_list[k]=val*val;
    }
    Et enl�ve tout tes x++ et mets les en ++x. Certain compilateur sont assez intelligent pour optimiser la premi�re version mais ne joue pas avec le feu

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par d�faut
    ...

    J'essayerai de calculer les indices 2 et 3 de Vector3d plus tot. Je sais pas si ce que je te propose est correct, j'ai fait vite fait.
    Effectivement c'est une optimisation, merci bien vu!

    J'ai d�j� essayer de sortir la d�claration des variables des boucles mais cela ne change rien ...

    Et enl�ve tout tes x++ et mets les en ++x. Certain compilateur sont assez intelligent pour optimiser la premi�re version mais ne joue pas avec le feu
    C'est vrai ... pris bonne note , mais cela n'a pas chang� grand chose.

  7. #7
    Membre confirm�
    Inscrit en
    Avril 2013
    Messages
    93
    D�tails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 93
    Par d�faut
    C'est d�j� �a, sinon je voit pas comment gagner sur la racine..
    Tu as pens� � utiliser la parall�lisation? il faudrait faire attention � l'�criture sur "b" mais avec des mutex �a passe.
    Bon courage pour la suite

  8. #8
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    Fais un reserve() sur Btemp.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par d�faut
    Citation Envoy� par pepito3364 Voir le message
    C'est d�j� �a, sinon je voit pas comment gagner sur la racine..
    Tu as pens� � utiliser la parall�lisation? il faudrait faire attention � l'�criture sur "b" mais avec des mutex �a passe.
    Bon courage pour la suite
    Oui tu as raison, mais ca complique pas mal le code ... j'ai pas trop envie de m'engag� sur cette voie sur cette fonction ... surtout que le programme est deja multithread� .

  10. #10
    Membre �m�rite
    Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par d�faut
    Citation Envoy� par Astraya Voir le message
    A ce stade l�, tu obtiendras plus de performance en travaillant sur l'organisation m�moire de tes donn�es (bloc contig�e en m�moire, faire le moins de saut possible dans le bloc, surtout valable avec les boucles for dans une autre boucle for, fais un maximum de traitement sur des m�moires contig�es)
    A ce titre, fusionner ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    std::vector<double> vecTmp1(tmp);
    std::vector<double> vecTmp2(tmp);
    en

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    std::vector< std::pair< double, double > > vecTmp12 ;
    �a aiderait en plein c�ur des boucles ou �a ne sert � rien?

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    // avant vecTmp1[k] et vecTmp2[k] ne sont pas forcément proche
    Btemp += Vector3d(si_r2_co_r1, vecTmp1[k], vecTmp2[k]) / (nr2*nr);
     
    // après vecTmp1[k].first et vecTmp2[k].second se suivent en mémoire
    Btemp += Vector3d(si_r2_co_r1, vecTmp1[k].first, vecTmp2[k].second) / (nr2*nr);

  11. #11
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut
    Je ne sais pas quel est la pr�cision recherch�e ni l'intervalle sur lequel ces donn�es s'�tendent, mais si tu restes sur un espace assez r�duit, alors tu peux certainement gagner en passant toutes tes valeurs flottantes en nombres � virgule fixe (int64, avec par exemple 48 bits pour la partie enti�re et 16 bits pour la partie d�cimale). Le gain peut �tre assez important.

    Sinon, si la pr�cision perdue ne te g�ne pas trop, tu peux peut �tre sortir une partie du calcul de ray dans la seconde boucle (j est un int, donc � chaque it�ration ray est augment� de tmp.de+tmp.R_de2).

    Pour le calcul de nr � partir de nr2, tu peux peut-�tre t'amuser avec la fonction fast invsqrt (http://en.wikipedia.org/wiki/Fast_inverse_square_root) dont il existe une version traitant des double quelque part. Tu obtiendra 1/sqrt(nr2), donc la valeur que tu cherches sera nr2*nr2*invsqrt(nr2). Le temps perdu sur la triple multiplication sera largement inf�rieur au temps gagn� sur fast invsqrt (que tu feras inline, bien �videmment).

    Et si tu a besoin de continuer � utiliser des flottant mais que la pr�cision ne te g�ne pas trop, tu peux peut-�tre passer en float (tu gagneras pas mal en temps de traitement).
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  12. #12
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2010
    Messages
    872
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par d�faut
    Pour les calculs parallelises, tu peux toujours utiliser la bibliotheque OpenMP. Je l'ai trouve assez facile a mettre en place, tu devrais peut-etre y jeter un coup d'oeil.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par d�faut
    Merci pour vos propositions, alors je retiens:

    Pour les calculs parallelises, tu peux toujours utiliser la bibliotheque OpenMP. Je l'ai trouve assez facile a mettre en place, tu devrais peut-etre y jeter un coup d'oeil.
    Oui ca fait plusieurs fois que je regarde, j'ai encore pas fais le pas. Je vais essayer c'est une bonne occasion.

    Pour le calcul de nr � partir de nr2, tu peux peut-�tre t'amuser avec la fonction fast invsqrt (http://en.wikipedia.org/wiki/Fast_inverse_square_root) dont il existe une version traitant des double quelque part. Tu obtiendra 1/sqrt(nr2), donc la valeur que tu cherches sera nr2*nr2*invsqrt(nr2). Le temps perdu sur la triple multiplication sera largement inf�rieur au temps gagn� sur fast invsqrt (que tu feras inline, bien �videmment).
    Magnifique lien! je regarde, reste a trouver/impl�menter une version en double. De plus il suffit d'ajuster le nombre d�it�rations � la pr�cision voulue. je regarde ca ...

    ... Virgule fixe + Et si tu a besoin de continuer � utiliser des flottant mais que la pr�cision ne te g�ne pas trop, tu peux peut-�tre passer en float (tu gagneras pas mal en temps de traitement).
    Malheureusement je dois rester en double et la pr�cision � une grande importance, car il s'agit d'une somme de petits termes donc l'erreur d�rive vite.

    std::vector< std::pair< double, double > > vecTmp12 ;
    pas de gains ou tr�s peu, merci

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par d�faut
    J'ai trouve ca :


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    inline double invSqrt( const double& x )
    {
        double y = x;
        double xhalf = ( double )0.5 * y;
        long long i = *( long long* )( &y );
        i = 0x5fe6ec85e7de30daLL - ( i >> 1 );//LL suffix for (long long) type for GCC
        y = *( double* )( &i );
        y = y * ( ( double )1.5 - xhalf * y * y );
     
        return y;
    }

    Voici un test performance precision :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    inline double invSqrt_It1( const double& x )
    {
        double y = x;
        double xhalf = ( double )0.5 * y;
        long long i = *( long long* )( &y );
        i = 0x5fe6ec85e7de30daLL - ( i >> 1 );//LL suffix for (long long) type for GCC
        y = *( double* )( &i );
        y = y * ( ( double )1.5 - xhalf * y * y );
        return y;
    }
     
    inline double invSqrt_It2( const double& x )
    {
        double y = x;
        double xhalf = ( double )0.5 * y;
        long long i = *( long long* )( &y );
        i = 0x5fe6ec85e7de30daLL - ( i >> 1 );//LL suffix for (long long) type for GCC
        y = *( double* )( &i );
        y = y * ( ( double )1.5 - xhalf * y * y );
        y = y * ( ( double )1.5 - xhalf * y * y );
        return y;
    }
     
    inline double invSqrt_It3( const double& x )
    {
        double y = x;
        double xhalf = ( double )0.5 * y;
        long long i = *( long long* )( &y );
        i = 0x5fe6ec85e7de30daLL - ( i >> 1 );//LL suffix for (long long) type for GCC
        y = *( double* )( &i );
        y = y * ( ( double )1.5 - xhalf * y * y );
        y = y * ( ( double )1.5 - xhalf * y * y );
        y = y * ( ( double )1.5 - xhalf * y * y );
        return y;
    }
     
    int main(int argc,char * argv[])
    {
       QElapsedTimer timer;
       double x=0.0;
     
       timer.start();
       x=0.0;
       for(unsigned int i=0;i<10000000;i++){x+=1.0/sqrt(100.0);}
       std::cout<<"math="<<timer.elapsed()<<" sum="<<x<<std::endl;
     
       timer.start();
       x=0.0;
       for(unsigned int i=0;i<10000000;i++){x+=invSqrt_It1(100.0);}
       std::cout<<"math="<<timer.elapsed()<<" sum="<<x<<std::endl;
     
       timer.start();
       x=0.0;
       for(unsigned int i=0;i<10000000;i++){x+=invSqrt_It2(100.0);}
       std::cout<<"math="<<timer.elapsed()<<" sum="<<x<<std::endl;
     
       timer.start();
       x=0.0;
       for(unsigned int i=0;i<10000000;i++){x+=invSqrt_It3(100.0);}
       std::cout<<"math="<<timer.elapsed()<<" sum="<<x<<std::endl;
     
       return 0;
    }
    sur mon pc (core i5) ca donne :

    math=8(ms) sum=1e+006
    math=123(ms) sum=998430
    math=176(ms) sum=999996
    math=229(ms) sum=1e+006
    bof

    Donc cc semble pas rentable pour les double

  15. #15
    Membre �m�rite
    Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par d�faut
    Bonjour,

    Merci d'avoir test� la pair.

    Sinon, j'aurais tendance � faire voler au maximum les abstractions Vector3d au c�ur de cette fonction.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    //Vector3d Btemp(0,0,0);
    double BtempX = 0.0 ;
    double BtempY = 0.0 ;
    double BtempZ = 0.0 ;
     
    //Btemp += Vector3d(si_r2_co_r1, vecTmp1[k], vecTmp2[k]) / (nr2*nr);
    double inv_nr2_nr = 1.0 / nr2 * nr ;
    BtempX += si_r2_co_r1 * inv_nr2_nr ;
    BtempY += vecTmp1[k] * inv_nr2_nr ;
    BtempZ += vecTmp2[k] * inv_nr2_nr ;
     
    //b+= (tmp.tmp1*j + tmp.tmp2)*Btemp;
    double coef = tmp.tmp1*j + tmp.tmp2 ;
    b[0] += coef * BtempX ;
    b[1] += coef * BtempY ;
    b[2] += coef * BtempZ ;

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par d�faut
    Bon je suis pass� sous OpenMP et ca dechire! ...

    Probleme resolu!

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    R�ponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    R�ponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    R�ponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    R�ponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    R�ponses: 2
    Dernier message: 23/01/2004, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo