26 de dezembro de 2009

Gerando números aleatórios com a biblioteca VSL (MKL)

Exemplo simples do uso dos geradores de números aleatórios da biblioteca MKL,






exemplo.c


#include <stdio.h>
/////////////////////////////// MKL GSL Mersenne Twister
#include <mkl_vsl.h>

#define BRNG    VSL_BRNG_MT19937 
#define METHOD  0
////////////////////////////////

main ()
{

  int N = 4, sqrtN = 2 , i , j;
  int seed;
  seed = 345;
  
  float ranfloat[sqrtN]; //cada entrada corresponde a um numero aleatorio
  VSLStreamStatePtr stream; 
  vslNewStream (&stream, BRNG, seed); //semeando o gerador
  
  for (i = 0; i < sqrtN; i++)
    {
    vsRngUniform (METHOD, stream, sqrtN, ranfloat, 0.0, 1.0); //carregando sqrtN numeros
    for (j = 0; j < sqrtN; j++)
      {
      printf ("%f\n", ranfloat[sqrtN]);
      }
    }

  return (0);

}





Para compilar basta linkar as bibliotecas adequadas:

ia32,  icc exemplo.c  -lmkl_intel -lmkl_sequential -lmkl_core  -o exemplo.bin

intel64, icc exemplo.c -lmkl_intel_lp64 -lmkl_sequential -lmkl_core  -o exemplo.bin

Pontos importante:
os números são obtidos em stream, a idéia é carrega um vetor a cada chamada da função vsRngUniform, no exemplo carregamos sqrtN números entre 0 e 1 (float) distribuídos uniformente. O desempenho é melhor para sqrtN > 1000.

Outras funções: 
vdRngUniform  -  double
viRngUniform  - int

Outros geradores, funções e mais detalhes podem ser obtidos na documentação da biblioteca Vector Statistical Library VSL

0 Comments: