일부 작은 작업을 시도하고 속도를 높이기 위해 병렬 할당을 이해하려고 합니다.나는 다음 스크립트를 실행하고(메모리가 부족하여 나를 잠갔다고 경고함) 벡터의 행 수에 따라 기하급수적으로 느려지는 것을 보고 있습니다.
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);
);
나는 그것이 cumulativesum()보다 병렬 할당을 수행하는 것이 더 빠를 것이라고 기대하지 않지만 병렬 할당이 어떻게 작동하는지 궁금합니다.
나는 읽었다 이것 각 스레드에 대해 매우 큰 행렬의 복사본을 생성하기 때문인 것 같습니다.
이것이 어떻게 작동하는지에 대한 다른 통찰력과 병렬 할당에 대한 몇 가지 기본 사항 및 금지 사항이 있는 사람이 있습니까?
좋은 점은 내 예가 사과 대 사과 비교가 아닌 것에 대해 생각하지 않았습니다.감사해요 @Craige_Hales , 이것은 정말 유용합니다.
Parallel Assign은 놀라운 일을 하고 있습니다! 배열 m의 크기가 실제 문제라고 생각합니다. 각 반복에서 비약적으로 또는 100X로 증가하고 있습니다.
| 나 | 나이템(m) | Seconds_in_Parallel_Assign | Seconds_in_Nested_Loops |
| 1 | 2,400 | tickseconds()에 비해 너무 작음 | .18 |
| 2 | 240,000 | .033 | 19 |
| 삼 | 24,000,000 | 3.3 | 1951년 |
| 4 | 2,400,000,000 | 338 | 기다리는 것을 포기했다 |
그 스크립트,
m[a, b] = a > db[b];
초당 약 700만 회 실행(4-CPU 17.5G VirtualBox) 나는 또한 메모리가 부족하다는 것을 의미합니다. 페이징 . 페이징은 아마도 i==5에서 급격한 속도 저하를 일으킬 것입니다.
중첩 루프 비교인 열 4는 다음과 같이 만들어졌습니다(화면 캡처...컴퓨터가 행 3에서 1900초에 도달하려고 바쁘게 시도함).

이것 ~이다 문제 병렬 할당의 종류가 설계되었습니다. 속도의 일부는 JSL 루프가 아닌 C++ 루프에서, 일부는 스레딩에서 나옵니다.