Paralel çözücüm neden sıralı çözücümden daha yavaş?


14

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?


Bu gerçekten bir "nasıl" yerine "ne" değil, çünkü bir cevap olarak gönderme değil ama geçmişte birden çok iş parçacığından erişilen bir muteks korumalı kod bölümü neden benzer sorunları yaşadım. Bazen paylaşılan kaynakların perde arkasında kilitlenip kilitlenmediğini kontrol etmeniz gerekir.
David Z

Yanıtlar:


13

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.


8

Bir programı paralelleştirmeye çalıştığınızda, bir dizi maliyeti dengelemeniz gerekir, ancak öncelikle

  • Her hesaplamayı yapmanın maliyeti
  • Bu hesaplamalar arasındaki iletişimin maliyeti
  • Bu hesaplamaları yönetmenin maliyeti

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ü.


3

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.


@ketch: haklısın. Üzgünüm ve fark ettiğiniz için teşekkürler. Metni düzenledi.
jbcolmenares
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.