PETSc ile oynuyordum ve programımı MPI üzerinden birden fazla işlemle çalıştırdığımda daha da yavaş çalıştığını fark ettim ! Neler olup bittiğini görmek için nasıl kontrol edebilirim?
PETSc ile oynuyordum ve programımı MPI üzerinden birden fazla işlemle çalıştırdığımda daha da yavaş çalıştığını fark ettim ! Neler olup bittiğini görmek için nasıl kontrol edebilirim?
Yanıtlar:
Bu mimari faktörlerden kaynaklanabilir :
Aynı bellek bant genişliği hem bir hem de daha fazla işlem için mevcutsa, SpMV ve ilgili doğrusal cebir işlemleri bellek bant genişliği sınırlı olduğundan neredeyse hiç hızlanma görmezsiniz.
Aynı zamanda iletişim yükünün yerel hesaplamanıza karşı koyması da söz konusu olabilir. Örneğin, doğrusal yinelemeli yöntemlerde, işlem başına en az 10.000 bilinmeyen olmasını öneririz.
veya sayısal faktörler:
Paralel önkoşullar genellikle seri benzerlerinden daha zayıftır. Örneğin, blok Jacobi kullandığınız daha fazla blok zayıflar. Bu nedenle, ekstra doğrusal yinelemelere harcanan ekstra süreyi hesaba katmanız gerekir. Doğrusal olmayan koşullar genel olarak bu şekilde çalışmaz, bu nedenle Newton yinelemeleri genellikle sabittir.
Bir programı paralelleştirmeye çalıştığınızda, bir dizi maliyeti dengelemeniz gerekir, ancak öncelikle
Hesaplamalarınız utanç verici bir şekilde paralel ise, iletişim maliyeti çok düşük olacaktır (yalnızca girdi ve çıktı) ve yönetim maliyeti çok düşük olmalıdır.
Hesaplamalar arasında karşılıklı bağımlılığınız varsa, iletişim maliyeti önemli ölçüde artabilir. Herhangi bir hesaplama için tamamlanması farklı zaman alan karmaşık bir algoritmaya sahipseniz, sahip olduğunuz kaynakları verimli bir şekilde kullanmaya çalıştığınızda yönetim karmaşıklığı artar.
Her türlü optimizasyonda olduğu gibi, anahtar da kıyaslama yapmaktır. MPI olmadan nasıl performans gösterdiğine, MPI ve bir işlemle nasıl performans gösterdiğine, ardından nasıl ölçeklendiğine bakın.
CUDA ile oynuyorsanız, daha fazla veri vermeyi deneyin . Buradaki bir test negatif bir hızlanma ile sonuçlandı. 1000 kat daha fazla veri verdik ve GP-GPU sürümü neredeyse aynı zamanda bitti, ana CPU'da çalışan sürüm 1000 kat daha uzun sürdü.
Aşağıdakileri yapmanızı tavsiye ederim:
Kodunuzun, paralelleştirme ile ve paralelleştirme olmadan yürütüldüğü zamanın bir profilini yapın. Bunun nasıl yapılacağı konusunda şüpheleriniz varsa, kodunuzu daha iyi açıklarsanız size yardımcı olabiliriz.
Artık paralel olarak daha yavaş çalışan parçalara odaklanabilirsiniz. İşlemler arasındaki iletişimin yavaş olabileceğinin farkında olmalısınız. Mark ve Sean'ın işaret ettiği gibi, bir sorunun sadece konulara bölünebilmesi, bunun etkili olacağı anlamına gelmez. Daha derinlemesine bakmalısınız. Ancak kodunuzu profillendirirseniz, mevcut hataları bulmanıza yardımcı olabilir. Benim görüşüm.
Ne yaptığınızı daha ayrıntılı olarak açıklarsanız, örneğin bir iş akışıyla, birisi size daha iyi bir açıklama yapabilir.