Performans sorunlarını araştırmak için olay verilerini görselleştirme yolları


10

Bir MPI uygulamasını son derece asenkron iletişim paterni ile optimize etmeye çalışıyorum. Her sıralamada hesaplanacak şeylerin bir listesi vardır ve girişler veya çıkışlar farklı bir sıralamada bulunuyorsa gerektiği şekilde mesaj gönderir. Ayrıca, her rütbe iş parçacığı (şu anda bir iletişim iş parçacığı ve 5 işçi ile) dişli.

Bana her iş parçacığı için (başlangıç, bitiş, tür) üçlü bir listesini veren farklı performans kritik kod bölümleri etrafında zamanlayıcılar ile kod kullandım. Yatay eksen olarak zaman, dikey olarak sıra ve iplik ve her bir iş parçacığının ne yaptığını gösteren renkle açık bir şekilde çizilir, 6 iş parçacığı / sıra ile 16 sıra için böyle bir görüntü elde ederim:

Pentago sıralaması ve iş parçacığı geçmişi

Benim sorum: Bu verileri görselleştirmenin performans sorunlarını azaltmaya yardımcı olabilecek başka yolları nelerdir? Hiç kimsenin eşzamansız uygulamaları profillendirirken kullandıkları favori bir arsa türü var mı?

Bu veri kümesi, veri akışı yapısını bilmediği için sınırlıdır, ancak daha karmaşık bir şey toplamaya çalışmadan önce mümkün olduğunca fazla bilgi edinmek istiyorum.

Sıkıştırılmamış görüntü, herhangi birinin etrafına bakmak istemesi durumunda buradadır (normal rotadan yüklenemedi). Ne yazık ki, Firefox geçerli olduğuna inandığım halde kabul etmiyor, muhtemelen çok büyük olduğu için.


Büyük resmi yüklemek için tarayıcımı veya neredeyse başka bir programı almakta biraz sorun yaşadım. Sonunda, gimp bunu yaptı, ancak boyut veya dosya formatı seçeneklerini yeniden düşünmek isteyebilirsiniz.
Pedro

Bunun için üzgünüm. Firefox bana aynı hataları dönüştürme (ImageMagick) aracılığıyla çalıştırıyor çünkü görüntü geçerli olduğunu düşünüyorum. Muhtemelen bazı keyfi boyut eşiğini aşıyor.
Geoffrey Irving

Yanıtlar:


4

Hem paylaşılan hem de dağıtılmış bellekle paralel kod yazmak ve hata ayıklamak için çok zaman harcıyorum, ancak özel sorununuzu bilmeden, sadece benim için en iyi olanı söyleyebilirim.

Hangi bilerek rutinleri kadar zaman hesaplama verimliliği bakıyorsanız önemli şey ne kadar sürebilir, ancak paralel verimlilik endişe eğer, o zaman daha da kullanıcılar bu kod ne yaptığını endişe edilmelidir değil herhangi hesaplama yapıyor. Çocukların çok sessiz olduğunda neler yaptıklarından endişe etmek gibi ...

Karma bir paylaşılan / dağıtılmış bellek yaklaşımı kullandığınızdan, kodunuzun boşluklarda bir MPI çağrısında veya muteks / koşul değişkeninde beklediğini düşünüyorum. Bu aramaları zamanlayıcılara da satabilirsiniz ve bu sizi yavaşlatan şeyin daha iyi bir resmini verecektir MPI_REDUCE;

Sık kullandığım bir yazılım parçası Intel Vtune Amplifikatör XE . İplik eşzamanlılığını görselleştiren güzel bir çizim özelliği / seçeneğine sahiptir. Program sizinkine çok benzer bir çizim çizecektir, ancak bir iplik bir muteks veya koşul değişkeninde beklediğinde, beklemeye başladığı anda, muteksi serbest bırakan veya sinyal verilen ipliğe çapraz bir çizgi çizer. serbest bırakıldığı / işaret edildiği sırada beklediği durum. Bu oldukça dağınık olabilir, ancak darboğazların hemen görünmesini sağlar.

Son olarak, toplu istatistikleri de topluyorum, örneğin her muteks / sinyal / MPI çağrısı için ortalama ve maksimum bekleme süreleri nelerdi? Toplanan bekleme sürelerinin histogramı nedir? Arsa size güzel bir genel bakış sunarken, ince ayrıntılar söz konusu olduğunda oldukça dağınık olabilir.

Son olarak, hafife alınmaması gereken bir soru: Zamanlamalarınızı nasıl topluyorsunuz? Zamanlayıcı kodunuzu etkilemeyecek kadar müdahaleci değil mi? CPU komut sayısını mümkün olduğunca RDTSCx86 mimarisinde kullanıyorum. Bu genellikle kodunuza tek bir talimat ekler.


Verilerin zaten tüm beklemeler etrafında blokları var; şemada, boş işçi dişleri için beyaz ve bekleyen iletişim iplikleri için sarı olarak gösterilmektedir. Ne yazık ki, iletişim iş parçacığındaki tüm beklemeler, eşzamansızlık nedeniyle tek bir battaniye MPI_Waitsome oluşur. Vtune bu durumda geçerli değildir, çünkü tamamen dişli performans esasen mükemmeldir, ancak işaretçi için teşekkürler. Histogram önerisi de iyi bir öneridir.
Geoffrey Irving

Zamanlama yükü gelince: Ben pthread koşul değişkenleri kullandığım için en azından boş bölümlerin etrafında gerekli gettimeofday kullanıyorum. CPU talimat sayımı böyle bir durumda çalışmak için yapılabilir mi? Tepegöz zaten yeterince düşük, ama daha düşük kesinlikle daha güzel olurdu.
Geoffrey Irving

1
@GeoffreyIrving: Evet, bunları kullanabilirsiniz, ancak yalnızca constant_tscbayrak ayarlı (kontrol /proc/cpuinfo) CPU'larda mantıklıdırlar ve her bir iş parçacığını belirli bir çekirdeğe kilitlerseniz, yani her iş parçacığı her zaman aynı çekirdekten aynı kaydı okur, örneğin pthread_setaffinity_np. İkincisinin Linux'a özgü olduğunu ve bu nedenle taşınabilir olmadığını unutmayın.
Pedro

@GeoffreyIrving: Açıklanmayan bazı olayları kullanarak bekliyorsanız bile MPI_Waitsome, gerçekte hangi isteklerin nereden geldiğini kaydedebilirsiniz. Bu bilgiler yararlı olabilir veya olmayabilir ...
Pedro

5

Bazen yüksek düzeyli bir kaynak analizi yoluyla performans sorunlarına alternatif bir görünüm elde edebilirsiniz: Bellek bant genişliği gibi ilgili bir darboğaz var mı? Her işçi iş parçacığı aynı miktarda iş yapıyor mu? Bu veriler, LIKWID araç paketi LIKWID Google kod projesinden likwid-perfctr ile kolayca toplanabilir . Profil çok farklı sıcak noktalar varsa, bunları tek tek ele almanız gerekebilir. Kaç iş parçacığının / işlemin kullanıldığına bağlı olarak farklı sorunlar da olabilir.


Mükemmel ifşa için, Georg LIKWID projesi üzerinde çalışıyor ve bu yanıtı talep ettim çünkü Pedro'nun büyük cevabını başka bir bakış açısıyla (ve özgürce ulaşılabilen harika bir araç) tamamlamak istedim.
Aron Ahmadia

2

İletiler veya olaylar tarafından yönetilen son derece eşzamansız işlemler ağında bir sorun yaşadığımda, kolay olmayan ancak etkili bir yöntem kullanıyorum. Süreçlerin zaman damgalı günlüklerini almayı, bunları ortak bir zaman çizelgesine birleştirmeyi ve bazı iletileri etkinlikleri tetiklerken ilerlemeyi izlemeyi, başka iletileri tetiklemeyi içeriyordu. Aradığım şey, bir mesajın alındığı zaman ile harekete geçildiği zaman arasındaki gecikme ile gecikmenin nedenini anlamak. Bir sorun bulunduğunda giderilir ve işlem tekrarlanır. Bu şekilde, gerçekten tatmin edici bir performans elde edebilirsiniz.

Bunun ölçtüğünüz, ölçtüğünüz, ölçtüğünüz yaklaşımlardan nasıl farklı olduğunu görmek önemlidir. Nerede makul söyleyebilirim tek şey ölçüm olduğu değil bakmak için. Gerçek performans ayarı, ayrıntılara zaman açısından dikkatle bakmayı gerektirir. Aradığın zamanın nerede harcandığı değil, gereksiz yere nerede harcandığı.

İyi şanslar.


Başka bir deyişle, elimdeki verilerin yararlı bir görselleştirmesi yoktur. :) Jed Brown, Jumpshot'ı (ve ilişkili yardımcı programları) önerdiğiniz verileri toplamanın ve görselleştirmenin bir yolu olarak önerdi, bu yüzden buna bakacağım.
Geoffrey Irving

@Geof: Görselleştirmede iyi şanslar. Yararlı bulabileceğim tek araç, olay günlüklerini toplamak ve birleştirmek için bir şeydir, böylece çeşitli iş parçacıklarından geçerken bir veya daha fazla isteğin yolunu izleyebilirim, çünkü gereksiz tespit etmenin tek yolu budur gecikmeler. Herhangi bir performans sorununun oluşturacağı şey budur - gereksiz gecikmeler.
Mike Dunlavey
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.