Okullar için Robotik ve Mühendislik · anaokulundan liseye

Bölüm 9 · Yazılımın içi · Ders 40

Önbellek (LRU)

Harita karolarını yakında tutmak: biraz bellek, çok hız

Veri. Depoda dolaşan robot, haritayı 8×5 = 40 karoya bölünmüş olarak sunucudan çekiyor. Her adımda bulunduğu karoyu istiyor: sunucudan gelmesi 80 ms, robotun kendi belleğinden okunması 2 ms. Robot 120 adım yürüyor ve çoğu zaman yakın karolara geri dönüyor. Bellekte yalnız birkaç karoya yer var: hangisini tutmalı?

robotun yolu: 120 karo isteği, 40 karoluk haritaönbellek 4 karo · isabet 2 ms, ıska 80 ms
1 / 130
onbellek.pypython
  1. import numpy as np
  2. from collections import OrderedDict # sıralı sözlük
  3. rng = np.random.default_rng(3)
  4. x, y, req = 3, 2, [] # haritanın ortası
  5. moves = [(0, 0), (1, 0), (-1, 0), (0, 1), (0, -1)] # dur ya da komşuya geç
  6. for _ in range(120): # robot 120 adım yürür
  7. dx, dy = moves[rng.integers(5)]
  8. x, y = min(max(x + dx, 0), 7), min(max(y + dy, 0), 4) # 8×5 karo
  9. req.append((x, y)) # karoyu iste
  10. def lru(size):
  11. cache, hits = OrderedDict(), 0 # baş: en eski, son: en yeni
  12. for t in req:
  13. if t in cache:
  14. hits += 1 # isabet: 2 ms
  15. cache.move_to_end(t) # en yeni yap
  16. else:
  17. cache[t] = "karo" # ıska: sunucudan 80 ms
  18. if len(cache) > size:
  19. cache.popitem(last=False) # en eskiyi at
  20. return hits / len(req)
  21. for s in (1, 2, 4, 8, 12):
  22. h = lru(s) # isabet oranı
  23. print(s, round(h, 2), round(2*h + 80*(1-h), 1), "ms") # ortalama gecikme

Sahnedeki her sayı, aynı algoritmanın tarayıcında yapılan gerçek çalıştırmasından gelir (sabit tohum, her seferinde aynı sonuç). Python kodunu kendi bilgisayarında çalıştırırsan rastgele başlangıçlar farklı olacağı için sayılar biraz değişebilir.

Bu dersin kodu verisini kendi içinde üretir; indirilecek dosya yok. Kodu yine de aşağıda tarayıcında çalıştırabilirsin.

Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide

Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.

onbellek.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. İstenen karo önbellekteyse isabet: 2 ms, karo listenin başına (en yeni) taşınır.
  2. Yoksa ıska: 80 ms bekleyip sunucudan çekilir, listenin başına eklenir.
  3. Yer dolduysa listenin sonundaki, en uzun süredir kullanılmayan (LRU) karo atılır. Yakın geçmişte kullanılan, yakın gelecekte yine kullanılır: zamansal yerellik.
  4. LRU’da büyük önbellek, küçüğün tuttuğu her şeyi de tutar; bu yüzden boyut arttıkça isabet oranı hiç düşmez. Ama robotun hiç görmediği karolar için ilk istek her zaman ıskadır.
  5. Şunu dene: önbellek boyunu 1’den 4’e çıkar; ortalama gecikme ~50 ms’den ~30 ms’ye iner. 8’den sonra eğri düzleşir: geri kalan ıskalar robotun ilk kez gördüğü karolar.

Neden önemli

İşlemcinin L1/L2 önbellekleri, web tarayıcıları, CDN'ler, veritabanı tamponları ve robotlarda harita karoları, çıkarım sonuçları ve dönüşüm ağaçları hep aynı fikirle çalışır. Bedeli bayatlıktır: sunucudaki harita güncellenirse önbellekteki kopya eskir; bu yüzden gerçek sistemler ayrıca bir yaşam süresi (TTL) koyar.

ESOF 323, 11. hafta: robotlarda derin öğrenme →
Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç