Talimat planlaması - Instruction scheduling

İçinde bilgisayar Bilimi, talimat planlaması bir derleyici optimizasyonu geliştirmek için kullanılır öğretim düzeyinde paralellik ile makinelerde performansı artıran talimat ardışık düzenleri. Daha basit bir ifadeyle, kodun anlamını değiştirmeden aşağıdakileri yapmaya çalışır:

  • Önlemek boru hattı tezgahları talimatların sırasını yeniden düzenleyerek.[1]
  • Yasadışı veya anlamsal olarak belirsiz işlemlerden kaçının (tipik olarak ince talimat boru hattı zamanlama sorunlarını veya birbirine bağlı olmayan kaynakları içerir).

Boru hattı kesintilerine yapısal tehlikeler (işlemci kaynak limiti), veri tehlikeleri (başka bir talimat için gereken bir talimatın çıktısı) ve kontrol tehlikeleri (dallanma) neden olabilir.

Veri tehlikeleri

Talimat planlaması genellikle tek bir temel blok. Bloğun talimatlarını belirli bir şekilde yeniden düzenlemenin o bloğun davranışını koruyup korumadığını belirlemek için, bir veri bağımlılığı. Üç tür bağımlılık vardır ve bunlar aynı zamanda veri tehlikeleri:

  1. Yazdıktan Sonra Oku (RAW veya "Doğru"): Talimat 1, Talimat 2 tarafından daha sonra kullanılan bir değeri yazar. Talimat 1 önce gelmelidir, aksi takdirde Talimat 2 yeni yerine eski değeri okuyacaktır.
  2. Okuduktan sonra yaz (WAR veya "Anti"): Talimat 1, daha sonra Talimat 2 ile üzerine yazılan bir konumu okur. Talimat 1 önce gelmelidir, yoksa eski yerine yeni değeri okuyacaktır.
  3. Yazdıktan sonra Yaz (WAW veya "Çıktı"): İki komutun her ikisi de aynı konumu yazar. Orijinal sıralarında gerçekleşmeleri gerekir.

Teknik olarak, dördüncü bir tür vardır, Okuduktan Sonra Oku (RAR veya "Giriş"): Her iki komut da aynı konumu okur. Girdi bağımlılığı, iki deyimin yürütme sırasını kısıtlamaz, ancak dizi öğelerinin sayısal olarak değiştirilmesinde yararlıdır.

Üç tür bağımlılığa saygı duyduğumuzdan emin olmak için, bir bağımlılık grafiği oluşturuyoruz. Yönlendirilmiş grafik her köşe bir talimattır ve benden bir kenar vardır1 bana2 Eğer ben1 benden önce gelmeli2 bağımlılık nedeniyle. Döngü üzerinden taşınan bağımlılıklar dışarıda bırakılırsa, bağımlılık grafiği bir Yönlendirilmiş döngüsüz grafiği. Sonra herhangi biri topolojik sıralama Bu grafiğin tamamı geçerli bir talimat çizelgesidir. Grafiğin kenarları genellikle şu şekilde etiketlenir: gecikme bağımlılığın. Bu, boru hattının durmadan hedef talimatla ilerleyebilmesi için geçmesi gereken saat döngülerinin sayısıdır.

Algoritmalar

Topolojik sıralamayı bulmak için en basit algoritma sıklıkla kullanılır ve şu şekilde bilinir: liste planlaması. Kavramsal olarak, tekrar tekrar bağımlılık grafiğinin bir kaynağını seçer, bunu mevcut talimat programına ekler ve grafikten kaldırır. Bu, diğer köşelerin kaynak olmasına neden olabilir ve bu daha sonra zamanlama için de dikkate alınacaktır. Grafik boşsa algoritma sona erer.

İyi bir programa ulaşmak için, duraklamalar önlenmelidir. Bu, planlanacak bir sonraki talimatın seçimi ile belirlenir. Yaygın olarak kullanılan bir dizi buluşsal yöntem vardır:

  • Önceden programlanmış talimatlar tarafından kullanılan işlemci kaynakları kaydedilir. Bir aday meşgul olan bir kaynağı kullanırsa, önceliği düşecektir.
  • Bir aday, ilgili gecikmeden daha yakın bir tarihe planlanırsa, önceliği düşer.
  • Bir aday grafiğin kritik yolunda yer alıyorsa, önceliği artacaktır. Bu buluşsal yöntem, başka türlü yerel bir karar sürecinde bir tür ileriye dönük bakış sağlar.
  • Bir aday seçmek birçok yeni kaynak yaratacaksa, önceliği artacaktır. Bu buluşsal yöntem, zamanlayıcı için daha fazla özgürlük üretme eğilimindedir.

Faz sırası

Talimat planlaması, öncesinde veya sonrasında yapılabilir. kayıt tahsisi ya da hem öncesinde hem de sonrasında. Bunu kayıt tahsisatından önce yapmanın avantajı, bunun maksimum paralellik ile sonuçlanmasıdır. Bunu kayıt tahsisatından önce yapmanın dezavantajı, bu kayıt ayırıcının mevcut olanları aşan bir dizi kayıt kullanma ihtiyacı ile sonuçlanabilmesidir. Bu, dökülme / doldurma kodunun tanıtılmasına neden olacak ve bu da söz konusu kod bölümünün performansını düşürecektir.

Planlanan mimarinin potansiyel olarak geçersiz kombinasyonlara sahip komut dizileri varsa (komut kilitlerinin olmamasından dolayı), komutlar kayıt tahsisinden sonra programlanmalıdır. Bu ikinci programlama geçişi, dökülme / doldurma kodunun yerleşimini de geliştirecektir.

Programlama yalnızca kayıt tahsisatından sonra yapılırsa, kayıt tahsisi tarafından, programlayıcı tarafından olası talimat hareket miktarını sınırlandıracak yanlış bağımlılıklar ortaya çıkacaktır.

Türler

Birkaç tür talimat planlaması vardır:

  1. Yerel (temel blok) zamanlama: talimatlar temel blok sınırları boyunca hareket edemez.
  2. Global planlama: talimatlar temel blok sınırları boyunca hareket edebilir.
  3. Modulo çizelgeleme: üretmek için bir algoritma yazılım ardışık düzeni, bu, bir içteki farklı yinelemeleri serpiştirerek talimat düzeyi paralelliğini artırmanın bir yoludur. döngü.
  4. İzleme planlaması: küresel çizelgeleme için ilk pratik yaklaşım olan izleme çizelgeleme, en sık yürütülen kontrol akış yolunu optimize etmeye çalışır.
  5. Süper kilit planlaması: izleme "yan girişlerinde" kontrol akış yollarını birleştirmeyi denemeyen basitleştirilmiş bir izleme planlaması biçimi. Bunun yerine, kod birden fazla zamanlama ile uygulanabilir ve kod oluşturucuyu büyük ölçüde basitleştirir.

Derleyici örnekleri

GNU Derleyici Koleksiyonu komut planlamasını gerçekleştirdiği bilinen bir derleyicidir. -Mart (hem komut seti hem de programlama) veya -mtune (yalnızca zamanlama) bayraklar. Görevi gerçekleştirmek için her mikro mimari için talimat gecikmelerinin açıklamalarını ve hangi talimatların paralel olarak (veya eşdeğer olarak, her kullanımda "bağlantı noktası") çalıştırılabileceğini kullanır. Bu özellik, GCC'nin desteklediği hemen hemen tüm mimarilerde mevcuttur.[2]

12.0.0 sürümüne kadar, talimat planlaması LLVM / Clang yalnızca bir -Mart (aranan hedef işlemci LLVM dilinde) hem komut seti hem de programlama için anahtar. Sürüm 12, aşağıdakiler için destek ekler: -mtune (tune-cpu) yalnızca x86 için.[3]

Gecikme ve bağlantı noktası kullanımına ilişkin bilgi kaynakları şunları içerir:

LLVM'ler llvm-inceleme özellikle x86 olmayanlar hakkında bilgi toplamak için tüm makinelerde kullanılabilir olmalıdır.[6]

Ayrıca bakınız

Referanslar

  1. ^ Su, Ching-Long; Tsui, Chi-Ying; Despain, Alvin M. (1994). Yüksek Performanslı İşlemciler için Düşük Güç Mimarisi Tasarımı ve Derleme Teknikleri (PDF) (Bildiri). İleri Bilgisayar Mimarisi Laboratuvarı. ACAL-TR-94-01. (Soğuk planlama)
  2. ^ "x86 Seçenekleri". GNU Derleyici Koleksiyonunu (GCC) Kullanma.
  3. ^ "⚙ D85384 [X86] Clang'da -mtune komut satırı seçeneği için temel destek ekleyin". reviews.llvm.org.
  4. ^ "Yazılım optimizasyon kaynakları. C ++ ve montaj. Windows, Linux, BSD, Mac OS X". Agner Sis.
  5. ^ "x86, x64 Komut Gecikmesi, Bellek Gecikmesi ve CPUID dökümleri". instlatx64.atw.hu. Sayfadaki "Yorumlar" bağlantısına da bakın.
  6. ^ "llvm-exegesis - LLVM Makine Talimatı Karşılaştırması". LLVM 12 Belgeleri.

daha fazla okuma