Skip to content

Less slow.cpp

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

Playing around "Less Slow" coding practices in C++ 20, C, CUDA, PTX, & Assembly, from numerics & SIMD to coroutines, ranges, exception handling, networking and user-space IO

About

  • 고성능 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

외부 라이브러리 사용

  • 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[...]로 커스텀 카운터 등록 가능

See also

Favorite site