J'essaie de comprendre l'affectation parallèle pour essayer d'accélérer certaines petites opérations.J'exécute le script suivant (en avertissant qu'il manquait de mémoire pour moi et m'a enfermé) et je le vois devenir exponentiellement plus lent avec le nombre de lignes dans un vecteur.
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);
);
Je ne m'attends pas à ce qu'il soit plus rapide de faire l'assignation parallèle que la somme cumulative () mais je suis curieux de savoir comment fonctionne l'assignation parallèle.
j'ai lu ce et je suppose que c'est parce qu'il crée des copies de très grandes matrices pour chaque thread?
Quelqu'un a-t-il d'autres idées sur la façon dont cela pourrait fonctionner et peut-être quelques choses à faire et à ne pas faire pour l'attribution parallèle?
Bon point, je ne pensais pas que mon exemple n'était pas une comparaison de pommes à pommes.Merci @Craige_Hales , c'est vraiment utile.
Parallel Assign fait un travail incroyable ! Je pense que la taille du tableau m est le véritable problème : il augmente à pas de géant, ou 100X à chaque itération.
| je | articles(m) | Seconds_in_Parallel_Assign | Seconds_in_Nested_Loops |
| 1 | 2 400 | trop petit pour tickseconds() | .18 |
| 2 | 240 000 | .033 | 19 |
| 3 | 24 000 000 | 3.3 | 1951 |
| 4 | 2 400 000 000 | 338 | renoncé à attendre |
Ce scénario,
m[a, b] = a > db[b];
est exécuté environ 7 millions de fois par seconde (VirtualBox 4-CPU 17.5G). J'ai aussi manqué de mémoire, et cela signifie pagination . La pagination provoquera un ralentissement spectaculaire, peut-être à i==5.
La colonne 4, la comparaison de boucles imbriquées, a été faite comme ceci (capture d'écran...ordinateur occupé essayant d'atteindre 1900 secondes sur la ligne 3) :

Ce est le type de problème pour lequel l'affectation parallèle a été conçue. Une partie de la vitesse provient des boucles C++ plutôt que des boucles JSL, et une partie du threading.