Bu olası L1 önbellek yazma optimizasyonunu gerçekleştiren CPU'lar var mı?


9

L1 önbelleğe sahip CPU bir yazma işlemi gerçekleştirdiğinde, normalde olan şey (yazdığı önbellek satırının zaten L1 önbelleğinde olduğu varsayılarak) önbelleğin (verileri güncellemeye ek olarak) bu önbellek satırını kirli olarak işaretlemesi ve güncellenmiş verilerle ilgili satırı daha sonra yazacaktır.

Olası bir optimizasyon, önbelleğin yazma içeriğini ve önbelleğin önceki içeriğini karşılaştırmasını sağlamaktır ve eğer aynıysa, satırı kirli olarak işaretlemeyin. Bu, önbelleğin zaman zaman geri yazmalardan kaçınmasına izin verebileceğinden, CPU üreticisinin bunu bu mantığı yapmak için gereken kapılara değer olarak nasıl görebildiğini görebiliyorum.

Benim sorum: Bu optimizasyonu yapan CPU'lar var mı?

Neden soruyorum: Arka plan sürekli bellek erişimleri olması gereken bazı kod yazıyorum; yani, önbelleğin davranışını dinleyebilen biri yaptığım şeyi çıkaramamalı. Erişimlerimden bazıları yazıyor ve bu kodu uygulamak için bariz bir şekilde, birçok yazar zaten aynı verileri yazıyor olacak. Yazmaları yapmam gerekiyor, çünkü verilere bağlı olarak yazdığım veriler aynı olabilir veya olmayabilir ve aynı eylemi ne olursa olsun gerçekleştirmek önemlidir. CPU aslında bir 'no-change-write' yazmadan optimize edilirse, bu, önbelleğin davranışının yaptığım şeye bağlı olarak değişeceğini ve hedefimin bozulmasına neden olacağı anlamına gelir.

Peki, yazma işlemlerini bu şekilde optimize etmeye çalışan bir CPU var mı?


11
Bilgisayar bilimlerinde gerçekten zor iki sorun olduğu söylenir: önbellek geçersiz kılma, işleri iyi adlandırmak ve tek tek hatalar. Bu, bunlardan birincisinin neden zor olduğunun bir örneğidir.
Mason Wheeler

@poncho, "önbellek davranışını dinleyebilen biri yaptığım şeyi çıkaramamalı " diyorsunuz . Şimdi bazı CPU'lar veri gerçekten güncellenmedikçe önbelleği geçersiz kılmayan bu "akıllı geri yazma" özelliğini uygularsa, bellek hiyerarşisinde CPU'dan bir seviye daha uzaklaşarak trafik / zamanlama gözlemlenebilir gerçek yazılar ile sahte yazılar arasındaki farklar. Endişe duyduğunuz şey bu mu?
TheCodeArtist

@poncho Ayrıca, asıl sorunuz kullanım bilgilerine sızmayan daha iyi ayrıcalıklı / güvenli bir mod uygulamaktır. Belki bunu sormalısın? ...
TheCodeArtist

1
@TheCodeArtist: saldırı programının paylaşılan önbelleği izlemesini sağlayarak, aynı CPU'nun farklı bir çekirdeğinde çalışan başka bir program tarafından bir şifreleme rutininin saldırıya uğrayabileceği kriptografik yanal saldırılar yayınlandı. Böyle bir programın L1 önbellek satırlarının boşaltıldığını potansiyel olarak algılayabileceğine ve böylece CPU tartışılan optimizasyonu yaparsa ilgilendiğim program hakkında bilgi çıkarabileceğine inanıyorum. CPU'yu veya işletim sistemini değiştirme yeteneğini varsaymadığım için 'güvenli mod' hakkında konuşmuyorum.
panço

4
Bu bugün geçerli olsa bile, yarın doğru olacağı garanti edilmez.
pjc50

Yanıtlar:


4

Saatler süren aramalardan bu optimizasyonu kullanan bir CPU bulamadım. Bahsedilen optimizasyonların çoğu genellikle okuma / yazma işlemleri ve veri erişimi ile isabet / kaçırmayla ilgilidir:

(sayfa 7 ve) https://cseweb.ucsd.edu/classes/fa14/cse240A-a/pdf/08/CSE240A-MBT-L15-Cache.ppt.pdf

Ancak bu, bu optimizasyonun yapılamayacağı anlamına gelmez. Genel olarak, bir CPU önbellek hattının boyutuna programlı olarak erişmek mümkündür. Önbellek kayıtlarında mevcut değerlere erişmek de mümkündür - ancak bunu yapmak biraz tehlikelidir. Yanlış kayıtlara kötü bir zamanda erişirseniz, çalışan bir programla ilgili kayıtlara müdahale ediyor olabilirsiniz. Veya okumaya çalıştığınız satırların içeriğini yanlışlıkla değiştirebilirsiniz.

Yazıcının önbelleğinde geçerli değeri elde etme

Ayrıca, tüm teorik çözümler bir çeşit yazılım uygulaması gerektirir (montajcı). Bulduğum en yakın, önbellek manipülasyonuna izin verdiği anlaşılan ARM mimarisi ile ilgilidir. Buna ek olarak, istediğiniz CPU için bir önbellek hattının boyutunu da bilmeniz gerekir. Önbellek içeriğini bellekteki ikincil bir konuma, satır boyutundaki artışlarla dikkatlice okuyabilir ve bunu kayıtlara (veya bu durumda L1 önbellek satırlarına) yazmak üzere olan verilerle karşılaştırabilirsiniz.

CPU önbellek içeriğini okuma

Oradan, aynı yeniden yazma işlemlerini önleyen yazılım tabanlı bir sistem tasarlayabilirsiniz. Bu biraz basitleştirilmiş olsa da, çözüm mevcut olan herhangi bir CPU için uygulanabilir olmalıdır.

Önbellek tutarlılığı ile ilgili bulduğum başka bir olasılık:

Vikipedi makalesinden acche tutarlılığı ile ilgili pasaj

Bu konu ile ilgili olarak dikkatimi çeken ana nokta Snarfing açıklamasıydı:

İkinci bir ana ana bellekteki bir konumu değiştirdiğinde, bir bellek konumunun kendi kopyasını güncellemek amacıyla önbellek denetleyicisinin hem adresi hem de verileri izlediği bir mekanizmadır. Önbelleğin bir kopyasının bulunduğu bir konuma yazma işlemi gözlendiğinde, önbellek denetleyicisi, dağıtılmış bellek konumunun kendi kopyasını yeni verilerle güncelleştirir.

Başka bir deyişle, halihazırda yürürlükte olan mekanizmalar vardır. Sadece önerdiğiniz optimizasyon için kullanılmayabilir. Okuma / yazma karşılaştırmasını gerçekleştiren bir yazılım uygulamanız gerekir.


Önbellek kayıtlarında mevcut değerlere erişmek de mümkündür - ancak bunu yapmak biraz tehlikelidir. Ha, bu hiç mantıklı değil. CPU kayıtları mı demek istediniz? Derleyici tarafından oluşturulan veya elle yazılmış asm kodu, üzerinde çalıştığı değerleri tutmak için kayıtlar kullanır ...
Peter Cordes

Bunu yazılımda uygulamaya çalışıyorsanız, derleyicinin if (mem != x) { mem = x; }yerine kodu üretmesini istersiniz mem = x;. Bu yalnızca bazen çok iş parçacıklı bir programdaki paylaşılan önbellek satırları için bir optimizasyondur, çünkü yazma diğer iş parçacıklarının okumasına müdahale eder.
Peter Cordes

1
"snarfing" in bununla hiçbir ilgisi yoktur. Sadece pasif gözetleme. CPU önbellekleri , uyumlu geri yazma önbelleklerine sahip olabilmeleri için MESI kullanır .
Peter Cordes

@PeterCordes Cevabımı tatsız bulursanız özür dilerim. Ancak, bu konuda benden daha fazla içgörüye sahip olduğunuz görülüyor. Peki neden soruyu kendiniz cevaplamıyorsunuz?


3

L1 önbelleğine yazmak çok, çok zaman açısından kritik bir işlemdir.

Aynı verilerin tekrar yazılması oldukça nadir görünmektedir. Bu durumda işleri hızlandıran bir optimizasyon, toplamda çok fazla hızlanmayacaktır.

Öte yandan, bu optimizasyon, önbelleğe her yazma işleminde eski verilerin ve yeni verilerin karşılaştırılmasını gerektirir. Bunu daha da kötüleştiren şey, yazılacak verinin yazma sırasında gerçekte erişilebilir olmasını gerektirmesidir!

Modern bir CPU'da genellikle durum böyle değildir. Örneğin yazılacak veriler hala hesaplanıyor olabilir. Önbellek yine de devam edebilir, gerekirse önbellek satırını yükleyebilir, hesaplama bitmeden önce bile önbellek satırını değiştirilmiş olarak işaretleyebilir ve bu şekilde devam edebilir. Önbellek satırının gerçekte değiştirilmesi dışında, tüm defter tutma zaten gerçekleştirilebilir. Yeni yazılan sonucu ve eski önbellek satırı verilerini karşılaştırmak istiyorsanız, bu mümkün değildir.

Örnek olarak, C kodunuz varsa a [i] = x / y; x / y bölümünün çoğu CPU'da gerçekleştirilmesi olağanüstü uzun zaman alır. Ancak, sonucu bir [i] 'de saklamak için gereken çalışmaların çoğu bölüm tamamlanmadan çok önce gerçekleşti; eksik olan tek şey sekiz sonuç baytının önbellek satırına taşınmasıdır. Önbellek hattını temizleyen bir işlem, bölüm tamamlanana kadar otomatik olarak bekler. Sonucu doğrudan bölücüden almak için [i] 'yi okuyan bir işlem yeniden yönlendirilecektir.


Tutarlılık için MESI kullanan bir önbellek yine de RFO'yu yapabilir, ancak veriler hazır olduğunda aynı karşılaştırıldıysa, satırı Değiştirildi yerine Özel durumunda bırakın. Donanımda yapılmamasının gerçek nedeni, veriler önbelleğe alınırken ekstra önbellek okumalarına mal olması ve onu emmek için bir çeşit atomik okuma / karşılaştırma / yazma döngüsü (kirli bitin isteğe bağlı ayarı ile) gerektirmesidir. ardışık düzen.
Peter Cordes

1

Olası bir optimizasyon, önbelleğin yazma içeriğini ve önbelleğin önceki içeriğini karşılaştırmasını sağlamaktır ve eğer aynıysa, satırı kirli olarak işaretlemeyin

CPU'nun önbelleğe bir şey yazması için gereken süreyi iki katına çıkarmayacak mısınız? Çünkü her önbellek satırına şimdi ücretsiz olmayan bir karşılaştırma işlemi eşlik edecek.

Yani, aslında optimizasyon çok belirsiz bir faktöre bağlı olacaktır: ortalama bir yazılımın önbelleğe alınabilir belleğini kaç kez aynı verilerle yeniden yazdığı.


Bu karşılaştırma CPU mantığı içinde uygulanacaktır. Ek bir CPU işlemi gerektirmez, ancak sinyal süresi artabilir, bu da bir sorun olabilir veya olmayabilir.
ziggystar

@ziggystar Ben bir donanım ustası değilim, ama her şeyin bir bedeli olduğu düşüncesine alıştım. İşlemi önbellek satırıyla karşılaştırır. Hızlı olabilir. Ama bu hala maliyet. Bence uygulayıcılar ödememeye karar verdiler. Bazı düşünce ve ölçümlerden sonra bile olabilir.
Vladislav Rastrusny

1
Ancak, maliyetin sadece kapı sayısında bir artış olabileceği zamandan bahsediyorsunuz.
ziggystar

1
@ziggystar: Bu sadece daha fazla kapı değil. Veriler önbelleğe gönderildiğinde, normalde veri gönderme işlemi önbellek satırını değiştirilmiş olarak işaretleyebilir. Bu "optimizasyon" ile, hem eski verilerin hem de yeni verilerin bir miktar gecikmeye neden olacak şekilde bu kapılardan geçmesi gerekir ve ancak o zaman önbellek geçersiz kılınabilir. Tüm bunları bir işlemci döngüsüne sıkıştırmanız gerekir, aksi takdirde bir önbellek satırına yazmak aniden iki döngü alır. Ve şimdi işleri daha karmaşık hale getirmek için, önbellek satırına art arda sekiz kelime yazdığımda ne olacağını düşünün.
gnasher729

1
Bu yazıların her biri, önbellek satırının değiştirilip değiştirilmeyeceği kararını geciktirir. Dolayısıyla, ikinci yazma gerçekleştiğinde, önbellek satırı değiştirilip değiştirilmediğini (henüz) bilmez. Eğlenceli olacak.
gnasher729
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.