덜 느린 C/C++ 코드 작성하는 법 배우기

21 hours ago 1

  • 고성능 C/C++ 및 어셈블리 코딩 기법을 실전 예제로 학습할 수 있는 오픈소스 프로젝트
  • STL 대신 최적화된 라이브러리와 다양한 하드웨어 최적화 기법 사용 예시 포함
  • 입력 생성 비용, 수학 함수 근사화, CPU 분기 예측, 멀티코어 병렬화 등 다양한 퍼포먼스 트릭 설명
  • CUDA, PTX, ASM, FPGA, JSON 처리 등 플랫폼별 최적화 기법벤치마크 측정 방법까지 폭넓게 다룸
  • Google Benchmark 기반으로 벤치마크 실행 및 통계 처리 자동화 기능 제공

성능 지향 C/C++ 및 어셈블리 코드 작성법

  • 이 프로젝트는 고성능 소프트웨어 설계에 필요한 직관과 사고방식 형성을 돕는 벤치마크 코드 모음임
  • 현대 코드에서 흔한 버그, 보안 문제, 성능 병목 등을 피하기 위한 실전 코딩 예제를 다룸
  • 대학 강의나 부트캠프에서 접하기 어려운 실무 성능 지향 기법을 체계적으로 소개함
  • 대부분의 코드는 GCC, Clang 기반의 Linux 환경에서 동작하지만, Windows와 macOS도 일부 지원함
  • 고성능 코드 구현을 위한 병렬 알고리듬, 코루틴, 다형성 등도 함께 소개함

주요 항목들

  • 무려 100배 저렴한 무작위 입력?! 알고리듬보다 입력 생성이 더 느릴 수도 있다는 사실
  • 1% 오차로 비용은 1/40: std::sin 같은 STL 삼각함수를 단 3줄 코드로 근사화해보기
  • 지연 로직이 4배 더 빠르다고? 커스텀 std::ranges와 반복자로 극한의 게으름 구현
  • -O3를 넘는 컴파일러 최적화: 숨겨진 플래그와 트릭으로 성능을 2배 더 끌어올릴 수 있음
  • 행렬 곱셈이 문제라고? 연산 수는 60% 적지만 3x3x3 GEMM이 4x4x4보다 70% 느릴 수 있음
  • AI 스케일링의 진실? 이론적 ALU 처리량과 실제 BLAS 성능 간의 간극 측정해보기
  • 조건문 몇 개가 많다고 할 수 있을까? 단 10줄 코드로 CPU 분기 예측기의 한계 실험
  • 재귀가 더 좋아? 어디서 SEGFAULT 나는지 스택 깊이 직접 측정해보자
  • 예외를 피해야 하는 이유? std::error_code나 std::variant 같은 대안 써볼래?
  • 멀티코어 확장하려면? OpenMP, Intel oneTBB, 혹은 직접 만든 스레드 풀을 이용하는 법
  • 메모리 할당 없이 JSON 처리하는 법? C++20이 더 나을까, 아니면 구식 C99 도구가 더 간단할까?
  • STL의 연관 컨테이너 제대로 쓰려면 커스텀 키와 투명 비교자를 어떻게 활용할까?
  • 수제 파서보다 빠른 방법이 있다면? consteval 기반 정규표현식 엔진으로 정면 승부
  • 포인터 크기는 진짜 64비트일까? 포인터 태깅을 활용해보자
  • UDP가 얼마나 많은 패킷을 드롭할까? 사용자 공간에서 io_uring으로 웹 요청 처리까지 해보자
  • Scatter-Gather로 50% 더 빠른 벡터화된 비연속 메모리 연산 구현
  • Intel oneAPI vs Nvidia CCCL? <thrust>와 <cub> 은 뭐가 특별할까?
  • CUDA C++, PTX, SASS는 CPU 코드와 뭐가 다른가?
  • 성능 민감한 코드라면? 인트린식, 인라인 asm, 또는 .S 파일 중 어떤 걸 선택할지 비교
  • Tensor Core와 메모리 구조 — CPU와 Volta, Ampere, Hopper, Blackwell GPU는 어떻게 다를까?
  • FPGA 코딩은 GPU랑 어떻게 다를까? 고수준 합성(HLS), Verilog, VHDL의 차이점은? 🔜 #36
  • Encrypted Enclave란 무엇인가? Intel SGX, AMD SEV, ARM Realm의 지연시간 비교 🔜 #31

실행 방법 및 환경 설정

  • Linux + GCC 환경 추천, WSL 또는 Mac의 Clang(비기본 배포판)도 사용 가능
  • CMake, liburing, OpenBLAS, g++, build-essential 설치 필요
  • less_slow 실행 파일을 빌드 후 실행하면 벤치마크 자동 수행됨
git clone https://github.com/ashvardanian/less_slow.cpp.git cd less_slow.cpp pip install cmake --upgrade sudo apt install -y build-essential g++ liburing-dev libopenblas-base cmake -B build_release -D CMAKE_BUILD_TYPE=Release cmake --build build_release --config Release build_release/less_slow
  • CUDA 및 Intel TBB 사용 여부 선택 가능 (-D USE_INTEL_TBB=OFF 등 플래그 사용)
  • 실행시 특정 벤치마크만 선택 실행하거나 JSON 저장, 출력 포맷 지정 가능
build_release/less_slow --benchmark_filter=std_sort build_release/less_slow --benchmark_out=results.json --benchmark_format=json

성능 측정 향상 팁

  • SMT 비활성화, random interleaving 사용으로 노이즈 최소화
  • Google Benchmark의 --benchmark_perf_counters 옵션으로 하드웨어 성능카운터 측정 가능
sudo build_release/less_slow --benchmark_perf_counters="CYCLES,INSTRUCTIONS"
  • 또는 Linux perf 툴을 이용한 벤치마크 측정 가능
sudo perf stat taskset 0xEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFF build_release/less_slow --benchmark_filter=super_sort

프로젝트 파일 구조

  • 메인 소스: less_slow.cpp (CPU 벤치마크 코드 중심)
  • 플랫폼별 최적화 파일 포함: x86/ARM용 ASM, CUDA .cu, PTX .ptx 코드 포함
├── less_slow.cpp # 주 벤치마크 코드 ├── less_slow_amd64.S # x86 어셈블리 ├── less_slow_aarch64.S # ARM 어셈블리 ├── less_slow.cu # CUDA C++ ├── less_slow_sm70.ptx # PTX IR (Volta) ├── less_slow_sm90a.ptx # PTX IR (Hopper)

외부 라이브러리 사용

  • Google Benchmark: 성능 측정
  • Intel oneTBB: 병렬 STL 백엔드
  • Meta libunifex: 비동기 실행 모델
  • range-v3: std::ranges 대체
  • fmt: std::format 대체
  • StringZilla: std::string 대체
  • CTRE: std::regex 대체
  • nlohmann/json, yyjson: JSON 파서
  • Abseil: 고성능 컨테이너
  • cppcoro: 코루틴 구현
  • liburing: 리눅스 커널 우회 I/O
  • ASIO: 비동기 네트워킹
  • Nvidia CCCL, CUTLASS: GPU 알고리듬 및 행렬 연산

Google Benchmark 사용 팁 요약

  • BENCHMARK()로 벤치마크 등록, ->Args({x,y})로 파라미터 전달
  • DoNotOptimize(), ClobberMemory()로 컴파일러 최적화 제어
  • ->Iterations(n), ->MinTime(n)으로 반복 수 및 벤치 시간 제어
  • ->Complexity(...), ->SetComplexityN(n)으로 시간 복잡도 지정
  • state.PauseTiming(), ResumeTiming()으로 타이밍 구간 직접 제어
  • state.counters[...]로 커스텀 카운터 등록 가능

밈과 유머 요소

  • 교육 자료에 기술 밈 이미지 삽입으로 흥미 유발
  • 성능과 추상화의 대립, IEEE 754 부동소수점 등 유머러스하게 표현

Read Entire Article