- 高性能 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 を使い、Web リクエスト処理まで試す
- Scatter-Gather で 50% 高速な、ベクトル化された非連続メモリ演算を実装
- Intel oneAPI vs Nvidia CCCL?
<thrust> と <cub> の何が特別なのか?
- CUDA C++、PTX、SASS は CPU コードと何が違うのか?
- 性能に敏感なコードなら? Intrinsics、インライン
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: Linux カーネルをバイパスする 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 浮動小数点などをユーモラスに表現
1件のコメント
Hacker Newsの意見
40倍高速な三角関数:
std::sinのような標準ライブラリ関数を3行のコードで高速化できるsin(x)を近似できるマイクロコントローラでの経験共有
Abseilの選択についての意見
C++における性能のためのゆがみに対する批判
FPGAとGPUコーディングの違い、および高位合成、Verilog、VHDLに関する要望
非正規化浮動小数点数に関する新しい情報
Google Benchmark の投稿に対する好意的なフィードバック
「それほど遅くないC、C++、アセンブリコード」への期待