0Pricing
C++ Academy · Ders

Önbellek Dostu Veri Düzenleri

Dizi yapıları tasarlayın ve verileri önbellek yerelliği sağlayacak şekilde paketleyin

Önbellek Dostu Veri Düzenleri, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.

Bellek Hiyerarşisi

CPU'larda ana bellekten çok daha hızlı olan birden fazla önbellek düzeyi (L1, L2, L3) bulunur. Önbellek dostu kod, sık kullanılan verileri CPU'ya yakın tutar.

Önbellek Satırları

Bellek, önbellek satırları hâlinde (genellikle 64 bayt) getirilir. Bir baytın okunması satırın tamamını yükler. Bunu avantajınıza kullanın.

Başvuru Yerelliği

İki önemli özellik vardır:

  • Uzamsal yerellik — yakındaki belleği kısa süre içinde kullanma
  • zamansal yerellik — aynı belleği kısa süre içinde yeniden kullanma

Bitişik ve Bağlı Yapılar

Vektörler verileri bitişik olarak saklar; bunlar üzerinde yineleme yapmak önbellek dostudur. Bağlı listeler belleği dağıtır ve her adımda önbelleği etkisiz hâle getirir.

// Cache friendly
std::vector<int> v(1000);
for (auto& x : v) ++x;

// Cache UNfriendly
std::list<int> l(1000);
for (auto& x : l) ++x;

AoS ve SoA

Kayıt dizileri için iki yerleşim vardır:

  • AoS (Array of Structs) — doğaldır, ancak tek bir alanda yineleme yapmak tüm alanlara dokunur
  • SoA (Struct of Arrays) — döngülerin çoğu yalnızca bazı alanları kullandığında daha iyidir
// AoS
struct Particle { float x, y, z, vx, vy, vz; };
std::vector<Particle> particles;

// SoA
struct Particles {
    std::vector<float> x, y, z, vx, vy, vz;
};

Yapı Paketleme

Dolguyu en aza indirmek için üyeleri en büyükten en küçüğe sıralayın. pahole gibi araçlar gerçek yerleşimi gösterir.

struct Bad  { char c; double d; char c2; };  // padded
struct Good { double d; char c; char c2; };  // smaller

Sahte Paylaşım

Aynı önbellek satırındaki farklı değişkenlere yazan iki iş parçacığı, birbirlerinin önbelleklerini geçersiz kılar. Bu, performans için yıkıcıdır. 64 bayta dolgu ekleyin.

struct alignas(64) Counter {
    std::atomic<int> value;
};

Sıcak ve Soğuk Verileri Ayırma

Sıcak verileri (sık erişilen) soğuk verilerden (nadiren erişilen) ayırarak farklı yapılara yerleştirin. CPU yalnızca sıcak kısmı önbelleğe alır.

Önceden Bellek Ayırma

Tekrarlanan yeniden bellek ayırma işlemlerinden kaçınmak için vektörlerde reserve ile önceden bellek ayırın. Her yeniden bellek ayırma işlemi tüm öğeleri kopyalar; bu pahalıdır ve önbelleği etkisiz hâle getirir.

Sıralı Erişim Kazandırır

Dizilerde doğrusal taramalar en hızlıdır. Donanımın önceden getirme birimi, sonraki önbellek satırlarını otomatik olarak tahmin edip yükler.

Dolaylı Erişimden Kaçının

İşaretçiler, CPU'yu bağımlılıkların peşinden gitmeye zorlar. Gezinme sırasında std::vector<T*>, std::vector<T>'den daha yavaştır. Dolaylı erişimi yalnızca gerektiğinde kullanın.

Eniyilemeden Önce Profil Oluşturun

"Önbellek dostu" bir kılavuzdur, kural değildir. Önbellek kaçırmalarının nerede sorun oluşturduğunu görmek için perf veya VTune gibi araçlarla ölçün; ardından eniyileyin.

Hızlı Kontrol

Aynı boyuttaki bir std::list üzerinde yineleme yapmaya kıyasla, bir std::vector üzerinde yineleme yapmak neden genellikle çok daha hızlıdır?

Özet

Modern CPU'lar önbelleklere dayanır. Bitişik kapsayıcıları tercih edin, seçili alanlara erişim için SoA kullanın, yapıları paketleyin, sahte paylaşımdan kaçının ve sıcak noktaları bulmak için önbellek kaçırmalarına perf veya VTune ile profil oluşturun.

Sıkça Sorulan Sorular

“Önbellek Dostu Veri Düzenleri” dersi ücretsiz mi?

Evet — “Önbellek Dostu Veri Düzenleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.

“Önbellek Dostu Veri Düzenleri” dersinde ne öğreneceğim?

Dizi yapıları tasarlayın ve verileri önbellek yerelliği sağlayacak şekilde paketleyin C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C++ Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Önbellek Dostu Veri Düzenleri” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Önbellek Dostu Veri Düzenleri
  2. Dallanma Tahmini ve Sıcak Döngüler
  3. perf, vtune ve Sanitizer'larla Profil Oluşturma
  4. Google Benchmark ile Mikro Karşılaştırma
← C++ Academy Sayfasına Dön