2009-11-03 29 views
6

Visual C++ belgelerinde, aynı nesneden birden çok ileti dizisinin okunmasının güvenli olduğunu okudum.Çoklu konu ve bellek

Soruma şudur: X86-64 CPU birden çok çekirdeği nasıl kullanır?

1 MB bellek belleğiniz olduğunu varsayalım. Aynı veriyi aynı anda tam olarak okuyabilen farklı nesneler var mıdır yoksa çekirdekler bir seferde tek bir kelimeyi okuyorlar mı?

cevap

4

Sadece farklı çekirdekler bellek aynı blokta okunan izin verilir, bunlar aynı anda yazmak için izin konum çok. Eğer "güvenli" ya da değil ise, bu tamamen farklı bir hikaye. Özel olarak izin vermediğiniz şekilde, aynı bellek bloğu üzerinde çakışan birden fazla çekirdekle korunmak için kodunuzda bir çeşit koruma (genellikle semaforlar veya türevleri ile yapılır) uygulamanız gerekir.

Bir çekirdek her seferinde okur, bu genellikle bir kayıt değerinin 32bit işlemci üzerindeki 32 bit, 64 bit işlemci için 64 bit ve bu şekilde devam eder. Akış bile dword tarafından dword yapılır (örneğin memcpy'ye bakın).

Eşzamanlı çoklu çekirdeğin gerçekte nasıl olduğu hakkında her çekirdek, belleğe okuma ve yazma için tek bir veriyolu kullanır, böylece herhangi bir kaynağa (ram, harici aygıtlar, kayan nokta işlem birimi) erişmek, bir kerede bir istektir bir anda çekirdek. Ancak çekirdeğin içindeki gerçek işlem tamamen eş zamanlıdır. DMA transferleri de otobüsü engellemez, eşzamanlı transferler sıraya alınır ve bir seferde işlenir (bence bu konuda% 100 emin değilim).

düzenleme: sadece açıklamak için, burada diğer yanıtın aksine, sadece bir önbellek senaryosundan bahsediyorum. Tabi ki hafıza önbelleğe alınmış salt okunur erişime sahipse tamamen eşzamanlıdır.

+1

Herhangi bir bellek erişimi, modern işlemciler için gerçekten büyük bir önbellek hattı = 64 bayta sahiptir. Önbellek hattına erişim atomiktir. Hatlar okumak için çekirdekler tarafından paylaşılabilir. – osgx

8

1MB'lık bloğunuzda gerçekten hiç yazma yok, evet, her çekirdek, hiçbir yazma işlemi yapılmadığı için kendi önbellek satırından okuyabilir ve bu nedenle önbellek tutarlılığı sorunları ortaya çıkmaz.

Çok çekirdekli bir mimaride, temel olarak her çekirdek için bir önbellek ve en fazla güncel bilgiye sahip olmayan bazı çekirdeklerdeki önbelleği geçersiz kılan bir "Önbellek Uyumluluk Protokolü" bulunmaktadır. Çoğu işlemcinin, önbellek tutarlılığı için MOESI protocol uygulandığını düşünüyorum.

Önbellek tutarlılığı, büyük ölçüde tartışılan karmaşık bir konu (özellikle Joe Duffy'nin bazı makalelerini beğendim here ve here). Tartışma yine de, serbestçe kilitlenirken, önbellek tutarlılığı protokolünün, işlemci önbellekleri arasında tutarlılığı sağlamak için tekme atması nedeniyle yavaşlayabilen, ancak hiçbir yazım olmadığı sürece kodun olası performans cezaları etrafında dönüyor. sürdürmek için tutarlılık ve dolayısıyla performans kaybı olmaz.

Açıklamada da belirtildiği gibi, yalnızca x86 ve x64 mimarileri tek bir veriyolu üzerinde paylaşılan ve aynı anda ana belleğe erişme hakkını garantileyen SMP numaralı çekirdekler arasında paylaşıldığı için RAM'e aynı anda erişilemez. Bununla birlikte, bu durum her bir çekirdeğin kendi veri kopyasına sahip olmasını sağlayan her bir çekirdek önbellek tarafından gizlenir. 1MB'lık veriler için çekirdek önbelleğini güncellerken bazı çekişmelere maruz kalmak mümkün olabilirdi, ancak bu göz ardı edilebilir olurdu.

Bazı yararlı linkler:

+0

Genel olarak bugün doğru cevap. RAM'in kendisi birden fazla eşzamanlı erişimi koruyamaz, ancak bu önbelleklerle etkin bir şekilde gizlenir. Ancak birden çok çekirdek önbelleğe alınmamış bir okuma gerçekleştirirse, bu isteklerin hala haklı çıkması gerekir. – MSalters