Ich versuche, die parallele Zuweisung zu verstehen, um einige kleine Vorgänge zu beschleunigen.Ich führe das folgende Skript aus (Warnung, dass mir der Speicher ausgeht und ich blockiert werde) und sehe, dass es mit der Anzahl der Zeilen in einem Vektor exponentiell langsamer wird.
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);
);
Ich erwarte nicht, dass die parallele Zuweisung schneller ist als die cumulativesum(), aber ich bin gespannt, wie die parallele Zuweisung funktioniert.
Ich habe gelesen Das und ich vermute, das liegt daran, dass für jeden Thread Kopien sehr großer Matrizen erstellt werden?
Hat jemand weitere Einblicke in die Funktionsweise und vielleicht einige grundlegende Verhaltensregeln für die parallele Zuweisung?
Guter Punkt, ich habe nicht daran gedacht, dass mein Beispiel kein Vergleich zwischen Äpfeln sein könnte.Danke @Craige_Hales , das ist wirklich nützlich.
Parallel Assign leistet hervorragende Arbeit! Ich denke, die Größe des Arrays m ist das eigentliche Problem: Es wächst sprunghaft oder um das Hundertfache bei jeder Iteration.
| ich | Artikel(m) | Seconds_in_Parallel_Assign | Seconds_in_Nested_Loops |
| 1 | 2.400 | zu klein für tickseconds() | .18 |
| 2 | 240.000 | .033 | 19 |
| 3 | 24.000.000 | 3.3 | 1951 |
| 4 | 2.400.000.000 | 338 | Ich habe das Warten aufgegeben |
Dieses Skript,
m[a, b] = a > db[b];
wird etwa 7 Millionen Mal pro Sekunde ausgeführt (4-CPU 17,5G VirtualBox). Mir ging auch der Speicher aus, und das bedeutet Paging . Das Paging wird zu einer dramatischen Verlangsamung führen, möglicherweise bei i==5.
Spalte 4, der Nested-Loop-Vergleich, wurde wie folgt erstellt (Bildschirmaufnahme ... Computer ist damit beschäftigt, 1900 Sekunden in Zeile 3 zu erreichen):

Das Ist die Art von Problem, für das Parallel Assign entwickelt wurde. Ein Teil der Geschwindigkeit kommt von C++-Schleifen anstelle von JSL-Schleifen und ein Teil vom Threading.