ParallelMap

ParallelMap[f,expr]

f 并行作用在 expr 第一层的元素上.

ParallelMap[f,expr,levelspec]

f 并行作用在 levelspec 指定 expr 的部分元素上.

更多信息和选项

  • ParallelMap 是一个并行的 Map,将 f 作用在不同的内核和处理器之间.
  • ParallelMap 将给出和 Map 相同的结果,除了计算过程中的副作用.
  • ParallelMap 用和 Map 相同的层指定,并非所有指定可以并行化.
  • Parallelize[Map[f,expr]] 等价于 ParallelMap[f,expr].
  • 对于不能并行的 ParallelMap,用 Map 执行计算.
  • 可以给出下列选项:
  • Method Automatic并行化粒度
    DistributedContexts $DistributedContexts用于将符号分配到并行计算的上下文
    ProgressReporting $ProgressReporting是否报告计算进度
  • Method 选项指定要使用的并行化方法. 可能的设置包括:
  • "CoarsestGrained"将计算分成与可用内核数量相同的段
    "FinestGrained"将计算分成最小的子单元
    "EvaluationsPerKernel"->e将计算分成每个内核最多 e
    "ItemsPerEvaluation"->m将计算分成每个内核最多 m 个子单元
    Automatic在总开销和负载平衡之间的折中
  • Method->"CoarsestGrained" 适用于涉及多个子单元的计算,所有子单元采用相同的时间计算. 将总开销降到最低,不提供任何负载均衡.
  • Method->"FinestGrained" 适用于少量子单元的计算,子单元采用不同的时间计算. 它提高总开销,但最大化了负载均衡.
  • DistributedContexts 选项指定出现在 expr 中的哪些符号在计算之前将其定义自动分发到所有可用内核.
  • 设置 $DistributedContexts:=$Context,默认值为 DistributedContexts:>$DistributedContexts,该值分发当前上下文中所有符号的定义,但不分发程序包中的符号定义.
  • ProgressReporting 选项指定是否报告并行计算的进度.
  • 默认值为 ProgressReporting:>$ProgressReporting.

范例

打开所有单元关闭所有单元

基本范例  (4)

ParallelMapMap 工作方式相似,不同之处在于并行:

ParallelMap 对于任何函数都适用:

用明确的纯函数:

互动式定义的函数可以立即并行使用:

耗时更长的计算显示有关其进度和估计完成时间的信息:

范围  (6)

在第一层映射(默认):

映射下降到第二层:

在第二层映射:

映射下降到第三层:

在所有层上映射,从第一层开始:

负数层:

正数层和负数层可以混合:

在每个层上的不同头部(head):

不是所有层都可以被并行化:

推广和延伸  (2)

ParallelMap 可以用于具有任意头部的表达式中:

具有属性 Listable 的函数被自动映射:

选项  (13)

DistributedContexts  (5)

默认情况下,当前上下文的定义会自动分配:

没有分配任何函数的定义:

分配出现在并行计算中的所有上下文中的符号定义:

只分配给定上下文的定义:

恢复 DistributedContexts 选项的值为默认值:

Method  (6)

把计算分成最小可能的子单元:

把计算分成与可用内核相同数目的块:

对于整个任务,把计算分成每个内核最多两次计算:

把计算分成最次计算最多含有5个元素:

默认选项设置在计算规模和计算次数之间折中:

具有很大差异的运行时间的计算应该被尽可能精细地并行化:

大量简单计算应该被分配成尽可能少的批次:

ProgressReporting  (2)

不显示临时进度报告:

使用 Method"FinestGrained" 可得到准确度最高的进度报告:

应用  (2)

查看求得的结果:

求解算术难题:

以符号形式写出:

对每个字母指定一个数字:

并且把每个单词解释为一个以10为基数的数字:

自动检查一个特定的数字赋值:

为了系统地求解该赋值,首先获取字母列表:

该难题可以通过考虑8个数字的所有子集的全排列来求解:

对它进行并行化处理:

通常只考虑满足 的解:

一旦使用 ParallelTry 找到一个非平凡解,搜索也可以停止:

属性和关系  (10)

并行化出现在使用的最外层上:

Map 实际使用 ParallelMap,可以被自动并行化:

显示具有已知大小的任务的负载平衡的效果:

定义大量具有已知运行时间的任务:

测量并行执行的时间:

得到的加速(越大越好):

最精颗粒度的调用(Finest-grained scheduling)给出更好的负载平衡和更高的加速:

首先调用大型任务产生更好的结果:

关于一些变量的函数可以使用 MapThread 映射:

通过使用 Parallelize 获取一个并行版本:

MapIndexed 把一个元素的索引传递给被映射的函数:

通过使用 Parallelize 获取一个并行版本:

ScanMap 作用相同,但是不返回结果:

当需要时,互动式定义的函数会自动分配到所有内核:

手动分配定义并禁止自动分配:

对于来自程序包的函数,使用 ParallelNeeds 而不是 DistributeDefinitions

并行获取 Mathematica 安装中所有 Wolfram 语言文件的大小:

可能存在的问题  (7)

如果一个层次指定阻止了并行化的运行,ParallelMap 的计算类似 Map

副作用不可以在并行映射的函数中使用:

使用一个共享变量来支持副作用:

在并行内核上未知的一个函数可能导致串行计算:

在所有并行内核上定义该函数:

现在,该函数在并行内核上计算:

当前上下文的定义是自动分布的:

来自于不是默认上下文的定义不会自动分配:

使用 DistributeDefinitions 分配该类定义:

或者,设置 DistributedContexts 选项包括所有上下文:

当并行化时,平凡操作可能需要更长时间:

测量最小并行通讯开销:

与在主内核上进行的简单计算相比较:

函数可以简化短的参数列表,但不能简化长的参数列表:

部分表达式的这种简化可能导致并行映射不能进行:

为了阻止部分表达式的这种简化,只能在最后应用想要的函数:

如果较大型计算接近输入列表的末尾,则时长估计将不准确:

Wolfram Research (2008),ParallelMap,Wolfram 语言函数,https://reference.wolfram.com/language/ref/ParallelMap.html (更新于 2021 年).

文本

Wolfram Research (2008),ParallelMap,Wolfram 语言函数,https://reference.wolfram.com/language/ref/ParallelMap.html (更新于 2021 年).

CMS

Wolfram 语言. 2008. "ParallelMap." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2021. https://reference.wolfram.com/language/ref/ParallelMap.html.

APA

Wolfram 语言. (2008). ParallelMap. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/ParallelMap.html 年

BibTeX

@misc{reference.wolfram_2024_parallelmap, author="Wolfram Research", title="{ParallelMap}", year="2021", howpublished="\url{https://reference.wolfram.com/language/ref/ParallelMap.html}", note=[Accessed: 17-November-2024 ]}

BibLaTeX

@online{reference.wolfram_2024_parallelmap, organization={Wolfram Research}, title={ParallelMap}, year={2021}, url={https://reference.wolfram.com/language/ref/ParallelMap.html}, note=[Accessed: 17-November-2024 ]}