26 de dezembro de 2009

Números Aleatórios - Performance

Eu fiz um teste de performance de diferentes implementações de geradores de números aleatórios, comparando a biblioteca GSL e a MKL. O teste consistiu em calcular o tempo necessário para gera 2^30 números aleatórios (float):

  1. implementação do Numerical Recipes do ran2                  ->  25 segundos
  2. implementação da biblioteca GSL do Mersenne Twister  ->  15 segundos
  3. implementação da biblioteca MKL do Mersenne Twister ->  5  segundos
 Este é o fonte do teste











#include <stdio.h>
#include <math.h>
#include <time.h>

///////////////////////// Ran2 Numerical Recipes
//////////////////////////////////////////////

///////////////////////// GSL Mersenne Twister
#include <gsl/gsl_rng.h>
#define ARNG gsl_rng_mt19937
/////////////////////////

/////////////////////////////// MKL GSL Mersenne Twister
 #include <mkl_vsl.h>
#define BRNG    VSL_BRNG_MT2203
#define METHOD  0
////////////////////////////////

main ()
{

  float m,Sm;
  long N = 1073741824, sqrtN = 32768 , i , j;
  long seed,seedn;
  seed = 345;
  seedn = -1 * seed;  //semente negativa

//////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////////
  gsl_rng *randmt;
  randmt = gsl_rng_alloc(ARNG);
  gsl_rng_set (randmt, seed);
  
  time_t inicio2;
  time_t fim2;
  inicio2 = time (NULL);
  for (i = 0; i < N; i++)
    {
      m = tanh ( gsl_rng_get(randmt) / ( 1.+ gsl_rng_max (randmt) ) );
    }
  fim2 = time (NULL);
  gsl_rng_free (randmt);
  printf ("tempo para %d Mersenne Twister - GSL %ld \n", N, fim2 - inicio2 );
//////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////  
  
  float ranfloat[sqrtN];
  VSLStreamStatePtr stream;
  vslNewStream (&stream, BRNG, seed);
  
  time_t inicio3;
  time_t fim3;
  inicio3 = time (NULL);
  for (i = 0; i < sqrtN; i++)
    {
    vsRngUniform (METHOD, stream, sqrtN, ranfloat, 0.0, 1.0);
    for (j = 0; j < sqrtN; j++)
      {
      m = tanh ( ranfloat[j] );
      }
    }
  fim3 = time (NULL);
  printf ("tempo para %d Mersenne Twister - MKL  %ld\n", N, fim3 - inicio3 );
  
//////////////////////////////////////////////////////////////

  return (0);

}

4 Comments:

marilia mar said...

ola, TOMARA Q ACHE SEU GATO!!!!Nao consegui ler nada aki no seu blog, nao sei s 'e o formato ou o q. Busquei seu nome no facebook e e acredito estar falando com a propria pessoa. li um anoticia no UOl d sobre seu gato perdido no aeroporto de Brasilia. solidarizo-me com du sua dor e procura . Perdi O Kundum, um gato fantastico, siames azul q trouxe pra os eua, alguns meses depois q cheguei foi uma dor profunda, irreparavel. creioq ele tenha sido roubado e atropleado em seguiida.

marilia mar said...

ola, TOMARA Q ACHE SEU GATO!!!!Nao consegui ler nada aki no seu blog, nao sei s 'e o formato ou o q. Busquei seu nome no facebook e e acredito estar falando com a propria pessoa. li um anoticia no UOl d sobre seu gato perdido no aeroporto de Brasilia. solidarizo-me com du sua dor e procura . Perdi O Kundum, um gato fantastico, siames azul q trouxe pra os eua, alguns meses depois q cheguei foi uma dor profunda, irreparavel. creioq ele tenha sido roubado e atropleado em seguiida.

marilia mar said...
Este comentário foi removido pelo autor.
marilia mar said...

achou o bichano?