Flop sayımı ile algoritmik analiz yapmak eski mi?


43

Sayısal analiz kurslarımda, problemin büyüklüğüne göre ihtiyaç duydukları kayan nokta işlemlerinin (floplar) sayısını sayarak algoritmaların verimini analiz etmeyi öğrendim. Örneğin, Trefethen & Bau'nun Sayısal Doğrusal Cebir'deki metninde flop sayımlarının 3B görünümlü resimleri bile var.

Şimdi "floplar ücretsiz" demek modaya uygun, çünkü önbellekte olmayan herhangi bir şeyi almak için hafıza gecikmesi bir flop maliyetinden çok daha büyük. Ama yine de öğrencilere flop saymalarını öğretiyoruz, en azından sayısal analiz derslerinde. Onlara hafıza erişimini saymalarını öğretmeli miyiz? Yeni ders kitapları yazmamız gerekiyor mu? Yoksa bellek erişimi, zaman harcayacak kadar makineye özgü mü? Flop veya hafıza erişiminin tıkanıklık olup olmadığına dair uzun vadeli eğilim ne olacak?

Not: Aşağıdaki yanıtlardan bazıları, "Birkaç flop tasarrufu yapmak veya önbellek performansını artırmak için uygulamamı saplantılı olarak yeniden yazmalı mıyım?" Gibi farklı bir soruyu cevaplıyor gibi görünüyor. Ancak sorduğum şey, " Aritmetik işlemler veya hafıza erişimleri açısından algoritmik karmaşıklığı tahmin etmek daha mı faydalı ?"


1
> "Aritmetik işlemler veya hafızaya erişim açısından algoritmik karmaşıklığı tahmin etmek daha yararlı mıdır?" . Pratik açıdan bakıldığında, gömülü sistemler hala bellek bant genişliği yerine FPU hızı ile sınırlandırılıyor. Bu nedenle, flop sayımının HPC standartlarına göre geçersiz olduğu kabul edilse bile, diğer topluluklar için pratik kullanımdadır.
Damien

Yanıtlar:


31

βFmaxBmaxFmaxβ>BmaxBmaxβ>Fmax

Bellek erişimini saymanın zorunlu olduğunu düşünüyorum, ancak şunu da düşünmeliyiz:

  • Ne kadar yerel hafıza gerekli

  • Ne kadar olası eşzamanlılık var

Ardından, modern donanım için algoritmaları analiz etmeye başlayabilirsiniz.


3
β

2
David daha 8 yıl önce yapıyor .
Matt Knepley

3
Tamam, daha iyi, daha karmaşık bir model var (her zaman olduğu gibi). Ancak bu model makineye bağlı bir cevap veriyor. İlk analiz olarak öğrencilere ne öğretmeliyiz?
David Ketcheson,

3
Mesele şu ki, algoritma olduğu gibi, makinenin pik flop'ların pik bant genişliğine oranı tek bir sayıya düşürülmüştür. Bu olabildiğince basittir. Hesaplamalı bir model olmadan, herhangi bir karmaşıklık tahmini işe yaramaz ve bu en basit olanıdır.
Matt Knepley

1
Sanırım sorunu yanlış anladın. Zaten büyük yükleri taşıyabilecek optik nakliyemiz var. Sorun bunu bir çip üzerine almak. Sadece çok fazla kablo ve en iyi saat hızına sahipsin. Optik taşıma, bu sorunu yalnızca bir optik çip üzerinde hafifletir.
Matt Knepley

22

O(N4)O(N)O(NlogN)O(N2)

Daha geniş bir perspektiften, algoritmik performans analizinin "her şey dahil" olması gerektiğini düşünüyorum. İnsanlara gerçek HPC geliştiricileri ve kullanıcıları olmalarını öğretiyorsak, gerçek dünyadaki programlamanın maliyetini anlamaları gerekir. Sahip olduğumuz soyut analiz modelleri programcının zamanını dikkate almıyor. Flop sayıları ve algoritmik verimlilikten ziyade "toplam çözüm zamanı" anlamında düşünmeliyiz. Birkaç milyon hesaplama yapmayı planlamıyorsanız, bilgisayar başına bir saniyelik zaman kazandıracak bir rutini yeniden yazmak için üç veya dört programcı günü harcamak çok mantıklı değildir. Benzer şekilde, bir veya iki saatlik hesaplama süresinden tasarruf etmek için yapılan birkaç günlük yatırım çabucak karşılığını verir. Bu yeni algoritma şaşırtıcı olabilir,


7
O(NlogN)O(N2)

2
O(NlogN)O(N2)

9

Diğerlerinin de belirttiği gibi, cevap elbette darboğazın CPU mu yoksa hafıza bant genişliği mi olduğuna bağlı. Rasgele boyutta bazı veri kümelerinde çalışan birçok algoritma için, darboğaz genellikle veri kümesi CPU önbelleğine sığmadığından bellek bant genişliğidir.

Dahası, Knuth, bellek erişim analizinin zaman testine dayanma ihtimalinin yüksek olduğunu, muhtemelen modern CPU boru hatlarının ve şube tahminlerinin karmaşıklığı ile karşılaştırıldığında nispeten basit (hatta önbellek dostu olduğu göz önüne alındığında bile) olduğunu belirtti.

Knuth , BDD'leri analiz ederken TAOCP'nin 4A Birimindeki gigamemleri kullanır . Önceki ciltlerde kullanıp kullanmadığından emin değilim. 2010'daki yıllık Noel Ağacı Dersi'nde zamanın testine dayanmakla ilgili söz konusu yorumu yaptı.

İlginçtir, Yapıyorsun Yanlış , bellek işlemlerine dayanan performansı analiz etmenin bile, verilerin bir kerede fiziksel RAM'e sığmaması durumunda ortaya çıkan VM baskısı gibi unsurlar olduğu için her zaman kolay olmadığını göstermektedir.


8

Bir algoritmanın maliyetini nasıl belirleyeceğiniz, hangi bilimsel bilgi işlem seviyesinin çalıştığınıza ve hangi (dar veya geniş) problem sınıfını düşündüğünüze bağlıdır.

Önbellek optimizasyonu hakkında düşünürseniz, bu, örneğin BLAS ve benzeri kütüphaneler gibi sayısal lineer cebir paketlerinin uygulanması ile açıkça ilgilidir. Dolayısıyla bu düşük seviye optimizasyona aittir ve belirli bir problem için ve girdi üzerinde yeterli kısıtlamalara sahip sabit bir algoritmanız varsa, sorun yoktur. Örneğin, Önbellek optimizasyonu, eğer matrisin yeterince seyrek olacağına söz verilirse, eşlenik gradyan yinelemesinin hızlı bir şekilde uygulanması ile ilgili olabilir.

Öte yandan, sorun sınıfı ne kadar genişse, gerçek hesaplamada o kadar az tahmin edersiniz (örneğin, CG uygulamanızın giriş matrislerinin ne kadar seyrek olacağını bilmiyorsunuz gibi). Programınızın çalışması gereken makinelerin sınıfı ne kadar genişse, Önbellek mimarisinde o kadar az öngörüde bulunabilirsiniz.

Ayrıca, daha yüksek düzeyde bir bilimsel hesaplamada, problem yapısını değiştirmek daha uygun olabilir. Örneğin, doğrusal bir denklem sistemi için iyi bir önkoşullayıcı bulmak için zaman harcıyorsanız, bu tür bir optimizasyon genellikle düşük seviyeli optimizasyonları atar, çünkü yineleme sayısı büyük ölçüde azalır.

Sonuç olarak, önbellek optimizasyonu yalnızca, asimptotik FLOP sayılarının paralelliği ve azalması ile optimize edilecek hiçbir şey kalmadığında yararlıdır.

Teorik bilgisayar bilimi duruşunu uyarlamanın akıllıca olacağını düşünüyorum: Sonunda, bir algoritmanın asimptotik karmaşıklığını geliştirmek, varolan bazı kod satırlarının mikro-optimizasyonundan daha fazla geri dönüşe sahip. Bu nedenle FLOP sayımı hala tercih edilmektedir.


msgstr "önbellek optimizasyonu yalnızca, asimptotik FLOP sayılarının paralelliği ve azaltılması ile optimize edilecek hiçbir şey kalmadığında faydalıdır". Katılmıyorum. Büyük bir sayı grubunun büyük bir ifadesini hesaplamak istiyorsanız, her sayının tüm sayılarından, her sayının tüm adımlarından daha iyi bir adım gerçekleştirilmesi daha iyidir. Her ikisi de aynı sayıda FLOPS'a sahiptir, ancak bir tanesi hafıza erişiminde daha iyidir. Önbellek sığacak demet boyutunu seçerseniz Bonus (veya derleyici sizin için yapar). Bu, numexpr'nin Python'da yaptığı şeydir: github.com/pydata/numexpr
Davidmh

6

Her zaman flopları saymayı, hafızaya erişimi ya da her neye sahip olduğunuzu düşünmeyi reddettim. Bu, 1960'larda yaptığınız ve neredeyse yaptığınız şeyin sadece algoritmik optimizasyona bağlı olduğu bir kavram. Jacobi yinelemesinin her ikisini de ortadan kaldırarak, bir sonlu eleman problemini düzgün bir xyz ağında çözmeyi düşünün.

Şimdi, cehenneme optimize edebilir ve çalışma süresinin% 10'unu alarak birkaç floptan tasarruf edebilirsiniz. Veya, çalışma süresinde 10'luk bir faktör alarak, multigrid bir metot ve optimal bir blok ön şartlandırıcı kullanmayı düşünebilirsiniz. Öğrencilerimizi yapmaları için eğitmemiz gereken şey budur - daha iyi bir iç algoritma bulmaya çalışırken size hangi karmaşık, dış algoritmaların size kazandırdığını düşünün. Patronunuz (Keyes), MHD hesaplamalarında bu noktayı oldukça belirgin hale getiren bu slaytları sürdürmektedir.


Aslına bakarsan, düşük seviyeli optimizasyon değil, önerdiğin yüksek seviyeli düşünceyi soruyordum. Multigrid ve ön şartlandırıcınızın alternatiflerden daha hızlı olup olmayacağını belirlemek için hangi metriği kullanmalısınız?
David Ketcheson

Onlarca ya da binlerce satırlık kod üzerinde çalışan karmaşık algoritmalar için FLOPS ya da diğer herhangi bir komut sayımının nasıl sayılacağını bilemem. Örneğin, AMG algoritmalarının analiz ve yapım aşamasının ne kadar karmaşık olduğunu düşünün. Bu algoritmaların o kadar çok kısmı vardır ve bunların hepsi işlem sayısını tahmin edemediğiniz gerçek verilere bağlıdır.
Wolfgang Bangerth,

1
Sanırım ilk başta ne aldığınızı yanlış anladım, ama yine de amacınıza katılmıyorum. "Dış algoritmalar" hala (ve tartışmalıyım, olmaz) akılda asimptotik karmaşıklıkla tasarlanabilir. Elbette, ikinci dereceden bir algoritmadan, doğrusal bir algoritmaya düşmenin, çalışma süresinde% 10'luk bir azalmaya yol açacağını iddia etmeyeceksiniz; Yine de, asimptotik karmaşıklığı, flop ve / veya hafıza operasyonlarından daha başka nasıl ölçebiliriz?
Jack Poulson

7
Bence bu "ellerini kaldır" algoritmalarına yaklaşım çok saçma. Analizi yalnızca birinci dereceden maliyetlere bakarak ve modeli izlenebilir olacak şekilde sadeleştirerek basitleştirmeniz gerekir, ancak MG veya Cholesky gibi bir şeyi analiz edemeyeceğinizi söyleyin, çünkü bu çok karmaşık bir işlemdir.
Matt Knepley

1
Peki, saydığınız her FLOP, hiper iş parçacıklı işlemciler, önbellekler, yavaş RAM, multiskalar işlemciler ve otomatik vektörizasyonun neden olduğu birkaç gecikme katmanının arkasına gizlendiğinde MG veya Cholesky'yi analiz etmek ne anlama gelir? Yaptığım nokta şu ki, 5-10 faktöründe, algoritmalarınızın çalışma zamanını daha fazla zamanlamadan tahmin edemezsiniz. İnsanlar bu FLOP saymaya başlarken, 50'li ve 60'lı yıllarda tamamen farklıydı.
Wolfgang Bangerth

1

Evet, eski. Floplar veya başka herhangi bir yöntemle yapılan algoritmik analiz, eldeki problemin büyüklüğü göz önüne alındığında, makinenin soyut modeli kadar faydalıdır. Gerçek performans hem uygulamaya hem de donanıma bağlıdır ve herhangi bir soyut modelin gerçekliğe uygulanabilirliği zamanla azalmaktadır. Örneğin, moleküler dinamikler gibi karmaşık bir algoritmanın uygulanmasını daha da paralel hale getirdiğinizde, farklı özellikler farklı donanımlarda hızı sınırlandırır ve algoritmik analizin gözlemlerle ilgisi yoktur. Bir anlamda, önemli olan tek şey, algoritmaların / uygulamaların uygulanmasının söz konusu donanım türleri üzerindeki performansını ölçmektir.

Bu tür soyutlamalar bir öğrenme aracı olarak faydalı mıdır? Evet, öğretim için kullanılan birçok model gibi, modelin sınırlarını anlamanın yanı sıra yerleştirildikleri sürece faydalıdırlar. Klasik mekanik, küçük mesafeli veya büyük hızlı skalalarda çalışmadığını takdir ettiğiniz sürece gayet iyi ...


-1

Sorunuzu gerçekten cevaplamıyor, fakat dikkate alınması gereken başka bir değişken daha eklemek: dikkate alınması gereken bir şey de programlama dilinin özellikleri. Örneğin, Python's sort, Python nesneleri için potansiyel olarak yavaş olabilecek karşılaştırma sayısını en aza indirmek için tasarlanmış (diğer iyi özelliklerin yanı sıra) tasarlanmış Timsort algoritmasını kullanır . Öte yandan, iki kayan noktayı karşılaştırmak C ++ 'da hızlı bir şekilde cayır cayır yanıyor, ancak takas etmek daha pahalı, bu yüzden başka algoritmalar kullanıyorlar.

Diğer örnekler, dinamik bellek tahsisidir (Python listesinde önemsizdir, hem çalışma zamanında hem de geliştirici zamanında hızlıdır .append()), FORTRAN veya C, uygun şekilde uygulandığında mümkün ve hızlı olsa da, önemli ölçüde daha fazla programlama zamanı ve beyin gerektirir. Python'un FORTRAN'dan daha hızlı olduğunu görün .


Bu doğrudur, ancak dediğiniz gibi soruyu cevaplamıyor. Farklı bir konuda.
David Ketcheson

Uygun bir analizde hangi algoritmanın uygulanacağına karar verirken göz önünde bulundurulması gereken bir şeydir.
Davidmh
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.