C dilinde cache 'i yönetebilen bir yöntem veya yol var mı?

#1

Döngüleri yani böylece programı hızlandırmak adına hafıza yerine reqister 'i kullanabiliyoruz, memory yönetimi yapabiliyoruz ama cache yönetimine ilişkin hiç bir belge bulamadım C 'ye dair acaba C bu konuda yüksek seviyeli mi kalıyor yoksa C yetersiz mi veya ben mi bulamadım veyahut da Cache yalnızca işletim sistemleri bazı konularda hızlı çalışsın diye yapılmış ve özel bir kodla yönetilebilen aygıtlar mı? Kafamda deli sorulara cevap bulabilecek bu konuda bilgisi olan arkadaşlarımızın cevaplarını beklerim.Teşekkürler.

#2

C ile ilgili olan kısım için değil de, ön bellek ile ilgili olan kısım için fikrimi yazacağım.Tam emin olmamakla birlikte söyleyebileceğim şey, okumak belki mümkün olabilir(işlemciye göre). Ancak yazmak mümkün değil sanırım. Çünkü ön bellek, işletim sistemi tarafından sık kullanılan programların verilerinin tutulduğu bir bellek. L1 ve L2 olmak üzere iki adet bellek var genelde.

Ancak dediğim gibi, tam emin değilim. Çünkü sonuçta işletim sistemleri de insanlar tarafından yazılmış ve ön belleği kullanıyorlarsa, demek ki bir şekilde erişilebilir. Dediğiniz gibi,belki C dili bu gibi durumlarda Assembly’e göre yüksek seviyeli kalıyordur.

#3

ilgilendiğin için çok teşekkür ederim, bayağı araştırdım ama C ile yapan bulamadım şimdilik, belki bulabilirsek birbirimizi nasıl yapıldığı konusunda bilgilendiririz :slight_smile:

1 Like
#4

Rica ederim. Tabi ki bulursak bilgilendiririz. Kolay gelsin :slight_smile:

1 Like
#5

C ve C++ gibi pointer(işaretçi)larla çalıştığımız programlama dillerinde veri öanbelleğe mi yoksa belleğe mi yerleşecek buna işlemci kendi karar veriyormuş, aynı inline fonksiyonları derlerkenki mantığa benzettim bir anlamda.
Stackoverflow da okumuştum.Yani bizim ek bir şey yapmamıza gerek yok imiş, ön bellek konusunda.

#6

Oncelikle; cache cok yaygin kullanilan bir optimizasyon teknigi oldugu icin, bilgisayar ve programlarin her yerinde, her seviyede var. CPU uzerindeki cache’lerden bahsediyorsak bunu ozellikle belirtmek lazim.

CPU cache’lerine gelince, evet, C fazla yuksek seviyeli kaliyor. C dili maksimum tasinabilirlige sahip olabilmek icin cok soyut bir makine modeli kullaniyor. Register sinifina sahip olmayan degiskenlerin & ile adresinin alinabilmesi ve ayni array/struct icindeki elemanlarin adreslerinin bir yone dogru artmasi disinda bir hafiza modeli bile yok. Cogu kisi “int x yapinca stack, int *x = malloc yapinca heap mi oluyor” diye soruyor. Dogru cevap “C’de heap de stack de yok”.

Bununla beraber, modern CISC islemciler muhtelif cache’lerde muhtelif islemler yapacak fonksiyonlar sunuyorlar (cogunlukla ozellesmis instructionlar seklinde.) C icinde inline assembly veya yardimci isletim sistemi fonksiyonlari cagirarak bir takim manipulasyonlar yapilabilir. C++'in son versiyonlarina da cache consistency saglamak adina yardimci barrier fonksiyonlari geldi. Fakat bunlarin hepsi cok spesifik, ufak manipulasyonlar. Lx cache’e array gibi erismek, elemanlarina bakip degistirmek mumkun degil, instruction seviyesinde bile. (Bir ihtimal, islemcinin fiziki bir debug arayuzu varsa, ozellesmis alet ve yazilimlar kullanarak yapmak mumkun olabilir.)

Program (mikro-)optimizasyonu, en basta gereksiz olmakla beraber alete ve disaridaki sicakliga kadar duruma spesifik bir konu. CPU cache icin cok fazla enstrumentasyon mevcut degil; genellikle bir programin belirli bir islemci veya islemcilerde, belirli datasetlerle calisma hizi kullaniliyor. (Zaten “bu workload uzun, data cache’i daha dusuk olup instruction cache’i daha yuksek olan bir islemci alalim” gibi bir karar verilmiyor, dogrudan isin toplam yapilma suresine veya harcadigi elektrige bakiliyor.)

Bununla beraber, locality konusunu arastirmak isteyebilirsiniz. Baslangic icin arama terimleri: locality of reference, spatial locality, temporal locality.

2 Likes