Son zamanlarda bu sorunun bazılarını başlangıç noktası olarak kullanarak bu sorunu çözdüm. Akılda tutulması gereken en yararlı şey, tekliflerin bir nevi basit n-vücut simülasyonu olduğudur: her bir teklif, komşularına kuvvet uygulayan bir parçacıktır.
Linde gazetesini okumayı zor buldum; Bunun yerine SJ Plimpton'un Linde'nin referans aldığı "Kısa Menzilli Moleküler Dinamikler için Hızlı Paralel Algoritmalar" a bakmasını öneriyorum . Plimpton'un kağıdı daha iyi rakamlarla çok daha okunabilir ve ayrıntılı:
Özetle, atom ayrıştırma yöntemleri her işlemciye kalıcı olarak bir atom alt kümesi atar, kuvvet ayrıştırma yöntemleri her proc için çift kuvvet hesaplamalarının bir alt kümesini atar ve uzamsal ayrışma yöntemleri her proc için simülasyon kutusunun bir alt bölgesini atar .
AD'yi denemenizi tavsiye ederim. Anlaması ve uygulaması en kolay olanıdır. FD çok benzer. İşte nVidia'nın FD kullanarak CUDA ile n-vücut simülasyonu.
SD uygulamaları genellikle teknikleri optimize eder ve uygulanması için bir miktar koreografi gerektirir. Neredeyse her zaman daha hızlıdırlar ve daha iyi ölçeklenirler.
Bunun nedeni, AD / FD'nin her bir satınalma için bir "komşu listesi" oluşturmasını gerektirmesidir. Her bir alımın komşularının konumunu bilmesi gerekiyorsa, aralarındaki iletişim O ( n ²) 'dir. Eğer her adımın her birkaç dilimler yerine listesini yeniden olanak alanda her boid çekler, boyutunu azaltmak için Verlet komşu listelerini kullanabilirsiniz, ama yine de O (var n ²). SD'de her hücre bir komşu listesi tutarken, AD / FD'de her bir komşunun bir komşu listesi vardır. Böylece, her hücre birbiriyle iletişim kurmak yerine, her hücre birbiriyle iletişim kurar. İletişimdeki azalma hız artışının nereden kaynaklandığıdır.
Ne yazık ki, boids sorunu SD'yi biraz sabote ediyor. Her işlemcinin bir hücrenin izini sürmesi, teklifler tüm bölgeye eşit olarak dağıtıldığında en avantajlıdır. Ama tekliflerin birlikte kümelenmesini istiyorsunuz ! Sürünüz düzgün bir şekilde davranıyorsa, işlemcilerinizin büyük çoğunluğu birbiriyle boş listeler alıp değiştirecek ve küçük bir hücre grubu AD veya FD'nin yaptığı aynı hesaplamaları gerçekleştirecektir.
Bununla başa çıkmak için, herhangi bir zamanda boş hücre sayısını en aza indirmek için hücrelerin boyutunu (sabit olan) matematiksel olarak ayarlayabilir veya dört ağaçlar için Barnes-Hut algoritmasını kullanabilirsiniz. BH algoritması inanılmaz derecede güçlü. Paradoksal olarak, paralel mimarilere uygulamak son derece zordur. Bunun nedeni, bir BH ağacının düzensiz olmasıdır, bu nedenle paralel dişler, çılgınca değişen hızlarda hareket edecek ve iplik sapmasına neden olacaktır. Salmon ve Dubinski, dört paralel parçayı işlemciler arasında eşit olarak dağıtmak için dikey paralel çoğaltma algoritmaları sundular.
Gördüğünüz gibi, bu noktada açıkça optimizasyon ve kara büyü alanındayız. Yine, Plimpton'ın makalesini okumayı deneyin ve bunun mantıklı olup olmadığını görün.