Bir program neden belirli bir minimum CPU çekirdeği gerektiriyor?


55

N'den az sayıda çekirdeğe sahip olan bir CPU'da çalışırken düzgün çalışmayan bir kod (veya bir kod yerine yazılım tamamlandı) yazmak mümkün müdür? Açıkça kontrol etmeden ve bilerek başarısız olmadan :

EĞER (noOfCores <4) SONRA bilerek düzgün çalışmaz

Bir oyunun ( Dragon Age: Inquisition ) minimum sistem gereksinimlerine bakıyorum ve minimum dört çekirdekli bir işlemci olduğu belirtiliyor. Birçok oyuncu iki çekirdekli işlemcide ve iki fiziksel ve iki mantıksal çekirdeğe sahip Intel Core i3'lerde EVEN'de çalışmadığını söylüyor . Ve bu bilgisayar gücü sorunu değil.

Anladığım kadarıyla, iş parçacıkları işletim sistemi tarafından CPU tarafından tamamen izole edilmiyor çünkü bu yapılamıyor.

Sadece işleri düzeltmek için:

Ben am DEĞİL "Ben kodundan işlemci çekirdeklerinin sayısını öğrenmek, ve amacına başarısız misin?" Soran ... Böyle bir kod kötü niyetli olacaktır (bir programı çalıştırmak için daha pahalı bir CPU almaya zorlar - hesaplama gücüne ihtiyaç duymaz). Örneğin, kodunuzun dört iş parçacığı olduğunu ve iki iş parçacığı aynı fiziksel çekirdeğin üzerinde çalıştığında (sistem bilgisini açıkça kontrol etmeden ve bilerek başarısız olmadan) başarısız olduğunu soruyorum .

Kısacası, birden fazla çekirdekten gelen ilave bilgi işlem gücüne ihtiyaç duymadan birden fazla çekirdek gerektiren bir yazılım olabilir mi? Sadece N ayrı fiziksel çekirdek gerektirir.


11
Sorumu dikkatlice okursanız, aynı şeyi sormadıklarını göreceksiniz.
uylmz

21
Çekirdek sayısı alınabileceği için N ile karşılaştırılabilir ve bu karşılaştırma doğru olarak değerlendirilirse, kod, reklamı yapılmayan şekilde davranmayı da içeren ancak bunlarla sınırlı olmamak üzere, istediği her şeyi yapabilir. Sorunuz nedir?

3
Sorunun gerçekten ve doğrudan çekirdek sayısıyla ilgili olduğundan emin misiniz? Belki de bahsi geçen oyun kısmen CPU tarafından sağlanan ve en az 4 çekirdekli bir özelliğe dayanıyor mu?
mgoeminne

25
"Asgari sistem gereksinimleri" nin genellikle "özellikle oyunlarda" kabul edilebilir performansla çalışmak için minimum sistem gereksinimleri "olduğunu unutmayın. Ejderha Çağı'nın teorik olarak, tek bir çekirdekli kutuda koşması çok muhtemeldir, ancak bunu yaparsanız, büyük karelere düşer. Bu nedenle, sizi donanım satın almaya zorlamamak için değil, düşük kaliteli donanım kullanıcılarının kalite şikayetlerinden kaçınmak için bu sayıda çekirdeğe ihtiyaç duyuyorlar.
Robotu

3
@Sebb: Bence bir şeyin peşindesiniz: 4 fiziksel çekirdek daha fazla önbellek ve 2 fiziksel / 4 mantıkla ilişkiliyse, o zaman oyun doğal olarak 2x2 makinelerde boğuluyor olabilir çünkü tüm işlemlerinde önbellek eksik; saati. Test, 2x2 çekirdekli ve çok fazla önbellek veya 4 çekirdekli ve az önbellekli bir CPU bulmak ve ne olacağını görmek olacaktır.
Steve Jessop,

Yanıtlar:


45

Çekirdek afinitesinin dikkatsiz kullanımıyla bunu "kazayla" yapmak mümkün olabilir. Aşağıdaki sahte kodu göz önünde bulundurun:

  • iş parçacığı başlatmak
  • Bu iş parçacığında, hangi çekirdek üzerinde çalıştığını bulmak
  • CPU çekirdeğini bu çekirdeğe ayarla
  • Sonsuza dek hesaplama yoğun / döngüsel bir şeyler yapmaya başla

İki çekirdekli bir işlemcideki bunlardan dördünü başlatırsanız, çekirdek çekicilik ayarında bir şey ters gider veya mevcut çekirdeği ve iki kez zamanlanmış bir diziyi bağlayan iki iş parçacığı ile bitirdiniz. Hiçbir noktada, toplamda kaç tane çekirdek olduğunu açıkça sormadı.

(Uzun süre çalışan iş parçacığınız varsa, CPU benzeşimi ayarlamak genellikle verimi artırır)

Oyun şirketlerinin insanları iyi bir sebep olmadan daha pahalı donanım almaya zorladıkları fikri pek makul değil. Sadece müşterilerini kaybedebilir.

Düzenleme: Bu yazı şimdi eğitimli tahmine dayanarak verilen oldukça fazla 33 33 oy aldı!

Görünüşe göre insanlar DA: Çift çekirdekli sistemlerde fena koşuyorum: http://www.dsogaming.com/pc-performance-analyses/dragon-age-inquisition-pc-performance-analysis/ Bu analiz Hiper-dişi açıldığında durumun büyük ölçüde düzeldiğini belirtir. HT'nin başka herhangi bir talimat sorunu birimi veya önbellek eklemediği göz önüne alındığında, yalnızca bir iş parçacığının çalışmasına izin verir, bir başkası bir önbellek kabini içindeyken, yalnızca iş parçacığı sayısıyla bağlantılı olduğunu kuvvetle önerir.

Başka bir poster, grafik sürücülerini değiştirmenin işe yaradığını iddia ediyor: http://answers.ea.com/t5/Dragon-Age-Inquisition/Working-solution-for-Intel-dual-core-CPUs/td-p/3994141 ; Grafik sürücülerinin perişan bir pislik ve villany kovanı olma eğiliminde olduğu göz önüne alındığında, bu şaşırtıcı değil. Ünlü şöförlerden oluşan bir set, QUAKE.EXE'den çağrıldığında seçilen "hızlı ve yanlış" kipine karşı "doğru ve yavaş" modunu kullanıyordu. Sürücülerin farklı sayıdaki görünür CPU'larda farklı davranması tamamen mümkündür. Belki (spekülasyona geri dönersek) farklı bir senkronizasyon mekanizması kullanılır. Spinlockların yanlış kullanılması ?

"Kilitleme ve senkronizasyon ilkellerinin yanlış kullanımı" çok, çok yaygın bir hata kaynağıdır. (Bu yazıyı yazarken işte aramam gereken hata "yazıcı ayarlarını yazdırma işi bittiği zaman değiştiriyorsanız kilitlenmedir").

Düzenleme 2: yorumlar, işletim sisteminin iplik açlığından kaçınmaya çalıştığını belirtiyor. Oyunun, konulara iş atamak için kendi yarı-zamanlayıcıya sahip olabileceğini ve grafik kartının kendisinde (etkin bir şekilde kendi başına bir çoklu görev sistemi olan) benzer bir mekanizma olacağına dikkat edin. Bunlardan birinde bir hata şansı veya aralarındaki etkileşim oldukça yüksektir.

www.ecsl.cs.sunysb.edu/tr/ashok.pdf (2008), normalde ilk kez ilk olarak sunulan programı kullanmaları gerektiğini açıkça ifade eden grafik kartları için daha iyi zamanlama üzerine yüksek lisans tezidir. önleyici olmayan sistemler. Durum düzeldi mi? Muhtemelen değil.


1
Evet, bu soruyu cevaplamak için iki bölüm var: CPU benzeşimi, Windows'ta bunu teknik bir gereksinim haline getirecek bir şeyi kodlamaya izin veriyor, alternatif cevap, gerçek zamanlı sistemlerin kesinlikle bu tür şeyleri gerektirebileceğidir. Burada sorulan şey için gerçekten en muhtemel suçlu olan CPU benzeşiminden bahseden tek kişi olarak +1.
Jimmy Hoffa,

3
Geçerli çekirdeğe yakınlığı ayarlarsanız ne yanlış gidebilir? Preemptive çok görevli ile bekleyen iplik olacak cari biri mümkün olan maksimum öncelik (Windows "gerçek zamanlı") olmadıkça planlanabilir. Başka bir senaryo görecektim: 4 iş parçacığının her birine, 1,2,4,8'lik statik olarak tanımlanmış benzeşme atanmış, bu durumda sonraki iki iş parçacığı hiçbir zaman programlanmayacak (etkinliğe yakınlık ayarlayıp ayarlamayacağından emin olmasam da) sıfır başarılı olacak).
Ruslan

@Ruslan Belki de geçersiz yakınlık ayarlamaya çalışmak, her şeyden önce uygulamayı çökertirebilir mi?
Luaan

1
@Luaan de bu değil o çökmesine neden riskli bir operasyon. Beklediğim maksimum OS tarafından döndürülen bir hatadır. Az önce kontrol ettim, Linux'ta "Geçersiz bağımsız değişken" hatası alıyorum. Windows'un ne söyleyeceğini bilmiyorum.
Ruslan

@Ruslan 10 yıldan uzun bir süredir her büyük işletim sistemi, iş parçacığının aç kalmasını önlemek için kod içeriyor (genellikle yeterince uzun bir süre boyunca çalışmadan sonra bir dişlinin önceliğini artırarak).
Voo

34

4 çekirdeğe sahip olmak gerekebilir çünkü uygulama paralel işlerde dört görevi yerine getirir ve neredeyse aynı anda bitmelerini bekler.

Her iş parçacığı ayrı bir çekirdek tarafından yürütüldüğünde ve tüm iş parçacıkları aynı hesaplamalı iş yüküne sahip olduğunda, kabaca aynı anda bitmeleri oldukça muhtemeldir (ancak garantili olmaktan uzaktır). Ancak iki diş bir çekirdekte çalıştığında, zamanlama çok daha az tahmin edilebilir olacaktır çünkü çekirdek her zaman iki diş arasındaki içeriği değiştirecektir.

Beklenmeyen iplik zamanlaması nedeniyle oluşan hatalara " yarış koşulları " denir .

Oyun geliştirme bağlamında, bu tür bir soruna sahip akla yatkın bir mimari, oyunun farklı özelliklerinin farklı CPU iş parçacıkları tarafından gerçek zamanlı olarak simüle edildiği bir yapı olabilir. Her özellik kendi çekirdeğinde çalıştığında, hepsi kabaca aynı hızda simüle edilir. Ancak iki özellik bir çekirdekte yayınlandığında, her ikisi de sadece garip davranışlara neden olabilecek oyun dünyasının yarısı kadar hızlı bir şekilde simüle edilecektir.

Belirli zamanlamalarla çalışan bağımsız iş parçacıklarına bağlı bir yazılım mimarisinin son derece kırılgan olduğunu ve eşzamanlı programlamanın çok kötü bir şekilde anlaşıldığının bir işareti olduğuna dikkat edin. Pratik olarak tüm okuyuculu API'lerde, bu tür problemleri önlemek için konuları net bir şekilde senkronize etmek için mevcut olan özellikler vardır.


11
Ancak, herhangi bir oyunun bir sonraki kareye ilişkin tüm hesaplamaları makul bir sıklıkta yapmak için zamanında tamamlayabilmeye hassas bir bağımlılığı vardır. 4 parçanız doğru senkronize edilse bile, zamanında iş yapmak imkansız olabilir ve bir oyunda hesaplama açısından doğru olan ancak gecikme ve kekeme nedeniyle oynanamayan bir avantajı yoktur.
İşe yaramaz

1
@ Yararsız: Bu gerçekten doğru değil. Örneğin herhangi bir kekemeliği gizlemek için arabellek çerçeveleri veya simülasyon verileri yapabilirsiniz ve daha tutarlı olan eşzamanlı tasarımlar vardır. Tüm işlemlerinizi X zamanında yapmanız ve bu işlemin tam olarak eşitlenmesini istemeniz farklı konulardır.
DeadMG

23
“belirli zamanlamalarla çalışan bağımsız iş parçacıklarına dayanan bir yazılım mimarisi son derece kırılgan” Bu nedenle 2 çekirdekli bir oyun hayal edemiyorum, ancak 4 çekirdekli güvenilir bir şekilde çalışıyor. 4 çekirdekte bile, zamanlama tahmin edilemez olacak, bu nedenle yarış durumu daha az sıklıkta olsa bile ortaya çıkacaktı.
07:15 te

8
Tabii ki. Ancak soru “mümkün mü?” Diye soruyor. "aklı başında değil mi?"
kullanıcı253751,

5
"Irk koşulları" bu tür herhangi bir kod düz dışarı kırık olursa olsun onu çalıştırmak kaç çekirdek. (Özellikle beri ne olduğuna kesinlikle hiçbir garantisi yoktur başka sistem üzerinde çalışıyor.) Ben ciddiye bile bir hexacore sistemi üzerinde oyun yolculuk nasıl kolayca verilen nedeni olmaya şüphe ...
DevSolar

16

Bu "asgari şartların" altında oyunun çalışmayacağı bir şeyi temsil etmesi muhtemel değildir. Çok daha büyük olasılıkla, oyunun kabul edilebilir performansla koşmayacağı bir şeyi temsil etmeleri muhtemeldir. Hiçbir oyun şirketi, yazılım teknik olarak çalışsa bile, tek çekirdekli 1 Ghz'lık bir kutuda çalışırken berbat performanstan şikayet eden birçok müşteri ile uğraşmak istemez. Bu yüzden, muhtemelen kasıtlı olarak, kendilerine kabul edilebilir performans verebilecek olandan daha az sayıda çekirdekli kutularda zorlanmayacak şekilde tasarlarlar.

Oyun performansındaki önemli bir ölçü kare hızıdır. Genellikle saniyede 30 veya 60 kare hızında çalışırlar. Bu, oyun motorunun mevcut durumu oyun durumundan belirli bir süre içinde görüntülemesi gerektiği anlamına gelir. 60 fps'ye ulaşmak için, bunu yapmak için 16 milisaniyeden biraz daha fazlası var. Üstün grafikleri olan oyunlar son derece CPU'ya bağlıdır ve bu nedenle daha yüksek kaliteye (daha fazla zaman alan) itmeye çalışmakla bu zaman diliminde kalma ihtiyacı arasında çok büyük bir işe yarar. Bu nedenle, her bir çerçeve için zaman bütçesi son derece sıkıdır.

Zaman bütçesi dar olduğundan, geliştirici ideal olarak bir veya daha fazla çekirdeğe özel erişim ister. Ayrıca, muhtemelen renderleme malzemelerini bir çekirdekte yapabilmeyi istiyorlar, çünkü o zaman bütçesinde yapılması gerekenler, dünya devletini hesaplamak gibi diğer şeyler yapamayacağı ayrı bir süreçte oluyor davetsiz.

Teoride, bütün bunları tek bir çekirdeğe tıkayabilirsiniz, ancak daha sonra her şey daha da zorlaşır. Birdenbire, tüm bu oyun durumlarının yeterince hızlı olduğundan emin olmalısınız ve renderlemenizin gerçekleşmesine izin verin. Bunları sadece iki yazılım dizisi oluşturamazsınız, çünkü işletim sisteminin "iş parçacığı A'nın iş parçacığı B'nin ne iş parçacığına bakılmaksızın 16 milisaniyede X miktarını doldurması gerekir" i anlamasını sağlamanın bir yolu yoktur.

Oyun geliştiricileri, yeni donanım satın almanıza ilgi duymuyor. Sistem gereksinimlerinin olmasının nedeni, alt uç makinelere destek maliyetinin buna değmemesidir.


Bu doğru olsa da, asgari özelliklerde açıklanan dört çekirdekli donanımdan daha belirli bir zaman diliminde daha fazlasını başarabilecek kadar güçlü olan çift çekirdekli donanım satın alabilirsiniz. Satıcı neden bu donanımı kabul etmiyor, yalnızca satışlarını kaybedebilecek bir karar vermiyor?
Jules

4
Karşılaştırılacak şey 2 ile 4 çekirdeği değil. Temelde 1'e 3 çekirdeği var, çünkü CPU # 0, grafik sürücüsü ve DPC'ler tarafından hemen hemen sabitlenecek. Tipik bir modern oyunun iş sisteminde çeşitli görevleri olan bir işlemciden fazla abonelik yapıyorsanız, önemli önbellek ve geçiş efektleri de vardır. Buradaki gereksinim, Frostbite'ın (DA: I'in motoru) belirli sayıda çekirdek gerektiren çok dikkatli bir ayarlama ile sıfırdan tasarlanmasından kaynaklanıyor.
Lars Viklund

6
@LarsViklund Görünüşe göre buradaki herkesten daha fazla ayrıntı biliyorsun. Bir cevap vermeyi düşündün mü?
Robotu

1
“Bu“ asgari gerekliliklerin ”altında oyunun çalışmayacağı bir şeyi temsil etmesi muhtemel değildir. Çok büyük olasılıkla oyunun kabul edilebilir bir performansla çalışamayacağı bir şeyi temsil etmesi muhtemeldir.” - Intel'in G3258'si, Dragon Age Inquisition'dan daha yoğun veya daha fazla kaynak çalıştırabilen oyuncular tarafından yaygın olarak kullanılan çok güçlü bir çift çekirdekli işlemcidir, ancak birçok oyuncu oyunun üzerinde çalışmadığını bildiriyor.
uylmz

2
@Reek Bir son kullanıcının, belirli bir oyunun diğerine kıyasla ne kadar yoğun bir kaynak olduğunu kolayca söyleyebileceğinden şüpheliyim.
Robotu

9

Hiçbir zaman uyumayan üç gerçek zamanlı iplik ve bir başka iplik. Dörtten daha az sayıda çekirdek varsa, dördüncü iplik asla çalışmaz. Dördüncü iş parçacığının, gerçek zamanlı iş parçacığının bitmesi için gerçek zamanlı iş parçacıklarından biriyle iletişim kurması gerekiyorsa, kod dört çekirdekten daha az bitmeyecektir.

Açıkçası, gerçek zamanlı iş parçacıkları uyumasına izin vermeyen bir şeyi bekliyorsa (spinlock gibi) program tasarımcısı berbat etti.


1
Muhtemelen, bir kullanıcı uygulaması ilk etapta gerçek zamanlı iş parçacığı istediğinde, tasarımcı
batırdı

2
Yaptım. Yarım milyon kod satırı. Yaklaşık 300 satır kullanan bir vaka. Gerçek Zamanlı iş parçacığı, zamanının çoğunu girdi beklerken harcar, böylece girişi zaman aşımına uğrar ve daha az öncelikli bir iş parçacığına verir.
Joshua

2
@Luaan Çoğu uygulama için sizinle aynı fikirdeyim, ancak oyunlar gömülü uygulamalar gibi farklı bir canavar. Her iki durumda da, diğer eşzamanlı uygulamalarla iyi oynama endişesi çoğunlukla performans lehine pencereden dışarı çıkar.
saat

Özellikle etkili olmasa da, bu senaryo herhangi bir kilitlenmeye yol açmayacaktı - öncelikli inversiyon bununla ilgilenecekti (son on yılın herhangi bir büyük işletim sisteminde yarı yarıya uygun bir zamanlayıcı varsayarsak)
Voo

2
@Joshua > Windows öncelikli inversiyonun ne olduğunu bilmiyor. Ne? support.microsoft.com/kb/96418 , msdn.microsoft.com/en-us/library/windows/desktop/ms684831.aspx adresini ziyaret edin . Ayrıca, öncelikli inversiyon, bir çözüm değil (@Voo) konuyu tanımlayan terimdir .
Bob

3

Her şeyden önce, yazılım iş parçacıklarının donanım iş parçacıklarıyla ilgisi yoktur ve sık sık karıştırılır. Yazılım iş parçacıkları, işlem bağlamında kendi başına gönderilip çalıştırılabilen kod parçalarıdır. Donanım konuları çoğunlukla işletim sistemi tarafından yönetilir ve normal programlar hakkında konuşurken işlemcinin çekirdeğine gönderilir. Bu donanım iplikleri yüke göre gönderilir; donanım iplik dağıtıcısı, bir yük dengeleyici gibi az çok hareket eder.

Bununla birlikte, söz konusu oyun, özellikle üst seviye oyun söz konusu olduğunda, bazen donanım iplikleri oyunun kendisi tarafından yönetilir veya oyun donanım ipliği dağıtıcısına ne yapması gerektiğini bildirir. Bunun nedeni, her görev veya görev grubunun normal bir programdaki gibi aynı önceliğe sahip olmamasıdır. Ejderha çağı yüksek uçlu oyun stüdyosundan yüksek uçlu oyun stüdyosundan geldiği için "manuel" göndermeyi kullandığını ve ardından çekirdek sayısının minimum sistem gereksinimi haline geldiğini hayal edebiliyorum. Bir makinede çalışan 3. fiziksel çekirdeğe yalnızca 1 veya 2 çekirdekli bir kod parçası gönderdiğimde herhangi bir program çöküyor.


Bu. "Çekirdek sayısını kontrol et" demenin bir şirketin yazılım ürününü kullanıcıları daha pahalı donanım satın almaya zorlayacak şekilde (kötü niyetli) satın almaya zorladığı anlamına geldiğini unutmayın.
uylmz

2
Bu sorunlar, PC oyunları olduğu sürece mevcuttur. Başlangıçta 486dx ve 486sx vardı, daha sonra MMX ve MMX olmayan Pentium, çekirdek ve çekirdek olmayan ve bugün n çekirdek gereksinimlerimiz var. Konsolların hala var olmasının sebeplerinden biri de bu.
dj bazzie wazzie

4
CPU planlamalarını kendileri üstlenen oyunlara referansınız var mı? Bildiğim kadarıyla, bu doğrudan Windows'ta mümkün değil, en azından önerdiğiniz şekilde başarısız olacak şekilde mümkün değil.
Jules

2
@djbazziewazzie aslında windows bunu yapmak için bir api sağlıyor, yani her zaman aynı çekirdeği kullanmak için bir iş parçacığı oluşturuyor; buna iplik benzeşimi denir ve hangi kod parçasının nerede ve ne zaman çalıştığını manuel olarak seçmenize izin vermez ve önerdiğiniz gibi bir sistem arızasına neden olamaz (sistem olmayan bir çekirdeğe yakınlık ayarlama isteğini yok sayar ve - Kullanılabilir olduğunda, iş parçacığını herhangi bir çekirdeğe programlamaya devam edin.Senin Tech'in kullandığı kimliği olduğundan eminim ve bu gerçekten "donanım dişlerini kendisinin yönetmesi" anlamına gelmez.
Jules

1
Ayrıca gelmez Grand Central Dispatch noktasını yanlış görünen @djbazziewazzie değil geliştiricilere kendi kod bir çekirdek planlanan şekli üzerinde daha fazla kontrol sağlamak; Aslında, amacı tam tersidir: kaç tane iş parçacığı oluşturulacağına ve hangi kodun çalışacağına, hangi donanımın çalışacağına karar verilmesi, böylece sistem genelinde mevcut donanım için optimize edilebilir. Belirli sayıda çekirdeğe sahip olma bağımlılığı, GCD'nin önlenmesi için tasarlandığı türden bir problemdir.
Jules

1

Sanallaştırmayı fizikselden daha fazla sanal çekirdeğe sahip olarak kullanmak mümkün olduğundan ve yazılım sanallaştırmaya çalıştığını bilmediğinden ve bunun yerine bu kadar çok fiziksel çekirdeğe sahip olduğunu düşüneceğinden, bu tür yazılımların mümkün olmadığını söyleyebilirim.

Yani, her zaman N çekirdeğinden daha az duracak bir yazılım yazmak mümkün değildir.

Diğerlerinin de belirttiği gibi, özellikle N süreçleri <N işlemcilerde çalıştığında kullanılan işletim sistemi ve kodun yarış koşullarına karşı çok az koruması varsa, potansiyel olarak kontrol edebilecek yazılım çözümleri vardır. Gerçek numara, N işlemciden daha az işlemciye sahip olduğunuzda başarısız olacak ancak N işlemcilere sahip olduğunuzda ancak N işlemciden daha azına iş atayabilecek bir işletim sistemine sahip olduğunuzda başarısız olacak koddur.


1

Bir şey yapan (arka planlar üreten veya NPC hareketi üreten) ve olayları dördüncü bir sayıya geçiren, olayları topladığı / filtrelediği ve görünüm modelini güncellemesi gereken üç iş parçacığı olabilir. Dördüncü iş parçacığı tüm olayları alamazsa (çünkü bir çekirdek üzerinde zamanlanmadı), görünüm modeli doğru şekilde güncellenmedi. Bu yalnızca düzensiz olabilir, ancak bu göbeklerin herhangi bir noktada kullanılabilir olması gerekir. Bu, neden sürekli yüksek CPU kullanımı göremediğinizi açıklayabilir, ancak oyun yine de düzgün çalışmıyor.


1
Böyle bir senaryoda, arka plan hizmetlerinin çalıştırılması planlandığı zaman oyun çoğu kez oldukça sık olan oyun aynı zamanda başarısız olur.
Jules

1

Bence Joshua doğru bir yöne doğru gidiyor, ama sonuç değil.

Diyelim ki yapabildikleri kadar yapmak için yazılan üç ipliğin olduğu bir mimariye sahipsin - yaptıklarını bitirdiklerinde tekrar yaparlar. Performansı korumak için bu iş parçacıkları hiçbir şey için denetimi serbest bırakmaz - Windows görev zamanlayıcısından kaynaklanan gecikme riskini almak istemezler. 4 ya da daha fazla çekirdek olduğu sürece, bu iyi çalışıyor, olmadığında kötü bir şekilde başarısız oluyor.

Genelde bu kötü programlama olabilir ancak oyunlar başka bir konudur - tüm donanımlarda yetersiz olan bir tasarımla ya da yeterince iyi donanımda üstün olan bir tasarımla veya düşük donanımlı oyun geliştiricilerinde başarısızlıkla karşılaşmayı tercih ettiğinizde genellikle donanım gerektirmek için.


Kontrolü diğer ipliklere bırakmayacak bir iplik yazmak genellikle mümkün değildir. Tüm modern RTOS olmayan işletim sistemleri, önleyici çoklu görev kullanır; bu, (kullanıcı modu) bir iş parçacığının belirli bir çekirdeğin denetimini serbest bırakmamasını kasıtlı olarak imkansız kılar. Çekirdek ipleri, elbette, farklı bir konudur.
saat

@reirab Önceliğini arttır.
Loren Pechtel

@Loren Zamanlayıcının hala işini kaybettiği gerçeğini değiştirmez, yani aynı önceliğin diğer iş parçacıkları ile zaman paylaşmanız ve zamanlayıcı açlık çeken önceliği artırır. Bunu normal işletim sistemlerinde yapamazsınız ve yapsanız bile, oyunlar kesinlikle bunu yapmanın kabul edilebilir bir uygulaması olmaz.
Voo

1

Is it possible to write code (or complete software, rather than a piece of code) that won't work properly when run on a CPU that has less than N number of cores?

Kesinlikle. Gerçek zamanlı iş parçacığı kullanımı, bunun yalnızca mümkün değil, aynı zamanda işi yapmak için istenen yol (ve çoğu zaman tek doğru yol) olduğu durumlara iyi bir örnek olabilir. Ancak, gerçek zamanlı iş parçacıkları genellikle işletim sistemi çekirdeği ile sınırlıdır, genellikle bir tür donanım olayının belirli bir zaman diliminde ele alındığını garanti etmesi gereken sürücüler için. Normal kullanıcı uygulamalarında gerçek zamanlı iş parçacığı olmamalı ve Windows kullanıcı modu uygulamasında bir tanesine sahip olmanın bile mümkün olduğundan emin değilim. Genel olarak, işletim sistemleri belirli bir uygulamanın sistemin kontrolünü ele geçirmesine izin verdiği için, bunu kullanıcı alanından kesin olarak yapmayı imkansız kılar.

Kullanıcı arazi uygulamaları ile ilgili: Çalıştırmak için belirli sayıda iş parçacığını kontrol etmenin kasıtlı olarak kasıtlı olarak kötü niyetli olduğu varsayımınız doğru değildir. Örneğin, kendileri için bir çekirdeğe ihtiyaç duyan 2 uzun süreli ve performans yoğun göreviniz olabilir. CPU çekirdeği hızı ne olursa olsun, bir çekirdeği diğer dişlerle paylaşmak, iplik değiştirme işleminin (oldukça önemli olan) normal cezalarla birlikte önbellek çökmesinden dolayı ciddi ve kabul edilemez bir performans düşüşü olabilir. Bu durumda, tamamen makul olacaktır. özellikle bir oyun için, bu iş parçacıklarının her birinin, her biri için yalnızca belirli bir çekirdeğe bir afiniteye sahip olmasını ayarlamak ve daha sonra, bu diğer 2 çekirdeğin üzerinde afiniteye sahip olmayacak şekilde ayarlamak. Bunu yapmak için, yine de


1

Dikkat çekecek miktarda kilit çekişmesi olan spinlock'ları kullanan herhangi bir kod , iş parçacığı sayısı çekirdek sayısını aşarsa, korkunç bir şekilde (bir oyun gibi bir uygulama için - "işe yaramaz" diyebilirsiniz ) gerçekleşir.

Örneğin, 4 tüketici iş parçacığı sunan bir sıraya görevler gönderen bir üretici iş parçacığını düşünün. Sadece iki çekirdek var:

Üretici, döndürme kilidini elde etmeye çalışır, ancak diğer çekirdekte çalışan bir tüketici tarafından tutulur. Üretici dönerken iki çekirdek kilitlenip, serbest bırakılmayı bekliyor. Bu zaten kötü, ama alacağı kadar kötü değil.
Ne yazık ki, tüketici ipliği, zaman kuantumunun sonundadır, bu nedenle önlenir ve başka bir tüketici ipliği planlanır. Kilidi tutmaya çalışıyor, ama tabii ki kilit alındı, bu yüzden şimdi iki çekirdek dönüyor ve olamayacak bir şey bekliyor.
Üretici iplik zaman diliminin sonuna ulaşır ve önceden beklenir, başka bir tüketici uyanır. Yine, iki tüketici bir kilidin serbest bırakılmasını bekliyor ve bu iki kuantum geçmeden önce gerçekleşmeyecek.
[...] Sonunda, döndürme kilidini tutan tüketici kilidi serbest bıraktı. Diğer çekirdekte dönen kim tarafından hemen alınır. Tüketici için bir başka konu olma olasılığı% 75 (3'e 1). Başka bir deyişle, üreticinin hala durma olasılığı% 75'tir . Elbette bu, tüketicilerin de durduğu anlamına gelir. Üretici ortak görevleri olmadan, yapacak hiçbir şeyleri yoktur.

Bunun prensip olarak her türlü kilitle çalıştığını, sadece döndürme kilitleriyle değil - yıkıcı etki döndürme kilitleriyle daha belirgin olduğunu unutmayın; çünkü CPU hiçbir şey elde etmeden işlemcilerin yazma döngülerini sürdürür.

Şimdi, yukarıdakilere ek olarak, bazı programcıların, ilk çekirdeğe ayarlanmış afiniteye sahip özel bir iş parçacığı kullanmak için mükemmel bir fikre sahip olduğunu hayal edin, bu yüzden RDTSC tüm işlemcilerde güvenilir sonuçlar verecektir (yine de olmaz, ancak bazı insanlar böyle düşünüyor).


Bu nedenle iyi kilitlenmeler küçük bir süre sonra diğer kilit tiplerine indirgenir ve daha iyi olanlar aynı kilidin geçmiş kullanımlarını düşürmek zorunda kaldıklarında çok daha hızlı hale gelir.
Ian

-1

Ne sorduğunuzu anlarsam mümkün, ama bu çok çok kötü bir şey.

Tanımladığınızın kanonik örneği, birden çok iş parçacığı tarafından artırılan bir sayacı korumak olacaktır. Bu işlem, bilgisayar gücü termlerinde neredeyse hiçbir şey gerektirmez ancak dişliler arasında dikkatli bir koordinasyon gerektirir. Bir seferde yalnızca bir iş parçacığı bir artış yaptığı sürece (ki bu aslında bir yazma tarafından izlenen bir okumadır), değeri her zaman doğru olacaktır. Bunun nedeni, bir iş parçacığının her zaman doğru "önceki" değeri okuyacağı, bir tane ekleyeceği ve "sonraki" doğru değeri yazacağıdır. Aynı anda iki iş parçacığı alın ve her ikisi de aynı "önceki" değeri okuyacak, artıştan aynı sonucu alacak ve aynı "sonraki" değeri yazacaktır. İki iş parçacığının her birinin yaptığını düşündüğü halde sayaç etkili bir şekilde artırıldı.

Zamanlama ve doğruluk arasındaki bu bağımlılık bilgisayar biliminin bir yarış koşulu olarak adlandırdığı şeydir .

Yarış koşulları, paylaşılan bir veri parçası üzerinde çalışmak isteyen dişlilerin erişim için sıraya girmeleri gerektiğinden emin olmak için senkronizasyon mekanizmaları kullanılarak sıklıkla önlenir. Yukarıda açıklanan sayaç, bunun için bir okuma-yazma kilidi kullanabilir .

Dragon Age: Engizisyon'un iç tasarımına erişmeden herkesin yapabileceği tek şey neden böyle davrandığı hakkında spekülasyon yapmaktır. Ama kendi tecrübelerime göre yaptığım bazı şeylere dayanarak gidiyorum:

Program, ayarlanmış dört iş parçacığına dayanıyor olabilir, bu yüzden iş parçacıkları çoğunlukla kendi fiziksel çekirdeklerinde kesintisiz olarak çalıştığında her şey çalışır. "Ayarlama", yeniden düzenleme kodu biçiminde gelebilir veya gelişim sırasında kırpılan yarış koşullarına bağlı hataları azaltmak için stratejik yerlere uyku ekleyebilir. Yine, bunların hepsi bir varsayım, ancak saydığım umduğumdan çok daha fazla sürdüğü yarış koşullarının “çözüldüğünü” gördüm.

Böyle bir programın, ayarlandığı ortamdan daha az yetenekli herhangi bir şey üzerinde çalıştırılması, kodun hızlı bir şekilde veya daha büyük olasılıkla bağlam anahtarlarının çalışmamasının sonucu olan zamanlama değişikliklerini sağlar. Bağlam anahtarları fiziksel olarak gerçekleşir (yani, CPU'nun fiziksel çekirdeği, mantıksal çekirdeğin tuttuğu iş arasında geçiş yapar) ve mantıksal (yani, CPU üzerindeki işletim sistemi, çekirdeğe iş atar) yollarıdır; "beklenen" yürütme zamanlaması olurdu. Bu kötü davranış ortaya çıkarabilir.

Eğer Dragon Age: Engizisyon yapma basit adımı almaz emin EA'nın hatam, ilerlemeden önce yeterli fiziksel çekirdek mevcut bulunmaktadır. Muhtemelen, oyunu çok az donanımda çalıştırmaya çalışan insanlardan gelen destek çağrılarını ve e-postalarını almak için küçük bir servet harcıyorlar.


1
Bazı oyuncular DRM'nin 2 çekirdek üzerinde çalıştığını ve asıl oyunun da 2 üzerinde çalıştığını söylüyor. DRM ve oyun konuları aynı çekirdekte çalıştıklarında berbatlaşıyor. Ancak bu bana doğru gelmiyor, oyuncu ya da mimarlık hakkında pek bir şey bilmeyen bir oyuncu tarafından yapılmış küçük bir hikaye olabilir.
uylmz

4
yarış koşullarının çekirdek sayımı ile pek ilgisi yok, -1 ... birden fazla sanal iş parçacığına sahip tek bir çekirdekli makine, çalışma zamanının zaman dilimleme tekniğine tamamen bağlı olarak yarış koşullarına sahip olabilir ya da birçok çekirdek sistem tüm yarış koşullarına bağlı olarak önleyebilir membar operasyonlarında ne kadar sıkı olduğu konusunda ...
Jimmy Hoffa

1
@Reek: Programın nasıl çalıştığı hakkında kesin bir bilgi olmadan, her şey bir tahmindir. Sadece DRM'yi yapacak iki çekirdek bana biraz aşırı geliyor.
Blrfl

1
@ JimmyHoffa: Ben katılmıyorum. Bir yarış koşulu, istenmeyen davranışlara neden olmasa bile, yine de bir yarış koşulu. Çekirdek sayısı , bu davranışın gerçekleşip gerçekleşmeyeceğini etkileyebilir, bu da sorgulayıcının sorduğu şeydi, ancak bunu tek değişken olarak göstermedim.
Blrfl

-1

Windows yerleşik bir işleve sahiptir bunun için: function GetLogicalProcessorInformation , Windows içindedir API . Çekirdekler, sanal çekirdekler ve hiper-dişler hakkında bilgi almak için programınızdan çağırabilirsiniz.

Yani sorunuzun cevabı şöyle olurdu: Evet.


3
"Koddaki çekirdek sayısını öğrenemez miyim?" Diye sormuyorum. ... Böyle bir kod kötü niyetli olacaktır (bir programı çalıştırmak için daha pahalı bir CPU almaya zorlar - hesaplama gücüne ihtiyaç duymadan).
uylmz

3
Bu fonksiyon, sadece ham "çekirdek sayısı" ndan sonra çok daha fazla bilgi verir. Bu bilgilerle fiziksel çekirdek, mantıksal çekirdek ve daha fazlasını düşürebilirsiniz. Bunu düşürebilirseniz, bu bilgiyi kullanmak için yazılım yazabilirsiniz. İyi ya da kötü bir şekilde (4 çekirdekten ancak 4 fiziksel çekirdekten daha az gördüğünüzde kilitlenme programı).
Pieter B

1
Bu, Windows'ta işe yarayabilir, fakat ya OSX / Linux / iOS / Android / etc. Oyuna, bu davranışın görüldüğü bir örnek olarak atıfta bulunurken (ve doğal korelasyon Windows = Oyun olacaktır), oyuna özgü bir istek olarak görünmüyor.
Robert

Dragon Age gibi bir oyun için, söz konusu sistemler Windows / XBox / PS4.
Robotu

Linux vardır /proc/cpuinfove sysconf(_SC_NPROCESSORS_ONLN)(ikincisi POSIX'de belirtilmiştir). Bilgiyi minimum performans eşiğini uygulamak için kullanmak yine de oldukça kötü bir formdur.
cHao
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.