我已经花了一个星期的时间来尝试完成这项任务,我希望这里有人可以带领我走上正确的道路。让我从讲师的指示开始:您的分配与我们的第一个实验室分配相反,后者是优化素数程序。您在此作业中的目的是简化程序,即使其运行缓慢。这两个都是占用大量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的一些缺点:
缺少SIMD,可能需要更多说明。
基于堆栈,对于超标量和流水线架构存在问题。
单独的寄存器组非常小,可能需要更多与其他寄存器的转换和更多的存储器操作。
在Core i7上,SSE有3个端口,x87只有2个端口,处理器可以执行较少的并行指令。
- 3 回答
- 0 关注
- 458 浏览
添加回答
举报
0/150
提交
取消