CPU features
Jump to navigation
Jump to search
Overview
CPU features는 프로세서가 지원하는 명령어 집합 확장 기능으로, 컴파일러 최적화 및 애플리케이션 성능 향상에 활용됩니다.
Summary
- 무엇인가? CPU가 지원하는 명령어 집합 확장 기능 (SSE, AVX, FMA 등)
- 왜 필요한가? 컴파일러 최적화 플래그 설정, TensorFlow 등 애플리케이션 성능 향상
- 언제 사용하는가? 소스 컴파일 시 -march=native 및 최적화 플래그 설정, CPU 기능 확인
---
Purpose
이 문서가 존재하는 이유
- Goal: CPU 기능 플래그 확인 방법, 주요 플래그 설명, TensorFlow 컴파일 최적화 방법 설명
- Scope: /proc/cpuinfo 기반 플래그 확인, 최적화 플래그 생성, 주요 SIMD 명령어 집합
- Non-goals: CPU 아키텍처 상세, 다른 프로세서 아키텍처(ARM 등)
---
Key Concepts
| Concept | Description | Related |
|---|---|---|
| CPU Flags | /proc/cpuinfo에서 확인 가능한 CPU 기능 플래그 | CPU features |
| SSE/AVX | SIMD 명령어 집합 — 병렬 데이터 처리 가속 | Optimization |
| FMA | Fused Multiply-Add — 곱셈-덧셈 통합 연산 | Optimization |
| -march=native | GCC 최적화 플래그 — 호스트 CPU에 맞춘 자동 최적화 | Optimization |
| TensorFlow Build | CPU 최적화 플래그 기반 TensorFlow 소스 컴파일 | Deep Learning Frameworks |
---
Architecture
CPU 기능 확인 및 최적화 흐름:
graph TD
A[Target System] --> B[/proc/cpuinfo 확인]
B --> C[flags 추출]
C --> D{Optimization Flags 생성}
D --> E[-march=native]
D --> F[-msse4.1, -msse4.2]
D --> G[-mavx, -mavx2]
D --> H[-mfma, -mpopcnt]
E --> I[TensorFlow Build]
F --> I
G --> I
H --> I
I --> J[최적화된 실행 파일]---
Workflow
CPU 기능 확인 및 최적화 흐름:
- /proc/cpuinfo에서 CPU flags 확인
- 주요 최적화 가능 플래그 식별 (SSE4.1, SSE4.2, AVX, AVX2, FMA 등)
- 최적화 플래그 생성 스크립트 실행
- TensorFlow 등 컴파일 시 최적화 플래그 적용
- 성능 향상 검증
| Stage | Input | Output |
|---|---|---|
| Flag Check | /proc/cpuinfo | CPU 지원 기능 목록 |
| Flag Filter | 전체 flags | 최적화 대상 flags 추출 |
| Optimize Build | 최적화 flags | -march=native 기반 플래그 생성 |
| TensorFlow Build | 최적화 플래그 | CPU 최적화된 TensorFlow |
---
Detailed Explanation
Compiler CPU Flags
TensorFlow 소스 빌드를 커스터마이즈하여 CPU 기능의 가용성을 활용하면 TensorFlow 코드 실행 속도를 높일 수 있습니다.
대상 시스템의 사용 가능한 CPU 플래그는 다음 명령어로 확인할 수 있으며, Linux 커널 소스([1](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/arch/x86/include/asm/cpufeatures.h))가 각 플래그의 의미를 설명합니다.
주요 CPU 기능 플래그
| No | Flag | CPU Feature | Additional Info |
|---|---|---|---|
| 1 | ssse3 | Supplemental Streaming SIMD Extensions 3 (SSSE-3) | — |
| 2 | sse4_1 | Streaming SIMD Extensions 4.1 (SSE-4.1) | — |
| 3 | sse4_2 | Streaming SIMD Extensions 4.2 (SSE-4.2) | — |
| 4 | fma | Fused Multiply-Add (FMA) | — |
| 5 | cx16 | CMPXCHG16B (double-width compare-and-swap) | — |
| 6 | popcnt | Population count (1비트 개수 세기) | — |
| 7 | avx | Advanced Vector Extensions | — |
| 8 | avx2 | Advanced Vector Extensions 2 | — |
최적화 플래그 생성
TensorFlow 소스 빌드를 위한 최적화 플래그는 다음 명령어로 생성합니다:
# 최적화 플래그 생성
$ grep flags -m1 /proc/cpuinfo | cut -d ":" -f 2 | tr '[:upper:]' '[:lower:]' | { read FLAGS; OPT="-march=native"; for flag in $FLAGS; do case "$flag" in "sse4_1" | "sse4_2" | "ssse3" | "fma" | "cx16" | "popcnt" | "avx" | "avx2") OPT+=" -m$flag";; esac; done; MODOPT=${OPT//_/\.}; echo "$MODOPT"; }
# AMD EPYC 프로세서 출력 예시:
# -march=native -mssse3 -mfma -mcx16 -msse4.1 -msse4.2 -mpopcnt -mavx -mavx2
---
Configuration
CPU flags 확인
# 전체 CPU flags 확인
$ cat /proc/cpuinfo | grep flags
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibrs ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca
TensorFlow 빌드 최적화
# TensorFlow 소스 빌드 시 최적화 플래그 적용
$ ./configure
# Optimization flags 입력:
# -march=native -mssse3 -mfma -mcx16 -msse4.1 -msse4.2 -mpopcnt -mavx -mavx2
$ bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
---
Examples
Example 1: AMD EPYC CPU flags
# AMD EPYC 프로세서의 CPU flags
$ cat /proc/cpuinfo | grep flags | head -1
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibrs ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca
Example 2: 최적화 플래그 생성 및 적용
# 최적화 플래그 생성
$ grep flags -m1 /proc/cpuinfo | cut -d ":" -f 2 | tr '[:upper:]' '[:lower:]' | { read FLAGS; OPT="-march=native"; for flag in $FLAGS; do case "$flag" in "sse4_1" | "sse4_2" | "ssse3" | "fma" | "cx16" | "popcnt" | "avx" | "avx2") OPT+=" -m$flag";; esac; done; MODOPT=${OPT//_/\.}; echo "$MODOPT"; }
-march=native -mssse3 -mfma -mcx16 -msse4.1 -msse4.2 -mpopcnt -mavx -mavx2
# TensorFlow 빌드에 적용
$ export CXXFLAGS="-march=native -mssse3 -mfma -mcx16 -msse4.1 -msse4.2 -mpopcnt -mavx -mavx2"
$ bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
---
Best Practices
- TensorFlow 빌드 시 -march=native 및 관련 SIMD 플래그 필수 적용
- AVX2, FMA, SSE4.2 지원 시 반드시 최적화 플래그에 포함
- AMD EPYC 시스템에서는 svm, sev, smca 등 AMD 전용 플래그도 확인
- 최적화 플래그는 대상 시스템의 실제 CPU에 맞게 설정
- 이식성 필요 시 -march=native 대신 명시적 플래그 사용
---
Limitations
- -march=native로 컴파일된 바이너리는 다른 CPU에서 실행 불가
- 구형 CPU는 AVX/AVX2/FMA 지원 안 함
- 일부 플래그는 커널 버전/BIOS 설정에 따라 비활성화될 수 있음
- ARM 아키텍처는 다른 플래그 체계 사용
---
References
---
Related Pages
---