首页 > 后端开发 > C++ > 我们如何取消优化蒙特卡洛模拟以暴露英特尔 Sandybridge 管道瓶颈?

我们如何取消优化蒙特卡洛模拟以暴露英特尔 Sandybridge 管道瓶颈?

Linda Hamilton
发布: 2024-12-09 00:48:10
原创
434 人浏览过

How Can We Deoptimize a Monte Carlo Simulation to Expose Intel Sandybridge Pipeline Bottlenecks?

对 Intel Sandybridge 系列 CPU 中的管道进行去优化

此作业的目标是修改给定的程序以使其运行速度较慢,同时保持相同的算法。这是为了更深入地了解英特尔 i7 流水线的运行方式以及指令路径如何重新排序以引入危险。

程序概述

该程序是对欧洲普通看涨期权和看跌期权进行定价的蒙特卡罗模拟。它使用 Box-Muller 算法生成高斯随机数并执行大量模拟来估计期权价格。

恶魔般的无能

目标是故意创建会减慢程序执行速度的不合格代码。以下是一些用“恶魔般的无能”来证明这种方法的合理性的想法:

错误共享

  • 创建由多个线程访问的共享数据结构,但未正确同步。这可能会导致缓存行乒乓球和内存顺序错误推测管道清除。

存储转发停顿

  • 避免使用浮点变量的“-”运算符。相反,将高字节与 0x80 进行异或以翻转符号位,从而导致存储转发停顿。

过多的时间测量

  • 每次迭代的时间具有 CPUID/RDTSC 等繁重操作的主循环,它会序列化指令并停止

不利的数学运算

  • 将常量乘法替换为倒数除法(“为了便于阅读”)。除法较慢且未完全流水线化。

矢量化效率低下

  • 使用 AVX 对乘/平方运算进行向量化,但在调用之前无法使用 vzeroupper标量数学库函数,导致 AVXSSE 转换

数据结构

  • 将 RNG 输出存储在链表或乱序遍历的数组中。对每次迭代的结果执行相同的操作并在最后求和。这引入了指针追逐加载并破坏了缓存局部性。

多线程误用

  • 多线程程序,但强制两个线程共享相同的循环计数器(具有原子增量)来创建错误的共享和争用。这也引入了原子操作不必要的开销。

其他建议

  • 引入不可预测的分支来创建错误预测和管道刷新。
  • 使用恶魔般无能的理由来增加循环携带的依赖链的长度。
  • 引入非连续内存访问模式最大限度地减少缓存利用率。
  • 额外费用学分:编写自己的平方根算法来替换作业中提供的算法。

修改的影响

这些修改预计会显着通过引入管道停顿、缓存未命中和其他性能瓶颈来减慢程序的执行速度。该作业鼓励创造力和愿意探索悲观化代码同时保持原始算法的不同方法的意愿。

以上是我们如何取消优化蒙特卡洛模拟以暴露英特尔 Sandybridge 管道瓶颈?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板