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
Performance 为什么_mm_pause()可以显著提高性能?_Performance_Assembly_X86_Cpu Architecture_Lockless - Fatal编程技术网

Performance 为什么_mm_pause()可以显著提高性能?

Performance 为什么_mm_pause()可以显著提高性能?,performance,assembly,x86,cpu-architecture,lockless,Performance,Assembly,X86,Cpu Architecture,Lockless,根据: 无效_mm_暂停(无效) 下一条指令的执行在一个实现中被延迟 具体时间。该指令不修改 建筑状态。这一内在因素尤其重要 性能增益 也就是说: while(!acquire_spin_lock())\u mm_pause();//代码片段1 速度更快,功耗更低 当(!acquire_spin_lock())继续时;//代码段2 我能理解为什么代码段1比代码段2功耗更低 我不能理解的是: 为什么代码段1比代码段2快?这看起来很有趣:“对于自旋锁实现,Intel至少有一条PAUSE指令,专门通知

根据:

无效_mm_暂停(无效)

下一条指令的执行在一个实现中被延迟 具体时间。该指令不修改 建筑状态。这一内在因素尤其重要 性能增益

也就是说:

while(!acquire_spin_lock())\u mm_pause();//代码片段1

速度更快,功耗更低

当(!acquire_spin_lock())继续时;//代码段2

我能理解为什么代码段1代码段2功耗更低

我不能理解的是:


为什么代码段1比代码段2快?

这看起来很有趣:“对于自旋锁实现,Intel至少有一条PAUSE指令,专门通知CPU这是一个自旋锁等待循环,这允许它尽可能优化缓存和内存访问,以避免内存排序冲突,从而要求CPU同步。我相信,在较旧的处理器上,这可能非常引人注目。。。。暂停实际上也可能会延迟CPU进行此优化,而as rep nop只会以尽可能快的速度运行。”它避免了内存顺序错误推测管道核(也称为完全清除管道,如分支未命中,但更糟)关于离开循环的迭代。同样相关:另请参见Nehalem Xeon上的基准测试。也提出了一些煽动性的说法,但也引用了Intel的优化手册:将SKL上的暂停延迟从~10个周期增加到~100个周期的好处是,通过从其他HyperC上偷取更少的周期,加快HT系统上的线程工作负载read.(并且在spin等待时经常重读会减少争用。)@racraman,区分PAUSE和REP NOP是没有意义的,因为它们是完全相同的指令。如果你多读一点链接的线程,你会发现引用语的作者收回了它。