为了账号安全,请及时绑定邮箱和手机立即绑定

在英特尔Sandybridge系列CPU中取消优化管道程序

在英特尔Sandybridge系列CPU中取消优化管道程序

C++
慕慕森 2019-12-07 13:30:12
我已经花了一个星期的时间来尝试完成这项任务,我希望这里有人可以带领我走上正确的道路。让我从讲师的指示开始:您的分配与我们的第一个实验室分配相反,后者是优化素数程序。您在此作业中的目的是简化程序,即使其运行缓慢。这两个都是占用大量CPU的程序。他们需要几秒钟才能在我们的实验室PC上运行。您可能无法更改算法。要优化程序,请使用有关Intel i7管道运行方式的知识。想像一下重新排序指令路径以引入WAR,RAW和其他危险的方法。想办法最大限度地减少缓存的有效性。令人作呕的无能。作业中选择了油石或蒙特卡洛程序。缓存效率注释大部分仅适用于Whetstone,但我选择了蒙特卡洛模拟程序:// Un-modified baseline for pessimization, as given in the assignment#include <algorithm>    // Needed for the "max" function#include <cmath>#include <iostream>// A simple implementation of the Box-Muller algorithm, used to generate// gaussian random numbers - necessary for the Monte Carlo method below// Note that C++11 actually provides std::normal_distribution<> in // the <random> library, which can be used instead of this functiondouble gaussian_box_muller() {  double x = 0.0;  double y = 0.0;  double euclid_sq = 0.0;  // Continue generating two uniform random variables  // until the square of their "euclidean distance"   // is less than unity  do {    x = 2.0 * rand() / static_cast<double>(RAND_MAX)-1;    y = 2.0 * rand() / static_cast<double>(RAND_MAX)-1;    euclid_sq = x*x + y*y;  } while (euclid_sq >= 1.0);  return x*sqrt(-2*log(euclid_sq)/euclid_sq);}// Pricing a European vanilla call option with a Monte Carlo methoddouble monte_carlo_call_price(const int& num_sims, const double& S, const double& K, const double& r, const double& v, const double& T) {  double S_adjust = S * exp(T*(r-0.5*v*v));  double S_cur = 0.0;  double payoff_sum = 0.0;  for (int i=0; i<num_sims; i++) {    double gauss_bm = gaussian_box_muller();    S_cur = S_adjust * exp(sqrt(v*v*T)*gauss_bm);    payoff_sum += std::max(S_cur - K, 0.0);  }  return (payoff_sum / static_cast<double>(num_sims)) * exp(-r*T);}}我所做的更改似乎使代码的运行时间增加了一秒钟,但是我不确定要更改哪些内容以停止管道而不添加代码。指向正确方向的指示非常棒,我感谢您的任何答复。
查看完整描述

3 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

您可以long double用于计算。在x86上,它应该是80位格式。只有旧的x87 FPU支持此功能。

x87 FPU的一些缺点:

  1. 缺少SIMD,可能需要更多说明。

  2. 基于堆栈,对于超标量和流水线架构存在问题。

  3. 单独的寄存器组非常小,可能需要更多与其他寄存器的转换和更多的存储器操作。

  4. 在Core i7上,SSE有3个端口,x87只有2个端口,处理器可以执行较少的并行指令。


查看完整回答
反对 回复 2019-12-07
  • 3 回答
  • 0 关注
  • 458 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信