- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我注意到英特尔 特里蒙特 有 MOVDIRI
的 64 字节存储指令和 MOVDIR64B
.
这些保证原子写入内存,而 不要保证负载原子性。此外,写入是弱排序的,可能需要紧跟其后的防护。
我发现没有 MOVDIRx
在冰湖。
为什么不冰湖需要像 MOVDIRx
这样的说明?
(在第 15 页底部)
英特尔® 架构指令集扩展和 future 功能编程引用
https://software.intel.com/sites/default/files/managed/c5/15/architecture-instruction-set-extensions-programming-reference.pdf#page=15
最佳答案
Ice Lake 有 AVX512,它为我们提供了 64 字节的加载 + 存储,但不能保证 64 字节的存储原子性。
我们确实通过 movntps [mem], zmm
获得了 64 字节的 NT 存储/ movntdq [mem], zmm
.有趣的是,NT 存储不支持合并屏蔽以保留一些字节未写入。但是,这基本上会通过创建部分行写入来破坏 NT 存储的目的。
可能 Ice Lake Pentium/Celeron CPU 仍然不会有 AVX1/2,更不用说 AVX512(可能是因为他们可以销售在 FMA 单元的高 128 位和/或至少一个内核上的寄存器文件中存在缺陷的芯片),所以只有rep movsb
将能够在这些 CPU 上内部使用 64 字节的加载/存储。 (IceLake 将具有“快速短表示”功能,这可能使其即使对于小的 64 字节副本也很有用,在不能使用向量寄存器的内核代码中很有用。)
可能英特尔无法(或不想)在其主流 CPU 上提供原子性保证,仅在不支持多插槽的低功耗芯片上提供,但我还没有听到任何有关撕裂实际存在的报告Intel CPU 上的缓存线。实际上,我认为在当前 Intel CPU 上不跨越缓存线边界的缓存加载/存储总是原子的。
(与 AMD K10 不同,HyperTransport 确实在插槽之间的 8B 边界上产生撕裂,而在单个插槽上的内核之间看不到撕裂。
SSE instructions: which CPUs can do atomic 16B memory operations? )
在任何情况下,都无法通过 CPUID 检测到这一点,并且没有记录在案,因此基本上不可能安全地利用这一点。如果有一个 CPUID 叶告诉您系统和单个套接字内的原子性宽度会很好,因此仍然允许将 512 位 AVX512 操作分成 256 位一半的实现......
无论如何,与其引入具有保证存储原子性的特殊指令,我认为 CPU 供应商更有可能开始为所有 2 次幂大小的存储或仅为 NT 记录和提供更广泛的存储原子性的 CPUID 检测商店,什么的。
使 AVX512 的某些部分需要 64 字节原子性将使 AMD 更难支持,如果他们遵循他们目前的半角向量实现策略。 (Zen2 将有 256 位向量 ALU,使 AVX1/AVX2 指令主要是单微操作,但不幸的是,据报道它不会支持 AVX512。AVX512 是一个非常好的 ISA,即使您只在 256 位宽度下使用它,填补可以方便/有效地完成的更多空白,例如 unsigned int<->FP 和 [u]int64<->double。)
所以 IDK 如果英特尔同意不这样做,或者出于自己的原因选择不这样做。
64B 写入原子性的用例:
我怀疑主要用例是可靠的 创建 64 字节 PCIe 事务 ,实际上并不是“原子性”本身,也不是用于另一个核心的观察。
如果您关心从其他内核读取,通常您希望 L3 缓存支持数据,而不是将其绕过到 DRAM。 seqlock 可能是模拟 CPU 内核之间 64 字节原子性的更快方法,即使 movdir64B
可用。
Skylake 已经有 12 个写入组合缓冲区(从 Haswell 中的 10 个增加),因此(也许?)使用常规 NT 存储来创建全尺寸 PCIe 事务并避免早期刷新并不太难。但是,也许低功耗 CPU 的缓冲区较少,并且可靠地创建 64B 事务到 NIC 缓冲区或其他东西可能是一个挑战。
关于assembly - 为什么 Ice Lake 没有像 tremont 那样的 MOVDIRx?他们已经有更好的了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54919280/
据我所知,根本不为元素呈现 HTML,或添加 display:none,似乎具有完全相同的行为:两者都使元素消失并且不与 HTML 交互。 我正在尝试禁用和隐藏一个复选框。所以HTML的总量很小;我无
我刚刚读了Android Architecture Tutorial: Developing an App with a Background Service (using IPC) .基本上是 让服
我有两个查询具有相同的结果,现在我想知道哪个查询更优化? 在选择中: select t1.*, sum(t2.value) as total_votes from table1 t1 left joi
有人告诉我,对于 I/O 绑定(bind)的应用程序,非阻塞 I/O 会更好。对于 CPU 密集型应用程序,阻塞 I/O 会好得多。我找不到这种说法的原因。试过谷歌,但很少有文章只是触及这个话题而没有
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我从 API 收到一个 json,我需要解析并修改一个属性值。问题是,我收到的 json 数据的嵌套结构不一致,我无法控制它。 这将禁止我指定在特定深度(如 parsedJson.children[0
我有 451 个城市的坐标。现在我想计算每个城市之间的距离,然后根据该距离对一些结果进行排序。现在我有两个选择: 我可以运行一个循环来计算每个可能的城市组合的距离并将它们存储到一个表中,这将产生大约
对于返回相同结果的不同查询,我有两个查询计划我想知道是否有人可以告诉我哪个“更好”,以及为什么。 SELECT * FROM bids order by (select ranking from us
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我有一个二维数组。我需要尽可能快地对其执行一些操作(函数每秒将被调用十几次,所以让它变得高效会很好)。 现在,假设我想获取元素 A[i][j],简单地使用 A[i][j] 在速度上有什么不同吗和 *(
在声明或使用字符串的代码中,我通常会看到开发人员这样声明它: string randomString = @"C:\Random\RandomFolder\ThisFile.xml"; 代替: str
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why don't CSS resets use '*' to cover all elements? 我正
如果我有一个包含许多重复项的 python 列表,并且我想遍历每个项目,而不是重复项,最好使用一个集合(如 set(mylist),或者找到另一种方法来创建没有重复的列表?我想只是循环遍历列表并检查重
在阅读常量接口(interface)反模式时,我发现没有实例的最终常量类比常量接口(interface)更好。 请解释一下怎么做? public interface ConstIfc { publ
我正在查看我继承的一些旧代码,我真的不喜欢某些地方的风格。我真的不喜欢它的外观的一件事是: bool func() { bool ret = true; ret &= test1();
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我经常发现自己试图使用 boost/QT 信号解耦对象。实现这一点的简单方法是针对我要通信的每个具体类型,创建一个新的信号和插槽签名并连接所有相关对象。这导致了访问者模式,理想情况下我想发出一个访问者
我正在 https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html 上阅读有关 lambda 的内容 在方法
public List getInts() { List xs = new ArrayList(); xs.add(1); // return Collections.unmo
我是一名优秀的程序员,十分优秀!