Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/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
Assembly 预取队列、缓存、管道、超标量设计_Assembly_X86 - Fatal编程技术网

Assembly 预取队列、缓存、管道、超标量设计

Assembly 预取队列、缓存、管道、超标量设计,assembly,x86,Assembly,X86,我了解到CPU的预取队列可能会影响程序的执行,并可能导致与预期行为的不期望偏差(错误结果) 除了相互影响的命令之间的间隔和祈求最好的结果之外,还有什么方法可以避免上述情况吗?如果没有,需要多少间距 x86系列是否还有其他功能(如缓存、管道、超标量设计)会对程序产生负面影响?我指的不是时间安排(就像管道危险一样),而是错误的结果 编辑:你们都回答说CPU优化不会影响正确性,只会影响速度。 我现在很烦恼。例如,据称此代码将不会按计划执行。另外还有 ,以及,这可能是为了确定CPU型号。否,CPU遵守手

我了解到CPU的预取队列可能会影响程序的执行,并可能导致与预期行为的不期望偏差(错误结果)

除了相互影响的命令之间的间隔和祈求最好的结果之外,还有什么方法可以避免上述情况吗?如果没有,需要多少间距

x86系列是否还有其他功能(如缓存、管道、超标量设计)会对程序产生负面影响?我指的不是时间安排(就像管道危险一样),而是错误的结果

编辑:你们都回答说CPU优化不会影响正确性,只会影响速度。 我现在很烦恼。例如,据称此代码将不会按计划执行。另外还有
,以及,这可能是为了确定CPU型号。

否,CPU遵守手册中记录的内存顺序和其他规则

负载的早期预取(比内存模型允许的更早)是推测性的,如果内核检测到它对负载使用了错误的值,则内存顺序错误推测管道将被刷新

因此,现代x86 CPU在很多方面都严重失序,但需要进行所有必要的跟踪,以保持单线程指令正常运行的假象。(对于多线程,其他线程实际上看不到任何违反内存模型的内容,只要在安全的情况下执行即可。)


或者CPU可能具有比手动操作更强/更安全的行为:例如,指令预取实际上不会导致在现代Intel CPU上执行过时的指令:它们嗅探存储到管道中正在运行的代码地址


因此,您的问题的前提是不真实的。

不,CPU遵守手册中记录的内存顺序和其他规则

负载的早期预取(比内存模型允许的更早)是推测性的,如果内核检测到它对负载使用了错误的值,则内存顺序错误推测管道将被刷新

因此,现代x86 CPU在很多方面都严重失序,但需要进行所有必要的跟踪,以保持单线程指令正常运行的假象。(对于多线程,其他线程实际上看不到任何违反内存模型的内容,只要在安全的情况下执行即可。)


或者CPU可能具有比手动操作更强/更安全的行为:例如,指令预取实际上不会导致在现代Intel CPU上执行过时的指令:它们嗅探存储到管道中正在运行的代码地址


因此,您的问题的前提是不正确的。

在x86情况下,预取仅对程序正确性和速度没有影响。没有任何cpu优化可以做到这一点,处理器将确保您的代码等同于简单的顺序执行。re:your edit:386不是“现代x86”。与P6系列和更高版本不同,386可以执行过时的指令,并且只能在执行的分支上重新同步。在x86的情况下,预取不会影响程序的正确性,只会影响速度。没有任何cpu优化可以做到这一点,处理器将确保您的代码等同于简单的顺序执行。re:your edit:386不是“现代x86”。与P6系列和更高版本不同,386可以执行过时的指令,并且只能在执行的分支上重新同步。