branch-prediction相关内容

`rep ret` 是什么意思?

我在 Visual Studio 2008 上测试了一些代码并注意到 security_cookie.我能理解它的意思,但我不明白这个指令的目的是什么. rep ret/* REP 避免 AMD 分支预测惩罚 */ 当然我能理解评论:) 但是这个前缀在 ret 上下文中做了什么,如果 ecx 是 != 0 会发生什么?显然,当我调试它时,ecx 的循环计数被忽略了,这是意料之中的. 我 ..
发布时间:2021-11-30 11:17:03 其他开发

为什么处理排序数组比处理未排序数组更快?

这是一段 C++ 代码,显示了一些非常奇特的行为.出于某种奇怪的原因,对数据进行排序(在定时区域之前)奇迹般地使循环快了近六倍. #include #include #include int main(){//生成数据const unsigned arraySize = 32768;整数数据[数组大小];for (unsigned c = 0; c = 128)总和 += 数据 [ ..
发布时间:2021-11-25 10:07:44 Java开发

为什么处理排序数组比处理未排序数组更快?

这是一段 C++ 代码,显示了一些非常奇特的行为.出于某种奇怪的原因,对数据进行排序(在定时区域之前)奇迹般地使循环快了近六倍. #include #include #include int main(){//生成数据const unsigned arraySize = 32768;整数数据[数组大小];for (unsigned c = 0; c = 128)总和 += 数据 [ ..
发布时间:2021-11-22 14:47:09 Java开发

为什么处理排序数组比处理未排序数组更快?

这是一段 C++ 代码,显示了一些非常奇特的行为.出于某种奇怪的原因,对数据进行排序(在定时区域之前)奇迹般地使循环快了近六倍. #include #include #include int main(){//生成数据const unsigned arraySize = 32768;整数数据[数组大小];for (unsigned c = 0; c = 128)总和 += 数据 [ ..
发布时间:2021-11-19 22:24:12 Java开发

当前 CPU 上的分支预测有多普遍?

由于对性能的巨大影响,我从不怀疑我今天的桌面 CPU 是否有分支预测.当然可以.但是各种 ARM 产品又如何呢?iPhone 或 android 手机有分支预测吗?较旧的任天堂 DS?基于 PowerPC 的 Wii 怎么样?PS 3? 他们是否有一个复杂的预测单元并不那么重要,但他们是否至少有一些动态预测,以及他们是否按照预期执行一些指令分支. 具有分支预测功能的 CPU 的截止时间 ..
发布时间:2021-11-17 22:06:29 其他开发

了解分支预测

有一些关于分支预测的问题,我无法确定.假设我必须使用静态分支预测器. 应该在流水线的哪个阶段进行分支预测? 如何知道预测出错了?数据路径如何知道发生了错误预测? 如果知道发生了错误预测,它如何发送信号以占用未采用的分支? 出现问题后,我必须使用之前没有使用的地址.同时,如果发生了一些内存写入或寄存器写入怎么办?如何防止它发生? 即使建议了一些带有数据路径的适当引用,这也会非常有帮 ..
发布时间:2021-11-17 21:57:00 其他开发

了解分支预测

有一些关于分支预测的问题,我无法确定.假设我必须使用静态分支预测器. 应该在流水线的哪个阶段进行分支预测? 如何知道预测出错了?数据路径如何知道发生了错误预测? 如果知道发生了错误预测,它如何发送信号以占用未采用的分支? 出现问题后,我必须使用之前没有使用的地址.同时,如果发生了一些内存写入或寄存器写入怎么办?如何防止它发生? 即使建议了一些带有数据路径的适当引用,这也会非常有帮 ..
发布时间:2021-11-17 02:11:47 其他开发

是 mov rax,0x12345678;jmp rax 仍然会杀死分支预测?

我无法找到上述两种情况的特定信息,尽管听取了您的专家意见. 第一件事是:我知道间接 jmps 会损害分支预测,即使间接的结果是常数,它仍然需要预测维护缓冲区和东西,所有这些都与绝对 jmp 相比. 我的问题是,如果有人知道: mov rax, 1234567812345678h;jmp rax; 处理器的分支预测器仍然认为是间接的,或者在这种情况下它会做数学运算吗..我这样做是因为 ..

哪些指令会在 x86 CPU 上产生分支预测错误?

我有一个测试问题. 哪些指令可能会减慢处理器的工作,然后管道不预测(分支预测)进一步的执行方式? 可能的答案:JGE |添加 |订阅 |推 |JMP |JNZ |多|JG |打电话 如果我们谈论分支预测,是 JGE、JMP、JNZ &JG要走的路? 解决方案 mul 之类的指令 不要对 EIP 做任何特别的事情 当然不能误报,但是每一种 跳转/调用/分支都可能对某些流水线 ..
发布时间:2021-06-18 18:33:56 其他开发

如何理解影响分支预测的宏“可能"?

我注意到如果我们知道控制流有可能是真还是假,我们可以告诉编译器,例如,在Linux内核中,有很多likely unlikely,实际上是由 gcc 提供的 __builtin_expect 实现的,所以我想知道它是如何工作的,然后检查了那里的程序集: 20:branch_prediction_victim.cpp **** if (array_aka[j] >= 128)184 .loc 3 ..
发布时间:2021-06-15 19:55:32 其他开发

为什么短路逻辑运算符应该更快

这个问题不是关于优化代码的问题,而是一个关于短路逻辑运算符和普通逻辑运算符的性能差异的技术性问题,这些差异可能归结于它们在硬件级别上的执行方式. 基本逻辑 AND 和 OR 占用一个周期,而短路评估则使用分支,并可能占用各种周期.现在我知道分支预测变量可以使此评估高效,但是我不知道它的循环速度如何快于1个周期? 是的,如果正确的操作数是昂贵的东西,那么尝试不进行评估是有益的.但对于诸如 ..

在6级标量或超标量MIPS中,有多少条指令因未命中而需要杀死?

我正在使用6个阶段的流水线:F D I X0 X1W.有人问我,当发生分支未命中预测时,需要杀死多少条指令. 我想出了4.我想这是因为分支解析发生在X1中,我们将需要杀死分支之后的所有指令.在管道图中,看起来需要杀死流经管道的4条指令.那是对的吗? 我还被问到,如果管道是三宽超标量,则需要杀死多少人.我不确定这一点.我认为应该是12,因为您一次可以提取3条指令.正确吗? 解决方案 ..
发布时间:2021-04-24 21:07:48 其他开发

嵌套分支和投机执行会怎样?

好的,所以我知道,如果特定条件分支的条件需要花费时间来计算(例如,内存访问),则CPU会假定条件结果,并沿该路径推测执行.但是,如果沿着该路径弹出另一个慢速的条件分支会发生什么(当然,假设第一个条件尚未解决,并且CPU无法仅仅提交更改)?CPU只是在推测内进行推测吗?如果最后一个条件的预测有误,但第一个条件不是预测的,会发生什么?会一直回滚吗? 我说的是这样的东西: if(value_i ..

x86-64管道是否会像JMP RAX一样在间接跳转时停顿?

在x86-64中,如果您使用以下汇编代码: MOV RAX,(内存地址)JMP RAX 管道是否在执行分支之前停滞(等待MOV完成RAX处理),还是像条件分支一样冲洗管道? 解决方案 对于大多数现代80x86 CPU;有静态预测(没有历史可用来做出更好的预测)和动态预测(有以前执行的历史可以使用). 对于静态预测,CPU预测 JMP RAX 之后立即执行该指令.我不能完全确定 ..

分支预测变量和分支目标缓冲区如何共存?

我的问题是它们如何在现代CPU体系结构中共存并协同工作? 解决方案 您已经略微颠倒了它.在每次获取时,您都会索引到分支预测器中,该分支预测器会告诉您刚收到的指令是否将解码为采用分支.如果不是,则获取下一个顺序地址.但是,如果您的分支预测器说它将是一个采用的分支,则您不知道下一步要提取哪一条指令,因为您尚未对该指令进行解码.因此,为了不浪费等待分支解决的周期,您可以使用分支目标缓冲区(或BT ..
发布时间:2021-04-24 21:04:35 其他开发

函数指针的分支预测

我有一个循环反复运行.该循环内的逻辑取决于程序所处的模式.为了提高性能,我一直在考虑可以初始化函数指针数组functionPtr [],这样就可以调用运行正确逻辑的functionPtrmode.循环将以相同的模式保持多个周期(该数目在前期未知,但有数千个).该程序仅在intel x64计算机上运行,​​并且不需要可移植性. 我希望CPU使用分支预测,但是由于我的分支不是有条件的(在汇编级别 ..
发布时间:2021-04-19 18:52:25 C/C++开发

分支预测如何影响R中的性能?

一些参考文献: 这是此 r 的问题中的唯一帖子我发现与分支预测有些相关的标签是为什么采样矩阵行很慢? 问题的说明: 我正在研究处理排序数组是否比处理未排序数组快(与Java和C –第一个链接中测试的问题相同),以查看分支预测是否以相同方式影响R 请参阅下面的基准示例: set.seed(128) #or making a vector with 1e7 myvec ..

性能损失:数字归一化与分支错误预测

对于已经测量过或对此类注意事项有深入了解的人员,假定您必须执行以下操作(为示例选择任何一个)浮点运算符: float calc(float y, float z) { return sqrt(y * y + z * z) / 100; } 在y和z可以是非正规数的情况下,我们假设两种可能的情况,其中y,z或全部以随机的方式都可以是非正规数 50%的时间 ..