Callgrind ile CFD kodu oluşturma


16

Yazdığım bir çözücüyü profilini oluşturmak için Valgrind + Callgrind kullanıyorum. Valgrind kullanım kılavuzunda belirtildiği gibi, kodumu derleyici için hata ayıklama seçenekleriyle derledim:

"Hata ayıklama bilgisi olmadan, Valgrind araçlarının yapabileceği en iyi araç, belirli bir kod parçasının hangi işleve ait olduğunu tahmin etmektir, bu da hem hata mesajlarını hem de profil oluşturma çıktısını neredeyse işe yaramaz hale getirir. -G ile doğrudan ilgili kaynak kodu satırlarını. "

Valgrind kılavuzu

Hata ayıklama seçeneği ile derlendiğinde, kodlar çok daha yavaş çalışır. CFD kodu, hata ayıklama bayrakları ile derlendiğinde bile küçük durumlarda GERÇEKTEN yavaş olur. Valgrind 40x daha yavaş yapar (kılavuza 1 bakın ).

  1. Kod profili oluşturma için hangi araçları kullanıyorsunuz (karşılaştırma değil profil oluşturma)?

  2. Kodun ne kadar süre çalışmasına izin veriyorsunuz (istatistikler: kaç zaman adımı)?

  3. Vakalar ne kadar büyüktür (vaka önbelleğe sığarsa, çözücü daha büyük boyutlu siparişlerdir, ancak daha sonra bellekle ilgili işlemleri özleyeceğim)?


3
Kodu hem hata ayıklama sembolleri hem de optimizasyon etkin olarak derleyebilirsiniz. Yine de, 40x ila valgrind (tüm bellek erişimini simüle eder) mantıksız değildir.
Aron Ahmadia

Teşekkürler, ben de okuduğum budur ... bilmek istediğim profilleme (tercihen valgrind ile) günlük deneyimler hakkında bilgi: raporları beklemek için ne kadar zaman normal, kaç yineleme sayımlara ihtiyacım var, neleri hariç tutabilirim ... vb ...
tmaric

Sorunuz da biraz geniş. Sorularınızı Q2.1 ve Q2.2'ye odaklanmak için düzenlemenizi öneriyorum, çünkü Q1 tamamen farklı bir soru (ayrı olarak sormanızdan memnuniyet duyuyorum, iyi bir soru, ancak "Hangi araçlar kullanırsınız?" X sorununu çözmek için kullanın, burada X iyi tanımlanmıştır!), tek başına Q2 çok geneldir.
Aron Ahmadia

Ayrıca isme düzenleyebilir callgrind, cachegrindya da massif. Birçok kişi Valgrind'i yalnızca varsayılan araçla ( memcheck) ilişkilendirir. Öykünme tabanlı (kesme tabanlı değil) bir profil sistemi olarak, uzun süre çalıştırmanız gerekmez.
Jed Brown

@Aron & Jed: ipuçları için teşekkürler, soruyu düzenledim. :)
tmaric

Yanıtlar:


11

S1: Kod profili oluşturma için hangi araçları kullanıyorsunuz (karşılaştırma değil profil oluşturma)?

S2: Kodun ne kadar süre çalışmasına izin veriyorsunuz (istatistik: kaç zaman adımı)?

S3: Vakalar ne kadar büyük (kasa önbellekte yer alıyorsa, çözücü daha büyük boyutlu siparişlerdir, ancak daha sonra bellekle ilgili işlemleri özleyeceğim)?

İşte bunu nasıl yaptığımın bir örneği.

Kıyaslamayı (ne kadar sürdüğünü görerek) profilden ayırıyorum (nasıl daha hızlı hale getirileceğini belirleyerek). Profil oluşturucunun hızlı olması önemli değildir. Neyin düzeltileceğini söylemesi önemlidir.

"Profil oluşturma" kelimesini bile sevmiyorum, çünkü her rutin için bir maliyet çubuğu veya "darboğaz" olan bir görüntüyü histogram gibi bir şeyle çağrıştırıyor çünkü kodda olması gereken küçük bir yer var sabit. Bunların her ikisi de, doğruluğun önemli olduğunu düşündüğünüz bir tür zamanlama ve istatistik anlamına gelir. Zamanlamanın doğruluğu hakkında fikir vermekten vazgeçmeye değmez.

Kullandığım yöntem rastgele duraklama ve burada tam bir vaka çalışması ve slayt gösterisi var . Profiler darboğaz dünya görüşünün bir parçası, hiçbir şey bulamazsanız, bulunacak bir şey olmadığını ve bir şey bulup belirli bir yüzde hızlanma elde ederseniz, zafer ilan edip çıkmayı bırakmanızdır. Profiler hayranları neredeyse ne kadar hız aldıklarını asla söylemezler ve reklamlar yalnızca bulmak kolay olacak şekilde tasarlanmış yapay olarak ortaya çıkan sorunları gösterir. Rastgele duraklatma sorunları kolay ya da zor olsun. Daha sonra bir problemi düzeltmek diğerlerini ortaya çıkarır, böylece bileşik hızlanma elde etmek için süreç tekrarlanabilir.

Çok sayıda örnekten edindiğim deneyime göre, işte böyle: Bir problemi bulabilirim (rastgele duraklayarak) ve düzeltebilirim,% 30 veya 1.3x gibi bir yüzde hızlanma elde edebilirim. Sonra tekrar yapabilirim, başka bir sorun bulabilir ve düzeltebilirim, başka bir hızlanma, belki% 30'dan az, belki daha fazla. Daha sonra, düzeltmek için başka bir şey bulana kadar tekrar tekrar yapabilirim. Nihai hızlanma faktörü, bireysel faktörlerin çalışan ürünüdür ve şaşırtıcı derecede büyük olabilir - bazı durumlarda büyüklük dereceleri.

INSERTED: Sadece bu son noktayı açıklamak için. Burada , slayt gösterisi ve tüm dosyalarla, bir dizi sorun giderme işleminde 730x hızlandırmanın nasıl elde edildiğini gösteren ayrıntılı bir örnek var . İlk versiyon, birim iş başına 2700 mikrosaniye aldı. Problem A çıkarıldı, süre 1800'e indirildi ve kalan problemlerin yüzdeleri 1.5x (2700/1800) büyüdü. Sonra B çıkarıldı. Bu işlem altı tekrarlama ile devam etti ve neredeyse 3 büyüklükte hızlanma sırası elde edildi. Ancak profil oluşturma tekniğinin gerçekten etkili olması gerekir, çünkü bu sorunlardan herhangi biri bulunamazsa, yani yanlış bir şey daha yapılamayacağını düşündüğünüz bir noktaya ulaşırsanız, işlem durur.

Büyük hızlanma elde etmek için çoklu problemleri ortadan kaldırma açıklaması

INSERTED: Başka bir deyişle, ardışık problemler ortadan kaldırıldığında toplam hızlandırma faktörünün bir grafiği:

resim açıklamasını buraya girin

Yani Q1 için, kıyaslama için basit bir zamanlayıcı yeterlidir. "Profil oluşturma" için rastgele duraklama kullanıyorum.

S2: Yeterli iş yükü veriyorum (ya da etrafına bir döngü koyuyorum), bu yüzden duraklamak için yeterince uzun çalışıyor.

S3: Elbette, önbellek sorunlarını kaçırmamak için gerçekçi bir şekilde büyük bir iş yükü verin. Bunlar, bellek getirmelerini yapan kodda örnekler olarak görünecektir.


Mike, görsel bir IDE yokken rastgele duraklama yapma tercihiniz var mı? Bu süreç bir şekilde otomatik hale getirilebilir mi?
Matthew Emmett

@Matthew: Orada araçlar gibi anlıyoruz pstackve lsstack, ama gerçekten bu hata ayıklama ile daha ortak bir süreç düşünün. Bu yüzden, taşıyabileceğim en iyi hata ayıklayıcı olsa bile gdb, işi halleder. Bir hata ayıklayıcı ile verileri inceleyebilirsiniz ve bu yığın tek başına size yeterli bir şey söylemediğinde fark yaratabilir.
Mike Dunlavey

9

Yoksul adamın Profilci temelde bir olduğunu gdbkomut örneklerinin olduğu çağrı yığını. Yine de hata ayıklama sembollerine sahip olmanız gerekir. Hala yavaş, ancak kodu çalıştırmak için sanal bir makine uygulamadığı için genellikle callgrindgöreve göre daha hızlı ve yeterlidir.

Ben mütevazı bir başarı ile parçacık fiziği analizörleri üzerinde çalıştım (yani kod herhangi bir korkunç sıcak noktalar yoktu gösterdi ve optimizasyon daha iyi bir algoritma gerektiriyordu).


1
+ Kanıt yokluğu yok kanıtı değildir :) Zavallı adamın profillerinin yapması gereken şey daha az iz almak ve onları çökertmemek, ama onları görmenize izin vermektir. İnsan gözü, yararlı desenleri tespit etmede basit işlev süresi tahminlerinden çok daha iyidir ve 2 numuneye kadar geliştirebileceğiniz bir şey görürseniz, önemli ölçüde yardımcı olacaktır. Kaydedeceği X fraksiyonu, 2 / N modu ile bir beta dağılımıdır; burada N, kaç iz izlediğinizdir ve hızlanma faktörü 1 / (1-X) olacaktır, bu da büyük olabilir.
Mike Dunlavey

2

Mevcut harika cevaplara eklemek için, Rice'ta geliştirilen ve yığın örneklemesini otomatikleştiren ve bu nedenle çok az ek yükü olan bir araç var:

http://hpctoolkit.org/


Güzel görünüyor, ama (üzgünüm) Alev şapkamı buraya taktım. Derleyici için optimize edilmiş kodu ayarlamıyorum çünkü karışık kodda neler olduğunu görmek zor. Demek gibi - Ben budama ediyorum şeyler iyileştirici ile anlaşma olabilir şeyler değildir expve logaynı defalarca argümanlar veya tüm zamanlarını deşifre seçenekleri harcama matris operasyonları ile. Mümkün olduğunca çok ayarlıyorum, sonra -O3'ü açıyorum.
Mike Dunlavey

Araçlar bir araçtır ve yalnızca kullanıcı sınırlamalarını biliyor ve anlarsa yararlıdır. Çıktısını anlamak ve bilgiyi nasıl kullanacağını bilmek açısından kullanıcıyı denklemden tamamen kaldıracak "mükemmel bir profilci" olacağını düşünmüyorum.
Reid.Atcheson

1

Allinea MAP , ticari olarak geliştirilmiş ve desteklenen bir örnekleme profilidir ve bu nedenle - daha önceki bir yanıtta önerilen HPC Toolkit gibi - isterseniz üretim boyutlu işlerde çalışabilir.

Bu tür bir araç CPU darboğazlarına veya zayıf MPI iletişimine işaret eder, ancak aynı zamanda tüm işi profillendirmenin tüm gözetimi sürpriz sorunları bulmakta paha biçilemez olabilir.

Beklenmeyen alanlarda genellikle CFD kodunun çekirdek çekirdeğinin dışında kalan düşük performanslı meyveler vardır. Rastgele yığın örneklemesi - ister GDB ile ister HPC Toolkit ve Allinea MAP gibi araçlarla manuel olarak yapılsın - bunları bulmanın en iyi yoludur. Performans için önemli bir şey varsa, görünecektir.

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.