Paralel azaltma için sayısal ilişkisizlik nasıl ele alınır?


17

Paralel bir azalma, karşılık gelen işlemin birleştirici olduğunu varsayar. Kayar nokta sayılarının eklenmesi nedeniyle bu varsayım ihlal edilmiştir. Bunu neden önemsediğimi sorabilirsiniz. Sonuçların daha az tekrarlanabilir olmasını sağlar. Ve bu tür tekrarlanamayan sonuçlar üreten altyordamları optimize etmek (veya parametreleri takmak) için simüle tavlama kullanıldığında daha da kötüleşir.

Bu sorunla başa çıkmanın genel yolları nelerdir? Aşağıdaki stratejiler hakkında ne söylenebilir?

  • Tekrar üretilemezliğe aldırmayın.
  • Kayan nokta sayıları ve toplama ile paralel azaltma kullanmayın.
  • Yeniden üretilebilir bir şekilde uygun boyutta iş paketleri oluşturun ve son indirimi elle yapın.
  • Ekleme için daha yüksek hassasiyet kullanın (ancak tüm derleyiciler daha yüksek hassas kayan nokta türleri sunmaz).

Aynı sayıda işlemde tekrarlanabilirlik veya farklı sayıda işlemcide tekrarlanabilirlik konusunda endişeli misiniz? Bitsel tekrarlanabilirlik için ne kadar performans isabeti almak istiyorsunuz? Sadece benzetilmiş tavlama ile ilgileniyor musunuz?
Jed Brown

@JedBrown Örneğin olası sorunları ayıklamak için tekrarlanabilir sonuçlar elde etme olasılığı konusunda endişeliyim. Sonuçları yeniden üretmenin bir yolu varsa, örneğin aynı sayıda işlemci kullanarak (veya yalnızca orijinal olarak kullanılan işlemci sayısını "bilerek) benim için sorun değil. Eklemenin kendisi için daha yüksek hassasiyetli kayan nokta türleri kullanma ile ilgili performans vuruşunu almaya istekli olurum. Somut sorunlarım çoğunlukla taklit tavlama ve beklenmedik farklılıklarla ilgiliydi, ancak bunların hepsi gerçek hatalar oldu.
Thomas Klimpel

Yanıtlar:


15

MPI_Allreduce()MPI-2.2 standardının 5.9.1 Bölümünde yer alan aşağıdaki not göz önüne alındığında, aynı sayıda işlemci kullandığınız sürece kullanılarak uygulanan bir azaltma tekrarlanabilir.

Uygulayıcılara tavsiyeler . MPI_REDUCEİşlev aynı argümanlara aynı sırada uygulandığında aynı sonucun elde edilmesi için aynı sonucun elde edilmesi şiddetle tavsiye edilir. Bunun, işlemcilerin fiziksel konumlarından yararlanan optimizasyonları engelleyebileceğini unutmayın. ( Uygulayıcılara tavsiyenin sonu .)

Her ne pahasına olursa olsun tekrarlanabilirliği garanti etmeniz gerekiyorsa, bir sonraki paragraftaki yönergeleri takip edebilirsiniz:

Kullanıcılara tavsiye . Bazı uygulamalar kayan nokta işlemlerinin ilişkisel olmayan yapısını göz ardı edemeyebilir veya özel bir azaltma sırası gerektiren ve ilişkilendirici olarak ele alınamayan kullanıcı tanımlı işlemleri (bkz. Bölüm 5.9.5) kullanabilir. Bu tür başvurular değerlendirme sırasını açıkça uygulamalıdır. Örneğin, sıkı bir soldan sağa (veya sağdan sola) değerlendirme emri gerektiren operasyonlar durumunda, bu, tüm işlenenleri tek bir işlemde (örn. İle) bir araya MPI_GATHERgetirerek, azaltma işlemini uygulayarak yapılabilir istenen sırayla (örn. ile MPI_REDUCE_LOCAL) ve gerekirse sonucu diğer işlemlere (ör MPI_BCAST. ile ) yayınlayın veya saçın . ( Kullanıcılara tavsiyenin sonu .)

Daha geniş bir şemada, çoğu uygulama için etkili algoritmalar yerellikten yararlanır. Algoritma, farklı sayıda işlemde çalıştırıldığında gerçekten farklı olduğundan, farklı sayıda işlemde çalıştırıldığında sonuçları tam olarak üretmek pratik değildir. Olası bir istisna, sönümlenmiş Jacobi veya polinom (örn. Chebyshev) düzleştiricilerle multigrid olup, bu basit yöntemin çok iyi performans göstermesi mümkündür.

Aynı sayıda işlemle, performansların, belirleyici olmamaya neden olan, alındıkları sırayla (örn. Kullanılarak MPI_Waitany()) işlenmesi genellikle yararlıdır . Bu gibi durumlarda, iki varyantı uygulayabilirsiniz, hızlı olanı herhangi bir sırayla alır ve bir "hata ayıklama" statik bir sırayla alır. Bunun için, bu davranışı sunmak üzere temeldeki tüm kitaplıkların da yazılması gerekir.

Bazı durumlarda hata ayıklama için, bu yeniden üretilebilir davranışı sunmayan bir hesaplamanın bir kısmını izole edebilir ve bunu gereksiz bir şekilde gerçekleştirebilirsiniz. Bileşenlerin nasıl tasarlandığına bağlı olarak, bu değişiklik az miktarda kod veya çok müdahaleci olabilir.


6

Çoğunlukla Jed'in cevabını verdim. Bununla birlikte, farklı bir çıkış yolu vardır: Normal kayan nokta sayılarının büyüklüğü göz önüne alındığında, her sayıyı 4000 veya bitlik bir sabit nokta numarasında saklayabilirsiniz. Dolayısıyla, bu şekilde gömülü kayan nokta sayılarında bir azalma yaparsanız, ilişkilendirilebilirlik ne olursa olsun kesin bir hesaplama elde edersiniz. (Üzgünüm, bu fikri kimin bulduğuna dair bir referansım yok.)


1
Ben o ilk olduğunu sanmıyorum, ama meslektaşım Dr. Bant genişliği kesinlikle bu konuda güzel bir writeup vardır: sites.utexas.edu/jdm4372/2012/02/15/...
Jeff

5

MPI'da seri olarak yapabileceğiniz gibi sayısal olarak kararlı bir azaltma algoritması uygulayabilirsiniz. Elbette bir performans isabeti olabilir. Vektörü çoğaltmayı göze alabiliyorsanız, MPI_Gather kullanın ve kökte seri olarak sayısal kararlı azalma yapın. Bazı durumlarda, isabet performansının büyük bir şey olmadığını görebilirsiniz.

Başka bir çözüm, burada açıklandığı gibi geniş akümülatörler kullanmaktır . MPI ile bunu kullanıcı tanımlamayı azaltma olarak yapabilirsiniz, ancak çok daha fazla bant genişliği kullanacaktır.

Yukarıdakiler için bir uzlaşma telafi edilmiş toplamı kullanmaktır. Ayrıntılar için “Kahan toplamı” referanslarına bakın. Higham'ın “ Sayısal Algoritmaların Doğruluğu ve Kararlılığı ” bu konuda mükemmel bir kaynaktır.



2

Eklemek için daha yüksek hassasiyetli aritmetik kullanmak yerine, telafi edilmiş toplama kullanma olasılığının bulunduğunu belirtmek isterim (bkz. [1]). Bu, daha büyük veri türlerine başvurmaya gerek kalmadan toplamanın doğruluğunu artırabilir.

[1] Higham, NJ Kayan Nokta Toplamının Doğruluğu. SIAM Bilimsel Hesaplama Dergisi 14, 783-799 (1993).

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.