Assembly [kapalı] ile optimize etmeyi öğrenme


21

Bilgisayar Oyunları Teknolojisi ikinci sınıf öğrencisiyim. Geçenlerde kendi yol göstericimin "tür" olan ilk prototipimi bitirdim (geometrik bir yaklaşım / örüntü tanıma yerine A * kullanmaz), yol gösterici karar verebilmek için kendi görüş alanı olan arazi bilgisine ihtiyaç duyar. Arazi zaten biliniyorsa, gerçekten keşfedilebilecek bir AI istedi, o zaman en kısa yoldan kolayca yürüyecek, çünkü yol izleyicide bir düğüm hafızası var).

Yine de sorum daha genel: Algoritmaları / döngüleri / for_each / etc optimizasyonunu nasıl başlatabilirim. genel ipuçları açık olmasına rağmen, derleme kullanarak. Özellikle iyi kitaplar arıyorum, çünkü bu konuda iyi kitaplar bulmak gerçekten zor. Orada gibi orada bazı küçük eşyalar vardır bu bir , ama yine de bir algoritma / oyun optimize etmek için yeterli bilgi olmadığı ...

Umarım modern bir güzel kitap vardır, bulamadım.


1
Bu, doğrudan sorunuzu yanıtlamıyor, ancak keşif edici (uyarlanabilir) A * araştırılmış ve gerçekten iyi bir performansa sahip (yani, ASM kullanarak optimize etmeniz gerekmeyecek). D * Lite’a bir bakın .
Jonathan Dickinson

Yanıtlar:


21

Buraya tahılın karşısına giden ben olacağım ve şunu söyleyeceğim: optimizasyonlar, özellikle montaj optimizasyonları ve daha da önemlisi montajda hata ayıklama hakkında bilgi edinmek için asla erken değildir . Bir öğrenciyseniz (çünkü zaman kaybettiğinizde (yani zaman / para olarak akıllıca) çok azınız varsa) ve kazanacak her şeyiniz varsa, maksimum faydayı elde edeceğinize inanıyorum.

Eğer sektördeyseniz ve montajda dolaşmakla görevli değilseniz, o zaman yapmayın. Aksi takdirde, eğer bir öğrenciyseniz veya genel olarak vaktiniz varsa, programları sökmeyi öğrenmeyi ve derleyiciden daha iyi bir çözüm bulup bulamayacağımı öğrenmeyi zaman bulurdum. Yapamazsam, kimin umrunda! Derleyicinin yanı sıra nasıl yazılacağını da öğrendim ve bu büyük bir artı, sürüm kodunda (hata ayıklama sembolleri olmayan) bir hatayla karşılaştığınızda ve sökme işlemine bakarken, bakabileceğiniz tek şey bu.

Cevap

Bu, optimizasyonlar hakkında bilgi edinmek için bulduğum en iyi kaynaklardan biri.

http://www.agner.org/optimize/

Rant

Bazı geliştiricilerin bazı makalelerini okursanız (örneğin, EASTL’in yapılmasının arkasındaki gerekçeler ve kodun daha yakından incelenmesi, GCC'nin size söyleyeceği ifadenin içindekiler için korkunç olduğu için, bunun gibi yorumlara yol açacaktır . insanlar derleyicinin her zaman doğru olmadığına, özellikle de oyun geliştirmede güvende olduğunu söylüyorlar ) ve daha sonra sektöre ayak bastığında optimizasyonların günlük bir şey olduğunu ve montaj çıktısının ne kadar büyük olduğunu bilmek olduğunu göreceksiniz. Ayrıca, insanlar (özellikle stackoverflow'ta) oyun oynamanın çok zor ve her zaman doğru olmadığının farkında değiller.

Yine de bir uyarı var. Bir şeyi optimize etmek için zaman harcayabilir ve daha sonra zamanın boşa gittiğini fark edebilirsiniz. Ama ne öğrendin? Aynı hatayı benzer durumlarda tekrar etmemeyi öğrendin.

Ne SO şimdi alıyor bence açıklamaya dini duruşu optimize sen profil yok dek ve endişe yok, derleyici senden daha iyi bilir . Öğrenmeyi engelliyor. Endüstrinin oyunu optimize etmek ve hata ayıklamak için etrafta dolaşması için çok iyi para ödenen (ve çok iyi para demek istiyorum) sektördeki uzmanları tanıyorum, çünkü derleyici kötü ya da basitçe size yardımcı olamıyor çünkü olamaz (GPU ile ilgili çökmeler, ilgili verilerin bir hata ayıklayıcıda okunmasının imkansız olduğu çökmeler vb.)!

Bunu yapmayı seven, henüz henüz tam olarak anlamadıysanız, soruyu burada sorar ve derleyicinin sizden daha iyi bildiği birçok cevap tarafından kapatılıp kapatılırsa ? ve asla bu yüksek ücretli programcılardan biri olmaz mı?

Son bir düşünce. Bunu daha erken yapmaya başlarsanız, yakında en kötü ihtimalle kod yazmaya başlayacağınızı, derleyicinin aynı şekilde optimize ettiği ya da en iyi ihtimalle bazı performans iyileştirmeleri içerdiğini göreceksiniz, çünkü derleyici bunu en iyi duruma getirebilir . Her iki durumda da, alışkanlık haline geldi ve bu şekilde kod yazarken daha önce yaptığınızdan daha yavaş değilsiniz. Birkaç örnek (daha birçok var):

  1. Gerçekten artış sonrası istemediğiniz sürece ön artırma
  2. Döngü içindeki kabın üzerinde çağrılan boyut () yerine sabit bir yerel boyut değişkeni kullanan kaplar için döngü yazma.

EDIT: Sektörde 8 yıl sonra güncelleme. Montajı öğren. Optimize edicilerin nasıl çalıştığını ve ürettikleri montajı öğrenin (CompilerExplorer bunun için harika bir araçtır). Test derlemelerinde (dahili testler için optimize edilmiş derlemeler) sayısız çöküşle karşılaştım, hata ayıklayıcısına hata ayıklama sembolleriyle bile güvenemezsiniz. Derleyici çok fazla şeyi optimize etti ve derleme, çökme çöplüğündeki hatayı bulmak için tek değerli bilgi kaynağınız. Şanslıysanız ve önce yapı kuyruğundaysanız, her derleme 30-40 dakika sürer; bu nedenle, hatayı izole etmek için bazı geleneksel tekniklere güvenemezsiniz. Çok oyunculu işleri daha da kötüleştirir. Montajı ve optimize edilmiş montajın nasıl okunacağını bilmek sizi daha iyi ve sonuçta takım için daha değerli hale getirecektir.


1
Derleyicileri optimize etmek için iyi bir nokta. Sahip olmaları harika, ama mükemmel olmaktan çok uzak ve bazı insanların bir derleyicinin yapmadığı basit bir optimizasyon bulmanın zor olmadığını düşündüğünün aksine.
aaaaaaaaaaaa 13:11

3
"Montaj okumayı öğrenme" ile " montaj ile optimize etme öğrenme" arasında bir fark olduğu not edilmelidir . İkisi aynı şey değildir ve cevabınız optimizasyonları uygulamak için montaj kullanmaya gerçekten değmez . Derleme doğru bir şey yapmadığı yerlerde hata ayıklama ve tespit yardımcı olabilir gibi okuma montaj yararlı bir beceridir. Ancak bu , belirli bir CPU için talimat çizelgeleme konusunda derin bilgi gerektiren optimize edilmiş rutinler yazmak için derleme kullanmaktan çok farklı . Ve aynı zamanda kapsamadığın bir şey.
Nicol Bolas,

1
Ayrıca "Sadece derleyiciyi nasıl yazacağımı öğrendim" Hayır, yapmadın. Belirli bir işlemcinin belirli bir CPU için nasıl derlendiğine baktınız. Optimize edilmiş montaj rutinlerinin nasıl uygulanacağını öğrenmek, derleyicinin bir rutini nasıl derlediğine bakmaktan daha fazlasını gerektirir. Derleyicinin neden bu belirli C ++ kodunu yeniden üretmek için bu opcodları seçtiğini anlamalısınız . Bu da CPU hakkında kesin bilgi, talimat çizelgeleme vb. Gerektirir. Bunu genelleştirmek, yılların deneyimini gerektirir ; Birkaç rutini çözerek elde edemezsin.
Nicol Bolas,

7
Dolayısıyla, A için -1: montaj için optimize edilmiş yordamların nasıl yazılacağı hakkındaki soruyu yanıtlamamak. B: derleme için optimize edilmiş yordamlar yazarken derleyiciyi nasıl yeneceğinizi öğrenmenin ne kadar kolay olduğunu ortaya koyuyor. Ve C: bir programcının algoritma seviyesi optimizasyonlarından önce montaj seviyesi optimizasyonlarına bakmasını teşvik etmek . Yüksek oranda ücret alan "sektördeki uzmanlar" bile arabayı attan önce koyduğunu söyler.
Nicol Bolas,

2
@Samaursa: Hiç kimse, insanların "sökmeyi anlamadığını ve kodu nasıl optimize edeceğini" söylemedi. Bu dini bir tartışma değil; Bu basit bir gerçek meselesi. İnsanlar insanlık yüzyıllarını, sadece genel performans için bir anlam ifade etmediğini bulmak için bazı rutini elle optimize ederek geçirdiler. Algoritmaların nasıl optimize edileceğini öğrenmek çok değerli bir beceri setidir. Montajın nasıl okunacağını öğrenmek yarı değerli bir beceri setidir. Montaj rutinlerinin nasıl yazılacağını öğrenmek, sadece nadiren kullanılan bir beceri setidir. Ve bu günlerde, en iyi optimizasyonlar el montajından değil daha iyi önbellek kullanımından kaynaklanıyor.
Nicol Bolas

22

Alacağınız ilk ipucu bu - yapma.

Modern derleyiciler aslında kodu optimize etmede gerçekten çok başarılılar ve daha iyi bir iş çıkarması için yazabileceğiniz herhangi bir kendinden haddelenmiş derleme dilden çok daha fazla olasılıkları olacak.

Bunun istisnası, derleyicinin optimizasyonda kötü bir işlem yaptığını kesin olarak belirlediğiniz herhangi bir özel durum olabilir, bu yüzden ikinci ipucu bu. Burada genel bir kural yoktur, kendi kodunuzu bilmeniz, ne yaptığını bilmeniz, bir demontajın içine atlayabilmeniz ve derleyicinin kötü bir iş yaptığını kesin olarak belirleyebilmeniz gerekir.

Bu durumda bile, hala istemeyebilirsiniz. Sizin için devam eden bakım masraflarının olmayacağından emin olmanız gerekir. Bu koda 6 ay sonra tekrar gelip bir parçasını değiştirmek isteyebilir veya bir meclis dili sürümünde düzeltilmesi daha zor olacak son derece ince bir hata bulabilirsiniz. Tüm hataları çözdüğünüze inansanız bile, programınız halka açık hatalara geçtiğinde, asla gerçekleşmeyeceğini düşündüğünüz şeyler sizin için gerçek olacaktır. Bu oldukça göz açıcı (ve alçakgönüllü bir deneyim).

Bunu kabul etmekten mutlu olsanız bile, yine de, ana darboğazınız programınızda tamamen farklı bir yerde olabileceğinden, kesinlikle ölçülebilir bir performans gelişimi olmadığını görebilirsiniz. Bu da beni tekrar 1 numaraya getiriyor. Yapma.


15

Genellikle, katı optimizasyon, Meclis kullanmaya veya daha yüksek seviyeli dillerde kod ile mikro optimizasyon yapmaya bağlı değildir. Çok fazla araştırma makalesi okursanız (yaptığım gibi - veya denediğinizde!), Algoritmalarda yapılan iyileştirmelerin çoğunlukla "nicel" değil, daha geniş bir kavramsal "nitel" seviyede olduğunu görürsünüz. mikro optimizasyon düzeyi. Büyüklük sırasındaki kazanımların, bu bakış açısına göre algoritmalara bakarak veya mevcut çözümleri vektörleştirerek / paralelleştirerek bulunmasının daha muhtemel olduğunu vurgularım.

Bunu söyledikten sonra, son zamanlarda bunun üzerine geldim; bu , özellikle oyun geliştiricileri için x86 ASM'yi öğrenmek için iyi bir yol olabilir.


EK

Başımın üstünden iki kaynak:

Ek olarak, araştırma makalelerini okumak, daha iyi performans için algoritmaları optimize ederken, bilgeğin düşünce süreçlerini izlemenin mükemmel bir yoludur. Çoğu zaman kazançlar şu şekilde görülür:

  • En pahalı işlemlerin kullanımının azaltılması (div, SQRT, trig ops ve koşullu ürünler);
  • Daha verimli veri yapıları, bellek hizalama ve azaltılmış şartlandırmalar kullanarak önbellek performansını artırmak;
  • Gelişmiş performans için kabul edilebilir alanlarda çıktı kalitesini düşürmek;
  • Vektörleşme (SIMD);
  • Paralelleştirme (iş parçacığı, görevleri GPU'ya kaydırmayı içerir);
  • Ve elbette (giderek nadiren) el kodlu montaj. Öncelikle C / C ++ montajlarını inceleyerek derleyicinin optimal olmayan seçimler yapıp yapmadığını kontrol edin. Daha fazlasını 80'lerin ve 90'ların IME'sindeki eski gazetelerde bulabilirsiniz.

Okuma araştırması aynı zamanda bu bilginin endüstriye süzülmesini beklemek yerine sizi alanınızın en üst seviyesinde tutar.


algoritma optimizasyonu hakkında konuşuyorsunuz ama bu konuda hiçbir bilgi vermiyorsunuz, tavsiyenizi izlersek ve bunun yerine bir yön verebilir misiniz?
Skeith

Aslında bundan söz ediyorum; Gerekirse çalışma o bilgisayar bilimciler niteliksel performansını iyileştirmek için ne olduğunu anlayarak, algoritmalar. Kendinizi bu kadar yeterince bırakın ve zamanla benzer terimlerle düşünmeye başlarsınız. Buradaki artan çabalar, harcama yıllarının aksine (ve son zamanlarda bir ASM forumunda bahsettiğimi gördüm) örn. x86 mimarisi. Büyük oyunu avla: Sorunları en özlerine indirgemeyi öğren ve en iyisini yapmak için neyin gereksiz olduğuna karar ver. Yukarıdaki ref kitaplarına bakınız.
Mühendis

@NickWiggill Her zamanki araştırma makaleleri kaynağınız nedir?
kizzx2

3

Bence çok erken olabilir.

Her neyse, derleyicinin derlemenin eşdeğerinden daha yavaş kod üretmediğini anlamak önemlidir, sadece derleyicinin yazdığı gibi aynı derleme kodunu yazmaktan hiçbir performans alamazsınız.

Başlangıç ​​için en azından montaj gerektirmeyen optimizasyonlara odaklanın. Igor Ostrovsky'nin bazı temel özellikleri gösteren birkaç iyi makalesi var: http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/

Şube yanlış tahminlerinin ve önbellek özlemlerinin, bazı ekstra aritmetik işlemler yaparak ödemek zorunda olsanız bile, önceden tahmin edilemeyen bir dalı önlemek veya çok fazla bellekten rastgele okumaktan kaçınmak için genellikle buna değer olduğunu unutmayın.

Ve elbette, en önemlisi, önce algoritmanızı optimize edin. Hızlı bir algoritmanın yavaş uygulanması, yavaş bir algoritmanın hızlı bir uygulamasından hemen hemen her zaman daha hızlı olacaktır.


2

Bu kitap bir kitap için son derece iyidir. Ancak, özellikle optimizasyona yönelik değildir. X86 İşlemciler için Assembly Dili, 6. baskı

MASM kullanarak, montajın temellerini öğretmekle ilgili. Ardından kitabın sonuna doğru c ++ ile nasıl bir araya getirileceğini ve onu daha büyük programlara nasıl entegre edebileceğini öğrenir.

Bunu buraya koydum, çünkü onunla programları nasıl optimize edeceğinizi öğrenmeden önce montajın temellerini öğrenmek bir anlam ifade ediyor.

Bu kitabı seviyorum, çünkü Irvine size masm programları yazmak için gereken araçları nasıl kullanacağınızı öğretiyor. Özellikle IDE (Visual Studio C ++) ve hata ayıklayıcının nasıl kullanılacağı üzerine giriyor. Her bölümde, sorunların çözümüne yönelik birkaç video bulunmaktadır. Bu bilgilerin bir kısmı listelenen web sitesinde serbestçe kullanılabilir.


1
"Programları nasıl optimize edeceğinizi öğrenmeden önce montajın temellerini öğrenmek mantıklı" - iyi tavsiyeler.
Maximus Minimus 16:11
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.