diff options
| -rw-r--r-- | docs/design/018-lifetimes-and-computation.md | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/docs/design/018-lifetimes-and-computation.md b/docs/design/018-lifetimes-and-computation.md index 2ed3e78..00e5b52 100644 --- a/docs/design/018-lifetimes-and-computation.md +++ b/docs/design/018-lifetimes-and-computation.md @@ -197,6 +197,27 @@ view distance(start: u32, goal: u32) { # 보기의 본문(3단계): 스냅숏� 보기를 묻지 않을 때의 95% 이상이다. - 연결 스레드 둘에서 BFS 보기의 처리량이 하나일 때의 1.6배 이상이다. +### 3단계에서 알게 된 것 + +- **첫 통과 조건은 채우지 못했다**(`034-view-bodies`의 첫 측정: 쓰기 처리량이 보기를 묻지 않을 때의 44.6%). 그 조건은 처음부터 채울 + 수 없었다: 초당 11만 8천 번의 쓰기가 이미 코어 셋(호스트의 0–2)을 쓰고, 두 연결의 탐색은 어디서 돌든 코어 둘 몫을 가져간다. 같은 + 코어에서 다른 프로세스가 같은 보기를 계산하게 한 대조(apart)도 46.0%였다(라운드마다 크게 흔들려서 이 둘이 같다고도 말할 수 없다). + 같은 탐색을 이벤트로 하면(소유자에서) 쓰기는 0.2%로 거의 멈춘다. +- 그래서 조건이 잡으려던 것을 다시 적는다: **보기의 계산이 CPU를 나누는 것 말고 쓰기를 막는가.** 막는다면 그것은 연결 스레드다: + 보기를 계산하는 연결 스레드는 그동안 자기의 다른 연결(쓰기)을 읽지도 답하지도 못한다. 처리량이 아니라 지연이 그것을 가른다. + +## 3단계의 두 번째 착수 기준 + +첫 측정을 본 뒤, 다시 재기 전에 적어 커밋한다. + +- **바꿀 결정:** 보기의 본문을 연결 스레드에서 평가해도 되는지, 긴 보기를 연결 스레드 밖(보기의 스레드)으로 넘겨야 하는지. +- **통과 조건**(RAM의 Pi 5, 034의 `views.py`, 여섯 라운드, 라운드마다 넷을 번갈아): 같은 호스트에서 연결 둘이 BFS 보기를 쉬지 않고 + 묻는 동안 쓰기(16연결)의 p99 중앙값이, 같은 코어에서 다른 프로세스가 그 보기를 계산할 때(apart)의 쓰기 p99 중앙값의 2배를 넘지 + 않는다. 넘으면 연결 스레드가 쓰기를 막는 것이고, 긴 보기를 연결 스레드 밖으로 넘기는 것을 다음 단계로 둔다(보기의 본문은 그대로 + 둔다: 대안인 핸들러의 계산은 쓰기를 0.2%로 멈춘다). +- 연결 스레드의 수가 처리량을 늘리는지는 `--threads 1`과 `--threads 2`에서 각각 두 연결이 보기를 물어 견준다(첫 측정은 `--threads + 3`에서 묻는 연결 하나와 둘을 견줬다). + ## 하지 않는 것 - `while`과 재귀. 모든 반복은 시작할 때 횟수의 상한이 정해진다(세기의 범위, 걷기의 항목 수). 끝을 모르는 반복은 상한을 적은 |
