Asenkron hücresel otomata olarak tanımlanabilecek bir hesaplama modelleri koleksiyonum var. Bu modeller Ising modeline benzer, ancak biraz daha karmaşıktır. Bu modeller bir CPU yerine bir GPU üzerinde çalışmaktan fayda sağlayacak gibi görünüyor. Ne yazık ki böyle bir modeli paralel hale getirmek oldukça basit değil ve bana nasıl gideceğimi net değil. Konuyla ilgili literatür olduğunu biliyorum, ancak hepsi benim gibi uygulayabileceğim bir şeyin tanımını isteyen biri yerine algoritmik karmaşıklığın ayrıntılarıyla ilgilenen hardcore bilgisayar bilimcilerini hedefliyor gibi görünüyor ve sonuç olarak ben bunu olanaksız buluyorum.
Açıklık için, CUDA'da hızlı bir şekilde uygulayabildiğim ve CPU uygulamam üzerinde önemli bir hız kazandıracak kadar uygun bir algoritma aramıyorum. Programcı zamanı, bu projede bilgisayar zamanından çok daha sınırlayıcı bir faktördür.
Ayrıca, eşzamansız bir hücresel otomasyonun eşzamanlı olandan oldukça farklı bir şey olduğunu ve eşzamanlı CA'ları (Conway'in hayatı gibi) paralel hale getirme tekniklerinin bu probleme kolayca uyarlanamayacağını açıklığa kavuşturmalıyım . Fark, eşzamanlı CA'nın her hücreyi her zaman adımında eşzamanlı olarak güncellemesi, eşzamansız hücrenin ise her zaman adımında rasgele seçilen bir yerel bölgeyi aşağıda açıklandığı gibi güncellemesi.
Paralel hale getirmek istediğim modeller ~ 100000 hücreden oluşan (genellikle daha fazla kullanmak isterim) bir kafes (genellikle altıgen bir) üzerinde uygulanır ve bunları çalıştırmak için paralel olmayan algoritma şöyle görünür:
Rasgele komşu bir hücre çifti seçin
Bu hücreleri çevreleyen yerel bir mahalleye göre bir "enerji" işlevi hesaplayın
( bir parametre ile) bağlı bir olasılıkla , iki hücrenin durumunu değiştirin veya hiçbir şey yapmayın. β
Yukarıdaki adımları süresiz olarak tekrarlayın.
Sınır koşullarıyla ilgili bazı komplikasyonlar da var, ancak bunların paralellik için çok zor olmayacağını hayal ediyorum.
Bu sistemlerin sadece denge durumundan ziyade geçici dinamikleriyle ilgilendiğimi belirtmek gerekir, bu yüzden aynı denge dağılımına yaklaşacak bir şeyden ziyade yukarıdakilere eşdeğer dinamiklere sahip bir şeye ihtiyacım var. (Yani chequerboard algoritmasının varyasyonları aradığım şey değil.)
Yukarıdaki algoritmayı paralelleştirmenin ana zorluğu çarpışmalardır. Tüm hesaplamalar yalnızca kafesin yerel bir bölgesine bağlı olduğu için, mahalleleri çakışmadığı sürece birçok kafes alanının paralel olarak güncellenmesi mümkündür. Soru, bu tür çakışmaların nasıl önleneceğidir. Birkaç yol düşünebilirim, ama hangisinin uygulanacağının en iyisi olduğunu bilmiyorum. Bunlar aşağıdaki gibidir:
Rastgele ızgara sitelerinin bir listesini oluşturmak ve çakışmaları kontrol etmek için CPU'yu kullanın. Izgara sitesi sayısı GPU işlemci sayısına eşit olduğunda veya bir çakışma algılandığında, ilgili koordinat alanını güncellemek için her koordinat kümesini bir GPU birimine gönderin. CPU'nun çarpışmalarını kontrol etmek muhtemelen tüm güncellemeyi CPU'da yapmaktan çok daha ucuz olmayacağından, bunun uygulanması kolay olurdu, ancak muhtemelen çok fazla hız vermeyecektir.
Kafesleri bölgelere bölün (GPU birimi başına bir tane) ve bölgesinde ızgara hücrelerini rastgele seçmekten ve güncellemekten sorumlu bir GPU birimine sahip olun. Ama bu fikirle nasıl çözüleceğimi bilmediğim birçok sorun var, en bariz olanı, bir birim kendi bölgesinin kenarıyla örtüşen bir mahalleyi seçtiğinde tam olarak ne olması gerektiğidir.
Sistemi aşağıdaki gibi yaklaşıklandırın: zamanın ayrık adımlarla ilerlemesine izin verin. Kafesleri farklı bir bölüme ayırınönceden belirlenmiş bir şemaya göre her zaman adımında bölgeler kümesi ve her GPU biriminin, komşusu bölgenin sınırını örtüşmeyen bir çift ızgara hücresini rastgele seçmesini ve güncellemesini sağlayın. Sınırlar her adımda değiştiği için, bölgeler nispeten büyük olduğu sürece bu kısıtlama dinamikleri çok fazla etkilemeyebilir. Bu, uygulanması kolay ve hızlı olması muhtemel gibi görünüyor, ancak dinamiğe ne kadar yaklaşacağını veya her zaman adımında bölge sınırlarını seçmek için en iyi şemanın ne olduğunu bilmiyorum. Bu blokla aynı fikirde olan veya olmayan "blok eşzamanlı hücresel otomata" için bazı referanslar buldum. (Biliyorum, çünkü yöntemin tüm açıklamaları Rusça veya erişimim olmayan kaynaklarda.)
Özel sorularım aşağıdaki gibidir:
Yukarıdaki algoritmalardan herhangi biri, eşzamansız bir CA modelinin GPU paralelleştirmesine yaklaşmanın mantıklı bir yolu var mı?
Daha iyi bir yol var mı?
Bu tür bir sorun için mevcut kütüphane kodu var mı?
"Blok eşzamanlı" yönteminin İngilizce açıklamasını nerede bulabilirim?
İlerleme
Uygun olabilecek asenkron bir CA'yı paralel hale getirmenin bir yolunu bulduğuma inanıyorum. Aşağıda özetlenen algoritma, benimki gibi komşu bir hücre çiftinden ziyade bir seferde sadece bir hücreyi güncelleyen normal bir eşzamansız CA içindir. Özel durumuma genelleme ile ilgili bazı sorunlar var, ancak bunları nasıl çözeceğime dair bir fikrim var. Ancak, aşağıda tartışılan nedenlerden dolayı, ne kadar bir hız avantajı sağlayacağından emin değilim.
Fikir, asenkron CA'yı (bundan sonra ACA) eşdeğer davranan stokastik bir senkron CA (SCA) ile değiştirmektir. Bunu yapmak için öncelikle ACA'nın bir Poisson süreci olduğunu hayal ediyoruz. Yani, zaman sürekli olarak ilerler ve her hücre, diğer hücrelerden bağımsız olarak güncelleme işlevini yerine getirmek için birim zaman başına sabit bir olasılık olarak.
Bu yazıda, hücreler her bir mağaza iki şey SCA inşa: durum hücrenin (yani, sıralı uygulama, her bir hücre içinde saklanacaktır verileri) ve bir kayan nokta sayısı (sürekli temsil ) bir sonraki güncelleme zamanı . Bu sürekli süre, SCA'nın güncelleme adımlarına karşılık gelmez. İkincisini "mantıksal zaman" olarak anlatacağım. Zaman değerleri üstel bir dağılıma göre rastgele başlatılır: . (Burada , değeri keyfi olarak seçilebilen bir parametredir.) t i j t i j ( 0 ) ∼ Uzm ( λ ) λ
Her mantıksal zaman adımında, SCA hücreleri aşağıdaki gibi güncellenir:
Eğer herhangi yakınında , zaman , hiçbir şey.i , j t k l < t i j
Bunun, çarpışmalardan kaçınarak ve bazı hücrelerin paralel olarak güncellenmesine izin verirken, hücrelerin orijinal ACA'ya karşılık gelen "kodu çözülebilecek" bir sırada güncelleneceğini garanti ettiğine inanıyorum. Bununla birlikte, yukarıdaki ilk kurşun noktası nedeniyle, GPU işlemcilerinin çoğunun, SCA'nın her zaman adımında ideal olandan daha az olacağı anlamına gelir.
Bu algoritmanın performansının iyileştirilip iyileştirilemeyeceği ve ACA'da birden çok hücrenin aynı anda güncellendiği durumla başa çıkmak için bu algoritmayı nasıl genişleteceğimi biraz daha düşünmem gerekiyor. Ancak, umut verici görünüyor, bu yüzden (a) literatürde benzer bir şey bilen veya (b) bu kalan meseleler hakkında herhangi bir fikir verebileceği durumlarda burada tarif edeceğimi düşündüm.
exp()
), bu yüzden birden fazla iş parçacığına yaymanın çok mantıklı olduğunu düşünmezdim. Bence iplik başına bir çift ile, birden fazla çift paralel ve güncellemek denemek daha iyi (ve benim için daha kolay).