C++17引入了常量,这些常量似乎对缓存感知编程非常有用:size
inline constexpr std::size_t hardware_destructive_interference_size,
inline constexpr std::size_t hardware_constructive_interference_size但我想知道他们能有多可靠?
是否保证以后在同一CPU体系结构中不会出现具有其他缓存行大小的新CPU模型?
也就是说,对于x64,行大小是64 bytes。但是,它是否可以成为例如128 bytes的一些未来x64兼容的CPU模型?
为64 byte缓存行大小而编译的代码最终将变成错误行为。
当然,缓存行大小的改变不会破坏代码的逻辑(如果这可能不是一个类似心脏出血的算法)。但这仍然会引起一些副作用。错误的共享保护将停止工作。
对这些常量的依赖可能会给人以下感觉:
我的代码是由标准保证正确运行平台无关。
有时候这种感觉可能不太对。在编译代码后,由于硬件的更改。
或者..。每个CPU架构可能有固定的标准缓存线大小或类似的东西吗?
发布于 2019-09-10 18:19:32
..。有点手舞足蹈,但太长了,不能发表评论:
但我想知道他们能有多可靠?
你只引用了声明。对于它们的定义,标准只指定:/*implementation-defined*/。标准只是保证一个符合标准的实现必须提供一个定义。
是否保证以后在同一CPU体系结构中不会出现具有其他缓存行大小的新CPU模型?
据我所知,这就是在标准中保持这些常量的全部意义。如果您为不同的体系结构编译代码,那么这些值将是“自动”正确的。不用再用魔法数字了。不再是由您来处理与缓存访问有关的体系结构,而是由库实现者来处理。
PS:便携并不意味着“编译一次,到处运行”,而是“写一次,到处编译”。
https://stackoverflow.com/questions/57875779
复制相似问题