Estoy escribiendo un programa paralelo utilizando mp abierto en el que genero una matriz de números aleatorios de coma flotante y luego hago una serie de cálculos en ella. Actualmente quiero hacer que el paso donde genero la matriz se ejecute en paralelo, pero tengo el problema de que la función rand() no estaba pensada para ejecutarse simultáneamente. No quiero utilizar bloqueos para proporcionar mutex en rand porque esto es lo único que se hace en el ciclo y probablemente sería más eficiente ejecutarlo secuencialmente. ¿Hay alguna manera de hacer este paso de manera eficiente en paralelo?Generación concurrente de números aleatorios
Aquí si el código actual para esta parte (sin mutex en rand);
#pragma omp parallel default(private)
{
int i= omp_get_thread_num();
for(int j=0; j<cols; j++)
matrix[i][j]= rand()%1000 + (float)(rand()%100)/(float)(rand()%1000);
}
Los PRNG generan una secuencia consistente de números de una semilla fija. ¿Es importante para usted este orden (repetibilidad) o realmente desea "aleatorio"? –
No importa si están en algún orden en particular, el problema que tuve fue que cuando lo ejecuté secuencialmente obtuve una distribución bastante buena en mi rango, pero cuando lo cambié a paralelo en general, los números eran menos de 10 y cuando resumí las filas, casi todas sumaron hasta 0 (nunca obtuve negativos con la secuencia). Esto me hace pensar que hay algún tipo de problema de concurrencia con la llamada a la función. – user381261
Espera un segundo: una vez cada mil iteraciones en promedio, rand()% 1000 será cero, entonces, ¿cómo puedes dividir por eso? – TonyK