问题标签 [speculative-execution]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 具有推测执行的 Hadoop 多输出
我有一个任务,它在由输入记录的几个字段组织的多个目录中写入 avro 输出。
下面的代码将使用哪个输出提交者来编写输出。与推测执行一起使用是否不安全?通过推测执行,这会导致(可能会导致)org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException
在这篇文章 中 Hadoop Reducer:如何使用推测执行输出到多个目录? 建议使用自定义输出提交器
hadoop AvroMultipleOutputs 的以下代码没有说明推测执行有任何问题
如果 baseoutput 路径位于作业目录之外,则 write 方法也不会记录任何问题
在作业目录之外写入时,AvroMultipleOutputs(其他输出)是否存在具有推测执行的真正问题?如果,那么我如何覆盖 AvroMultipleOutputs 以拥有它自己的输出提交者。我在 AvroMultipleOutputs 中看不到它使用的输出提交者的任何输出格式
c++ - 投机性执行会演变成昂贵的操作吗?
如果我正确理解分支(x86),处理器有时会推测性地采用代码路径并执行指令并“取消”错误路径的结果。如果错误代码路径中的操作非常昂贵,例如导致缓存未命中的内存读取或一些昂贵的数学运算,该怎么办?处理器会尝试提前执行一些昂贵的事情吗?处理器通常如何处理这个问题?
apache-spark - 推测执行 Mapreduce/Spark
我知道 Hadoop/Spark 框架会检测故障或慢速机器并在不同机器上执行相同的任务。框架将如何(在什么基础上)识别运行缓慢的机器。框架是否有任何统计数据可以决定?
有人可以在这里阐明一下吗?
assembly - ARM 预取解决方法
我有一种情况,其中某些地址空间很敏感,因为您阅读它会崩溃,因为那里没有人响应该地址。
bx 不是由编译器作为指令创建的,而是一个 32 位常量的结果,该常量不适合作为单个指令中的立即数,因此设置了 pc 相对负载。这基本上是文字池。它恰好有类似于 bx 的位。
可以很容易地编写一个测试程序来生成问题。
在这种情况下,处理器正在等待从弹出(ldm)返回的数据移动到下一条指令 bx r0,并在 r0 中的地址开始预取。哪个挂着 ARM。
作为人类,我们将 pop 视为无条件分支,但处理器不会,它一直通过管道。
预取和分支预测并不是什么新鲜事(在这种情况下我们关闭了分支预测器),已有数十年历史,并且不仅限于 ARM,而是将 PC 作为 GPR 的指令集的数量以及在某种程度上将其视为非- 特殊的很少。
我正在寻找一个 gcc 命令行选项来防止这种情况。我无法想象我们是第一个看到这个的人。
我当然可以这样做
防止问题
请注意,不仅限于拇指模式,gcc 还可以在弹出后使用文字池为类似的东西生成 arm 代码。
希望有人知道一个通用或特定于 arm 的选项来执行 armv4t 之类的返回(例如 pop {r4,lr}; bx lr 在 arm 模式下)而不带行李或在 pop pc 之后立即将分支放到 self (似乎解决了问题管道并不混淆 b 作为无条件分支。
编辑
也会导致预取。这不会属于-march = armv4t。gcc 故意生成 ldrls pc,[]; b 某处用于 switch 语句,这很好。没有检查后端是否有其他 ldr pc,[] 指令生成。
编辑
看起来 ARM 确实将此报告为勘误表(勘误表 720247,“可以在内存映射中的任何位置进行推测性指令提取”),希望我在我们花了一个月的时间之前就知道...
caching - Meltdown 和 Spectre 有什么区别?
最近发现的硬件漏洞 Meltdown 和 Spectre 之间的主要区别是什么?我知道它们都依赖于推测执行,但是它们之间有什么不同呢?
hadoop - 未触发 Hadoop 中 reducer 的推测执行
我设置了以下标志,以便为我的 MR 作业触发推测执行。有一些糟糕的硬件导致作业运行时间很长(8-9 小时而不是常规的 1.5-3 小时),理想情况下,当我们推测硬件问题不应影响 Hadoop MR 作业的运行时间。映射器工作正常并触发推测,但在减速器上从未触发过推测(即使是那些运行 8 小时的)。在这种情况下的任何帮助都将非常有价值。
参数值的来源:http: //docs.qubole.com/en/latest/user-guide/hadoop/hadoop1/speculation.html
c - 处理器是否对函数指针表执行推测执行?
如果有一个函数指针表,并且索引作为 volatile 变量提供,生成的代码是否会被认为是无分支的,这样可以避免推测执行,还是处理器仍会尝试推测最可能的分支?
作为一个简单的例子,考虑:
我预测具有推测执行的 CPU 会尝试它认为最有可能执行上述代码的分支。
但是,如果转换成跳转表:
上面的代码还会触发推测执行吗?
cpu-architecture - 乱序执行与投机执行
我无法理解的是相同点和不同点。例如,在我看来,推测执行在尚未确定条件的值时使用了乱序执行。
当我阅读 Meltdown 和 Spectre 的论文并进行更多研究时,困惑就来了。Meltdown 论文中指出,Meltdown 是基于乱序执行的,而其他一些资源,包括关于投机执行的 wiki 页面,表明 Meltdown 是基于投机执行。
我想澄清一下。
cpu - 为什么不只预测两个分支?
CPU 使用分支预测来加速代码,但前提是实际采用第一个分支。
为什么不简单地同时使用两个分支?也就是说,假设两个分支都会被命中,缓存两边,并在必要时采用正确的分支。缓存不需要失效。虽然这需要编译器事先加载两个分支(更多内存、正确布局等),但我认为适当的优化可以简化这两个分支,以便从单个预测器获得接近最佳的结果。也就是说,需要更多内存来加载两个分支(对于 N 个分支来说是指数级的),大多数时候应该能够在完成执行所采用的分支之前足够快地用新代码“重新缓存”失败的分支.
if (x) Bl else Br;
与其假设 Bl 被采用,不如假设 Bl 和 Br 都被采用(某种类型的并行处理或特殊交错),并且在实际确定分支之后,一个分支无效,然后可以释放缓存以供使用(也许一些需要某种特殊技术来正确填充和使用它)。
事实上,不需要预测电路,所有用于预测的设计都可以用来处理两个分支。
如果这可行,有什么想法吗?
cpu-architecture - 有没有双峰比不采取更好的情况?
考虑这两种方法:
- 动态双峰:
- 我们有 4 个阶段,每个阶段有 2 个阶段(采取或不采取),并且每次算法预测错误时交替,在 2 次连续错误预测后从采取<->不采取变化。
- 未采取静态:
- 在这里,算法将始终预测采取或未采取。在每个错误预测之后在两个阶段之间切换。
我用 C 中的以下代码测试了这两种算法:
并分析if
条件。
在这两种情况下,它们都是偶数(将预测正确/错误的次数相同)。
是否有任何可能的简单算法,双峰比不采用更好?