Ir al contenido

Random en paralelo y Montecarlo

Un algoritmo estocástico usa variables aleatorias: dos ejecuciones con la misma entrada pueden diferir.

TiempoResultado
Monte Carlocontrolado (fijo/acotado)puede tener error
Las Vegasvariable aleatoriasiempre correcto

NN puntos al azar en el cuadrado; nn caen en el círculo inscrito: nN=πr24r2⇒π=4nN\dfrac nN=\dfrac{\pi r^2}{4r^2}\Rightarrow\pi=4\dfrac nN (típicamente 103<N<10610^3<N<10^6).

U2.6 — paralelo con OpenMP
#pragma omp parallel for reduction(+:count)
for(i=0; i<num_trials; i++){
x = (double)rand()/RAND_MAX;
y = (double)rand()/RAND_MAX;
test = x*x + y*y;
if(test <= r*r) Ncirc++;
}
pi = 4.0 * ((double)Ncirc/(double)num_trials);

Las iteraciones son independientes ⇒ paralelización trivial con una reducción (en MPI: cada rank cuenta y MPI_Reduce(SUM)).

Generación de números aleatorios en paralelo

Sección titulada «Generación de números aleatorios en paralelo»

LCG: xi+1=(a xi+c) mod mx_{i+1}=(a\,x_i+c)\bmod m, p. ej. a=16807a=16807, m=231−1m=2^{31}-1, c=0c=0.

EstrategiaIdeaTrade-off
Centralizadael maestro reparte los númerosbajo performance (cuello de botella + comunicación)
Replicativacada proceso su semilla, mismo generadorriesgo de correlaciones
Distribuidasemilla basada en los random de los vecinoseficiente pero difícil
  • Random tree: dos LCG, L(x)=aLx+cLL(x)=a_Lx+c_L y R(x)=aRx+cR(modm)R(x)=a_Rx+c_R\pmod m, generan un árbol de semillas: streams independientes sin comunicación.
  • MRG32k3a (L’Ecuyer, 1999): 1.8×10191.8\times10^{19} streams independientes, cada uno con 2.3×10152.3\times10^{15} substreams de período 7.6×10227.6\times10^{22}; período total 3.1×10573.1\times10^{57}. Cada proceso usa su propio stream.

π en paralelo

Cada proceso genera N/p puntos en [0,1]², cuenta los que caen en el cuarto de círculo y se hace MPI_Reduce(SUM): π ≈ 4·n/N.

rankpuntosdentroπ local
P010248033.1367
P110247933.0977
P210247953.1055
P310247983.1172
π (tras Reduce)3.11426
|error|0.0273
puntos distintos4096/4096
corr(P0,P1)-0.0066
Un solo stream global; el proceso r toma los elementos r, r+p, r+2p, … Sin solapamiento ni comunicación. (Técnica estándar; no aparece con este nombre en las slides.)
Convergencia — el error de Montecarlo baja como ~1/√N
0.11001000N acumulado|π̂ − π|
error medido1/√N

I=∫abf(x)dxI=\int_a^bf(x)dx con NN puntos; cada proceso cubre (b−a)/p(b-a)/p y se suma en el maestro. La generación aleatoria se delega a cada proceso ⇒ sin comunicación. En pi-reduce.cpp (session2) se integra π=∫0141+x2dx≈1n∑i=1n41+(i−0.5n)2\pi=\int_0^1\frac{4}{1+x^2}dx\approx\frac1n\sum_{i=1}^n\frac{4}{1+\left(\frac{i-0.5}{n}\right)^2} con MPI_Bcast(n) + MPI_Reduce.

¿Por qué conviene que cada proceso genere sus propios números en la integración Montecarlo, en vez de recibirlos del maestro? ¿Qué pasaría con π si necesitaras el orden en que caen los puntos?

Ver solución

Recibirlos del maestro es la estrategia centralizada: O(N)O(N) datos por la red y un cuello de botella en el maestro; generándolos localmente solo se comunica un número por proceso al final (la reducción). Si importara el orden global de los puntos, las iteraciones dejarían de ser independientes (habría dependencia secuencial) y ya no bastaría una reduction.

Autoevaluación

0/4 correctas · 0 respondidas
1. Quicksort con pivote aleatorio (siempre ordena bien, tiempo variable) es…
2. π por Montecarlo (tiempo fijo, resultado aproximado) es…
3. Estrategia con riesgo de correlación entre procesos:
4. Período total de MRG32k3a:

Fuente ·estudio/06_Random_Paralelo.md · U2.4-Diseño_en_paralelo-Particionamiento-Random.pdf (U2.6) · session2/pi-reduce/ejemplo03-PI-reduce.cpp · U3.2 (Ejemplo 4: π por integración)