Parallel processing 如何在racket中将函数映射到并行列表上?

Parallel processing 如何在racket中将函数映射到并行列表上?,parallel-processing,scheme,racket,Parallel Processing,Scheme,Racket,问题的标题说明了这一切,真的:在racket中,将函数映射到列表上的最佳方式是什么?谢谢。如果您指的是多处理器核,那么最常用的方法就是使用 Places允许开发并行程序,利用具有多个处理器、内核或硬件线程的机器 place是一个并行任务,实际上是Racket虚拟机的一个单独实例。场所通过场所通道进行通信,场所通道是双向缓冲通信的端点 您可能可以使用其他并行化技术,但其工作条件相对有限,例如,如上所述的浮点操作 编辑:回应评论: 在某处是否有使用地点的并行地图的实现 首先,我应该后退。你可能不需

问题的标题说明了这一切,真的:在racket中,将函数映射到列表上的最佳方式是什么?谢谢。

如果您指的是多处理器核,那么最常用的方法就是使用

Places允许开发并行程序,利用具有多个处理器、内核或硬件线程的机器

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

您可能可以使用其他并行化技术,但其工作条件相对有限,例如,如上所述的浮点操作


编辑:回应评论:


在某处是否有使用地点的并行地图的实现

首先,我应该后退。你可能不需要地方。您可以使用Racket线程获得并发性。例如,这里有一个
映射/线程

#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核,那么您将需要未来或位置

由于Places的实现方式——就像Racket的多个实例一样有效——我现在不知道如何编写一个通用的
map/place
。有关以“定制”方式使用场所的示例,请参见:


    • 我不知道Racket中的版本,但我在中实现了一个版本

      唯一的问题不是R5R

      使用示例:

      使用常规的
      地图

      (time (map (lambda (a)
              (begin
                (sleep 1000)
                (+ 1 a)))
           '(1 2 3 4 5)))
      => ((2 3 4 5 6) (5000 ms))
      
      使用
      并行映射

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

      谢谢你,格雷格。我确实尝试过使用futures将阶乘函数映射到一个大整数列表上,但计算似乎绑定到一个核心。然而,我显然是在使用bignum——我没有意识到期货仅限于浮动的事实。顺便说一句,我的描述有点随意。这并不是什么“浮点”。定点和浮点都可以工作;关键是它们是
      fixnum
      还是
      flonum
      并且不需要装箱/分配。这有点棘手。这就是为什么我建议将地点作为更普遍的尝试。只有当你在做数字方面的工作,并且愿意仔细阅读代码时,你才可能发现未来是有帮助的(据我所知,其他知道更多的人可能会跳进来纠正我)。谢谢你的澄清,Greg。在某处有使用位置的平行地图的实现吗?我希望能够调用(并行映射f xs ys zs)以可用内核的数量进行参数化并使用它。@wdkrnls似乎不太容易以通用的方式工作,因为位置被提升到模块的顶层(起初有点混乱,但多次阅读文档中的段落会有所帮助)。我尝试在一个列表中放置多个位置,但后来无法在我的程序中使用它们。这种提升有一些奇怪的效果。总的来说,场所的概念似乎很棒,就像球拍中几乎所有的概念一样。
      (time (map-parallel (lambda (a)
              (begin
                (sleep 1000)
                (+ 1 a)))
           '(1 2 3 4 5)))
      => ((2 3 4 5 6) (1000 ms))