Quiero generar números pseudoaleatorios en paralelo usando OpenMP, algo como esto:¿Cómo generar números aleatorios en paralelo?
int i;
#pragma omp parallel for
for (i=0;i<100;i++)
{
printf("%d %d %d\n",i,omp_get_thread_num(),rand());
}
return 0;
que he probado en ventanas y tengo enorme aumento de velocidad, pero cada hilo generó exactamente los mismos números. Lo probé también en Linux y tuve una gran desaceleración, la versión paralela en el procesador 8core fue aproximadamente 10 veces más lenta que la secuencia, pero cada hilo generó números diferentes.
¿Hay alguna forma de tener aceleración y números diferentes?
Editar 27.11.2010
creo que he resuelto usando una idea de Jonathan Dursi puesto. Parece que el siguiente código funciona rápido tanto en Linux como en Windows. Los números también son pseudoaleatorios. ¿Qué piensa usted al respecto?
int seed[10];
int main(int argc, char **argv)
{
int i,s;
for (i=0;i<10;i++)
seed[i] = rand();
#pragma omp parallel private(s)
{
s = seed[omp_get_thread_num()];
#pragma omp for
for (i=0;i<1000;i++)
{
printf("%d %d %d\n",i,omp_get_thread_num(),s);
s=(s*17931+7391); // those numbers should be choosen more carefully
}
seed[omp_get_thread_num()] = s;
}
return 0;
}
PD .: Todavía no he aceptado ninguna respuesta, porque necesito estar seguro de que esta idea es buena.
+1. Modifiqué un poco tu solución y parece funcionar bien tanto en Linux como en Windows. –