#include <xmmintrin.h>

titim

Membre confirmé
30 Septembre 2004
41
0
Bonjour &#224; tous,

Voil&#224; 2 ans que je d&#233;veloppe une code de type Monte Carlo pour ma th&#232;se. Apr&#232;s avoir termin&#233; la version s&#233;quentiel puis parall&#232;le. Je cherche un moyen d'optimiser mon code.
Parmis mes nombreuses fonctions, j'ai une fonction Random, elle est appell&#233; des milliards de fois je voudrai tout faire pour l'optimiser. La fonction n'est pas tr&#232;s classe mais elle n'est que la traduction lit&#233;rale d'un code en fortran.

J'ai pens&#233; &#224; utiliser les fonctions SSE pour pour acc&#233;lerer cette fonction
Pour info je donne la routine si il y a un sp&#233;cialiste des instructions SSE2 qu'il me donne son avis, une optimisation de 5 &#224; 10 &#37; serait d&#233;j&#224; bien cool. (SSE2 max car le code doit tourner sur amd)


#include <Accelerate/Accelerate.h>
#include <xmmintrin.h>


double Rand01 (int Idum)
{
static int Ma [55];
static int Inext;
static int Inextp;
const int Mbig = 1000000000;
const int MSeed = 161803398;
const int Mz =0;
const double Fac = 1.0E-9;
int Iff = 0;
int Mj,Mk,Ii;
int i,k;
double Rf;

//initialisation du rand
if (Idum < 0 || Iff == 0)
{
Iff = 1;
Mj = MSeed - abs (Idum);
Mj %= Mbig;
Ma [54] = Mj;
Mk = 1;
for ( i = 1;i<55;i++)
{
Ii = 21*i%55;
Ma [Ii-1] = Mk;
Mk = Mj - Mk;
if (Mk < Mz)
Mk += Mbig;
Mj = Ma [Ii];
}
for ( k = 1;k<=4;k++)
{
for ( i = 0; i<55;i++)
{
Ma -= Ma [(i+30)%55];
if (Ma < Mz)
Ma += Mbig;
}
}
Inext = 0;
Inextp = 31;
}
do
{
Mj = Ma [Inext++] - Ma [Inextp++];
if (Mj < Mz)
Mj += Mbig;
Ma [Inext] = Mj;
Rf = Mj*Fac;
Inext %= 55;
Inextp %= 55;
}
while ((Rf<= 1.0E-8) || (Rf >= 0.99999));
return Rf;
}
 
fait un tour ici

ici

ha et utilises les balises code

Bloc de code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
        int cs, i,r; /*cs == case*/
        srand(time(0));
        while(1)
        {
                cs = rand() &#37; 2;
                if(cs)
                        printf("O");
                else
                        printf("o");
        fflush(stdout);
        }
        return EXIT_SUCCESS;
}
et ? signed int ?

bad random number generator