2013-03-26 68 views

回答

9

如果您的意思是在多個處理器內核上,那麼最一般的方法是使用Places

場所支持開發利用多處理器,內核或硬件線程的機器的並行程序。

一個地方是一個並行任務,實際上是一個單獨的Racket虛擬機實例。地點通過地點信道進行通信,地點信道是用於雙向緩衝通信的端點。

可能可以使用其他的並行化技術,Futures,但條件爲它工作都比較有限,例如浮點運算,如所描述here


編輯:針對註釋:

是否有使用地方某處平行圖的實現?

首先,我應該備份。您可能不需要地點。使用Racket線程可以獲得併發性。例如,這裏有一個map/thread

#lang racket 

(define (map/thread f xs) 
    ;; Make one channel for each element of xs. 
    (define cs (for/list ([x xs]) 
       (make-channel))) 
    ;; Make one thread for each elemnet of xs. 
    ;; Each thread calls (f x) and puts the result to its channel. 
    (for ([x xs] 
     [c cs]) 
    (thread (thunk (channel-put c (f x))))) 
    ;; Get the result from each channel. 
    ;; Note: This will block on each channel if not yet ready. 
    (for/list ([c cs]) 
    (channel-get c))) 

;; Use: 
(define xs '(1 2 3 4 5)) 
(map add1 xs) 
(map/thread add1 xs) 

如果正在開展的工作包括阻塞,例如I/O請求,這會給你「並行性」,因爲它不會停留在I/O上。但是Racket線程是「綠色」線程,因此一次只能使用一個CPU。

如果您真的需要並行使用多個CPU核心,那麼您需要Futures或Places。

由於地方的實施方式---有效地作爲球拍的多個實例---我不會立即看到如何編寫一個通用的map/place。對於使用在「定製」方式的地方示例,請參閱:

+0

由於格雷格。我確實嘗試了一個快速的嘗試,使用期貨將階乘函數映射到一個大整數列表上,但計算似乎與一個核心綁定。然而,我顯然正在使用高級 - 我沒有看到期貨僅限於浮動的事實。 – Chris 2013-03-27 12:26:37

+0

順便說一句,我在我的描述中有點隨意。這不是什麼「浮點」。定點和浮動都可以工作;關鍵是他們是'fixnum'還是'flonum',並且不需要被裝箱/分配。這有點棘手。這就是爲什麼我建議地方作爲更普遍的事情來嘗試。只有當你在做數字化的東西並且願意仔細檢查代碼時,你纔會發現期貨很有幫助(據我所知,其他人知道更多可能跳進來糾正我)。 – 2013-03-27 12:34:46

+0

感謝您的澄清,Greg。 – Chris 2013-03-27 20:20:36

2

我不知道在拍,但我在SISC Scheme實施的版本。

(define (map-parallel fn lst) 
    (call-with-values (lambda() 
         (apply parallel 
          (map (lambda (e) 
            (delay (fn e))) 
            lst))) 
    list)) 

只有parallel不是R5RS。使用的

實施例:

使用正map

(time (map (lambda (a) 
     (begin 
      (sleep 1000) 
      (+ 1 a))) 
    '(1 2 3 4 5))) 
=> ((2 3 4 5 6) (5000 ms)) 

使用map-parallel

(time (map-parallel (lambda (a) 
     (begin 
      (sleep 1000) 
      (+ 1 a))) 
    '(1 2 3 4 5))) 
=> ((2 3 4 5 6) (1000 ms)) 
相關問題