39 puan yazan GN⁺ 2025-04-21 | 1 yorum | WhatsApp'ta paylaş
  • Yüksek performanslı C/C++ ve assembly kodlama tekniklerini gerçek örneklerle öğrenebileceğiniz bir açık kaynak proje
  • STL yerine optimize edilmiş kütüphanelerin ve çeşitli donanım optimizasyon tekniklerinin kullanım örneklerini içeriyor
  • Girdi üretim maliyeti, matematiksel fonksiyon yaklaşımı, CPU dal tahmini, çok çekirdekli paralelleştirme gibi çeşitli performans hilelerini açıklıyor
  • CUDA, PTX, ASM, FPGA, JSON işleme gibi platforma özel optimizasyon tekniklerinden benchmark ölçüm yöntemlerine kadar geniş bir alanı kapsıyor
  • Google Benchmark tabanlı benchmark çalıştırma ve istatistik işleme otomasyonu sunuyor

Performans odaklı C/C++ ve assembly kodu nasıl yazılır

  • Bu proje, yüksek performanslı yazılım tasarımı için gerekli sezgi ve düşünme biçimini geliştirmeye yardımcı olan bir benchmark kodları koleksiyonu
  • Modern kodda sık görülen hatalar, güvenlik sorunları ve performans darboğazlarından kaçınmaya yönelik pratik kodlama örneklerini ele alıyor
  • Üniversite derslerinde veya bootcamp'lerde karşılaşması zor olan, gerçek dünyaya dönük performans odaklı teknikleri sistemli biçimde tanıtıyor
  • Kodun büyük bölümü GCC, Clang tabanlı Linux ortamında çalışıyor, ancak Windows ve macOS için de kısmi destek var
  • Yüksek performanslı kod geliştirmek için paralel algoritmalar, coroutine'ler ve polimorfizm gibi konuları da tanıtıyor

Başlıca başlıklar

  • Tam 100 kat daha ucuz rastgele girdi mi?! Girdi üretiminin algoritmanın kendisinden daha yavaş olabileceği gerçeği
  • %1 hata ile maliyet 1/40: std::sin gibi STL trigonometrik fonksiyonlarını yalnızca 3 satır kodla yaklaşık hesaplamak
  • Tembel mantık 4 kat daha hızlı olabilir mi? Özel std::ranges ve yineleyicilerle uç düzeyde tembellik uygulamak
  • -O3'ün ötesinde derleyici optimizasyonu: Gizli bayraklar ve hilelerle performansı 2 kat daha artırmak mümkün
  • Sorun matris çarpımı mı? İşlem sayısı %60 daha az olsa da 3x3x3 GEMM, 4x4x4'ten %70 daha yavaş olabilir
  • Yapay zeka ölçeklemesinin gerçeği mi? Teorik ALU aktarım hızı ile gerçek BLAS performansı arasındaki farkı ölçmek
  • Kaç tane koşul fazla sayılır? Sadece 10 satır kodla CPU dal tahmincisinin sınırlarını denemek
  • Özyineleme daha mı iyi? SEGFAULT'ın nerede oluştuğunu yığın derinliğini ölçerek görmek
  • İstisnalardan neden kaçınmalı? std::error_code veya std::variant gibi alternatifleri denemek ister misiniz?
  • Çok çekirdeğe nasıl ölçeklenir? OpenMP, Intel oneTBB veya el yapımı bir thread pool kullanma yöntemleri
  • Bellek ayırmadan JSON işlemek mümkün mü? C++20 daha mı iyi, yoksa eski usul C99 araçları daha mı basit?
  • STL ilişkisel konteynerlerini doğru kullanmak için özel anahtarlar ve şeffaf karşılaştırıcılar nasıl kullanılmalı?
  • El yazımı bir parser'dan daha hızlı bir yol varsa? consteval tabanlı bir düzenli ifade motoruyla doğrudan karşılaşma
  • İşaretçi boyutu gerçekten 64 bit mi? Tagged pointer yaklaşımını kullanmak
  • UDP ne kadar paket düşürüyor? Kullanıcı alanında io_uring ile web isteği işlemeye kadar gitmek
  • Scatter-Gather ile %50 daha hızlı vektörleştirilmiş, kesintili bellek işlemleri uygulamak
  • Intel oneAPI mi Nvidia CCCL mi? <thrust> ve <cub> neden özel?
  • CUDA C++, PTX, SASS CPU kodundan nasıl farklı?
  • Performansa duyarlı kod için? Intrinsic'ler, satır içi asm veya .S dosyaları arasında nasıl seçim yapılır
  • Tensor Core ve bellek yapısı — CPU ile Volta, Ampere, Hopper, Blackwell GPU'lar nasıl ayrışıyor?
  • FPGA programlama GPU'dan nasıl farklı? Yüksek seviyeli sentez (HLS), Verilog ve VHDL arasındaki farklar neler? 🔜 #36
  • Encrypted Enclave nedir? Intel SGX, AMD SEV, ARM Realm gecikmelerinin karşılaştırması 🔜 #31

Çalıştırma ve ortam kurulumu

  • Linux + GCC ortamı öneriliyor, WSL veya Mac üzerindeki Clang (varsayılan olmayan dağıtım) da kullanılabilir
  • CMake, liburing, OpenBLAS, g++, build-essential kurulumu gerekli
  • less_slow çalıştırılabilir dosyası derlenip çalıştırıldığında benchmark'lar otomatik olarak yürütülür
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 ve Intel TBB kullanımını seçmek mümkün (-D USE_INTEL_TBB=OFF gibi bayraklar kullanılır)
  • Çalıştırma sırasında yalnızca belirli benchmark'ları seçmek, JSON olarak kaydetmek veya çıktı biçimini belirlemek mümkün
build_release/less_slow --benchmark_filter=std_sort  
build_release/less_slow --benchmark_out=results.json --benchmark_format=json  

Performans ölçümünü iyileştirme ipuçları

  • SMT'yi devre dışı bırakmak ve random interleaving kullanmak, gürültüyü en aza indirir
  • Google Benchmark'ın --benchmark_perf_counters seçeneğiyle donanım performans sayaçları ölçülebilir
sudo build_release/less_slow --benchmark_perf_counters="CYCLES,INSTRUCTIONS"  
  • Alternatif olarak Linux perf aracıyla benchmark ölçümü yapılabilir
sudo perf stat taskset 0xEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFF build_release/less_slow --benchmark_filter=super_sort  

Proje dosya yapısı

  • Ana kaynak: less_slow.cpp (esas olarak CPU benchmark kodu)
  • Platforma özel optimizasyon dosyaları dahil: x86/ARM için ASM, CUDA .cu, PTX .ptx kodları
├── less_slow.cpp           # Ana benchmark kodu  
├── less_slow_amd64.S       # x86 assembly  
├── less_slow_aarch64.S     # ARM assembly  
├── less_slow.cu            # CUDA C++  
├── less_slow_sm70.ptx      # PTX IR (Volta)  
├── less_slow_sm90a.ptx     # PTX IR (Hopper)  

Harici kütüphanelerin kullanımı

  • Google Benchmark: performans ölçümü
  • Intel oneTBB: paralel STL backend'i
  • Meta libunifex: asenkron yürütme modeli
  • range-v3: std::ranges alternatifi
  • fmt: std::format alternatifi
  • StringZilla: std::string alternatifi
  • CTRE: std::regex alternatifi
  • nlohmann/json, yyjson: JSON parser'ları
  • Abseil: yüksek performanslı konteynerler
  • cppcoro: coroutine uygulaması
  • liburing: Linux çekirdeğini baypas eden I/O
  • ASIO: asenkron ağ iletişimi
  • Nvidia CCCL, CUTLASS: GPU algoritmaları ve matris işlemleri

Google Benchmark kullanım ipuçları özeti

  • BENCHMARK() ile benchmark kaydı, ->Args({x,y}) ile parametre geçişi
  • DoNotOptimize(), ClobberMemory() ile derleyici optimizasyonunu kontrol etme
  • ->Iterations(n), ->MinTime(n) ile tekrar sayısı ve benchmark süresini kontrol etme
  • ->Complexity(...), ->SetComplexityN(n) ile zaman karmaşıklığını belirtme
  • state.PauseTiming(), ResumeTiming() ile zamanlama aralığını doğrudan kontrol etme
  • state.counters[...] ile özel sayaçlar kaydedebilme

Meme ve mizah unsurları

  • Eğitim materyaline teknoloji meme görselleri eklenerek ilgi çekiliyor
  • Performans ve soyutlama arasındaki çatışma, IEEE 754 kayan nokta gibi konular mizahi biçimde ele alınıyor

1 yorum

 
GN⁺ 2025-04-21
Hacker News görüşü
  • 40 kat daha hızlı trigonometrik hesaplar: std::sin gibi standart kütüphane fonksiyonları 3 satır kodla hızlandırılabilir

    • sin(x) birkaç terimle sınırlandırılmış bir açılımla yaklaşık hesaplanabilir
    • Hesaplama maliyeti azalır, ancak doğruluk da düşer
    • Doğruluktaki düşüş hafife alınıyor. [-2, 2] aralığı dışındaki girdiler için çok hatalı
    • Tek bir sinüs dalgası aralığını bile işleyemiyor ve periyodik yapıyı da ele alamıyor. İşe yaramaz bir "optimizasyon"
  • Mikrodenetleyicilerdeki deneyim paylaşımı

    • Gömülü sistemler üzerinde çalışıyor; heap yaklaşık 256 KiB, en büyük stack ise 4 KiB
    • Çoğunlukla modern C++ kullanıyor, ancak her numara her duruma uygun değil
    • CTRE, stack overflow'dan kaçınıldığı sürece sorun değil. HTTP proxy yapılandırmasındaki dizeleri doğrulamaya çalışmış, ancak stack overflow nedeniyle sistem çökmüş
    • Dahili olarak neredeyse hiç JSON kullanmıyor ve kendi BSON kütüphanesini yazmış. Bellek ayırma veya parçalanma konusunda endişelenmeye gerek kalmıyor
    • newlib yerine picolibc kullanıyor ve C/C++ standart kütüphanesinin locale kodunu kaldırmış. Program boyutu küçülmüş
  • Abseil tercihine dair görüş

    • İlk çıktığında büyük olay olmuştu, ancak artık zayıf yönlerini iyileştiren birçok alternatif var
    • Son birkaç yılda Abseil'e yönelik hoşnutsuzluk arttı. Google'da çekirdek kütüphane bakımcıları ayrıldı
  • C++'ta performans uğruna yapılan çarpıtmalara eleştiri

    • CTRE'nin iyi sonuç vermesine şaşırmış. Daha derine inmek gerekiyor
    • OpenMP ve TBB thread pool benchmark'larını incelemek ve Boost::ASIO thread pool'u ekleyip ekleyemeyeceğine bakmak istiyor
  • FPGA ve GPU kodlaması arasındaki farklar ile yüksek seviyeli sentez, Verilog ve VHDL üzerine talep

    • Bu konuda öncelikli bir istek görmek istiyor
  • Denormalize kayan noktalı sayılar hakkında yeni bilgi

    • GPU'da matris çarpımı yaparken bunu ara sıra merak ediyor
  • Google Benchmark gönderisine olumlu geri bildirim

    • Performans benchmark'larına odaklanılması güzel. Depo iyi düzenlenmiş
  • "Daha az yavaş C, C++, assembly kodu" beklentisi

    • C kodunun da olacağını sanmıştı, ama yalnızca .cpp ve .S var
    • less_slow.cpp birçok C++ özelliği kullanıyor. Listeden "C" çıkarılmalı ya da düzeltilmeli