Kütüphane fonksiyonları için FLOP sayımı


13

Basit bir fonksiyondaki FLOP sayısını değerlendirirken, genellikle temel aritmetik operatörleri ifade eden ifadeden aşağı inilebilir. Bununla birlikte, bölünmeyi bile içeren matematiksel ifadeler söz konusu olduğunda, bunu yapamaz ve sadece toplama ve çarpma ile fonksiyonlardan FLOP sayımları ile karşılaştırmayı bekleyebiliriz. İşlem bir kütüphanede uygulandığında durum daha da kötüdür. Bu nedenle, özel işlevlerin performansı hakkında makul bir fikre sahip olmak zorunludur.

Özel işlevlerle, şu gibi şeyleri kastediyoruz:

  • tecrübe()
  • SQRT ()
  • sin / cos / tan ()

bunlar genellikle sistem kütüphaneleri tarafından sağlanır.

Bunların karmaşıklığını belirlemek, birçoğunun uyarlanabilir olması ve girdiye bağımlı karmaşıklığa sahip olmasıyla daha da karmaşıktır. Örneğin, exp () 'nin sayısal olarak kararlı uygulamaları çoğu zaman uyarlamalı olarak yeniden ölçeklendirir ve aramaları kullanır. Buradaki ilk izlenimim, bu durumda yapılabilecek en iyi şeyin, işlevlerin ortalama davranışını tespit etmek olduğudur.

Bu tartışmanın tamamı elbette mimariye oldukça bağımlı. Bu tartışma için kendimizi geleneksel genel amaçlı mimarilerle kısıtlayabilir ve özel fonksiyon birimleri (GPU'lar, vb.) Olanları hariç tutabiliriz

Sistem karşılaştırması ve sistem karşılaştırması amacıyla bunları belirli mimariler için standartlaştırmak için oldukça basit girişimler bulunabilir , ancak yöntem veya yöntem performansını önemsiyorsa bu kabul edilemez. Bu işlevlerin FLOP karmaşıklığını belirlemek için hangi metodolojilerin kabul edilebilir olduğu düşünülmektedir? Büyük tuzaklar var mı?


Peter, kısa bir yorum. Matematik kitaplıkları tarafından sağlanan işlevlere birkaç iyi örnek sunmanıza rağmen, kayan nokta bölmeleri normal olarak kayan nokta birimi tarafından uygulanır.
Aron Ahmadia

Teşekkürler! Yeterince net değildim. Daha iyi kontrast sağlamak için düzenledim.
Peter Brune

Sin, cos ve sqrt'ın aslında x86 yönergelerinin x87 kayan nokta alt kümesinde uygulandığını görünce şaşırdım. Sanırım ne demek istediğimi anlıyorum, ama kabul edilen uygulamanın bunları biraz daha büyük sabitlerle kayan nokta operasyonları olarak ele almak olduğunu düşünüyorum :)
Aron Ahmadia

@AronAhmadia On yıldan fazla bir süredir x87 kullanmak için bir neden olmamıştır. Böl ve sqrt()SSE / AVX olduğunu ama daha fazla ek ve multilication daha sürebilir. Ayrıca, SSE komutunun iki katı uzunluğunda (genişliğinin yarısı ile) Sandy Bridge AVX üzerinde zayıf bir şekilde vektörleştirilmiştir. Örneğin, çift duyarlıklı AVX (4 çift genişlik), her döngüde 8 flop olan her döngüyü (bellekte bağımlılık veya duraklama olmadığı varsayılarak) paketlenmiş bir çarpma yapabilir ve paketlenebilir. Bölme, bu "4 flop" için 20 ila 44 döngü sürer.
Jed Brown

sqrt (), PowerPC'de isteğe bağlıdır. Bu mimarinin birçok gömülü çipi talimatı uygulamamaktadır, örneğin Freescale MPC5xxx serisi.
Damien

Yanıtlar:


10

Bir "flop" un aynı anakronistik tanımına göre flop sayısını saymak yerine, FPU'nun kodunuzun ne kadar bağlı olduğunu veya FPU'yu ne kadar etkili kullandığınızı değerlendirmenin bir yolunu istediğiniz gibi görünüyor. Diğer bir deyişle, her bir kayan nokta birimi her döngüde tam kapasitede çalışıyorsa aynı pik değerine ulaşan bir metrik istersiniz. Bunun nasıl olabileceğini görmek için Intel Sandy Bridge'e bakalım.

Donanım destekli kayan nokta işlemleri

Bu çip AVX talimatlarını destekler , bu nedenle kayıtlar 32 bayt uzunluğundadır (4 çift tutma). Süperskalar mimari, talimatların üst üste gelmesine izin verir, çoğu aritmetik talimatın tamamlanması birkaç döngü sürer, ancak bir sonraki döngüde yeni bir talimat başlayabilir. Bu anlambilim genellikle gecikme / ters verim yazılarak kısaltılır, 5/2 değeri, komutun tamamlanması için 5 döngü süreceği anlamına gelir, ancak her iki döngüde yeni bir talimat başlatabilirsiniz (işlenenlerin mevcut olduğu varsayılarak) bağımlılık ve hafıza beklememek).

Çekirdek başına üç kayan nokta aritmetik birimi vardır, ancak üçüncüsü tartışmamızla ilgili değildir, ilgili iki A ve M birimini çağıracağız çünkü birincil işlevleri toplama ve çarpmadır. Örnek talimatlar (bkz. Agner Sis tabloları )

  • vaddpd: paketlenmiş ekleme, 1 döngü için işgal ünitesi A, gecikme / ters verim 3/1
  • vmulpd: paketlenmiş çarpma, ünite M, 5/1
  • vmaxpd: paketlenmiş maksimum çift seçimi, birim A, 3/1
  • vdivpd: paketli bölme, birim M (ve bazı A), girişe bağlı olarak 21/20 - 45/44
  • vsqrtpd: paketlenmiş kare kök, bazı A ve M, girişe bağlı olarak 21/21 ila 43/43
  • vrsqrtps: tek duyarlıklı giriş için paketlenmiş düşük hassasiyetli karşılıklı karekök (8 floats)

Örtüşebilir ne için kesin semantik vdivpdve vsqrtpdgörünüşte ince ve AFAIK, her yerde belgelenmiştir değil. Çoğu kullanımda, bence çakışma olasılığı çok azdır, ancak kılavuzdaki ifadeler birden çok iş parçacığının bu talimatta çakışma için daha fazla olasılık sunabileceğini düşündürmektedir. Her döngüde vaddpdve vmulpdher döngüde toplam 8 flop için zirve floplarına vurabiliriz . Yoğun matris-matris çarpımı ( dgemm) bu zirveye makul bir şekilde yaklaşabilir.

Özel talimatlar için flopları sayarken, FPU'nun ne kadarının işgal edildiğine bakarım. Diyelim ki, girdi aralığınızda vdivpd, tamamıyla işgal eden M birimini tamamlamak için ortalama 24 döngü sürdüğünü, ancak (varsa) eklenti döngülerin yarısı boyunca eşzamanlı olarak gerçekleştirilebileceğini iddia edin. FPU, bu döngüler sırasında 24 paketlenmiş çarpan ve 24 paketli ekleme gerçekleştirebilir (mükemmel bir şekilde serpiştirilmiş vaddpdve vmulpd), ancak a ile vdivpdyapabileceğimiz en iyisi 12 ek paket ekidir. Bölme işleminin mümkün olan en iyi yolunun donanımı (makul) kullanmak olduğunu varsayarsak, vdivpdher bir skaler bölünmeyi 36 "flop" olarak saymamız gerektiğini belirten 36 paketli "flop" olarak sayabiliriz.

Karşılıklı kare kök ile, özellikle tam doğruluk gerekli değilse veya giriş aralığı darsa, bazen donanımı yenmek mümkündür. Yukarıda belirtildiği gibi, vrsqrtpstalimat çok ucuzdur, bu nedenle (tek hassasiyette ise) vrsqrtpstemizlemek için bir veya iki Newton yinelemesi yapabilirsiniz. Bu Newton iterasyonları sadece

y *= (3 - x*y*y)*0.5;

Bu işlemlerin çoğunun yapılması gerekiyorsa, bu naif değerlendirmeden önemli ölçüde daha hızlı olabilir y = 1/sqrt(x). Donanım yaklaşık karşılıklı karekökü bulunmadan önce, performansa duyarlı bazı kodlar Newton yinelemesi için bir ilk tahmin bulmak için rezil tamsayı işlemleri kullanıyordu.

Kütüphane tarafından sağlanan matematik fonksiyonları

Benzer bir buluşsal yöntem kütüphane tarafından sağlanan matematik işlevlerine de uygulanabilir. SSE talimatlarının sayısını belirlemek için profil oluşturabilirsiniz, ancak tartıştığımız gibi, bu tüm hikaye değildir ve tüm zamanını özel işlevleri değerlendirerek geçiren bir program zirveye yaklaşmış gibi görünebilir, bu doğru olabilir, ancak FPU üzerindeki kontrolünüz dışında her zaman harcandığını söylemek için kullanışlı değil.

Temel olarak iyi bir vektör matematik kütüphanesi kullanmanızı öneririm (örneğin Intel'in VML'si, MKL'nin bir parçası). Her çağrı için döngü sayısını ölçün ve bu döngü sayısı üzerinden elde edilebilecek en yüksek floplarla çarpın. Dolayısıyla, paketlenmiş bir üstel değerlendirmek için 50 döngü alırsa, kayıt genişliğinin 100 flop katı olarak sayın. Ne yazık ki, vektör matematik kitaplıklarını aramak bazen zor ve tüm özel işlevlere sahip değilsiniz, bu nedenle skaler matematik yapabilirsiniz, bu durumda varsayımsal skalerimizi 100 flop olarak üstel sayabilirsiniz (muhtemelen hala 50 sürer) Bu nedenle, yalnızca bu üstel değerleri değerlendirmek için her zaman harcanırsa "zirvenin"% 25'ini elde edersiniz).

Diğerlerinin de belirttiği gibi, PAPI veya çeşitli arabirimleri kullanarak döngüleri ve donanım olay sayaçlarını sayabilirsiniz. Basit çevrim sayımı için çevrim sayacını rdtsc, bir satır içi montaj snippet'i ile talimatı kullanarak doğrudan okuyabilirsiniz .


7

Donanım sayaçlarına erişim sağlayan PAPI'yi ve basit test programlarını kullanarak bunları gerçek sistemlerde sayabilirsiniz . En sevdiğim PAPI arabirimi / sarmalayıcısı IPM (Entegre Performans İzleyicisi), ancak başka çözümler var ( örneğin TAU ). Bu, oldukça kararlı bir yöntem-yöntem karşılaştırması sağlamalıdır.


4

Bu soruyu sanki siz istediniz gibi cevaplayacağım:

"Sayısal doğrusal cebirden gelen geleneksel çarpma-ekle-taşıma FLOP sayımları yerine, özel işlevlere büyük ölçüde dayanan algoritmaların performansını analitik olarak nasıl karşılaştırırım veya tahmin ederim"

İlk öncülünüze katılıyorum, birçok özel işlevin performansının mimariye bağlı olduğunu ve bu işlevlerin her birine sabit maliyet olarak davranabilmenize rağmen, sabitin boyutu, aynı iki işlemci arasında bile değişecektir. ancak farklı mimarilerle ( referans için Agner Sis'in talimat zamanlama tablosuna bakın).

Bununla birlikte, karşılaştırmanın odak noktasının bireysel kayan nokta operasyonlarının maliyetleri üzerinde olması gerektiğine katılmıyorum. Ben FLOP saymanın bir dereceye kadar yararlı olduğunu düşünüyorum, ancak iki potansiyel algoritmayı karşılaştırırken özel fonksiyonların maliyetini daha az alakalı hale getirebilecek birkaç çok daha önemli husus var ve bunların karşılaştırılmasına gitmeden önce açık bir şekilde incelenmesi gerekir. kayan nokta işlemleri:

  1. Ölçeklenebilirlik - Paralel mimariler üzerinde verimli bir şekilde uygulanabilen görevler içeren algoritmalar, öngörülebilir gelecek için bilimsel hesaplama alanına hakim olacaktır. Daha düşük iletişim, daha az senkronizasyon ihtiyacı veya daha iyi doğal yük dengesi yoluyla daha iyi bir "ölçeklenebilirliğe" sahip bir algoritma, daha yavaş özel işlevler kullanabilir ve bu nedenle az sayıda işlem için daha yavaş olabilir, ancak sonunda sayı olarak yakalanır. işlemcilerin sayısı artar.

  2. Geçici Referans Yeri - Algoritma görevler arasındaki verileri yeniden kullanıyor ve işlemcinin gereksiz bellek trafiğinden kaçınmasına izin veriyor mu? Bir algoritmanın geçtiği bellek hiyerarşisinin her seviyesi, her bellek erişimine başka bir büyüklük maliyeti (kabaca) ekler. Sonuç olarak, yüksek yoğunluklu özel işlemlere sahip bir algoritma, daha büyük bir bellek bölgesinde eşdeğer sayıda basit işlev işlemine sahip bir algoritmadan önemli ölçüde daha hızlı olacaktır.

  3. Bellek İzi - Bu, önceki noktalarla yakından ilgilidir, ancak bilgisayarlar büyüdükçe büyür, çekirdek başına bellek miktarı aslında aşağı doğru eğilim gösterir. Küçük bir bellek ayak izinin iki avantajı vardır. Birincisi, az miktarda program verisinin işlemci önbelleğine tamamen sığabileceğidir. İkincisi, çok büyük problemler için, daha küçük bir bellek alanına sahip bir algoritmanın işlemci belleğine sığabilmesi, aksi takdirde bilgisayarın kapasitesini aşacak problemlerin çözülmesine izin verebilmesidir.


FLOPS / sn'yi bilmek, hangi darboğaz rejimini (bellek, iletişim) oldukça iyi durumda olduğunuzu ayırmanızı sağlar. Örneğin, zamanlarının çoğunu matvec yapmak için harcayan Newton-Krylov yöntemlerini düşünün. Matvec'ler her matris girişi için bir veya iki FLOP yapar ve hepsi bu. Demonte olmayan düzleştiriciler daha iyisini yapma potansiyeline sahiptir. Jed ve ben de bunun hakkında konuşuyoruz ve alternatif bir fikir FLOP-bağlı hesaplamada kaç döngü harcadığınızı görmektir. Ancak, bu oldukça hassas bir izleme gerektirebilir ve toplam FLOPS / sn daha pratik olabilir.
Peter Brune

Aron, bu cevabın çoğu Peter'ın bu diğer soruyu cevaplamak lehine olan sorusunu atlatıyor gibi görünüyor: scicomp.stackexchange.com/questions/114
Jed Brown

@JedBrown, katılıyorum, çok daha sağlam bir cevap oluşturmak için zaman ayırdığınız için teşekkürler.
Aron Ahmadia

0

Neden flop saymaya zahmet ettin? Her işlem için döngüleri saymanız yeterlidir ve evrensel bir şeye sahip olursunuz.

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.