订阅移动开发RSS CSDN首页> 移动开发

PARSEC* 3.0 中的多线程代码优化: BlackScholes

发表于2016-01-12 14:42| 次阅读| 来源CSDN| 0 条评论| 作者csdn

摘要:普林斯顿共享内存计算机应用库 (PARSEC) 是由多线程程序组成的基准测试套件。 本套件主要面向新兴工作负载,堪称下一代芯片多处理器共享内存计划的代表。

简介

普林斯顿共享内存计算机应用库 (PARSEC) 是由多线程程序组成的基准测试套件。 本套件主要面向新兴工作负载,堪称下一代芯片多处理器共享内存计划的代表。

基准测试套件及其全部应用和输入集以开源方式免费提供。 一些基准测试计划有自己的许可条款,可能会限制在某些情况下的使用。

毕苏期权定价模式 (Black-Scholes) 基准测试是 PARSEC 中 13 个基准测试之一。 该基准测试可使用 Black-Scholes 偏微分方程 (PDE) 进行期权定价。 Black-Scholes 方程是一个微分方程,可描述在某些前提下,期权的值如何随底层资产价格的变化而变化。

看跌期权的公式相似。 累积正态分布函数 CND(x) 使得正态分布随机变量的值有可能低于 x。 该函数没有闭式表达式,因此必须求出其数字数值。 或者,该函数的值也可在表格中进行预计算和硬编码;此时,可在运行时使用表格查找获取这些值。

根据该公式,用户可以根据五个输入以分析的方式来计算期权价格。 使用分析方法来计算期权价格,限制因素将取决于处理器可执行的浮点计算的数量。

热点

当我们查看英特尔® VTune™ Amplifier XE 的性能分析结果时,我们发现了两个主要的热点。

  • 从输入文件中读取,以及向输出文件写入。
  • Black-Scholes 计算。

下面我们来详细了解一下每一项。

从输入文件中读取,以及向输出文件写入

其中的问题是输入文件包含 1000 万行数据。 每一行是一个 struct OptionData 元素,其中包含 9 个参数。 这也是我们之前开始计算时,花费了许多时间从输入文件中读取并解析从数据文件到一个 OptionData struct 阵列的原因。 该阵列称为 data

显然,经过全部计算之后,会遇到同样的问题,您需要在输出文件中写入结果。

这些问题可通过使用指针并行读写来解决。 更多详情,请阅读此处链接:并行应用中的数据读写优化 | 英特尔® 开发人员专区

Black-Scholes 计算

接下来,我们将更具体地介绍一下此案例。 所有计算都包括两个函数: CNDF 和 BlkSchlsEqEuroNoDiv。

CNDF

该函数实现了标准正态分布的累积分布函数。 更多详情,请参考有关或然率理论的书籍。

在我们的案例中,该函数如下:

01 #define inv_sqrt_2xPI 0.39894228040143270286

02 fptype CNDF ( fptype InputX )

03 {

04     int sign;

05     fptype OutputX;

06     fptype xInput;

07     fptype xNPrimeofX;

08     fptype expValues;

09     fptype xK2;

10     fptype xK2_2, xK2_3;

11     fptype xK2_4, xK2_5;

12     fptype xLocal, xLocal_1;

13     fptype xLocal_2, xLocal_3;

14     // Check for negative value of InputX

15     if (InputX < 0.0) {

16         InputX = -InputX;

17         sign = 1;

18     else

19         sign = 0;

20     xInput = InputX;

21      // Compute NPrimeX term common to both four & six decimal accuracy calcs

22     expValues = exp(-0.5f * InputX * InputX);

23     xNPrimeofX = expValues;

24     xNPrimeofX = xNPrimeofX * inv_sqrt_2xPI;

25     xK2 = 0.2316419 * xInput;

26     xK2 = 1.0 + xK2;

27     xK2 = 1.0 / xK2;

28     xK2_2 = xK2 * xK2;

29     xK2_3 = xK2_2 * xK2;

30     xK2_4 = xK2_3 * xK2;

31     xK2_5 = xK2_4 * xK2;

32     xLocal_1 = xK2 * 0.319381530;

33     xLocal_2 = xK2_2 * (-0.356563782);

34     xLocal_3 = xK2_3 * 1.781477937;

35     xLocal_2 = xLocal_2 + xLocal_3;

36     xLocal_3 = xK2_4 * (-1.821255978);

37     xLocal_2 = xLocal_2 + xLocal_3;

38     xLocal_3 = xK2_5 * 1.330274429;

39     xLocal_2 = xLocal_2 + xLocal_3;

40  

41     xLocal_1 = xLocal_2 + xLocal_1;

42     xLocal   = xLocal_1 * xNPrimeofX;

43     xLocal   = 1.0 - xLocal;

44  

45     OutputX  = xLocal;

46      

47     if (sign) {

48         OutputX = 1.0 - OutputX;

49     }

50        return OutputX;

51 }

BlkSchlsEqEuroNoDiv

此即 Black-Scholes 模型,可为欧式期权定价提供理论估计。 对于我们的目的而言,我们只需要知道 Black-Scholes 公式并将其用于计算中即可。 公式如下:

C(S,t)=N(d1)S-N(d2)Ke-r(T-t) - 非分红基础股票看涨期权值

P(S,t)=Ke-r(T-t)N(-d2)-N(d1)S - 相应的看跌期权的价格。

d1= 1/(σ√(T-t))(ln(S/K)+(r+σ2/2)(T-t))

d2= 1/(σ√(T-t))(ln(S/K)+(r-σ2/2)(T-t))

对于上述的两个公式:

  • N(∙) 代表 CNDF 函数,
  • T - t 代表期限。
  • S 代表基础资产的现货价格。
  • K 代表执行价格。
  • r 代表风险。
  • σ 代表基础资产的收益波动。

在我们的案例中,该函数如下:

01 fptype BlkSchlsEqEuroNoDiv( fptype sptprice,

02                             fptype strike, fptype rate, fptype volatility,

03                             fptype time, int otype, float timet )

04 {

05     fptype OptionPrice;

06  

07     // local private working variables for the calculation

08     fptype xStockPrice;

09     fptype xStrikePrice;

10     fptype xRiskFreeRate;

11     fptype xVolatility;

12     fptype xTime;

13     fptype xSqrtTime;

14  

15     fptype logValues;

16     fptype xLogTerm;

17     fptype xD1;

18     fptype xD2;

19     fptype xPowerTerm;

20     fptype xDen;

21     fptype d1;

22     fptype d2;

23     fptype FutureValueX;

24     fptype NofXd1;

25     fptype NofXd2;

26     fptype NegNofXd1;

27     fptype NegNofXd2;   

28      

29     xStockPrice = sptprice;

30     xStrikePrice = strike;

31     xRiskFreeRate = rate;

32     xVolatility = volatility;

33  

34     xTime = time;

35     xSqrtTime = sqrt(xTime);

36  

37     logValues = log( sptprice / strike );

38          

39     xLogTerm = logValues;

40          

41      

42     xPowerTerm = xVolatility * xVolatility;

43     xPowerTerm = xPowerTerm * 0.5;

44          

45     xD1 = xRiskFreeRate + xPowerTerm;

46     xD1 = xD1 * xTime;

47     xD1 = xD1 + xLogTerm;

48  

49     xDen = xVolatility * xSqrtTime;

50     xD1 = xD1 / xDen;

51     xD2 = xD1 -  xDen;

52  

53     d1 = xD1;

54     d2 = xD2;

55      

56     NofXd1 = CNDF( d1 );

57     NofXd2 = CNDF( d2 );

58  

59     FutureValueX = strike * ( exp( -(rate)*(time) ) );       

60     if (otype == 0) {           

61         OptionPrice = (sptprice * NofXd1) - (FutureValueX * NofXd2);

62     else {

63         NegNofXd1 = (1.0 - NofXd1);

64         NegNofXd2 = (1.0 - NofXd2);

65         OptionPrice = (FutureValueX * NegNofXd2) - (sptprice * NegNofXd1);

66     }

67      

68     return OptionPrice;

69 }

查看全文

0
0