--- id: [[P-Reinforce|P-Reinforce]]-AUTO-944A15 category: Dev confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - CPU Bottleneck" --- # [[CPU Bottleneck|CPU Bottleneck]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > 3D κ·Έλž˜ν”½μŠ€ 및 μ‹€μ‹œκ°„ λ Œλ”λ§ ν™˜κ²½μ—μ„œ CPU 병λͺ©(CPU Bottleneck)μ΄λž€, CPUκ°€ λ Œλ”λ§ λͺ…λ Ήμ–΄(λ“œλ‘œμš° 콜)λ₯Ό μ€€λΉ„ν•˜κ³  GPU둜 μ „μ†‘ν•˜κ±°λ‚˜ ν•„μš”ν•œ 데이터 연산을 μ²˜λ¦¬ν•˜λŠ” 속도가 느렀져 GPUκ°€ 제 μ„±λŠ₯을 λ°œνœ˜ν•˜μ§€ λͺ»ν•˜κ³  λŒ€κΈ°(Starve)ν•˜κ²Œ λ˜λŠ” ν˜„μƒμ„ λ§ν•©λ‹ˆλ‹€ [1]. 주둜 κ°œλ³„ λͺ¨λΈμ— λŒ€ν•œ κ³Όλ„ν•œ λ“œλ‘œμš° 콜 λ°œν–‰μ΄λ‚˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 메인 μŠ€λ ˆλ“œμ—μ„œμ˜ 무거운 μ—°μ‚°(μ• λ‹ˆλ©”μ΄μ…˜, μ •λ ¬, 컬링 λ“±)으둜 인해 λ°œμƒν•˜λ©° [2-4], 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μΈμŠ€ν„΄μ‹±([[Instancing|Instancing]])μ΄λ‚˜ μ—°μ‚°μ˜ GPU μ˜€ν”„λ‘œλ”© 기법이 μ‚¬μš©λ©λ‹ˆλ‹€ [5, 6]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) - **λ“œλ‘œμš° 콜 μ˜€λ²„ν—€λ“œ ([[Draw Call|Draw Call]] Overhead):** CPU 병λͺ©μ˜ κ°€μž₯ μ£Όμš”ν•œ μ›μΈμž…λ‹ˆλ‹€. CPUλŠ” GPU에 그리기 λͺ…령을 내릴 λ•Œλ§ˆλ‹€ λ³€ν™˜ ν–‰λ ¬, 셰이더 μ°Έμ‘°, μœ λ‹ˆνΌ, 정점 버퍼 λ“±μ˜ λ Œλ”λ§ μƒνƒœλ₯Ό μ€€λΉ„ν•˜κ³  톡신해야 ν•©λ‹ˆλ‹€ [2, 7]. 수백~수천 개의 κ°œλ³„ 객체λ₯Ό λ Œλ”λ§ν•  경우, μ‹€μ œ 폴리곀을 κ·Έλ¦¬λŠ” 연산보닀 CPUκ°€ λͺ…령을 μ€€λΉ„ν•˜κ³  λ°œν–‰ν•˜λŠ” μ˜€λ²„ν—€λ“œκ°€ μ‹œμŠ€ν…œ λ²„μŠ€μ— λ§‰λŒ€ν•œ λΆ€ν•˜λ₯Ό κ°€ν•˜μ—¬ 병λͺ©μ„ μœ λ°œν•©λ‹ˆλ‹€ [1, 7, 8]. - **μžλ°”μŠ€ν¬λ¦½νŠΈ 메인 μŠ€λ ˆλ“œ ν•œκ³„:** μ›Ή λ Œλ”λ§(Three.js λ“±) ν™˜κ²½μ—μ„œ 수만 개의 객체에 λŒ€ν•΄ μˆ˜λ™μœΌλ‘œ μ‹œμ•Ό μ ˆλ‘μ²΄ 컬링([[Frustum Culling|Frustum Culling]])을 κ³„μ‚°ν•˜κ±°λ‚˜, 투λͺ… 객체의 깊이 μ •λ ¬(예: [[Radix Sort|Radix Sort]])을 μˆ˜ν–‰ν•  경우 λ§‰λŒ€ν•œ CPU μ—°μ‚° λΉ„μš©μ΄ λ°œμƒν•©λ‹ˆλ‹€ [4, 9]. 단일 μŠ€λ ˆλ“œ 기반인 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ Œλ”λ§ 루프 λ‚΄μ˜ λŒ€κ·œλͺ¨ λ°°μ—΄ μ‘°μž‘μ€ 메인 μŠ€λ ˆλ“œλ₯Ό μ μœ ν•˜μ—¬ ν”„λ ˆμž„ λ“œλžμ„ μœ λ°œν•˜λŠ” 치λͺ…적인 CPU 병λͺ©μ„ λ‚³μŠ΅λ‹ˆλ‹€ [4, 9]. - **μ• λ‹ˆλ©”μ΄μ…˜ 및 λ ˆμ΄μΊμŠ€νŒ… λΆ€ν•˜:** μŠ€ν‚¨λ“œ λ©”μ‹œ(Skinned Mesh)의 λΌˆλŒ€(Bone) μ• λ‹ˆλ©”μ΄μ…˜ μ‹œμŠ€ν…œμ€ λ§€ ν”„λ ˆμž„ CPUμ—μ„œ ν–‰λ ¬ μ—…λ°μ΄νŠΈ 연산을 μš”κ΅¬ν•˜λ―€λ‘œ λ‹€μˆ˜μ˜ 캐릭터가 μžˆμ„ 경우 λ Œλ”λ§ μ˜ˆμ‚°μ„ μ΄ˆκ³Όν•˜λŠ” CPU μ‹œκ°„μ„ μ†Œλͺ¨ν•©λ‹ˆλ‹€ [3]. λ˜ν•œ 수만 개의 μΈμŠ€ν„΄μŠ€ ν™˜κ²½μ—μ„œ CPU 기반 λ ˆμ΄μΊμŠ€νŒ…([[Raycasting|Raycasting]])을 μˆ˜ν–‰ν•˜λ©΄ 각 μΈμŠ€ν„΄μŠ€μ˜ 행렬을 일일이 μ—­μ‚°ν•΄μ•Ό ν•˜λ―€λ‘œ 즉각적인 λ°˜μ‘μ„ λΆˆκ°€λŠ₯ν•˜κ²Œ λ§Œλ“œλŠ” 동기화 병λͺ©μ΄ λ°œμƒν•©λ‹ˆλ‹€ [10]. - **μž…μž μ‹œμŠ€ν…œ 및 물리 μ—°μ‚°:** CPUλ₯Ό ν™œμš©ν•œ νŒŒν‹°ν΄ μ‹œμŠ€ν…œ μ—…λ°μ΄νŠΈλŠ” 일반적인 ν•˜λ“œμ›¨μ–΄ κΈ°μ€€ μ•½ 50,000개 μˆ˜μ€€μ—μ„œ CPU 병λͺ©μ— λ„λ‹¬ν•©λ‹ˆλ‹€ [5]. μ΄λŸ¬ν•œ μ—°μ‚° 병λͺ©μ€ [[WebGPU|WebGPU]]의 μ»΄ν“¨νŠΈ 셰이더([[Compute Shader|Compute Shader]]s)λ₯Ό ν™œμš©ν•΄ 메인 μŠ€λ ˆλ“œμ˜ μž‘μ—…μ„ GPU μ½”μ–΄λ‘œ 병렬 μ˜€ν”„λ‘œλ“œν•¨μœΌλ‘œμ¨ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [5, 11]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Graphics & Performance λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[Draw Call|Draw Call]], InstancedMesh, [[Frustum Culling|Frustum Culling]] - **Projects/Contexts:** Three.js, [[WebGL|WebGL]], [[WebGPU|WebGPU]] - **Contradictions/Notes:** `[[InstancedMesh|InstancedMesh]]` κΈ°μˆ μ€ 수천 개의 객체λ₯Ό 단 ν•œ 번의 λ“œλ‘œμš° 콜둜 μ²˜λ¦¬ν•˜μ—¬ CPU 병λͺ©μ„ 획기적으둜 ν•΄κ²°ν•˜λŠ” 기술둜 μ•Œλ €μ Έ μžˆμŠ΅λ‹ˆλ‹€ [6, 12]. κ·ΈλŸ¬λ‚˜ 이 방식은 κ°œλ³„ 객체의 μ»¬λ§μ΄λ‚˜ μ •λ ¬ 같은 λ‚΄λΆ€ μ΅œμ ν™”λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, 이λ₯Ό κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ CPU λ‹¨μ—μ„œ μˆ˜λ™μœΌλ‘œ μœ„μΉ˜λ₯Ό κ²€μ‚¬ν•˜κ³  버퍼λ₯Ό μž¬μ •λ ¬ν•˜λŠ” λ‘œμ§μ„ μΆ”κ°€ν•  경우 였히렀 이전보닀 더 κ·Ήμ‹¬ν•œ CPU μ—°μ‚° 병λͺ©μ΄ λ°œμƒν•˜λŠ” 역섀적인 상황이 λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•©λ‹ˆλ‹€ [4, 9]. --- *Last updated: 2026-04-19* ---