C++ std的可靠性:硬件\u破坏性\u干扰\u尺寸

C++ std的可靠性:硬件\u破坏性\u干扰\u尺寸,c++,concurrency,c++17,C++,Concurrency,C++17,C++17引入了常量,这些常量似乎对缓存感知编程非常有用: 虽然我想知道他们有多可靠? 是否可以保证以后在相同的CPU体系结构中不会出现具有其他缓存线大小的新CPU型号 即,对于x64,缓存线大小为64字节。但是,对于某些未来的x64兼容CPU型号,它会变成例如128字节吗? 为64字节缓存线大小编译的代码最终会出现错误 缓存线大小的改变当然不会破坏代码的逻辑(如果这可能不是一个类似heartbleed的算法的话)。 但这仍然可能导致一些副作用。例如,虚假共享保护将停止工作 对这些常数的依赖可

C++17引入了常量,这些常量似乎对缓存感知编程非常有用:

虽然我想知道他们有多可靠?
是否可以保证以后在相同的CPU体系结构中不会出现具有其他缓存线大小的新CPU型号

即,对于x64,缓存线大小为64字节。但是,对于某些未来的x64兼容CPU型号,它会变成例如128字节吗?
64字节
缓存线大小编译的代码最终会出现错误

缓存线大小的改变当然不会破坏代码的逻辑(如果这可能不是一个类似heartbleed的算法的话)。 但这仍然可能导致一些副作用。例如,虚假共享保护将停止工作

对这些常数的依赖可能会让人感觉:

标准保证我的代码能够独立于平台正确运行

有时候这种感觉可能并不正确。由于编译代码后硬件发生了变化


或者。。。每个CPU架构是否有固定的标准缓存线大小或类似的东西?

。。。有点像波浪,但太长了,无法发表评论:

虽然我想知道他们有多可靠

你只引用了声明。对于它们的定义,标准只指定:
/*实现定义的*/
。该标准仅保证一致性实现必须提供定义

是否可以保证以后在相同的CPU体系结构中不会出现具有其他缓存线大小的新CPU型号

据我所知,这就是在标准中包含这些常量的全部意义。如果您为不同的体系结构编译代码,那么值将“自动”为正确的值。不再需要使用魔法数字了。在缓存访问方面,不再由您负责您所针对的体系结构,而是由库实现者负责


PS:Portable并不意味着“编译一次,到处运行”,而是“编写一次,到处编译”

标准保证我的代码能够独立于平台正确运行。这是真的。不正确的做法是从X中提取一个二进制文件并尝试在Y上运行它。您需要在Y上编译代码以获得一个与Y兼容的二进制文件。对于那些
不是
代码,请使用
代码标签
。这些标签由编译器针对实际体系结构的设计设置。检查这些源代码(正如您所做的那样)应该会告诉您编译器假设的是什么,但您需要对照实际的CPUI/cache/ram检查任何特定设计,以确定其有效程度。这些值只是编译器假设的粒度。实际缓存线大小是运行时属性。但它是100%兼容的。“兼容”并不意味着“最优”。
inline constexpr std::size_t hardware_destructive_interference_size,
inline constexpr std::size_t hardware_constructive_interference_size