- Proyek open-source untuk mempelajari teknik pengkodean C/C++ dan assembly berperforma tinggi lewat contoh praktis
- Mencakup contoh penggunaan library yang dioptimalkan dan berbagai teknik optimasi hardware sebagai pengganti STL
- Menjelaskan beragam trik performa seperti biaya pembuatan input, aproksimasi fungsi matematika, prediksi branch CPU, dan paralelisasi multicore
- Membahas luas mulai dari teknik optimasi per platform seperti CUDA, PTX, ASM, FPGA, pemrosesan JSON, hingga cara mengukur benchmark
- Menyediakan fitur otomatisasi eksekusi benchmark dan pemrosesan statistik berbasis Google Benchmark
Cara Menulis Kode C/C++ dan Assembly Berorientasi Performa
- Proyek ini adalah kumpulan kode benchmark yang membantu membangun intuisi dan pola pikir yang dibutuhkan untuk merancang perangkat lunak berperforma tinggi
- Berisi contoh pengkodean praktis untuk menghindari bug, masalah keamanan, dan bottleneck performa yang umum pada kode modern
- Memperkenalkan secara sistematis teknik berorientasi performa untuk dunia kerja yang sulit ditemui di kuliah universitas atau bootcamp
- Sebagian besar kode berjalan di lingkungan Linux berbasis GCC, Clang, tetapi juga mendukung Windows dan macOS secara terbatas
- Juga memperkenalkan algoritme paralel, coroutine, dan polimorfisme untuk membangun kode berperforma tinggi
Poin-poin utama
- Input acak 100x lebih murah?! Ternyata pembuatan input bisa lebih lambat daripada algoritmenya
- Error 1%, biaya 1/40: mencoba mengaproksimasi fungsi trigonometri STL seperti
std::sin hanya dengan 3 baris kode
- Logika lazy 4x lebih cepat? Menerapkan kemalasan ekstrem dengan
std::ranges kustom dan iterator
- Optimasi compiler melampaui
-O3: flag dan trik tersembunyi bisa meningkatkan performa hingga 2x lagi
- Masalahnya di perkalian matriks? Jumlah operasi 60% lebih sedikit, tetapi GEMM 3x3x3 bisa 70% lebih lambat daripada 4x4x4
- Kebenaran di balik scaling AI? Mengukur jarak antara throughput ALU teoretis dan performa BLAS nyata
- Berapa banyak
if yang terlalu banyak? Menguji batas prediktor branch CPU hanya dengan 10 baris kode
- Rekursi lebih baik? Mari ukur sendiri kedalaman stack untuk melihat di mana
SEGFAULT terjadi
- Kenapa sebaiknya menghindari exception? Mau coba alternatif seperti
std::error_code atau std::variant?
- Bagaimana menskalakan ke multicore? Cara memakai OpenMP, Intel oneTBB, atau thread pool buatan sendiri
- Bagaimana memproses JSON tanpa alokasi memori? Apakah C++20 lebih baik, atau alat C99 lawas justru lebih sederhana?
- Agar kontainer asosiatif STL dipakai dengan benar, bagaimana memanfaatkan key kustom dan comparator transparan?
- Kalau ada cara lebih cepat daripada parser buatan tangan? Duel langsung dengan mesin regex berbasis
consteval
- Ukuran pointer benar-benar 64-bit? Mari manfaatkan pointer tagging
- Seberapa banyak paket yang dijatuhkan UDP? Sampai memproses request web dari user space dengan
io_uring
- Scatter-Gather untuk operasi memori tidak kontigu yang tervectorisasi dan 50% lebih cepat
- Intel oneAPI vs Nvidia CCCL? Apa yang istimewa dari
<thrust> dan <cub>?
- CUDA C++, PTX, SASS โ apa bedanya dengan kode CPU?
- Untuk kode yang sensitif terhadap performa, perbandingan memilih intrinsic, inline
asm, atau file .S
- Tensor Core dan struktur memori โ apa perbedaan CPU dengan GPU Volta, Ampere, Hopper, dan Blackwell?
- Apa bedanya menulis kode FPGA dengan GPU? Apa perbedaan high-level synthesis (HLS), Verilog, dan VHDL? ๐ #36
- Apa itu Encrypted Enclave? Perbandingan latensi Intel SGX, AMD SEV, dan ARM Realm ๐ #31
Cara menjalankan dan menyiapkan lingkungan
- Disarankan Linux + GCC, juga bisa memakai WSL atau Clang di Mac (distribusi non-default)
- Perlu menginstal
CMake, liburing, OpenBLAS, g++, build-essential
- Setelah membangun executable
less_slow, benchmark akan berjalan otomatis saat dijalankan
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
- Penggunaan CUDA dan Intel TBB bisa dipilih (
-D USE_INTEL_TBB=OFF dan flag sejenis)
- Saat dijalankan, bisa memilih hanya benchmark tertentu, menyimpan hasil ke JSON, atau menentukan format output
build_release/less_slow --benchmark_filter=std_sort
build_release/less_slow --benchmark_out=results.json --benchmark_format=json
Tips meningkatkan pengukuran performa
- Nonaktifkan SMT dan gunakan random interleaving untuk meminimalkan noise
- Opsi
--benchmark_perf_counters dari Google Benchmark dapat dipakai untuk mengukur hardware performance counter
sudo build_release/less_slow --benchmark_perf_counters="CYCLES,INSTRUCTIONS"
- Atau benchmark bisa diukur memakai tool Linux
perf
sudo perf stat taskset 0xEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFF build_release/less_slow --benchmark_filter=super_sort
Struktur file proyek
- Sumber utama:
less_slow.cpp (berfokus pada kode benchmark CPU)
- Termasuk file optimasi per platform: kode ASM untuk x86/ARM, CUDA
.cu, dan PTX .ptx
โโโ less_slow.cpp # kode benchmark utama
โโโ less_slow_amd64.S # assembly x86
โโโ less_slow_aarch64.S # assembly ARM
โโโ less_slow.cu # CUDA C++
โโโ less_slow_sm70.ptx # PTX IR (Volta)
โโโ less_slow_sm90a.ptx # PTX IR (Hopper)
Penggunaan library eksternal
- Google Benchmark: pengukuran performa
- Intel oneTBB: backend STL paralel
- Meta libunifex: model eksekusi asinkron
- range-v3: pengganti
std::ranges
- fmt: pengganti
std::format
- StringZilla: pengganti
std::string
- CTRE: pengganti
std::regex
- nlohmann/json, yyjson: parser JSON
- Abseil: kontainer berperforma tinggi
- cppcoro: implementasi coroutine
- liburing: I/O bypass kernel Linux
- ASIO: networking asinkron
- Nvidia CCCL, CUTLASS: algoritme GPU dan operasi matriks
Ringkasan tips penggunaan Google Benchmark
- Daftarkan benchmark dengan
BENCHMARK(), kirim parameter dengan ->Args({x,y})
- Kendalikan optimasi compiler dengan
DoNotOptimize(), ClobberMemory()
- Atur jumlah iterasi dan waktu benchmark dengan
->Iterations(n), ->MinTime(n)
- Tentukan kompleksitas waktu dengan
->Complexity(...), ->SetComplexityN(n)
- Kendalikan sendiri rentang timing dengan
state.PauseTiming(), ResumeTiming()
- Bisa mendaftarkan counter kustom dengan
state.counters[...]
Unsur meme dan humor
- Materi pembelajaran disisipi gambar meme teknis untuk menarik minat
- Pertentangan antara performa dan abstraksi, serta floating point IEEE 754, digambarkan dengan cara yang humoris
1 komentar
Komentar Hacker News
Trigonometri 40x lebih cepat: fungsi pustaka standar seperti
std::sinbisa dipercepat dengan 3 baris kodesin(x)bisa didekati dengan membatasi ekspansi pada beberapa sukuBerbagi pengalaman di mikrokontroler
Pendapat tentang pilihan Abseil
Kritik terhadap distorsi demi performa di C++
Perbedaan antara coding FPGA dan GPU, serta permintaan tentang sintesis tingkat lanjut, Verilog, dan VHDL
Informasi baru tentang floating point terdenormalisasi
Umpan balik positif untuk postingan Google Benchmark
Harapan untuk "kode C, C++, assembly yang kurang lambat"