对 Intel Sandybridge 系列 CPU 中的管道进行去优化
本作业的目标是修改给定的程序以降低其性能,称为去优化。此任务需要了解英特尔 i7 管道架构以及如何重新排序指令路径以引入危险。
1.错误共享:
安排非原子变量存储在同一缓存行中,导致存储转发停顿。
2.存储转发停顿:
使用 XOR 翻转双精度数的符号位,而不是使用“-”运算符,强制将窄存储仅存储双精度数的一个字节。
3.内存消歧:
将数据4096B分开放置,以触发存储到不同页面的错误依赖关系。
4.未对齐的数据:
使用 __attribute__((packed)) 强制跨缓存行或页边界的变量未对齐,从而增加缓存未命中率。
5. Stride:
以 4096 字节的步幅循环数组,导致内存访问不连续,降低缓存利用率。
6.链表:
将结果存储在链表中,引入指针追逐负载依赖关系以及内存中潜在的分散节点。
1。原子变量:
使用std::atomic
2. Long double:
使用 long double 变量强制 x87 模拟,即使使用支持 SSE2 的 CPU。
3.整数转换:
在整数和浮点类型之间重复转换,引入高延迟的转换指令。
4.系统调用:
引入频繁的不必要的系统调用来强制上下文切换和缓存/TLB 未命中。
通过采用这些技术,可以显着悲观给定的程序并使其运行速度比原始版本慢得多。成功去优化的关键是用“恶魔般的无能”而不是恶意的意图来证明每一步的合理性。
以上是我们如何故意去优化 Intel Sandybridge CPU 的程序?的详细内容。更多信息请关注PHP中文网其他相关文章!