大佬教程收集整理的这篇文章主要介绍了C优化:条件存储,以避免弄脏缓存行,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
/* The if statement lets the compiler compile it to a conditional store. * Avoids dirtying a cache line. */ if (loop->stop_flag != 0) loop->stop_flag = 0;
有人可以解释一下吗?
什么是高速缓存行?
另外,我猜一个条件存储是一些Assembler指令,检查一些东西,如果成功,写一些值.对?
这样的结构何时有意义?我猜并不总是,因为否则编译器只会总是使用条件存储,对吧?
一般来说,存储器层级的每个级别:寄存器,L1,L2,L3 …高速缓存,主存储器和交换空间具有相同信息的不同副本.确保系统的不同部分(处理器,DMA,视频子系统等)看到相同的值,即使一个或多个副本可能已更改称为一致性问题.
一般的解决方案是暂停将更新的值复制到层次结构的不同级别.这被称为冲洗.
在最坏的情况下,当引起页面错误(可能是数百万个处理器周期)时,冲洗可能花费10分钟.
由于成本高昂,硬件设计人员将尽可能减少对刷新的需求.程序员也在这里解决了这个原因.
该评论说:“如果缓存已经在标志中包含一个零,那么我们不要在零上写零,因为这会将缓存行标记为脏,这可能会导致不必要的刷新.”
“条件商店”是一个稍微模糊的术语.它只是指正常存储上的零跳转,这是编译器将从if语句产生的代码.在X86它将看起来像:
;; assume edi holds value of pointer 'loop' ;; and flag is a constant offset for the 'stop_flag' field. cmp dword ptr [edi,flag],0 jz no_store mov [edi,0 no_store: ... code conTinues
如果if语句丢失,那么只有最后@L_793_2@mov指令.
NB评论者指出,在重要的处理器架构上存在单一的“条件移动/存储”指令.我没有看到gcc生产一个.
这是否值得优化是非常有争议的.条件有自己的冲洗指令管道的风险(另一种冲洗).不要在没有明确证据证明需要的情况下为了速度而牺牲清晰度.
以上是大佬教程为你收集整理的C优化:条件存储,以避免弄脏缓存行全部内容,希望文章能够帮你解决C优化:条件存储,以避免弄脏缓存行所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。