From 7559bd23bb6ac13ecbc7067fa567739140c37be2 Mon Sep 17 00:00:00 2001 From: Kevin Keogh Date: Sun, 30 Jul 2017 10:53:27 -0400 Subject: [PATCH] Add multi-threading --- Makefile | 2 +- build/opt-pricer | Bin 18600 -> 18816 bytes src/gbm_mc.c | 52 +++++++++++++++++++++++++++++++++++++++++++++-- src/gbm_mc.h | 4 ++++ 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 022a728..e108bd8 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ CC=gcc -CFLAGS=-Wall -fPIC -O3 -ansi -pedantic-errors +CFLAGS=-Wall -fPIC -O3 -ansi -pedantic-errors -pthread LDFLAGS=-lm PREFIX= /usr/local diff --git a/build/opt-pricer b/build/opt-pricer index d091c94f807476e8c4f9f93b91c9554699d5d4ef..6ade738a81fa29e473b7f03ca2499bc533448100 100755 GIT binary patch delta 7360 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 IXZ_^=2b~s}{{R30 delta 5614 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 diff --git a/src/gbm_mc.c b/src/gbm_mc.c index b2224a0..9df56ae 100644 --- a/src/gbm_mc.c +++ b/src/gbm_mc.c @@ -3,9 +3,17 @@ #include "gbm_mc.h" #include "utils.h" + #include +#include +#include +#include +#include #include +#define NUM_THREADS 8 + + double gbm_simulation(double spot, double rfr, double vol, double tte, double rand) { /* S_T = S_0e^{[r-\frac{\sigma^2}{2}]t + \sigma\sqrt{t}\xi_i} */ @@ -17,14 +25,17 @@ double gbm_simulation(double spot, double rfr, double vol, double tte, double ra return spot * exp(drift + stoch); } -void gbm(struct Option *opt) + +void *run_simulations(void *opt_ptr) { + int i; double tte, theta_tte, expiry_date, value_date, level, rand, df; double delta_shift = 0, vega_shift = 0, theta_shift = 0, rho_shift = 0; double gamma_shift = 0, base_gamma = 0, upper_gamma = 0, lower_gamma = 0; double price, delta, gamma, vega, theta, rho; double base = 0; - int i; + + struct Option *opt = (struct Option*) opt_ptr; if (opt->sims < 1) opt->sims = 1; @@ -79,4 +90,41 @@ void gbm(struct Option *opt) opt->vega = (vega - price) / 0.01; opt->theta = (theta - price) / (tte - theta_tte); opt->rho = (rho - price); + + return (void *) opt; +} + + +void gbm(struct Option *opt) +{ + int i; + pthread_t *threads; + struct Option *options; + options = malloc(sizeof(struct Option) * NUM_THREADS); + for(i=0; isims = opt->sims / NUM_THREADS; + + for(i=0; ifv += result->fv / NUM_THREADS; + opt->delta += result->delta / NUM_THREADS; + opt->gamma += result->gamma / NUM_THREADS; + opt->vega += result->vega / NUM_THREADS; + opt->theta += result->theta / NUM_THREADS; + opt->rho += result->rho / NUM_THREADS; + opt->sims += result->sims; + } } diff --git a/src/gbm_mc.h b/src/gbm_mc.h index 308e247..99ed8d8 100644 --- a/src/gbm_mc.h +++ b/src/gbm_mc.h @@ -3,9 +3,13 @@ #include + struct Option; + double gbm_simulation(double spot, double rfr, double vol, double tte, double rand); +void *run_simulation(void *opt_ptr); + void gbm(struct Option *opt); #endif