39 poin oleh GNโบ 2025-04-21 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GNโบ 2025-04-21
Komentar Hacker News
  • Trigonometri 40x lebih cepat: fungsi pustaka standar seperti std::sin bisa dipercepat dengan 3 baris kode

    • sin(x) bisa didekati dengan membatasi ekspansi pada beberapa suku
    • Biaya komputasi berkurang, tetapi akurasi juga menurun
    • Penurunan akurasi ini diremehkan. Untuk input di luar rentang [-2, 2], hasilnya sangat tidak akurat
    • Bahkan tidak bisa menangani satu interval gelombang sinus dan juga tidak menangani sifat periodiknya. Ini adalah "optimisasi" yang tidak berguna
  • Berbagi pengalaman di mikrokontroler

    • Bekerja pada sistem embedded, dengan heap sekitar 256 KiB dan stack terbesar 4 KiB
    • Kebanyakan menggunakan C++ modern, tetapi tidak semua trik cocok untuk setiap situasi
    • CTRE tidak masalah selama menghindari stack overflow. Pernah mencoba memvalidasi string konfigurasi HTTP proxy, tetapi sistem crash karena stack overflow
    • Hampir tidak menggunakan JSON secara internal dan menulis pustaka BSON sendiri. Tidak perlu khawatir soal alokasi memori atau fragmentasi
    • Menggunakan picolibc alih-alih newlib dan menghapus kode locale pustaka standar C/C++. Ini mengurangi ukuran program
  • Pendapat tentang pilihan Abseil

    • Saat pertama muncul, ini adalah isu besar, tetapi sekarang ada beberapa alternatif yang memperbaiki kelemahannya
    • Dalam beberapa tahun terakhir, keluhan terhadap Abseil meningkat. Ada eksodus maintainer pustaka inti di Google
  • Kritik terhadap distorsi demi performa di C++

    • Terkejut bahwa CTRE memberikan hasil yang baik. Perlu menggali lebih dalam
    • Ingin menyelidiki benchmark thread pool OpenMP dan TBB, serta melihat apakah bisa menambahkan thread pool Boost::ASIO
  • Perbedaan antara coding FPGA dan GPU, serta permintaan tentang sintesis tingkat lanjut, Verilog, dan VHDL

    • Ingin menerima permintaan prioritas tentang topik ini
  • Informasi baru tentang floating point terdenormalisasi

    • Kadang penasaran tentang hal ini saat mengalikan matriks di GPU
  • Umpan balik positif untuk postingan Google Benchmark

    • Fokus pada benchmarking performa bagus. Repositorinya tersusun rapi
  • Harapan untuk "kode C, C++, assembly yang kurang lambat"

    • Mengira kode C juga akan disertakan, tetapi yang ada hanya .cpp dan .S
    • less_slow.cpp menggunakan banyak fitur C++. Perlu menghapus "C" dari daftar atau merevisinya