"Rep;" ne anlama geliyor? nop; ” x86 derlemesinde mi? "Duraklat" talimatı ile aynı mı?


86
  • Ne anlama rep; nopgeliyor?
  • pauseTalimatla aynı mı?
  • rep nop(Noktalı virgül olmadan) ile aynı mı ?
  • Basit noptalimattan farkı nedir ?
  • AMD ve Intel işlemcilerde farklı mı davranıyor?
  • (bonus) Bu talimatlar için resmi belgeler nerede?

Bu soru için motivasyon

Başka bir sorunun yorumlarında biraz tartıştıktan sonra rep; nop;, x86 (veya x86-64) derlemesinde ne anlama geldiğini bilmediğimi fark ettim . Ayrıca internette de iyi bir açıklama bulamadım.

Bunun "sonraki talimat zamanlarını tekrarla"rep anlamına gelen bir önek olduğunu biliyorum (veya en azından eski 16 bit x86 derlemesinde öyleydi). Buna göre Wikipedia özet tablosunda , bu görünüyor ancak kullanılabilir , , , , (ama belki bu sınırlama yeni işlemciler üzerinde uzaklaştırıldı). Bu nedenle, (noktalı virgül olmadan) bir ameliyat zamanını tekrar edeceğini düşünürdüm .cxrepmovsstoscmpslodsscasrep nopnopcx

Ancak daha fazla araştırmadan sonra kafam daha da karıştı. Öyle görünüyor rep; nopve pause tam olarak aynı işlem koduyla eşleşiyor ve pausesadece biraz farklı bir davranışa sahip nop. 2005 tarihli bazı eski postalar farklı şeyler söylüyordu:

  • "çok fazla güç yakmamaya çalışın"
  • "sadece 2 bayt kodlamayla 'nop'a eşdeğerdir."
  • "Bilgide sihir var. Bu 'hayır ama diğer HT kardeşinin kaçmasına izin ver' gibi."
  • "Intel'de duraklama ve Athlon'da hızlı doldurma"

Bu farklı görüşlerle doğru anlamı anlayamadım.

O (her ikisi üzerinde Linux çekirdeği daha kullanıldığı i386 ve x86_64 birlikte bu yorum ile,): /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */Aynı zamanda bir Bertos kullanılan aynı yorum ile.


Yanıtlar:


75

rep; nopaslında pausetalimatla (işlem kodu F390) aynıdır . pauseHenüz talimatı desteklemeyen montajcılar için kullanılabilir . Önceki işlemcilerde bu sadece nopiki bayt gibi hiçbir şey yapmıyordu . Hyperthreading'i destekleyen yeni işlemcilerde, performansı artırmak için bir spinloop yürüttüğünüz işlemciye bir ipucu olarak kullanılır. Gönderen Intel'in talimat referans :

Döndürme bekleme döngülerinin performansını artırır. "Döndür-bekle döngüsü" yürütülürken, bir Pentium 4 veya Intel Xeon işlemci, olası bir bellek sırası ihlalini algıladığından döngüden çıkarken ciddi bir performans kaybına uğrar. PAUSE komutu, işlemciye kod dizisinin dönme bekleme döngüsü olduğuna dair bir ipucu sağlar. İşlemci, çoğu durumda bellek sırası ihlalini önlemek için bu ipucunu kullanır ve bu, işlemci performansını büyük ölçüde artırır. Bu nedenle, tüm spin-wait döngülerine bir DURAKLAT komutunun yerleştirilmesi önerilir.


4
Spin-bekleme döngüsü ile aynı meşgul-bekleme döngüsünde ? Bu "iyileştirme" yalnızca hyperthreading işlemciler için mi geçerli? (ve neden?)
Denilson Sá Maia

11
Evet, döndürme bekleme döngüsü meşgul bekleme döngüsü ile aynıdır. Avantaj, hiper iş parçacığını desteklemeyen CPU'lar için de geçerlidir. İşlem hattındaki (gereksiz) talimatların sayısını sınırlandırdığı düşünülebilir (paralel olarak birçok döngü yinelemesini yapmaya çalışmak yerine)
Brendan

1
@Brendan, teşekkürler! Döngünün yinelemeleri hakkında bir şey söyleyene kadar hiç anlamadım.
Prof. Falken

11
@Brendan, Oh, şimdi anladım! Bu modern işlemciler süper skalardır ve bu nedenle aynı anda birden fazla talimatı çalıştırmayı deneyeceklerdir. Bu meşgul bekleme döngüsüyse, sadece başka bir koşulu beklediği için daha fazla talimat çalıştırmak onu hızlandırmaz.
Denilson Sá Maia

1
@Denilson: Evet, hiper iş parçacığı dostu olma (veya HT olmadan güç tasarrufu) büyük bir avantaj, ancak diğeri spin döngüsünden çıkarken bellek siparişi yanlış spekülasyondan kaçınmak. Olmadan pause, dönüş döngüsünüz, başka bir çekirdek tarafından yazılan bellek konumunun durum değişikliğini fark etmek için etkin bir şekilde bir ardışık düzen netliğinde daha yavaştır.
Peter Cordes

15

rep nop= F3 90 = kodlama ve pausedesteklemeyen eski CPU'larda nasıl kod çözdüğü pause.


lockBir talimat için geçerli olmayan ön ekler (dışında ) mevcut CPU'lar tarafından pratikte yok sayılır.

Belgeler, repgeçerli olmadığı talimatlarla birlikte kullanmanın "rezerve edildiğini ve öngörülemeyen davranışlara neden olabileceğini" söylüyor çünkü gelecekteki CPU'lar bunu yeni bir talimatın parçası olarak tanıyabilir. Kullanarak herhangi bir belirli yeni komut kodlaması oluşturduktan sonra f3 xx, eski CPU'larda nasıl çalıştığını belgelerler. (Evet, x86 işlem kodu alanı o kadar sınırlıdır ki, bunun gibi çılgın şeyler yaparlar ve evet, kod çözücüleri karmaşık hale getirir.)

Bu durumda, geriye dönük uyumluluğu bozmadan spinlooplarda kullanabileceğiniz anlamına gelirpause . Bunu bilmeyen eski CPU'lar, pauseIntel'in ISA ref manuel girişipause tarafından garanti edildiği gibi, zarar vermeden bir NOP olarak çözecektir . Yeni CPU'larda, güç tasarrufu / HT dostu olma avantajını elde edersiniz ve döndürdüğünüz bellek değiştiğinde ve dönüş döngüsünden çıktığınızda bellek siparişi yanlış spekülasyondan kaçınırsınız.


X86 tag wiki bilgi sayfasındaki Intel'in kılavuzlarına ve diğer birçok iyi içeriğe bağlantılar

Anlamsız bir repönekin yeni CPU'larda yeni bir talimat haline gelmesinin başka bir durumu : lzcntis F3 0F BD /r. Bu talimatı desteklemeyen CPU'larda (CPUID'lerinde LZCNT özellik bayrağı eksik), rep bsrile aynı şekilde çalışan olarak kodunu çözer bsr. Yani eski CPU'larda, üretir 32 - expected_resultve girdi sıfır olduğunda tanımsızdır.

Ama tzcntve bsfderleyiciler böyle en sıfırdan girişli aynı şeyi yapmak ve kullanımını yapmak tzcnthedef CPU olarak çalışacağını garanti olmadığında bile tzcnt. AMD CPU'larda hızlı tzcnt, yavaş bsfve Intel'de ikisi de hızlı. Doğruluk önemli olmadığı sürece (bayrak ayarına güvenmediğiniz veya girdi = 0 durumunda hedefin değiştirilmemiş davranışı bırakmasına güvenmediğiniz sürece), onu tzcntdestekleyen CPU'larda olduğu gibi kodunun çözülmesini sağlamak yararlıdır.


repMuhtemelen hiçbir zaman farklı bir şekilde çözülmeyecek anlamsız bir önek örneği : rep ret"jenerik" CPU'ları hedeflerken varsayılan olarak gcc tarafından kullanılır (yani belirli bir CPU'yu -marchveya ile -mtunehedeflemeyen ve AMD K8 veya K10'u hedeflemeyen) Bu, kimseden on yıllar önce olacaktır. Çoğu Linux dağıtımında çoğu ikili dosyada mevcut rep retolduğundan ret, başka herhangi bir şey olarak kod çözen bir CPU yapabilir . Bkz ortalama ret` `temsilcisi ne yapar?


3
repÖnek da kilit elision eklemek için Intel tarafından kullanılmıştır.
Paul

Bir talimat için geçerli olmayan ön ekler dikkate alınmaz. Ama şu ifadeye yer tekrarlayın Önekleri ( F2Hve F3H) Rezerve ve öngörülemeyen davranışlara neden olabilir yılında Tablo 11-3. Öneklerin SSE, SSE2 ve SSE3 Talimatları Üzerindeki Etkisi . Bu nedenle, önek uygulaması bazı talimatlar için yok sayılır, hepsi için değil. Peki bu özellik belgelenmemiş olarak mı kabul ediliyor?
St.Antario

2
@ St.Antario: Bu şekilde ifade ediyorlar çünkü gelecekteki CPU'lar onu yeni bir talimatın parçası olarak tanıyabilir. Tüm gerçek CPU'larda durum böyleydi ve kullanarak bir kodlama oluşturduklarında f3 xx, eski CPU'larda nasıl çalıştığını belgelerler.
Peter Cordes

1
Bir talimat için geçerli olmayan ön ekler (kilit dışında) mevcut CPU'lar tarafından pratikte yok sayılır. O belgelenmiştir rep movbenedenlerini #UDyüzden repdeğil hep görmezden geldi. REP/REPE/REPZ/REPNE/REPNZManuel girişte belirtildiği anlamda bir talimat için geçerli olmasa bile .
St.Antario

2
@ St.Antario: İlginç! Genel olarak, daha eski talimatlar için uygulanamayan önekler göz ardı edilir. Yeni bir talimat verirken, seçerlerse daha katı kurallar eklemek mümkündür. IDK, bu özel durum için neden bunu seçti?
Peter Cordes
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.