猿问

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

我已经花了一个星期的时间来尝试完成这项任务,我希望这里有人可以带领我走上正确的道路。让我从讲师的指示开始:


您的分配与我们的第一个实验室分配相反,后者是优化素数程序。您在此作业中的目的是简化程序,即使其运行缓慢。这两个都是占用大量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 function

double 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 method

double 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);

}

}

我所做的更改似乎使代码的运行时间增加了一秒钟,但是我不确定要更改哪些内容以停止管道而不添加代码。指向正确方向的指示非常棒,我感谢您的任何答复。


慕慕森
浏览 459回答 3
3回答

一只萌萌小番薯

您可以long double用于计算。在x86上,它应该是80位格式。只有旧的x87 FPU支持此功能。x87 FPU的一些缺点:缺少SIMD,可能需要更多说明。基于堆栈,对于超标量和流水线架构存在问题。单独的寄存器组非常小,可能需要更多与其他寄存器的转换和更多的存储器操作。在Core i7上,SSE有3个端口,x87只有2个端口,处理器可以执行较少的并行指令。
随时随地看视频慕课网APP
我要回答