Değişen devletin maliyeti nedir?


25

Programcıların belirli işlemlerin maliyeti hakkında oldukça iyi bir fikir edinmeleri gerekiyor: örneğin CPU ile ilgili bir talimatın maliyeti, L1, L2 veya L3 önbellek maliyeti, LHS'nin maliyeti.

Grafiklere gelince, ne oldukları hakkında hiçbir fikrim olmadığını çok az biliyorum. Onları maliyetle sipariş edersek, devlet değişikliklerinin şöyle bir şey olduğunu aklımda tutuyorum:

  1. Gölgelendirici düzgün değişmesi.
  2. Aktif köşe tampon değişimi.
  3. Aktif doku birim değişikliği.
  4. Aktif gölgelendirici programı değişikliği.
  5. Aktif çerçeve tampon değişimi.

Fakat bu çok kaba bir kuraldır, doğru bile olmayabilir ve büyüklük düzenlerinin ne olduğu hakkında hiçbir fikrim yok. Birimler, ns, saat döngüleri veya talimatların sayısını koymaya çalışırsak, ne kadar bahsediyoruz?

Yanıtlar:


26

Gördüğüm en fazla veri, çeşitli devlet değişikliklerinin nispi masrafı, Cass Everitt ve John McDonald’nın Ocak 2014’ten itibaren OpenGL API’sinin genel giderlerini azaltma konusundaki konuşması.

Devlet değişikliklerinin nispi maliyetleri

Konuşma, bunu nasıl ölçtükleri hakkında daha fazla bilgi vermiyor (ya da CPU veya GPU maliyetini ölçüp ölçtükleri ya da her ikisi de!). Fakat en azından geleneksel bilgelikle birleşiyor: hedef oluşturma ve gölgelendirici program değişikliklerini en pahalı, tekdüze güncellemeler en az, tepe tamponları ve ortada bir yerde doku değişiklikleriyle. Konuşmalarının geri kalanında, devlet değişiminin genel giderlerini azaltma konusunda birçok ilginç bilgelik var.


2
Bu cevabı ben seçiyorum çünkü bu kaynak çok fazla açıklama yapmamasına rağmen sorduğuma en yakın olan emirleri veriyor.
Julien Guertault

27

Herhangi bir devlet değişikliğinin gerçek maliyeti, genel bir cevabın hemen hemen imkansız olduğu pek çok faktöre bağlı olarak değişmektedir.

Öncelikle, her durum değişikliğinde hem CPU tarafı maliyeti hem de GPU tarafı maliyeti olabilir. CPU maliyeti, sürücünüze ve grafik API'nize bağlı olarak, tamamen ana iş parçacığına ya da kısmen bir arka plan iş parçacığına ödenebilir.

İkincisi, GPU maliyeti, uçuşta iş miktarına bağlı olabilir. Modern GPU'lar boru hatlarına çok bağlı ve bir seferde uçuşta çok fazla iş bulmayı çok seviyorlar ve alabileceğiniz en büyük yavaşlama boru hattını durdurmaktan geliyor, böylece şu anda uçuşta olan her şey devlet değişmeden emekli olacak. Boru hattının durmasına ne sebep olabilir? Bu GPU'nuza bağlı!

Buradaki performansı anlamak için bilmeniz gereken şey şudur: Devlet değişimini işlemek için sürücü ve GPU ne yapmalı? Bu, elbette GPU’nuza ve ayrıca ISV’lerin genel olarak herkese açık paylaşmadığı ayrıntılara bağlıdır. Ancak, bazı genel prensipler vardır .

GPU'lar genellikle bir ön uç ve bir arka uç olarak ayrılır. Ön uç, sürücü tarafından oluşturulan bir komut akışını yönetirken, arka uç tüm gerçek işleri yapar. Daha önce de söylediğim gibi, arka uç uçuşta çok fazla iş yapmayı sever, ancak bu işle ilgili bilgileri (belki de ön uç tarafından doldurulmuş) depolamak için bazı bilgilere ihtiyaç duyar. Yeterince küçük miktarlar atarsanız ve işin tüm silikon tutma izini kullanırsanız, o zaman ön tarafta oturan çok sayıda kullanılmamış beygir gücü olsa bile, ön tarafın durması gerekecektir. Bu yüzden burada bir ilke: ne kadar fazla devlet değişirse (ve küçük çekimler), GPU arka ucunda aç kalmanız o kadar olasıdır .

Bir çizim gerçekte işlenirken, temel olarak sadece üniformalarınızı, verteks tampon verilerinizi, dokularınızı, aynı zamanda verteks ünitenizin nerede durduğu gölgelendirici birimlerini söyleyen kontrol yapılarını ve aynı zamanda da gölgelendirici birimlerini anlatan bellek erişimleri yapan gölgelendirici programları çalıştırıyorsunuz. dokularınız. GPU'da da bu bellek erişiminin önünde önbellekler var. Bu nedenle, ne zaman GPU'ya yeni üniformalar veya yeni doku / tampon bağları atarsanız, bunları ilk kez okuması gereken bir önbellek özü ortaya çıkar. Başka bir prensip: çoğu durum değişikliği GPU önbelleğinin ıskalamasına neden olur. (Bu, sürekli arabellekleri kendiniz yönetirken en anlamlı olanıdır: sürekli arabellekleri çizim arasında aynı tutarsanız, GPU'da önbellekte kalma olasılıkları artar.)

Shader kaynaklar için durum değişikliklerinin maliyetinin büyük bir kısmı CPU tarafıdır. Yeni bir sabit arabellek ayarladığınızda, sürücü büyük olasılıkla o sabit arabellek içeriğini GPU için bir komut akışına kopyalıyordur. Tek bir üniforma ayarlarsanız, sürücü bunu arkanızda sabit bir arabellek haline getirmesi muhtemeldir, bu nedenle sabit arabellekte bu forma ait ofsetin yukarı bakması gerekir, değeri kopyalayın, sonra sabit ara belleği işaretleyin kirli olduğu için bir sonraki beraberlik çağrısından önce komut akışına kopyalanabilir. Yeni bir doku veya köşe arabelleğini bağlarsanız, sürücü muhtemelen bu kaynak için bir kontrol yapısını kopyalıyordur. Ayrıca, çok görevli bir işletim sisteminde ayrı bir GPU kullanıyorsanız, sürücünün kullandığınız her kaynağı ve çekirdeği kullanmaya başladığınızda kullanmaya başladığınızda izlemesi gerekir. GPU bellek yöneticisi, bu kaynak için belleğin, çekilme gerçekleştiğinde GPU’nun VRAM’sında saklanacağını garanti edebilir. Prensip:durum değişiklikleri, sürücünün hafızada dolaşarak GPU için minimal bir komut akışı oluşturmasını sağlar.

Geçerli gölgelendiriciyi değiştirdiğinizde, büyük olasılıkla bir GPU önbellek özledim neden olur (onlar da bir talimat önbelleği var!). Prensip olarak, CPU çalışması "gölgelendiriciyi kullan" diyerek komut akışına yeni bir komut koymakla sınırlandırılmalıdır. Gerçekte, ancak, başa çıkmak için bir sürü gölgelendirici derleme karışıklık var. GPU sürücüleri, genellikle gölgeyi vaktinde oluştursanız bile, gölgelemeyi tembel bir şekilde derler. Bununla birlikte, bu konuyla daha alakalı, bazı eyaletlerde GPU donanımı tarafından yerel olarak desteklenmiyor ve bunun yerine gölgelendirici programında derleniyor. Popüler bir örnek, köşe biçimleridir: Bunlar, çipte ayrı durum yerine, köşe gölgelendiricisinde derlenebilir. Yani, daha önce belirli bir köşe gölgelendiricisi ile kullanmadığınız köşe biçimlerini kullanıyorsanız, şimdi, gölgelendiriciyi düzeltmek ve gölgelendirici programını GPU'ya kopyalamak için bir miktar CPU maliyeti ödüyor olabilirsiniz. Ek olarak, sürücü ve gölgelendirici derleyicisi, gölgelendirici programının yürütülmesini en iyi duruma getirmek için her türlü şeyi yapmak için anlaşma yapabilir. Bu, üniformalarınızın ve kaynak kontrol yapılarınızın bellek düzenini optimize ederek, bitişik hafızaya veya gölgelendirici kayıtlarına güzel bir şekilde paketlenmeleri anlamına gelebilir. Bu nedenle gölgelendiricileri değiştirdiğinizde, sürücünün boru hattına zaten bağlamış olduğunuz her şeye bakmasına ve yeni gölgelendirici için tamamen farklı bir biçimde yeniden paketlemesine ve ardından komut akışına kopyalamasına neden olabilir. Prensip: Bu, üniformalarınızın ve kaynak kontrol yapılarınızın bellek düzenini optimize ederek, bitişik hafızaya veya gölgelendirici kayıtlarına güzel bir şekilde paketlenmeleri anlamına gelebilir. Bu nedenle gölgelendiricileri değiştirdiğinizde, sürücünün boru hattına zaten bağlamış olduğunuz her şeye bakmasına ve yeni gölgelendirici için tamamen farklı bir biçimde yeniden paketlemesine ve ardından komut akışına kopyalamasına neden olabilir. Prensip: Bu, üniformalarınızın ve kaynak kontrol yapılarınızın bellek düzenini optimize ederek, bitişik hafızaya veya gölgelendirici kayıtlarına güzel bir şekilde paketlenmeleri anlamına gelebilir. Bu nedenle gölgelendiricileri değiştirdiğinizde, sürücünün boru hattına zaten bağlamış olduğunuz her şeye bakmasına ve yeni gölgelendirici için tamamen farklı bir biçimde yeniden paketlemesine ve ardından komut akışına kopyalamasına neden olabilir. Prensip:gölgelendiricileri değiştirmek, çok fazla CPU belleği karıştırmasına neden olabilir.

Çerçeve arabelleği değişiklikleri muhtemelen en fazla uygulamaya bağlıdır, ancak genellikle GPU'da oldukça pahalıdır. GPU'nuz, aynı anda farklı render hedeflerine yönelik birden fazla beraberlik çağrısı yapamayabilir, bu nedenle bu iki beraberlik çağrısı arasında boru hattını durdurması gerekebilir. Oluşturma hedefinin daha sonra okunabilmesi için önbelleklerin yıkanması gerekebilir. Çizim sırasında ertelediği işi çözmesi gerekebilir. (Derinlik arabellekleri, MSAA oluşturma hedefleri ve daha fazlasıyla birlikte ayrı bir veri yapısının biriktirilmesi çok yaygındır. Bu oluşturma hedefinden uzaklaştığınızda bu sonlandırılması gerekebilir. , birçok mobil GPU'da olduğu gibi, bir kare tampon belleğinden uzaklaştığınızda oldukça büyük miktarda gerçek gölgelendirme işleminin temizlenmesi gerekebilir.)render hedeflerini değiştirmek GPU’da pahalıdır.

Bunların hepsi kafa karıştırıcı olduğundan eminim ve ne yazık ki fazla net olmak zor, çünkü detaylar genellikle halka açık değil, ancak umarım, bazı devletler dediğinizde gerçekleşen bazı konulara yarı yarıya yakışır bir bakış açısı. En sevdiğiniz grafik API'nizdeki fonksiyonu değiştirme.

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.