如何在球拍中并行地在列表上映射函数?

Chr*_*ris 8 parallel-processing scheme racket

问题标题说明了一切,真的:在球拍中将一个函数映射到列表中的最佳方法是什么?谢谢.

Gre*_*ott 9

如果您的意思是多个处理器核心,那么最常用的方法是使用Places.

Places支持开发并行程序,利用具有多个处理器,内核或硬件线程的计算机.

一个地方是一个并行任务,实际上是一个独立的Racket虚拟机实例.场所通过场所通道进行通信,场所通道是双向缓冲通信的端点.

可能能够使用其他的并行化技术,期货,但条件为它工作都比较有限,例如浮点运算,如所描述这里.


编辑:回应评论:

在某处使用地方是否有并行映射的实现?

首先,我应该备份.你可能不需要地方.您可以使用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)
Run Code Online (Sandbox Code Playgroud)

如果正在完成的工作涉及阻塞,例如I/O请求,这将给你"并行性",意思是不会卡在I/O上.但是,Racket线程是"绿色"线程,因此一次只能使用一个CPU.

如果您确实需要并行使用多个CPU内核,那么您将需要Futures或Places.

由于Places的实现方式---有效地作为Racket的多个实例---我不会立即看到如何编写泛型map/place.有关以"定制"方式使用地点的示例,请参阅:

  • 在某处使用地方是否有并行映射的实现?我很乐意能够调用(parallel-map f xs ys zs)参数化可用内核的数量并完成它. (2认同)