問題標題說明了這一切,真的:在球拍中並行映射函數的最佳方式是什麼?謝謝。如何在球拍中並行映射一個函數?
7
A
回答
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
。對於使用在「定製」方式的地方示例,請參閱:
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))
相關問題
- 1. 如何映射在哈希表(球拍)的值
- 2. 如何將2個列表合併到一個球拍中
- 3. 如何使C函數可見球拍
- 4. 我該如何調用一個在球拍中帶參數的函數?
- 5. 如何在Emacs中運行球拍?
- 6. 在球拍中寫入出隊函數
- 7. 如何在列表中的一個條目上映射函數?
- 8. 如何在球拍中添加一個數字到字符串?
- 9. 如何在球拍中編寫指數?
- 10. 球拍定義一個函數有兩個參數
- 11. 在emacs中如何創建映射到另一個函數返回的函數?
- 12. 球拍/方案中的zip函數
- 13. 在列表中爲每個參數映射一個函數
- 14. 將多個函數映射到CSV行
- 15. 如何獲得在球拍
- 16. 如何通過Haskell中另一個函數的參數映射函數?
- 17. 爲什麼一個函數中的映射值受到另一個函數中映射項的影響?
- 18. 如何映射類和函數在concurrent.futures.ProcessPoolExecute
- 19. 如何在python中映射2個列表並進行比較
- 20. 創建一個php映射器函數
- 21. 函數返回一個唯美映射
- 22. RayTracer球形映射
- 23. 映射函數
- 24. 如何並行執行一個函數?
- 25. 如何在球拍中保存一個.bmp文件?
- 26. 你如何在球拍中創建一個簡單的變量?
- 27. 動態地找出一個函數有多少輸入,球拍
- 28. 我將如何自動紋理在OpenGL中映射一個球體?
- 29. 在id映射函數上合併兩個數組 - Javascript
- 30. 如何在映射在informatica中運行映射時將數據複製到一個excel文件中?
由於格雷格。我確實嘗試了一個快速的嘗試,使用期貨將階乘函數映射到一個大整數列表上,但計算似乎與一個核心綁定。然而,我顯然正在使用高級 - 我沒有看到期貨僅限於浮動的事實。 – Chris 2013-03-27 12:26:37
順便說一句,我在我的描述中有點隨意。這不是什麼「浮點」。定點和浮動都可以工作;關鍵是他們是'fixnum'還是'flonum',並且不需要被裝箱/分配。這有點棘手。這就是爲什麼我建議地方作爲更普遍的事情來嘗試。只有當你在做數字化的東西並且願意仔細檢查代碼時,你纔會發現期貨很有幫助(據我所知,其他人知道更多可能跳進來糾正我)。 – 2013-03-27 12:34:46
感謝您的澄清,Greg。 – Chris 2013-03-27 20:20:36