免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4989 | 回复: 8
打印 上一主题 下一主题

sfence 有用吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-01 17:27 |只看该作者 |倒序浏览
既然x86架构保证了所有内存wite/store之间的顺序性,为什么要引入sfence指令呢? Intel的目的何在?

而且,wmb不是在内核里实现也是空函数吗?

论坛徽章:
0
2 [报告]
发表于 2009-04-01 17:57 |只看该作者
原帖由 Solaris12 于 2009-4-1 17:27 发表
既然x86架构保证了所有内存wite/store之间的顺序性,为什么要引入sfence指令呢? Intel的目的何在?

而且,wmb不是在内核里实现也是空函数吗?


好像是via公司的几款CPU实现了relax ordering的wrtie, 看来Intel的sfence指令是为了照顾他们。

MWINCHIP3D || MWINCHIP2 || MWINCHIPC6

论坛徽章:
0
3 [报告]
发表于 2009-04-01 20:59 |只看该作者
原帖由 Solaris12 于 2009-4-1 17:27 发表
既然x86架构保证了所有内存wite/store之间的顺序性,为什么要引入sfence指令呢? Intel的目的何在?

而且,wmb不是在内核里实现也是空函数吗?

7.4 内存类型 - Memory Types
AMD64体系结构定义了如下的内存类型:
        不可缓存类型(Uncacheable)(UC) – 从UC内存进行读写操作是不被缓存的。从UC内存不允许进行投机性的读。对UC内存进行写合并也是不允许的。从UC内存进行的读操作会引发写缓冲(write buffers)写入主存并被废弃。
        缓存关闭类型(Cache Disable)(CD) – CD类型的内存是当缓存被关闭时(CR0.CD=1) 时的一种不可缓存内存类型。当使用CD类型的内存时,由于之前的可缓存访问或者两个虚拟地址映射到同一个物理地址这两种情况导致仍使用被缓存的数据。
对于L1数据缓存以及L2缓存来说,从CD内存读或者向CD内存写命中缓存的话,会引发在访问主存前的缓存行废弃。如果缓存行处于修改(Modified)状态,该行会被写入主存然后被废弃。
对于L1指令缓存,如果从CD内存读命中缓存的话,处理器会读取缓存的指令而不访问主存。缓存读失效引发的访问主存不会导致缓存行替换。
        写合并类型(Write-Combing)(WC) – 从WC内存读或者向WC内存写实不被缓存的。可以投机性地从WC内存读。
向这种内存的写可以由处理器内部进行合并,并且做为单一一次写操作减少内存访问次数。例如,连续的四个字的访问可以被合并为一个单独的四字写,将内存访问次数从4减少到1。
WC类型的内存对于写顺序不是十分重要的显存十分有用。
        写保护类型(Write-Protect)(WP) – 从WP类型内存的读诗被缓存的,并且在读失效时会相应地分配缓存行。可以投机性地从WP内存读取数据。
向WP内存写如果命中缓存的话不会导致对缓存的更新。相反,所有的写回更新内存(写入内存),并且命中缓存的写操作会导致对缓存行的废弃。允许对WP内存的写进行缓冲。
WP类型的内存对于ROM内存阴影(shadowed-ROM memory)是十分有用的。对于ROM内存阴影,更新必须对读取阴影位置的所有设备立即可见。
        写通类型(Writethrough)(WT) – 从WT内存的读是被缓存的,并且在读失效的时候分配缓存行。可以对WT类型的内存进行投机性地读取。
所有的WT内存的写操作都会更新内存,并入如果命中缓存会更新缓存(缓存行在当写操作命中该缓存行的时候仍然位于原来的状态)。写实效不会分配缓存行。对WT内存进行写缓冲是允许的。
        写回类型(Writeback)(WB) – 从WB内存进行的读操作是被缓存的并且在读实效的时候会分配缓存行。缓存行可以分配为共享的(shared),独占的(exclusive),或者修改的(modified)状态。可以对WB内存进行投机性地读操作。
所有命中的写操作更新缓存行,并且将缓存行置为修改状态。写实效会分配一个新的缓存行并且将缓存行置于修改的状态。仅仅在执行写回(writeback)操作的时候对主存进行写操作。允许对WB类型的内存进行写缓冲。
        WB内存类型提供了最高性能可能性,并且适用于大多数软件以及存储在系统内存(DRAM)中的数据。

论坛徽章:
0
4 [报告]
发表于 2009-04-01 22:11 |只看该作者
原帖由 Solaris12 于 2009-4-1 17:27 发表
既然x86架构保证了所有内存wite/store之间的顺序性,为什么要引入sfence指令呢? Intel的目的何在?

而且,wmb不是在内核里实现也是空函数吗?

主要是给WC类型内存用。WC具体解释可见楼上的内容。
简单的说WC是独立于L1~L3外的一块cache,并且是乱序。通常显卡的显存就是映射成WC类型的

论坛徽章:
0
5 [报告]
发表于 2009-04-02 10:55 |只看该作者
原帖由 zx_wing 于 2009-4-1 22:11 发表

主要是给WC类型内存用。WC具体解释可见楼上的内容。
简单的说WC是独立于L1~L3外的一块cache,并且是乱序。通常显卡的显存就是映射成WC类型的


OK,那从Linux wmb实现成空函数推断,这类WC的内存目前实际上还不需要wmb?

至少显存好像不需要。

[ 本帖最后由 Solaris12 于 2009-4-2 10:56 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-04-02 12:43 |只看该作者
原帖由 Solaris12 于 2009-4-2 10:55 发表


OK,那从Linux wmb实现成空函数推断,这类WC的内存目前实际上还不需要wmb?

至少显存好像不需要。

不,从P4起都应该用指令了

  1. #ifdef CONFIG_X86_32
  2. /*
  3. * For now, "wmb()" doesn't actually do anything, as all
  4. * Intel CPU's follow what Intel calls a *Processor Order*,
  5. * in which all writes are seen in the program order even
  6. * outside the CPU.
  7. *
  8. * I expect future Intel CPU's to have a weaker ordering,
  9. * but I'd also expect them to finally get their act together
  10. * and add some real memory barriers if so.
  11. *
  12. * Some non intel clones support out of order store. wmb() ceases to be a
  13. * nop for these.
  14. */
  15. #define mb() alternative("lock; addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2)
  16. #define rmb() alternative("lock; addl $0,0(%%esp)", "lfence", X86_FEATURE_XMM2)
  17. #define wmb() alternative("lock; addl $0,0(%%esp)", "sfence", X86_FEATURE_XMM)
  18. #else
  19. #define mb()         asm volatile("mfence":::"memory")
  20. #define rmb()        asm volatile("lfence":::"memory")
  21. #define wmb()        asm volatile("sfence" ::: "memory")
  22. #endif
复制代码

论坛徽章:
0
7 [报告]
发表于 2009-04-02 13:40 |只看该作者
原帖由 zx_wing 于 2009-4-2 12:43 发表

不,从P4起都应该用指令了

#ifdef CONFIG_X86_32
/*
* For now, "wmb()" doesn't actually do anything, as all
* Intel CPU's follow what Intel calls a *Processor Order*,
* in which all writ ...


我知道从P4就支持这个指令了,但是Linux 内核改成这个样子可是最近一两年的事情。

一没留神发现最近代码变了。

你给的代码注释里说是为了其它非Intel的x86 CPU改的,现在看起来可能很可能就是AMD的WC这样的东东引起的。

最早以前VIA的CPU也支持了out of oder store,但Linux内核也就是给了一个可配置的选项而已,所以我猜是因为AMD的影响比较大吧。

/*
   * Some non-Intel clones support out of order store. wmb() ceases to be a
   * nop for these.
   */

[ 本帖最后由 Solaris12 于 2009-4-2 13:46 编辑 ]

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
8 [报告]
发表于 2015-08-18 16:52 |只看该作者
不好意思,又挖出了一个老帖子。

请问3楼各种内存类型的介绍(UC\CD\WC\WP\WT\WB),出处是哪篇文档或者教材?

论坛徽章:
0
9 [报告]
发表于 2015-10-26 23:20 |只看该作者
nswcfd 发表于 2015-08-18 16:52
不好意思,又挖出了一个老帖子。

请问3楼各种内存类型的介绍(UC\CD\WC\WP\WT\WB),出处是哪篇文档或者 ...


上面的引用我在i64的intel手册中没有看到,不过有intel Volume 3 System Programming Guide的第11.3 methods of caching available节也有描述
手册下载地址【无url权限取消换行即可】
www dot intel dot com
/content
/www
/us
/en
/processors
/architectures-software-developer-manuals.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP