gpt4 book ai didi

wolfram-mathematica - 如何获取并行设置的变量/函数定义(例如使用 ParallelMap)?

转载 作者:行者123 更新时间:2023-12-04 06:01:29 26 4
gpt4 key购买 nike

我有一个函数用于根据索引查找值。该值需要一些时间来计算,所以我想用 ParallelMap , 并引用另一个类似的此类函数,该函数返回表达式列表,也基于索引。

然而,当我以一种看似合理的方式进行设置时,我看到了一些非常奇怪的行为。首先,我看到该功能似乎可以工作,尽管速度很慢。然而,对于大型索引,Taskmangler 中的处理器事件在很长一段时间(即 2-4 分钟)内完全保持为零,此时所有 Mathematica 实例似乎都处于惰性状态。然后,在没有丝毫 CPU 使用的情况下,结果出现了。这是 Mathematica 的另一个案例吗spukhafte Fernwirkung ?

也就是说,我想创建一个变量/函数来存储一个表达式,这里是一个整数列表( ListOfInts ),然后在并行工作人员上我想对该表达式执行一些函数(这里我应用一组替换规则并采用 Min )。我希望该函数的结果也被另一个变量/函数( IndexedFunk )下的相同索引索引,然后可以在 Mathematica 的主实例上使用其结果:

(*some arbitrary rules that will convert some of the integers to negative values:*)
rulez=Dispatch[Thread[Rule[Range[222],-Range[222]]]];

maxIndex = 333;
Clear[ListOfInts]
Scan[(ListOfInts[#]=RandomInteger[{1,999},55])&,Range[maxIndex ]]
(*just for safety's sake:*)
DistributeDefinitions[rulez, ListOfInts]

Clear[IndexedFunk]
(*I believe I have to have at least one value of IndexedFunk defined before I Share the definition to the workers:*)
IndexedFunk[1]=Min[ListOfInts[1]]/.rulez
(*... and this should let me retrieve the values back on the primary instance of MMA:*)
SetSharedFunction[IndexedFunk]

(*Now, here is the mysterious part: this just sits there on my multiprocessor machine for many minutes until suddenly a result appears. If I up maxIndex to say 99999 (and of course re-execute the above code again) then the effect can more clearly be seen.*)
AbsoluteTiming[Short[ParallelMap[(IndexedFunk[#]=Min[ListOfInts[#]/.rulez])&, Range[maxIndex]]]]

我相信这是一些错误,但是我仍在试图弄清楚 Mathematica Parallel,所以我对这个结论不能太自信。尽管速度慢得令人沮丧,但它在实际上不需要 CPU 的情况下执行计算的能力仍然令人印象深刻。

我想这可能是由于主进程和从进程之间使用了任何通信协议(protocol),也许它太慢了,以至于处理器似乎什么都不做,而实际上它们只是在等待发送下一个定义或其他。在这种情况下,我认为 ParallelMap[..., Method->"CoarsestGrained"]会有一些用处。但是不,这也行不通。

一个问题:“我是在做一些明显错误的事情,还是这是一个错误?”

最佳答案

恐怕你是。问题在于变量的共享定义。 Mathematica 在跨内核的变量的所有副本中维护一个单一的连贯值,因此该变量成为一个巨大的争用点。 CPU 处于空闲状态,因为内核排队等待变量 IndexedFunk ,并且大部分时间都花在进程间或机器间的通信上。去搞清楚。

对了,没有功能SetSharedDefinition在我所知道的任何 Mathematica 版本中。你可能打算写 SetSharedVariable .但无论如何都要移除那个邪恶的召唤!为避免争用,将并行计算的结果作为对列表返回,然后在主内核将它们组装成变量的下值:

Clear[IndexedFunk]
Scan[(IndexedFunk[#[[1]]] = #[[2]]) &,
ParallelMap[{#, Min[ListOfInts[#] /. rulez]} &, Range[maxIndex]]
]
ParallelMap负责自动分配定义,因此调用 DistributeDefinitions是多余的。 (作为一个小提示,写的不正确,省略了 maxIndex 变量,但在这种特殊情况下, ParallelMap 会自动处理遗漏。)

编辑,注意!:自动分发仅适用于 Mathematica 版本 8。感谢@MikeHoneychurch 的更正。

关于wolfram-mathematica - 如何获取并行设置的变量/函数定义(例如使用 ParallelMap)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8867183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com