Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance x86_64-自修改代码性能_Performance_X86 64_Self Modifying - Fatal编程技术网

Performance x86_64-自修改代码性能

Performance x86_64-自修改代码性能,performance,x86-64,self-modifying,Performance,X86 64,Self Modifying,我正在阅读英特尔体系结构文档,第3卷,第8.1.3节 自修改代码将以低于非自修改或普通代码的性能级别执行。性能恶化的程度取决于修改的频率和代码的具体特征 因此,如果我遵守规则: (*备选方案1*) 将修改后的代码(作为数据)存储到代码段中;跳转到新代码或中间位置;执行新代码 (*备选方案2) 将修改后的代码(作为数据)存储到代码段中; 执行串行化指令;(例如,CPUID指令*)执行新代码 并且每周修改代码一次,我应该只在下次修改和即将执行此代码时支付罚款。但在此之后,性能应该与未修改的代码相同(

我正在阅读英特尔体系结构文档,第3卷,第8.1.3节

自修改代码将以低于非自修改或普通代码的性能级别执行。性能恶化的程度取决于修改的频率和代码的具体特征

因此,如果我遵守规则:

(*备选方案1*) 将修改后的代码(作为数据)存储到代码段中;跳转到新代码或中间位置;执行新代码

(*备选方案2) 将修改后的代码(作为数据)存储到代码段中; 执行串行化指令;(例如,CPUID指令*)执行新代码

并且每周修改代码一次,我应该只在下次修改和即将执行此代码时支付罚款。但在此之后,性能应该与未修改的代码相同(+跳到该代码的成本)

我的理解正确吗?

“下次”可能不是这样;缓存算法会考虑第一次访问之外的访问(不这样做会很幼稚)。然而,在最初几次进入后不久,处罚就应该取消了。(“很少”可能是两个或数千个,但对于一台计算机来说,即使一百万也算不了什么。)


即使是当前正在执行的代码也在某个时候写入了内存(可能是最近由于分页),因此它最初也会经历类似的惩罚,但这种惩罚也会很快消失,因此您不必担心。

未缓存的代码之间存在差异,与修改已经推测在运行中的指令的代码(获取,可能解码,甚至可能位于调度程序中,并在无序内核中重新排序缓冲区)相比。当CPU的指令导致它返回到非常慢的操作时,写入已经被视为指令的内存。这就是通常所说的自我修改代码。即使JIT编译不太困难,也可以避免这种减速。在写完之前不要跳转到缓冲区

一周修改一次意味着,如果你做错了,你可能会每周受到一微秒的惩罚。的确,频繁使用的数据不太可能被从缓存中逐出(这就是为什么多次读取某个数据更有可能使其“粘滞”),但如果您遇到这种情况,自我修改的代码管道刷新应该只在第一次应用。在此之后,正在执行的缓存线处于prob中。如果第二次运行没有太多干预代码,则在一级I缓存(和uop缓存)中仍然很热。它在一级D缓存中还没有处于修改状态


我忘了if谈论过自修改代码和JIT。即使没有,如果你在ASM中写任何东西,也应该阅读Agner的指南。不过,主“优化asm”中的一些内容已经过时,与Sandybridge和更高版本的Intel CPU不太相关。由于uop缓存,对齐/解码问题不那么严重,对于SnB系列微阵列,对齐问题可能会有所不同。

@AmyLindsen:很高兴它有所帮助!:)将这些评论变成一个答案,因为它们最终几乎是一个完整的答案。@PeterCordes:注意,问题是“每周修改代码一次”。。。我不确定她是否想把它本身变成一种自我修正;我认为她通常关心修改已经在缓存/内存中的代码。但是,是的,如果她打算修改当前正在执行的代码,那么你是对的。@Mehrdad:是的,我也在想同样的事情。这可能是一个每周重新编译和执行一次的程序。我为你添加了+1(当我有足够的重复时启用)。所以一微秒/周是绝对可以接受的。我已经看过阿格纳的装配指南了。确实很有价值。代码更改应该在我可以控制并且机器上的流量减少时发生。很高兴认识彼得:)@AmyLindsen如果这个答案有帮助,完全可以不接受我的答案,这样你就可以接受:)+1@Mehrdad:你确定吗?我不会让你难过的,爸爸。一个虚拟的吻交换,然后呢?:)@AmyLindsen:是的,我肯定这一点哈哈:)我一直在努力解决的问题是有多少不同的表现类别。例如,您提到“尚未缓存的代码”与“修改已推测在运行中的指令的代码”,但这些类别似乎并不完整:缓存在L1I中但未“在运行中”的代码如何?在讨论SMC清除和“1K子页面”之类的问题时,它是否适用于更严格的“飞行中”案例或缓存案例?缓存但不在飞行中的情况的惩罚是什么?uop缓存级别会发生什么情况?