İşlemcinin L1 ve L2 önbelleklerini nasıl devre dışı bırakabilirim?


10

Ubuntu 14.04'te (tercihen Python gibi daha yüksek bir dilde) L1 ve / veya L2 önbelleğini devre dışı bırakmak mümkün müdür? Öyleyse nasıl?

Ayrıca, önbelleğin devre dışı bırakılması farklı mimariler arasında önemli ölçüde farklılık gösterecek mi? Eğer öyleyse, bir ARM Cortex-A15 ile daha fazla ilgileniyorum.

DÜZENLE

Önbelleğin nasıl devre dışı bırakılacağını araştırırken kernel.org belgelerinden / proc / sys / vm / dizinindeki "drop_caches" dosyasını öğrendim

"Buna yazmak çekirdeğin temiz önbelleklerin yanı sıra takma dişler ve inotlar gibi geri kazanılabilir levha nesnelerini düşürmesine neden olur. Bırakıldığında bellekleri serbest kalır."

...

"Bu dosya, çeşitli çekirdek önbelleklerinin büyümesini kontrol etmek için bir araç değil (inode, dentries, pagecache, vb.) Bu nesneler, sistemin başka bir yerine bellek gerektiğinde çekirdek tarafından otomatik olarak geri kazanılır."

Bu aradığım şey gibi görünmüyor, çünkü bu sadece önbelleği devre dışı bırakacak gibi görünmüyor, sanal belleğin donanımda değil işletim sisteminde olduğunu düşündüm. Amacım önbelleği devre dışı bırakmaktır, böylece istenen bellek RAM gibi başka bir yerde aranmalıdır.

DÜZENLE

Açıklığa kavuşturmak için önbelleği devre dışı bırakmanın sisteme ne yapacağını anlıyorum. Bununla birlikte, güvenlik açısından kritik uygulamalar için güvenilirliği artırmak amacıyla uzay uygulamalarında kullanılan yaygın bir tekniktir. İşte bu fenomeni belgeleyen bazı kaynaklar:

Önbelleklerle gömülü yazılım radyasyona bağlı arızaları azaltma

Uzay Radyasyon Ortamında Mikroişlemcilerin Yer Radyasyon Testi için Kılavuz

Konuyla ilgili kitaplar bile var:

Elektronikte İyonize Radyasyon Etkileri: Anılardan Görüntüleyicilere


Önbelleği devre dışı bırakmak gibi şeyler yapmaya çalışıyorsanız, katıştırılmış programlama yapıyorsunuz, katıştırılmış programlama yapıyorsanız, muhtemelen katıştırılmış bir dil (C) kullanmalısınız ve bir işletim sistemi kullanmam. Bir kenara devre dışı bırakmak önbellek sisteminizi büyük ölçüde yavaşlatacak.
Sam

Sistemimi önbellek olmadan hızlandırmanın başka yolları var, ancak önbelleği devre dışı bırakıp karşılaştırmaları çalıştırana kadar bu yöntemlerin ne kadar etkili olduğunu söyleyemem. Yerleşik uygulamalar için C veya montajın tercih edilen seçenek olduğunun çok farkındayım. Ancak, Python'da daha mantıklı olan birkaç üst düzey şey oluyor. Python'un özel uygulamam için önbelleği devre dışı bırakmak gibi bir şey yapmak için destek alması daha uygun olurdu. İşletim sistemini sıyırmaya gelince, çıplak metal benim için maalesef bir seçenek değil.
16:18, AustinTronics

Yanıtlar:


2

Bunu yapmak için bir çekirdek modülüne (ve bu modülü yüklemek için kök haklarına) ihtiyacınız olduğundan, doğrudan Python'da yapamazsınız.

L1 önbelleğini geçersiz kılmak için gerekenler için http://lxr.free-electrons.com/source/arch/arm/mm/cache-v7.S#L21 adresine bakın (geçersiz kılın, devre dışı bırakmayın).

Farklı CPU mimarileri (örn. X86 vs ARM) önbelleği devre dışı bırakmak için farklı montaj kodu (CPU talimatları) gerektirir. Linux çekirdeğinin L1 / L2 / L3 / L4 önbelleklerini devre dışı bırakma olasılığı olup olmadığından emin değilim ve eğer olurdu, CPU yavaş olduğu için dahili olarak sadece kısa bir süre için kullanılacağına inanıyorum bu önbellekler olmadan.

Bkz Linux sisteminde devre dışı işlemci önbelleği (L1 / L2) için bir yol var mı? x86 / x64 sistemindeki önbelleği nasıl devre dışı bırakabileceğinize ilişkin bir bağlantı için (kaydı değiştirmeniz gerekir cr0). ARM için Önbellek devre dışı davranışını kontrol edin .

CPU önbelleklerinin ne yaptığını tamamen anladığınızdan emin değilim. Sisteminizin performansını neden sakatlamak istediğinizi açıklayabilir misiniz?


Uygulama, havacılık için yüksek performanslı gömülü hesaplamadır. Çalışma zamanı uygulamam için performanstan daha önemlidir. Bunun garip geldiğini biliyorum, ancak fenomen iyi belgelenmiştir.
16:55

CPU önbelleği olmadan nasıl "yüksek performanslı" bir uygulamanız olabilir? Önbelleklerin çalışma süresi ile ne ilgisi var?
tehnicaorg

2
Ar-Ge'de yazılım geliştiriciyim, birçok çılgınca şey yapıyoruz. Yanıtlarım boyunca bilgi bıraktığım veya belirsiz olduğum için üzgünüm, ancak uygun bilgi olduğu için istediğim kadar giremiyorum. Önbellek, havacılık ve uzay uygulamalarında çalışma süresi ile ne ilginizi çekiyorsa, burada halka açık bir JPL kağıdı bulunmaktadır . İşte üzerinde de bir günlük gazetesi .
AustinTronics

1
İronik olarak, L1 önbelleğini devre dışı bırakmak bugün mantıklı!
Yüzük Ø

4

Bunu küçük bir ASM koduyla yapabilirsiniz, Intel Sistem Programlama Kılavuzu'nun 11. bölümüne bakın

11.5.3 Önbelleğe Alma İşlemini Önleme

L1, L2 ve L3 önbelleklerini etkinleştirildikten ve önbellek dolgularını aldıktan sonra devre dışı bırakmak için aşağıdaki adımları gerçekleştirin: 1. Dolgusuz önbellek moduna girin. (CR0 kontrol kaydındaki CD bayrağını 1 ve NW bayrağını 0 olarak ayarlayın. 2. WBINVD komutunu kullanarak tüm önbellekleri temizleyin. 3. MTRR'leri devre dışı bırakın ve varsayılan bellek tipini önbelleğe alınmamış olarak ayarlayın veya önbelleğe alınmamış bellek tipi için tüm MTRR'leri ayarlayın (bkz. Bölüm 11.11.2.1, “IA32_MTRR_DEF_TYPE MSR”, TYPE alanı ve E bayrağı tartışması).

Bunu uygulayan bir Python modülünün farkında değilim.

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.