[ 38 ]期货和投机未来是一种在需要价值之前进行的计算。与暂停类似,未来表示的值将在稍后确定。与暂停不同的是,无论是否需要将来的值,总是会对其进行评估。在顺序设置中,期货几乎没有兴趣;τ类型的未来只是τ类型的表示。然而,在并行环境中,期货是有意义的,因为它们提供了一种启动并行计算的方法,而这种并行计算的结果直到稍后才能完成。推测是一种延迟计算,它的结果可能需要整体计算到finish。推测的动力学与计算的主线程并行执行暂停计算,而不考虑主线程是否需要投机的值。如果需要投机的价值,那么这种动态就会得到回报,但如果不是,计算它的努力就白费了。期货是fi的工作,因为涉及期货的计算所做的全部工作并不比顺序执行所做的工作多。相反,投机是fi的工作,因为投机性的执行可能是徒劳的--整体计算可能比计算结果所需的步骤更多。因此,投机是利用并行性的一种冒险策略。它可以利用现有的资源,但可能只会牺牲做的工作比必要的多!38.3并行动力期货只有在它们承认并行动力学允许计算未来的同时进行一些其他计算的情况下才是有趣的。在本节中,我们给出了未来和投机的并行动态,其中任务的创建、执行和同步是明确的。除终止条件外,期货与投机的平行动态是一致的。期货要求所有任务在终止前完成,而投机活动在完成之前可能被放弃。
对期货和投机行为进行评估,而不考虑是否需要它们的价值。那么,期货如何比投机更有效呢?
“期货要求所有任务在终止前完成,炒作在完成之前可以放弃”,这是什么意思?
我仍然不明白期货和投机是如何被不同的评价的。
谢谢。
发布于 2021-02-12 15:45:40
实际上他们的评估是一样的。
关键是忽略您使用的语言或库调用它,并集中精力设计软件触发并行操作,从而程序员的意图。
如果你知道将来你要使用计算的结果,当你最终需要它的时候,你想让它做好准备,并且你有处理器来运行计算,那么你的目标是减少延迟,那么它就是未来。您肯定会使用这个结果,这样就不会浪费CPU周期,也就是说,没有更好的方法将它们用于计算所需的东西。
但也许你不一定需要将来的结果,但你认为在某些情况下(取决于未来几个周期可能发生的情况……)您可能需要它-如果您确实需要它,您将立即想要它(以减少延迟时,如果您需要的结果)。这是一种推测--你在预测一个可能的优势--如果你确实需要好的、好的结果,但如果碰巧你不需要它,那么这些CPU周期就被浪费了,如果你预测了更好的未来,或者如果你有肯定需要执行的计算,因为处理器在你的推测工作上很忙,你可能会将它们用于其他事情。
实际上,并发库可能允许也可能不允许取消正在进行的计算。通常您不能这样做,因为底层机制--可能是一个(用户空间)线程--实际上不能被取消。(因为简单地停止用户空间线程并删除它的资源通常是不安全的-它可能持有一个锁或一些内核东西,这样就永远不会关闭/释放。)因此,您可能会发现调用它们的构造的库futures (以及相应的promises)没有任何取消的能力,您要么必须带着所有的未来join,要么必须在退出之前访问所有的承诺。在这样的库中--你很可能很想在你需要它们之前先进行推测和启动计算--但是要好好选择,尽量不要做太多--除非你在处理器中游动……
发布于 2021-02-12 16:49:00
从程序员的角度来看,推测并不是一个非常普遍的术语,但我的理解是,他们被评估为对未来的相同评价。区别在于你对结果做了什么。
用更熟悉的术语重申,他们所说的“未来”似乎就像一个总是被async编辑的await函数。“推测”就像一个async函数,如果它的结果有用,那么就启动它,但是您还不知道是否想要await。如果您决定不使用await,那么运行它所花费的cpu时间最终会被浪费掉。
https://softwareengineering.stackexchange.com/questions/422178
复制相似问题