- 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
Hacker News görüşü
40 kat daha hızlı trigonometrik hesaplar:
std::singibi standart kütüphane fonksiyonları 3 satır kodla hızlandırılabilirsin(x)birkaç terimle sınırlandırılmış bir açılımla yaklaşık hesaplanabilirMikrodenetleyicilerdeki deneyim paylaşımı
Abseil tercihine dair görüş
C++'ta performans uğruna yapılan çarpıtmalara eleştiri
FPGA ve GPU kodlaması arasındaki farklar ile yüksek seviyeli sentez, Verilog ve VHDL üzerine talep
Denormalize kayan noktalı sayılar hakkında yeni bilgi
Google Benchmark gönderisine olumlu geri bildirim
"Daha az yavaş C, C++, assembly kodu" beklentisi