| 14 | ~430 | ~700~760 (×1.75~1.9) · ~95 % (E 일꾼 = 내 측정 프로세스의 ~0.65 · 메모리 대역 · E 묶음 L2 겹침 감안) |
- 어림 근거 = 08 시 실측 402 장/시 ↔ 한 프로세스 모형 장당 54.9 s → 일꾼 7 의 실효 병렬 6.1 · E 코어 8 개 동시 실측 6.68 → 10.50 s.
- 일꾼 14 × 최대 930 MB ≈ 13 GB → 메모리 여유 충분.
- 정책 바꿈 = 시스템 설정(사용자 몫): `powercfg /setacvalueindex SCHEME_CURRENT SUB_PROCESSOR SCHEDPOLICY 5`(자동) + `powercfg /setactive SCHEME_CURRENT` · 되돌림 = 값 1 · 도는 프로세스에 바로 듦(일꾼 수는 재시작해야 바뀜) · Armoury Crate 모드를 바꾸면 다시 덮일 수 있음.
- 정책 안 바꾸는 길 = 두 번째 미리 계산을 E 코어 고정(`start /low /affinity FF000`)으로 다른 도엽 묶음(`--sheets` 앞자리)에 — 잠금이 겹침은 막으나 진행 기록 파일을 서로 덮음(잃은 기록은 다음 실행에서 빠르게 건너뜀) → 버금 길.
| 라플라스 400 회 | 맞음 — 격자 스텐실 · 홀짝 칸 독립 | 장당 0.1~0.3 s(대역 336 GB/s 기준) · CPU 원본 27.5 s · CPU 홀짝 6 s |
| 거리 비례 EDT | 맞음 — cupyx EDT | 0.1~0.5 s · CPU 2~13 s |
| 폐합 안쪽 채움 | 안 맞음 — 작은 창 수백 개 · 차례 | — |
| D8 웅덩이 메움 · 위→아래 더함 | 안 맞음 — 차례 의존(큐 · 위상 정렬) | — |
| D8 평지 이어 감 | 맞으나 불필요 — CPU 고침으로 1 s 아래 | — |
### 같은 결과 문제
- 라플라스: float32 `((위+아래)+왼)+오른` → `×0.25`(2 의 거듭제곱 · 정확) → FMA 끼어들 자리 없음 → 빠른 수학 끄면 비트 동일 가능.
- EDT: 거리 = √(정수² × 4 합) → float64 정확 · √ 는 IEEE 정확 반올림 → 같을 공산 크나 cupyx 내부 경로(float32 여부) 미확인.
- 비트 동일 못 맞추면 `TERRAIN_ALGO`(surface.py:26) 올려야 → 이미 센 3,600 장 다시 셈 + GPU 없는 PC(데스크탑 · 서버)가 나중에 센 도엽과 값 어긋남 → 사실상 비트 동일 필수.
- 꼴: `common_util_terrain_surface.py` 에 공용 판 거리 비례 · 라플라스(B04 안 고침) → `cupy` 있으면 GPU 갈래 · 없으면 CPU 홀짝 판(같은 값) · 일꾼마다 CUDA 문맥 ~300 MB → 14 개면 ~4 GB(6 GB 중) 또는 GPU 전담 일꾼 하나.
### 득실 (남은 dem 9,258 + 이웃 3,191 · D8 12,804)
| 길 | 남은 계산 | 만들고 검증 | 판단 |
|---|---|---|---|
| ③④ CPU 고침 | ~13 h(일꾼 7) / ~7 h(①② 함께) | 3~4 h | 득 큼 |
| ⑤ GPU 더함 | ~4 h(①~④ 대비 −3 h · GPU 한 장치가 장당 ~0.6 s 몫으로 병목) | ~1 일(툴킷 · CuPy 설치 · 갈래 · EDT 비트 대조 · GPU 없는 PC 길 유지) | 이번엔 손해 |
| ⑤ 만(CPU 고침 없이) | 라플라스 · EDT 만 빠짐 · D8 36.8 h 그대로 | ~1 일 | 손해 |
→ GPU 는 다음 전국 재계산(`TERRAIN_ALGO` 올릴 때)이나 EDT 가 남은 몫 대부분이 될 때 검토.
## 4. CPU 쪽 단축 (같은 결과 · 시제품으로 비트 동일 실측)
| 고침 | 자리 | 전 → 후 (s) | 배수 | 같은 결과 |
|---|---|---|---|---|
| D8 평지 이어 감 — 같은 높이 이웃 표 8 장을 한 번만 · 아직 안 흐르는 후보 칸 목록만 돌림(방향 차례 · 갱신 차례 그대로) | ZeroOrder.py:79-91 | 16.0→2.5 · 84.7→2.9 · 37.9→3.5 · 남은 목록 표본 6 장 평균 62.6→3.8 | 6~30 | `array_equal` 참(표본 8 장 모두) |
| 라플라스 — 격자를 홀짝 네 덩이(연속 메모리)로 나눠 그 색 칸만 셈 · 덧셈 차례 같음 | 새 공용 판(SheetMethods.py:99 본뜸) | 27.2→6.1 · 짝 · 홀 크기 모두 | 4.5 | 참 |
| (버금) `surface[colour]=` → `np.copyto(where=)` · 덧대기 한 번 | 〃 | 28.2→12.4 | 2.3 | 참 |
| 폐합 안쪽 채움 — 채움 · 묶음을 그 수위 상자(+1 칸) 안에서 · 묶음은 `find_objects` 창으로(통격자 `components == id` 없앰) | surface.py:117-131 | 9.0→4.7 · 3.2→1.1 | 1.9~2.8 | 참(채운 수 같음) |
| numba(설치 필요 · BSD-2) | D8 스택 · 메움 | 장당 ~2 s 몫 | — | 고친 뒤 zero 3 s → 불필요 |
- 고친 뒤 장당(한 프로세스 · 부하 낀 값): dem 산지 55.3 → ~27 s(2.0 배) · 끝자락 38.1 → ~13 s(2.9 배) · 평지 33.8 → ~10.5 s(3.2 배) · zero 16~88 → 2.5~3.5 s.
- 고친 뒤 dem 의 가장 큰 몫 = EDT(산지 48 % · 끝자락 37 % · 수위 100 넘는 중간 도엽 ~60 %) → GPU 후보는 그때 EDT 하나. EDT 를 CPU 에서 같은 값으로 줄일 쉬운 길은 못 찾음(수위별 창 자르기 = 둘째 가까운 거리 상한이 평지에서 커서 득 없음).
- 꼴: 라플라스 · 거리 비례는 `common_util_terrain_surface.py`(180 줄 → ~260 줄)에 공용 판을 두고 `build_contour_surface` 가 부름(B04 안 고침) · 비트 동일이라 `TERRAIN_ALGO` = 1 그대로 → 센 저장본 그대로 유효. D8 은 D03 파일 그대로 고침 · `ZERO_ORDER_VERSION` 그대로.
- 검증: 창고에 있는 도엽 30 장 안팎을 새 길로 셈 → 저장 npz 와 `array_equal` · zero 는 원본 d8 과 `array_equal` · 거울 시험 `resources/tester`.
- 시제품 파일은 지시대로 지움 — 핵심 두 가지는 부록에.
## 5. 권함 순서
### 지금 바로 (코드 안 고침)
| 할 것 | 줄어드는 시간 | 위험 | 드는 시간 |
|---|---|---|---|
| ① 전원 정책 SCHEDPOLICY 1 → 5(자동) — 사용자 승인 | dem ~400 → ~480 장/시(일꾼 7 그대로 · 재시작 없이 바로) | 낮음 · 다른 앱도 E 코어로 감 · 되돌림 = 값 1 | 1 분 |
| ② ① 뒤 일꾼 7 → 14 재시작(`--workers 14`) | → ~700~760 장/시(×1.75~1.9) · 남은 61 h → ~34 h | 낮음 · 도는 7 장(~1 분)만 다시 셈 · 메모리 ~13 GB | 2 분 |
| (①을 못 하면) 일꾼 수 올리기 | +5 % 안팎 | 장당 시간만 늚 | — |
| 시놀로지(cloud-drive-daemon) · ipf_helper · Code 가 P 코어 ~2.7 개 | 미리 계산 동안 시놀로지 동기화 쉼 → 일꾼 몫 회복 | 데스크탑 반영 늦음 · ipf_helper 90 % 는 이상 소모 | — |
### 코드 고침 뒤
| 할 것 | 줄어드는 시간(일꾼 7 기준) | 위험 | 드는 시간 |
|---|---|---|---|
| ③ D8 평지 이어 감 고침(D03 · 함수 하나) | 0차곡 D8 36.8 → 2.7 h(**−34 h**) · dem 단계 끝나기 전(지금 속도 ~19 h 뒤)에 들어가면 **재시작 불필요**(단계마다 일꾼 묶음을 새로 띄움 · precompute_terrain.py:324) | 낮음 — 비트 동일 표본 8 장 · 열쇠 그대로 · 파일이 반쯤 쓰인 때 묶음이 뜨면 그 단계 실패 → 커밋으로 한 번에 | 1~1.5 h |
| ④ 라플라스 홀짝 + 폐합 채움 창(+ 거리 copyto) 공용 판 | 목록 dem 19.5 → 8.6 h · 이웃 dem 5.1 → 1.6 h(**−14 h**) · 재시작 필요(도는 dem 일꾼은 옛 코드) | 낮음~중간 — 비트 동일 실측 · 공용 판이 B04 와 두 벌(짝 시험으로 묶음) | 2~3 h |
| ⑤ GPU(CuPy) 라플라스 · EDT | ①~④ 7 h → ~4 h(−3 h) | 중간~높음 — 툴킷 설치 · EDT 비트 동일 미확인 · GPU 없는 PC 갈래 | 1 일 안팎 |
### 남은 시간 (모형 · D8 표본 편차로 ±30 %)
| 길 | 목록 dem 9,258 | 0차곡 단계(이웃 dem 3,191 + D8 12,804) | 합 |
|---|---|---|---|
| 지금 그대로(일꾼 7) | 19.5 h | 5.1 + 36.8 h | ~61 h |
| ①② | ~11 h | ~23 h | ~34 h |
| ③ 만 | 19.5 h | 5.1 + 2.7 h | ~27 h |
| ③④ | 8.6 h | 1.6 + 2.7 h | ~13 h(+ 만들기 3~4 h · 그동안 지금 셈은 계속) |
| ①~④ | ~4.8 h | ~2.4 h | ~7 h |
| ①~⑤ | ~2 h | ~1.8 h | ~4 h(+ 만들기 1 일) |
## 부록 — 시제품 핵심 (비트 동일 확인한 꼴)
D8 평지 이어 감(`ZeroOrder.py:79-91` 대체 · 앞뒤 그대로):
```python
eq=[_shift(filled,dr,dc,np.nan)==filledfordr,dcin_D8]# 한 번만
- 격자를 `S[p::2, q::2]` 네 덩이로 · 덩이마다 가장자리 한 칸 덧댄 float32 버퍼.
- 반 걸음 = 빨강 (0,0)·(1,1) → 검정 (0,1)·(1,0). (p,q) 칸의 위·아래 = (1−p,q) 버퍼 행을 한 칸 밀어 본 보기 · 왼·오른 = (p,1−q) 버퍼 열을 밀어 본 보기 · 격자 끝 = 자기 값(원본 edge 덧대기와 같음) → 셈 전 그 덧댄 한 줄만 자기 첫·끝 행·열로 채움.
-`np.add(위, 아래, out=t); t += 왼; t += 오른; t *= np.float32(0.25); np.copyto(x, t, where=free_pq)` — 덧셈 차례 원본과 같음.
- 끝에 `S[p::2, q::2] = 덩이`. 짝 · 홀 크기 모두 `array_equal` 참.
폐합 채움 창: 수위마다 그 수위 칸 상자 + 1 칸 0 덧댐 안에서 `binary_fill_holes` · `label` → `find_objects` 상자로 묶음 하나씩 · 창 = 상자 ± (`_BAND_CELLS` + 2) 를 격자 안으로 자름(원본 `_window` 와 같은 창) · 차례(수위 → 묶음 번호) 그대로.
4. 테스트 사용자는 사실 컴퓨터가 계산하는 방식에 대해서는 무관심함. 결과적으로 본인들이 보고 있는 화면으로 판단을하게 됨. 경쟁사 프로그램의 프론트엔드를 좀더 분석한다면 사용자가 어떤부분이 편하다고 느꼈는지 참고하기 좋을것같음. 그리고 우리프로그램도 단점만 있는게 아님으로 어떻게 조합해야. 사용자들이 클릭과 고민이 줄어들지를 고민해줬으면 함.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.