cpu_black_scholes.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #include <stdint.h>
  2. #include <starpu.h>
  3. #include <math.h>
  4. static inline double normcdf(double x)
  5. {
  6. return (1.0 + erf(x/sqrt(2.0)))/2.0;
  7. }
  8. void cpu_black_scholes(void *descr[], void *arg)
  9. {
  10. double *S, *K, *R, *T, *SIG, *CRES, *PRES;
  11. uint32_t nxS;
  12. S = (double *)STARPU_MATRIX_GET_PTR(descr[0]);
  13. K = (double *)STARPU_MATRIX_GET_PTR(descr[1]);
  14. R = (double *)STARPU_MATRIX_GET_PTR(descr[2]);
  15. T = (double *)STARPU_MATRIX_GET_PTR(descr[3]);
  16. SIG = (double *)STARPU_MATRIX_GET_PTR(descr[4]);
  17. CRES = (double *)STARPU_MATRIX_GET_PTR(descr[5]);
  18. PRES = (double *)STARPU_MATRIX_GET_PTR(descr[6]);
  19. nxS = STARPU_MATRIX_GET_NX(descr[0]);
  20. uint32_t i;
  21. for (i = 0; i < nxS; i++){
  22. double d1 = (log(S[i] / K[i]) + (R[i] + pow(SIG[i], 2.0) * 0.5) * T[i]) / (SIG[i] * sqrt(T[i]));
  23. double d2 = (log(S[i] / K[i]) + (R[i] - pow(SIG[i], 2.0) * 0.5) * T[i]) / (SIG[i] * sqrt(T[i]));
  24. CRES[i] = S[i] * normcdf(d1) - K[i] * exp(-R[i] * T[i]) * normcdf(d2);
  25. PRES[i] = -S[i] * normcdf(-d1) + K[i] * exp(-R[i] * T[i]) * normcdf(-d2);
  26. }
  27. }