Estoy tratando de entender la asignación paralela para intentar acelerar algunas operaciones pequeñas.Ejecuto el siguiente script (advirtiendo que se quedó sin memoria y me bloqueó) y veo que se vuelve exponencialmente más lento con la cantidad de filas en un vector.
for(i=1, i<=5, i++,
t = [59760, 71220, 79380, 83820, 3300, 11400, 27900, 39060, 43500, 51300,56220, 60];
t = repeat(t, 10^i);
n = nitems(t);
diff = t[2::n]-t[1::(n-1)];
day_v = diff < 0;
st = HPTime();
day_cum = cumulative Sum([0]|/day_v);
tot_cum = HPTIme() - st;
st= HPTime();
day_break = loc(day_v); // this will give you last row of the day
// make a matrix n x number of day breaks
m = J(n, nitems(day_break), -1);
parallel assign({db = day_break},
// make the item a 1 if it's row is higher than the corresponding row
m[a, b] = a > db[b];
);
m;
// now just sum the matrix
day = VSum(m`); // +1; // if you want the day to start at 1
tot_pa = HPTime() - st;
show(n, tot_pa, tot_cum);
);
No espero que sea más rápido hacer la asignación paralela que la suma acumulativa (), pero tengo curiosidad sobre cómo funciona la asignación paralela.
he leído este y supongo que es porque está creando copias de matrices muy grandes para cada hilo.
¿Alguien tiene alguna otra idea sobre cómo podría funcionar esto y tal vez algunos pros y contras básicos para la asignación paralela?
Buen punto, no pensé que mi ejemplo no fuera una comparación de manzanas con manzanas.Gracias @Craige_Hales , esto es realmente útil.
¡Parallel Assign está haciendo un trabajo increíble! Creo que el tamaño de la matriz m es el problema real: está creciendo a pasos agigantados, o 100X en cada iteración.
| i | nitems(m) | Seconds_in_Parallel_Assign | Segundos_en_bucles_anidados |
| 1 | 2,400 | demasiado pequeño para ticksegundos() | .18 |
| 2 | 240.000 | .033 | 19 |
| 3 | 24,000,000 | 3.3 | 1951 |
| 4 | 2,400,000,000 | 338 | dejó de esperar |
ese guión,
m[a, b] = a > db[b];
se ejecuta alrededor de 7 millones de veces por segundo (4-CPU 17.5G VirtualBox). También me quedé sin memoria, y eso significa paginación . La paginación causará una desaceleración dramática, quizás en i==5.
La columna 4, la comparación de bucle anidado, se hizo así (captura de pantalla... computadora ocupada tratando de llegar a 1900 segundos en la fila 3):

Este es el tipo de problema para el que se diseñó la asignación paralela. Parte de la velocidad proviene de los bucles C++ en lugar de los bucles JSL, y parte de los subprocesos.