summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@gmail.com>2017-12-12 15:06:43 -0500
committerGuillaume Horel <guillaume.horel@gmail.com>2017-12-12 15:06:43 -0500
commit27c60346d0675d34ec5854156a1ba94697f6b024 (patch)
tree4895f25050c71263898e9b5f5ec36b6112734d82
parent0e8dc14bb5816a6d26e355da020d5fbb457ee2a0 (diff)
downloadlossdistrib-27c60346d0675d34ec5854156a1ba94697f6b024.tar.gz
alloccate less
-rw-r--r--src/lossdistrib.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/lossdistrib.c b/src/lossdistrib.c
index e09c9bf..7028e7f 100644
--- a/src/lossdistrib.c
+++ b/src/lossdistrib.c
@@ -518,12 +518,19 @@ void BCloss_recov_dist(const double *defaultprob, const int *dim1, const int *di
for(int t = 0; t < (*dim2); t++) {
memset(Lw, 0, (*N) * (*n) * sizeof(double));
memset(Rw, 0, (*N) * (*n) * sizeof(double));
+ static double* gshocked;
+ static double* Sshocked;
+ static double* Rshocked;
+ #pragma omp threadprivate(gshocked, Sshocked, Rshocked)
+ #pragma omp parallel
+ {
+ gshocked = malloc((*dim1) * sizeof(double));
+ Sshocked = malloc((*dim1) * sizeof(double));
+ Rshocked = malloc((*dim1) * sizeof(double));
+ }
#pragma omp parallel for
for(int i = 0; i < *n; i++) {
- double* gshocked = malloc((*dim1) * sizeof(double));
- double* Sshocked = malloc((*dim1) * sizeof(double));
- double* Rshocked = malloc((*dim1) * sizeof(double));
- for(int j=0; j < (*dim1); j++) {
+ for(int j = 0; j < (*dim1); j++) {
double g = defaultprob[j + (*dim1) * t];
gshocked[j] = shockprob(g, rho[j], Z[i], 0);
Sshocked[j] = shockseverity(1-recov[j], Z[i], rho[j], g);
@@ -533,6 +540,9 @@ void BCloss_recov_dist(const double *defaultprob, const int *dim1, const int *di
Lw + i * (*N));
lossdistrib(gshocked, dim1, issuerweights, Rshocked , N, N, defaultflag,
Rw + i * (*N));
+ }
+ #pragma omp parallel
+ {
free(gshocked);
free(Sshocked);
free(Rshocked);