2009-11-09 19 views
12

İçinde orta ağırlıkta bir işlevi nasıl etkin bir şekilde uygulayacağım, mütevazı bir pahalı işlevi paralel olarak büyük bir tempolu eşleştirmeye haritalıyorum. pmap harika ama bağlam değiştirmeye çok şey veriyorum. Her iş parçacığına geçen işin büyüklüğünü arttırmam gerektiğini düşünüyorum.Paralel

Sekme parçalarını parçalara ayırmak ve işlevi her yığına kopyalamak ve yeniden birleştirmek için bir işlev yazdım. Bu 'çalışır' ancak sonuçlar muhteşem olmamıştır. origional kodu esas şuna benzer:

(pmap eval-polynomial (range x) coificients) 

tembel tutarken can Gerçekten bu squeez nasıl?

cevap

0

JDK 7'ye entegre edilmek üzere ayarlanmış Fork/Join kitaplığına bakıyorum. Bir iş parçacığı havuzu, çalışma çalma zamanlayıcısı ve veri kümesini kullanarak veri bloğu üzerinde bloklama, böl ve hesaplamalar için optimize edilmiş hafif bir iş parçacığı modeli. yeşil dişler.

Some work/Çatal sarın par dalında API Katılmaya yapılmıştır, ancak ana (yet) birleştirilecek edilmemiştir.

+1

Evet, bundan gördüğüm küçük bit zihin üfleme vardır. – Runevault

+1

@Runevault nasıl üflenir üfleme. – Surya

1

Biraz egzotik bir şey aldırmazsanız (gerçekten fark edilebilir bir hızlanma karşılığında), ayrıca, easy access to the GPU sağlayan Penumbra kitaplığının yazarı tarafından yapılan çalışmayı da incelemek isteyebilirsiniz.

3

'da bir sorun oluştu: ppmap işlevine şu adresten bakabilirim: http://www.braveclojure.com/zombie-metaphysics/. Chunk boyutunu belirlerken pmap sağlar.

Bu sorunun çözümü, tane büyüklüğü, ya da her bir paralelleştirilmiş görev tarafından yapılan işin miktarını arttırmaktır. Bu durumda, görevi, haritalama fonksiyonunu koleksiyonun bir elemanına uygulamaktır. Tane boyutu herhangi bir standart birimde ölçülmez, ancak ppa kümesinin tane boyutunun varsayılan olarak olduğunu varsayabilirsiniz. Tane boyutunu iki 'a yükseltmek, eşleme işlevini bir yerine olmak üzere iki öğeye uyguladığınız anlamına gelir, bu nedenle görevin yapıldığı iş parçacığı daha fazla iş yapar. [...] Sadece eğlence için, bölümlenmiş pmap için bu tekniği ppmap adı verilen işlevine dönüştürebiliriz. Bu sadece harita gibi, birden fazla koleksiyonunu alabilirsiniz: Bunu yapacağımı par şube için bekleyebilir eğer

(defn ppmap 
    "Partitioned pmap, for grouping map ops together to make parallel 
    overhead worthwhile" 
    [grain-size f & colls] 
    (apply concat 
    (apply pmap 
      (fn [& pgroups] (doall (apply map f pgroups))) 
      (map (partial partition-all grain-size) colls)))) 
(time (dorun (ppmap 1000 clojure.string/lower-case orc-name-abbrevs))) 
; => "Elapsed time: 44.902 msecs" 
+1

Linkler gel ve git, stackoverflow sonsuza dek ... çatal atmak bir sarıcı gibi görünüyor ... Bu cevabın uzun vadede bağlamında kalmasını sağlamak için braveclojure gelen ilgili alıntı içerebilir. (ayrıca bu soru neredeyse 7 yaşında) –