39 ポイント 投稿者 GN⁺ 2025-04-21 | 1件のコメント | WhatsAppで共有
  • 高性能 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_codestd::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(非標準ディストリビューション)も利用可能
  • CMakeliburingOpenBLASg++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件のコメント

 
GN⁺ 2025-04-21
Hacker Newsの意見
  • 40倍高速な三角関数: std::sin のような標準ライブラリ関数を3行のコードで高速化できる

    • いくつかの項に制限した展開で sin(x) を近似できる
    • 計算コストは下がるが、精度も低下する
    • 精度低下という表現は過小評価である。[-2, 2] の範囲外の入力に対しては非常に不正確
    • 単一の正弦波区間すら扱えず、周期性も扱えない。役に立たない「最適化」だ
  • マイクロコントローラでの経験共有

    • 組み込みシステムで作業しており、ヒープは約256 KiB、最大のスタックは4 KiB
    • 主にモダンなC++を使っているが、あらゆるテクニックがすべての状況に適しているわけではない
    • CTREはスタックオーバーフローを回避できる限り問題ない。HTTPプロキシ設定の文字列を検証しようとしたが、スタックオーバーフローでシステムがクラッシュした
    • JSONは内部ではほとんど使わず、独自のBSONライブラリを書いた。メモリ割り当てや断片化を心配する必要がない
    • newlib の代わりに picolibc を使い、C/C++標準ライブラリのロケールコードを削除した。プログラムサイズを削減できた
  • Abseilの選択についての意見

    • 初登場時には大きな話題だったが、今ではその弱点を改善した複数の代替が存在する
    • ここ数年でAbseilへの不満が増えている。Googleでは中核ライブラリ保守担当者の離脱があった
  • C++における性能のためのゆがみに対する批判

    • CTREが良い結果を出していることに驚いた。もっと深掘りする必要がある
    • OpenMP と TBB のスレッドプールのベンチマークを調べ、Boost::ASIO のスレッドプールも追加できるか確認したい
  • FPGAとGPUコーディングの違い、および高位合成、Verilog、VHDLに関する要望

    • この話題について優先的なリクエストを受けたい
  • 非正規化浮動小数点数に関する新しい情報

    • GPUで行列を掛けるときに時々気になる
  • Google Benchmark の投稿に対する好意的なフィードバック

    • 性能ベンチマークへの注力が良い。リポジトリもよく整理されている
  • 「それほど遅くないC、C++、アセンブリコード」への期待

    • Cコードも含まれると思っていたが、あるのは .cpp と .S だけ
    • less_slow.cpp は多くのC++機能を使っている。「C」を一覧から外すか修正が必要だ