Bonjour à tous,
Voilà 2 ans que je développe une code de type Monte Carlo pour ma thèse. Après avoir terminé la version séquentiel puis parallèle. Je cherche un moyen d'optimiser mon code.
Parmis mes nombreuses fonctions, j'ai une fonction Random, elle est appellé des milliards de fois je voudrai tout faire pour l'optimiser. La fonction n'est pas très classe mais elle n'est que la traduction litérale d'un code en fortran.
J'ai pensé à utiliser les fonctions SSE pour pour accélerer cette fonction
Pour info je donne la routine si il y a un spécialiste des instructions SSE2 qu'il me donne son avis, une optimisation de 5 à 10 % serait déjà 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;
}
Voilà 2 ans que je développe une code de type Monte Carlo pour ma thèse. Après avoir terminé la version séquentiel puis parallèle. Je cherche un moyen d'optimiser mon code.
Parmis mes nombreuses fonctions, j'ai une fonction Random, elle est appellé des milliards de fois je voudrai tout faire pour l'optimiser. La fonction n'est pas très classe mais elle n'est que la traduction litérale d'un code en fortran.
J'ai pensé à utiliser les fonctions SSE pour pour accélerer cette fonction
Pour info je donne la routine si il y a un spécialiste des instructions SSE2 qu'il me donne son avis, une optimisation de 5 à 10 % serait déjà 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;
}