非同期セルラーオートマトンと呼ばれる計算モデルのコレクションがあります。これらのモデルはイジングモデルに似ていますが、少し複雑です。このようなモデルは、CPUではなくGPUで実行することでメリットが得られるようです。残念ながら、そのようなモデルを並列化することは非常に簡単ではなく、どのように実行するかはまったくわかりません。私は主題に関する文献があることを知っていますが、それはすべて、私が実装できるものの説明を望んでいる私のような人ではなく、アルゴリズムの複雑さの詳細に興味がある筋金入りのコンピュータ科学者を対象にしているようです、その結果、私はそれをかなり浸透していません。
明確にするために、私はCPU実装を大幅に高速化する可能性があるCUDAで迅速に実装できるものほど最適なアルゴリズムを探していません。このプロジェクトでは、プログラマーの時間はコンピューターの時間よりもはるかに制限要因です。
また、非同期セルオートマトンは同期セルオートマトンとはかなり異なるものであり、同期CA(Conwayの生活など)を並列化する技術はこの問題に簡単に適応できないことを明確にする必要があります。違いは、同期CAはすべてのセルをタイムステップごとに同時に更新するのに対して、非同期CAはランダムに選択されたローカルリージョンをタイムステップごとに更新することです。
並列化したいモデルは、〜100000セルからなる格子(通常は六角形)に実装されています(さらに使用したいのですが)、それらを実行するための非並列化アルゴリズムは次のようになります。
隣接するセルのペアをランダムに選択します
「エネルギー」機能計算これらの細胞の周囲の局所近傍に基づきます
依存確率で(とβ Aパラメータ)、いずれか2つのセルの状態を入れ替えるか、何もしません。
上記の手順を無期限に繰り返します。
境界条件にはいくつかの複雑な問題もありますが、並列化にそれほど困難はないと思います。
ちょうど平衡状態ではなく、これらのシステムの過渡的なダイナミクスに興味があることに言及する価値があるため、同じ平衡分布に近づくだけではなく、上記と同等のダイナミクスを持つものが必要です。(したがって、チェッカーボードアルゴリズムのバリエーションは、私が探しているものではありません。)
上記のアルゴリズムを並列化する際の主な困難は衝突です。すべての計算はラティスのローカル領域のみに依存するため、近傍が重複していない限り、多くのラティスサイトを並行して更新できます。問題は、このような重複を回避する方法です。いくつかの方法を考えることができますが、実装するのに最適な方法があるかどうかはわかりません。これらは次のとおりです。
CPUを使用して、ランダムグリッドサイトのリストを生成し、衝突をチェックします。グリッドサイトの数がGPUプロセッサの数と等しい場合、または衝突が検出された場合、座標の各セットをGPUユニットに送信して、対応するグリッドサイトを更新します。これは簡単に実装できますが、おそらくCPUでの衝突のチェックはCPUで更新全体を行うよりもそれほど安くないので、おそらく速度をあまり上げません。
ラティスをリージョン(GPUユニットごとに1つ)に分割し、そのリージョン内のグリッドセルをランダムに選択および更新するGPUユニットを1つ用意します。しかし、このアイデアには解決方法がわからない多くの問題があります。最も明白なのは、ユニットがその領域の端に重なる近傍を選択したときに正確に何が起こるかです。
システムを次のように近似します。時間を個別のステップで進めます。格子を上に分割します別のものに事前に定義されたスキームに従ってタイムステップごとに領域のセットを作成し、各GPUユニットが、領域の境界と重なり合わないグリッドセルのペアをランダムに選択および更新します。境界はタイムステップごとに変化するため、領域が比較的大きい限り、この制約はダイナミクスにあまり影響しません。これは簡単に実装でき、高速であるように見えますが、ダイナミクスをどれだけ近似するか、または各タイムステップで領域境界を選択するための最適なスキームはどれかわかりません。「ブロック同期セルオートマトン」への参照をいくつか見つけましたが、これはこの考えと同じである場合とそうでない場合があります。(メソッドの説明はすべてロシア語であるか、アクセスできないソースにあるようですので、わかりません。)
私の具体的な質問は次のとおりです。
上記のアルゴリズムのいずれかは、非同期CAモデルのGPU並列化にアプローチする賢明な方法ですか?
もっと良い方法はありますか?
このタイプの問題に対応する既存のライブラリコードはありますか?
「ブロック同期」メソッドの明確な英語の説明はどこにありますか?
進捗
適切な非同期CAを並列化する方法を考え出したと思います。以下に概説するアルゴリズムは、私のように隣接するセルのペアではなく、一度に1つのセルのみを更新する通常の非同期CA用です。私の特定のケースにそれを一般化することにはいくつかの問題がありますが、私はそれらを解決する方法を考えていると思います。ただし、以下で説明する理由により、どれだけの速度のメリットが得られるかはわかりません。
考え方は、非同期CA(以降ACA)を、同等に動作する確率的同期CA(SCA)に置き換えることです。これを行うには、まずACAがポアソンプロセスであると考えます。つまり、時間は継続的に進み、各セルは、他のセルとは無関係に、その更新機能を実行する単位時間あたりの一定の確率として進行します。
値を任意に選択できるパラメーターです。)
各論理タイムステップで、SCAのセルは次のように更新されます。
これにより、元のACAに対応するように「デコード」可能な順序でセルが更新され、衝突を回避して一部のセルを並行して更新できるようになると確信しています。ただし、上記の最初の箇条書きのため、ほとんどのGPUプロセッサはSCAの各タイムステップでほとんどアイドル状態になり、理想的ではありません。
このアルゴリズムのパフォーマンスを改善できるかどうか、およびこのアルゴリズムを拡張して、ACAで複数のセルが同時に更新される場合に対処する方法について、さらに検討する必要があります。しかし、有望に見えるので、誰かが(a)文献で似たようなことを知っている、または(b)これらの残りの問題についての洞察を提供できる場合に、ここで説明しようと思いました。
exp()
)ので、複数のスレッドに分散することはあまり意味がないと思います。私は、スレッドごとに1つのペアを使用して、複数のペアを並行して更新しようとする方が良いと思います(そして私にとっては簡単です)。