Neden tek bir iş parçacığı CPU'lar arasında yayılır?


24

Zamanlayıcının neden bir uygulamayı bir uygulamada tutmak yerine sürekli CPU'lar arasında taşıdığını merak ediyorum. % 100'de bir değil,% 25'te 4 çekirdeğe sahip olmak biraz saçma görünüyor.

Isı ile ilgisi var mı, yoksa bir şekilde daha mı verimli? Diğer işletim sistemleri farklı mı?

Derinlemesine şeyler için içgörü veya bağlantılar iyi olurdu. (Kendimi pek bulamadım.)

Güncelleştirme:

“Yayılma” derken, bir seferde birkaç cpu'nun üzerinde çalıştığını kastetmiyorum, ancak saniyede birkaç kez birinden diğerine taşınıyor ve yayılmış gibi görünmesini sağlıyor.


3
"Başka hiçbir şey yürütülmese" bile, her zaman CPU için rekabet eden sistem dizileri vardır. Örneğin, O / S geri kazanılmış bellek sayfalarını sıfırlamak için bir iş parçacığına sahiptir, bu yüzden bellek gerektiğinde, bazı sayfaları çalışmaya hazır hale gelir. İş parçanız yeniden yürütmeye başladığında, bulunduğunuz işlemci bu iş parçacıklarından biri tarafından kullanılıyor olabilir. Os ne yapmalı? Bekle ya da seni yeni bir cpuya mı taşıdın? Ne yaparsa yapsın, bazı durumlarda istenmeyen davranışlarla karşılaşırsın.
Tony Lee,

Bu bir goomba. SMB, LBP değil. :)
Macke

"Cevabımda", açıkladığınız gibi davranan tek bir iş parçalı bir program gösterdim, yani "saniyede birkaç kez birinden diğerine taşınmak, yayılmış gibi görünmesini sağlamak."
Evan Rosica

Yanıtlar:


8

Bence wierobkonuyu oldukça iyi açıkladı.
İşte bir olduğunu yaşlı makale tartışan processor affinitybir dört çekirdekli ile ayarları QX6800 .
(bağlantı bu makalenin ikinci sayfasına işaret eder).

Proses afinitesini bir çekirdeğe zorlamazsanız, performansta gevşek misiniz ?

  • İken , Windows zamanlayıcı önbelleklerine ile önlemek dayak böyle yakınlık karar vermesi gerekiyor, işlemci tasarımı kendisi de böyle şeyler düşünmektedir.
  • Dört çekirdekli Intel QX6800 (bu yanıtta daha önce bahsettiğimden beri) 4 çekirdeğinde paylaşılan 8 MB'lık bir önbelleğe
    sahip .L3

Sadece bu tek iş parçacıklı bir işlemi sistemde çalıştırmayı seçmiş olsanız da, işletim sisteminin kendisinin de zamanlanmış olması gereken çalışan başka görevleri olacağı belirtilmelidir. Zamanlayıcı, tüm bu etkinlikleri mevcut işlemci havuzunda (veya çekirdeklerinde) dengeler.


İle, Bundan sonra Nehalem mimarisi ve NUMA ,
çoklu priz genelinde işlemciler de daha iyi adres erişimine thrash mümkün olacak.
İşte NUMA'daki bir ArsTechnica sayfasından kısa bir resim .

görüntü tanımını buraya girin

Nehalem ve i7sizi ilgilendiren ise , bu cevaba biraz daha bağlarım var .


“Nehalem mimarisi ve NUMA ile birlikte, birden fazla yuvadaki işlemciler aynı zamanda erişim thrash'ine daha iyi hitap edebileceklerdir” diye düşündüren şeydir. ? Gördüğüm gibi, NUMA belleği daha yerel ve özel işlemci ile ilgili yapıyor, bu yüzden paramparça etmenin kötüleşmesine neden oluyor.
Roland Pihlakas,

@RolandPihlakas, bu cevabın üzerinden çok zaman geçti, ama arstechnica makalesine ve bu noktalara baktığımda, yeni platformların daha iyi hafıza bağlantısına sahip olma yeteneğini ve bundan faydalanacak yazılımı (bu seçeneğe sahip olmamaktan ötürü) hesapladığımı düşünüyorum. o sırada çoklu soket konfigürasyonları, yani Nehalem'den önce).
nik

6

Zamanlayıcı, yalnızca "serbest" bir çekirdek / CPU'da çalışmaya hazır olan bir sonraki iş parçacığını çalıştırır.

Windows görev yöneticisi aracılığıyla belirli bir CPU'ya bir işlem atayabilirsiniz.

% 25'te 4 çekirdeğe sahip olmak, 4 ipliğin aynı anda yürütüldüğü anlamına gelir. Oysa, x% 'deki bir çekirdek, yalnızca bir ipliğin yürütüldüğü anlamına gelir. Yani eski bazı durumlarda daha verimlidir.

Ancak yürütülmesi sırasında CPU'nun önbelleği, iş parçacığı tarafından erişilen verilerle doldurulur. Bu nedenle, iş parçacığı başka bir CPU'da yürütülürse, veriler bu CPU'nun önbelleğinde olmadığı için pahalı olan önbellek kayıpları ile karşılaşır.

Konu ne yapıyor? İplik çok kısa bir süre boyunca "uyuyorsa", daha önce yürütülmüş olan çekirdek başka bir tehdit tarafından ele geçirilmiş olabilir ve bu nedenle ipliğiniz bir sonraki uygun çekirdeğe geçirilir. Süreciniz tarafından kullanılacak tek bir çekirdek belirlerseniz ne olur (örneğin, bir görev yöneticisi)?


3
Afaik Windows Zamanlayıcı, bu sorunu önlemek için bu süre boyunca aynı cpu / çekirdek üzerinde konuları tutmak için oldukça iyi bir iş yapıyor.
Paxxi

@ Pär: Benim iş parçacığım aslında her çekirdekte çalışıyor gibi görünüyor.
Macke

Evet, muhtemelen iş parçacığımı çevreleyen OS işlemcileridir. İki cevap nasıl kabul edilir? :)
Macke

@ PärBjörklund tecrübelerime göre en azından Windows XP yok. Sanırım "önbellek sıçrayan" sorunu Vista'da veya daha sonra
giderildi

1
"% 25'te 4 çekirdeğe sahip olmak, 4 iş parçacığının aynı anda yürütüldüğü anlamına gelir." Hayır, bu bir iş parçacığının bir çekirdeğin üzerinde bir bit, daha sonra bir diğeri gibi yürütüldüğü anlamına gelir. Görev Yöneticisi ortalama kullanımı gösterdiğinden, her bir çekirdek için% 25 (4 çekirdekli bir sistemde, iki çekirdekte% 50 gösterecektir) gösterecektir. Bu, çekirdeğin dörtte bir oranında tamamen kullanıldığı ve zamanın boşta kaldığı anlamına gelir.
David Balažic

0

Değil. Bir iş parçacığı yalnızca bir işlemcide çalışabilir. Bununla birlikte, bazı işlemlerde yayılabilen çok sayıda iplik vardır.

Akıl yürütme, ister inan ister inanma, neye benzediğini hiç düşünmedim. Sistem, dişleri açmaya çalışır çünkü birinin ne zaman fırlayacağını bilmenin bir yolu yoktur.


1
Ek açıklamamı görün. Bu, tam gazda çalışan, zaman içinde her bir çekirdeğin (önden dışarıya)% 25 meşgul olması için hızla hareket eden bir ipliktir. (Diğer tüm işlemler / iş parçacığı ihmal edilebilir)
Macke

0

İşletim sistemi iş parçacığını CPU çekirdeği boyunca geçirir (hızlı, saniyede birkaç kez). Her zaman aynı çekirdekte çalıştırmak daha verimlidir. Bu, Görev Yöneticisi'ndeki "Benzerliği ayarla" içerik menüsü öğesi tarafından zorlanabilir.

Genellikle (tipik ev kullanımı) farkın birkaç yüzdelik aralıkta olduğunu unutmayın.

"Her biri% 25 kullanımda 4 çekirdek", Görev Yöneticisi'nin ortalama kullanımda gösterdiği gibi, her bir çekirdeğin dörtte bir oranında tamamen kullanıldığı ve geri kalan zamanın ücretsiz olduğu anlamına gelir.

Açıklama Windows içindir, ancak diğer işletim sistemlerinde de benzerdir.


-1

Eğer biri hala bunu okuyorsa, ben de bunu farkettim ve bunun sadece bir şans olmadığını görmek için epeyce test yaptım. Görünen o ki öyle değil! Tüm çekirdeğe tek bir iplik yaymanın çeşitli nedenlerle daha etkili olduğuna inanıyorum:

  1. Tüm dişlere bir iplik geçirme daha düşük güç tüketimi sağlar. Çoğu işlemci frekanslarını düşürür ve daha da önemlisi yüke göre voltajı düşürür, bu nedenle örneğin bir Core 2 Quad çok daha az güç tüketir ve bir çekirdeği bir çekirdeği kullanmak yerine 4 çekirdeğin tamamına dağıtarak daha az ısı üretir. TÜM çekirdeklerde voltajın yükselmesine neden olur, çünkü yalnızca bir voltaj regülatörü * vardır - bu oldukça etkili değildir).
  2. İpliğin daima maksimum / sabit hızda çalışmasını sağlar. İplik aniden daha fazla işlem gücü isterse, bir çekirdek aşırı yüklenebilir ve uygulamada bir gecikme olur. Çekirdekler üzerine yayarak, ani herhangi bir yükseliş gecikme ve gecikme olmadan sorunsuz bir şekilde ele alınacaktır.

Ayrıca, yukarıdaki iki gözlem nedeniyle, Turbo Boost ve IDA'nın etkisiz olduğuna inanmaya başladım. Eski işletim sistemlerinde yararlı olabilirler, ancak Linux ve Windows 7 her şeyi tüm çekirdeklere oldukça verimli bir şekilde yayar. Böylece, bir Core 2 Quad q9100 @ 2.26 GHz neredeyse olacaktır (her zaman istisnalar vardır :-) daima Core 2 Duo X9100 @ 3.06GHz'den daha hızlıdır ve IDA kullandığını nadiren gördüm (temelde Turbo boost'un öncüsü, yalnızca tek iş parçacıklı uygulamalar için bir veya iki çekirdekteki frekansı artırır).

  • Core 2 Quad, iki fiziksel kalıp olduğu için iki saat alanına sahiptir, böylece iki çekirdek tam frekansta, ikisi de en düşük frekansta çalışabilir. Gerçi iki voltaj regülatörü olup olmadığını bilmiyorum - Gerilimin 4 çekirdeğin hepsinde tekdüze olduğunu fark ettim, bu nedenle paketin tamamı için yalnızca bir regülatör olması gerekir.

3
Bu birkaç nedenden dolayı şüpheli geliyor. Lütfen "gerçeklerinize" referanslar sağlayın. Birincisi, neden dört çekirdekli bilgisayarlarda% 25'teki bilgi işlem, bir tanesinde% 100'den daha az güç harcıyor? (Sıcaklığın daha eşit yayıldığına katılıyorum, ama ...) Ayrıca, sorumdaki iş parçacığı tam eğimde çalışıyor (% 100), bu yüzden "daha fazla işlem gücü talep etmiyor", çünkü zaten yapıyor mümkün olduğunca.
Macke

Evet, bu sadece kendi gözlemlerimden - IDA ve TurboBoost'un ilgisini çektim, bazı testler yapmaya karar verdim. Bir süre önceydi, ancak yukarıdaki sonuçlara vardım. Tüm çekirdekler daha düşük bir voltajda çalıştığı için işlemci daha az güç tüketir - 0,1V'lik bir azalma güç tüketiminde yaklaşık 6-10 Watt tasarruf sağlar (bir çekirdek% 100 yüklü ise, tüm çekirdekler boşta olsunlarsa daha yüksek bir voltajda çalışır) ya da değil). Bu özellikle SLFM modlu Core2Duo'da geçerlidir. Tam tiltle çalışan ve daha fazla işlemci taktisi istemediğiniz konusunda haklısınız, ancak bunu gerçekten yapan uygulamalar var.
JakL

"İplik yaymak" diye bir şey yoktur (hayır, 5 yıl sonra bile). Bir çekirdekte yürütülen tek bir iplik var. Ve sonra bir başkasına. Ve bunun gibi. Her anda bir çekirdek% 100 çalışıyor ve diğerleri rölantide. Yani tasarruf yok. Özellikle de tüm çekirdeğin her zaman tam voltaj olduğu zaman bahsettiğiniz gibi (dediğiniz gibi, voltajı paylaşırlar). Ayrıca, önceden aynı çekirdekte olmak gibi ele alındığında, ipliğin var olan tüm işlem gücünü almasını sağlar. Bu çekirdek zaten% 100 kullanılmış olduğundan, işletim sistemi diğer daha az kullanılan çekirdeklere başka dişlileri zamanlayacaktır.
David Balažic
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.