我试图理解为什么我们需要标准示例代码的所有部分:
a `par` b `pseq` a+b
Run Code Online (Sandbox Code Playgroud)
以下为什么不够?
a `par` b `par` a+b
Run Code Online (Sandbox Code Playgroud)
上述表达式似乎很描述:尝试同时评估a
和b
并行,并返回结果a+b
.仅仅是效率的原因:第二个版本会引发两次而不是一次?
以下,更简洁的版本怎么样?
a `par` a+b
Run Code Online (Sandbox Code Playgroud)
为什么我们需要确保在原始标准代码b
之前进行评估a+b
?
在计算机架构中,
(分支)预测和推测之间有什么区别?
这些似乎非常相似,但我认为它们之间存在微妙的区别.
如果我理解正确的分支(x86),处理器有时会推测性地采用代码路径并执行指令并"取消"错误路径的结果.如果错误的代码路径中的操作非常昂贵,例如导致高速缓存未命中的内存读取或某些昂贵的数学运算,该怎么办?处理器是否会提前尝试执行昂贵的操作?处理器通常如何处理这个问题?
if (likely) {
// do something lightweight (addition, subtraction, etc.)
} else {
// do something expensive (cache-miss, division, sin/cos/tan etc.)
}
Run Code Online (Sandbox Code Playgroud) 我正在考虑为我想解决的一个问题利用并行性.问题大致如下:给定输入(点序列)找到最佳输出(由这些点组成的最大三角形,最长线等).在点序列中有3种不同的"形状",但我只对"最佳得分"(通常是某种形式的"长度"倍数系数)感兴趣.我们称之为形状S1,S2,S3.
我有2种不同的算法来解决S1 - 'S1a'在O(n 2)中,'S1b'大多表现得更好,但最坏的情况是O(n 4).
第一个问题:是否有一些简单的方法可以并行运行S1a和S1b,使用先完成并停止另一个的方法?至于我正在阅读文档,这可以使用一些forkIO编程并在获得结果时杀死线程 - 只是询问是否有更简单的东西?
第二个问题 - 更加困难:我以这种方式调用优化函数:
optimize valueOfSx input
Run Code Online (Sandbox Code Playgroud)
valueOfSx特定于每个形状,并返回"得分"(或得分的猜测)可能的解决方案.优化调用此函数以找出最佳解决方案.我感兴趣的是:
s1 = optimize valueOfS1 input
s2 = optimize valueOfS2 input
s3 = optimize valueOfS3 input
<- maximum [s1,s2,s3]
Run Code Online (Sandbox Code Playgroud)
但是,如果我知道S1的结果,我可以丢弃所有较小的解决方案,从而使s2和s3收敛得更快,如果不存在更好的解决方案(或者至少丢弃最差的解决方案,从而提高空间效率).我现在在做的是:
zeroOn threshold f = decide .f
where decide x = if (x < threshold) then 0 else x
s1 = optimize valueOfS1 input
s2 = optimize (zeroOn s1 valueOfS2) input
s3 = optimize (zeroOn (max s1 s2) valueOfS3) input
Run Code Online (Sandbox Code Playgroud)
现在的问题是:我能以这样的方式如运行S2和S3并行,无论哪完成第一次将更新其他线程运行的得分功能的"门槛"参数?在某种意义上的东西:
threshold = 0 …
Run Code Online (Sandbox Code Playgroud) parallel-processing concurrency haskell speculative-execution
最近发现的硬件漏洞 Meltdown 和 Spectre 之间的主要区别是什么?我知道它们都依赖于投机执行,但它们之间有何不同?
我已阅读维基百科页面关于无序执行和推测性的exectution.
我不能理解的是相似之处和不同之处.在我看来,当推测执行没有确定条件的值时,它会使用无序执行.
当我阅读Meltdown和Spectre的论文并做了进一步的研究时,出现了混乱.它在陈述消融纸即熔毁是基于乱序执行,而其他一些资源,包括对维基页面sepeculative执行状态消融是基于推测执行.
我想对此有所澄清.
我有一个任务,它将avro输出写入由输入记录的几个字段组织的多个目录中.
For example : Process records of countries across years and write in a directory structure of country/year eg: outputs/usa/2015/outputs_usa_2015.avro outputs/uk/2014/outputs_uk_2014.avro
AvroMultipleOutputs multipleOutputs=new AvroMultipleOutputs(context);
....
....
multipleOutputs.write("output", avroKey, NullWritable.get(),
OUTPUT_DIR + "/" + record.getCountry() + "/" + record.getYear() + "/outputs_" +record.getCountry()+"_"+ record.getYear());
Run Code Online (Sandbox Code Playgroud)
下面的代码用什么输出提交器来编写输出.用于推测执行是不安全的?通过推测执行,这会导致(可能导致)org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException
在这篇文章中 Hadoop Reducer:如何使用推测执行输出到多个目录? 建议使用自定义输出提交器
来自hadoop AvroMultipleOutputs的以下代码未说明推测执行的任何问题
private synchronized RecordWriter getRecordWriter(TaskAttemptContext taskContext,
String baseFileName) throws IOException, InterruptedException {
writer =
((OutputFormat) ReflectionUtils.newInstance(taskContext.getOutputFormatClass(),
taskContext.getConfiguration())).getRecordWriter(taskContext);
...
}
Run Code Online (Sandbox Code Playgroud)
如果baseoutput路径在作业目录之外,write方法也不会记录任何问题
public void write(String namedOutput, Object key, Object value, String baseOutputPath)
Run Code Online (Sandbox Code Playgroud)
在作业目录外写作时,AvroMultipleOutputs(其他输出)是否存在推测执行的实际问题?如果,那么我如何覆盖AvroMultipleOutputs以拥有它自己的输出提交器.我在AvroMultipleOutputs中看不到任何输出格式,它使用的输出提交者
java hadoop speculative-execution hadoop-yarn multipleoutputs
CVE-2018-12126 已分配给 MSBDS(微架构 StoreBuffer 数据采样),这是英特尔处理器的一个漏洞,属于新创建的MDS(微架构数据采样)类。
我正在尝试获取这些漏洞背后的微架构细节。我已经开始使用 MSBDS,也称为 Fallout (cfr Meltdown),它允许攻击者泄漏存储缓冲区的内容。
出于某种原因,讨论微架构细节的网络安全论文通常不准确。
幸运的是,MSBDS 论文引用了专利 US 2008/0082765 A1(图片来自该专利)。
对于我收集到的信息,似乎在 MSBDS 的情况下,漏洞存在于内存消歧算法如何处理具有无效物理地址的负载。
这是据称用于检查存储缓冲区中的负载是否匹配的算法:
302检查load所引用的页面的偏移量是否与存储缓冲区中任何先前存储所引用的页面的偏移量匹配。
如果此检查失败,则加载与任何存储都不匹配,并且可以在304处执行(已分派)。
如果302检查,则将负载的虚拟地址的上半部分与存储的虚拟地址进行检查1。
如果找到匹配,则加载匹配并且在308,如果转发不可能(例如从窄存储到更宽加载),则转发它需要的数据或阻止加载本身(直到匹配的存储提交)。
笔记同一个虚拟地址可以映射到两个不同的物理地址(在不同的时间但在存储转发窗口内)。不正确的转发不是通过该算法而是通过排空存储缓冲区(例如,使用mov cr3, X
正在序列化的 a)2来防止的。
如果加载的虚拟地址与存储的任何虚拟地址都不匹配,则在310处检查物理地址。
这对于处理不同的虚拟地址映射到相同的物理地址的情况是必要的。
[0026]段补充说:
在一个实施例中,如果在操作302有命中并且加载或存储操作的物理地址无效,则在操作310的物理地址检查可以被认为是命中并且方法300可以在操作308继续。在一种情况下,如果加载指令的物理地址无效,则加载指令可能由于DTLB 118未命中而被阻塞。此外,如果存储操作的物理地址无效,则在一个实施例中结果可以基于finenet命中/未命中结果,或者可以在该存储操作上阻塞加载操作,直到解析存储操作的物理地址在一个实施例中。
这意味着如果物理地址不可用,CPU 将仅考虑地址的低 (12) 位3。
考虑到 TLB 未命中的情况正在下面几行处理,这仅留下访问的页面不存在的情况。
这确实是研究人员如何展示他们的攻击:
char * victim_page = mmap (... , PAGE_SIZE …
Run Code Online (Sandbox Code Playgroud) 好吧,所以我知道,如果特定的条件分支有一个需要时间来计算的条件(例如内存访问),CPU 会假定一个条件结果并沿着该路径推测执行。但是,如果沿着该路径弹出另一个缓慢的条件分支(当然,假设第一个条件尚未解决并且 CPU 无法提交更改),会发生什么情况?难道CPU只是在猜测里面猜测吗?如果最后一个条件预测错误但第一个条件没有预测会发生什么?难道只是一路回滚吗?
我正在谈论这样的事情:
if (value_in_memory == y){
// computations
if (another_val_memory == x){
//computations
}
}
Run Code Online (Sandbox Code Playgroud) cpu-architecture nested-if speculative-execution branch-prediction
由于 Spectre 缓解,所有当前 CPU 都禁用了硬件锁定省略是否正确,并且任何尝试使用 HLE 内在函数/指令进行互斥都会导致通常的互斥?
这是否有可能在未来不会有类似 HLE 互斥体的东西来避免像 Spectre 这样的漏洞?