Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- var-mt.c 2011-11-12 11:28:12.000000000 -0500
- +++ var-mt.cpp 2011-11-12 11:27:28.000000000 -0500
- @@ -3,12 +3,11 @@
- #include <stdio.h>
- #include <math.h>
- #include <pthread.h>
- -#include <stdint.h>
- #define NS 10
- -#define CORES 4
- +#define CORES 8
- -uint32_t initialSeed( size_t index )
- +inline uint32_t initialSeed( size_t index )
- {
- uint32_t seed = 1;
- uint32_t mult = 300773;
- @@ -23,14 +22,14 @@
- return seed;
- }
- -double nextUniform01( uint32_t* seed )
- +inline double nextUniform01( uint32_t &seed )
- {
- - *seed = (*seed * 300773) % 1073741824;
- + seed = (seed * 300773) % 1073741824;
- //printf( "%u\n", (unsigned)seed );
- - return (double)*seed / (double)1073741824.0;
- + return double(seed) / double(1073741824.0);
- }
- -double randomNormal( uint32_t* seed )
- +inline double randomNormal( uint32_t &seed )
- {
- double x1, x2, w;
- do
- @@ -43,13 +42,13 @@
- return x1 * w;
- }
- -void randomNormalVec( double vec[NS], uint32_t* seed )
- +inline void randomNormalVec( double vec[NS], uint32_t &seed )
- {
- for ( size_t i=0; i<NS; ++i )
- vec[i] = randomNormal( seed );
- }
- -void multMatVec( double const mat[NS][NS], double const vec[NS], double res[NS] )
- +inline void multMatVec( double const mat[NS][NS], double const vec[NS], double res[NS] )
- {
- for ( size_t i=0; i<NS; ++i )
- {
- @@ -59,7 +58,7 @@
- }
- }
- -double runTrial(
- +inline double runTrial(
- size_t index,
- size_t numTradingDays,
- double dt,
- @@ -77,7 +76,7 @@
- for ( size_t day=0; day<numTradingDays; ++day )
- {
- double Z[NS];
- - randomNormalVec( Z, &seed );
- + randomNormalVec( Z, seed );
- double X[NS];
- multMatVec( choleskyTrans, Z, X );
- for ( size_t i=0; i<NS; ++i )
- @@ -90,22 +89,22 @@
- return value;
- }
- -typedef struct FixedArgs_
- +struct FixedArgs
- {
- size_t numTradingDays;
- double dt;
- double sqrtDT;
- double choleskyTrans[NS][NS];
- double drifts[NS];
- -} FixedArgs;
- +};
- -typedef struct Args_
- +struct Args
- {
- FixedArgs *fixedArgs;
- size_t startIndex;
- size_t endIndex;
- double *trialResults;
- -} Args;
- +};
- void *threadEntry( void *_args )
- {
- @@ -125,7 +124,7 @@
- return 0;
- }
- -void trans( double A[NS][NS], double B[NS][NS] )
- +inline void trans( double A[NS][NS], double B[NS][NS] )
- {
- for ( size_t i=0; i<NS; ++i )
- {
- @@ -136,7 +135,7 @@
- }
- }
- -void multMatMat( double A[NS][NS], double B[NS][NS], double R[NS][NS] )
- +inline void multMatMat( double A[NS][NS], double B[NS][NS], double R[NS][NS] )
- {
- for ( size_t i=0; i<NS; ++i )
- {
- @@ -149,7 +148,7 @@
- }
- }
- -void randomCorrelation( double R[NS][NS], uint32_t* seed )
- +void randomCorrelation( double R[NS][NS], uint32_t &seed )
- {
- double T[NS][NS];
- for ( size_t i=0; i<NS; ++i )
- @@ -213,7 +212,7 @@
- int main( int argc, char **argv )
- {
- size_t const numTrials = 1048576;
- - double *trialResults = malloc(sizeof(double) * numTrials);
- + double *trialResults = new double[numTrials];
- FixedArgs fixedArgs;
- fixedArgs.numTradingDays = 252;
- @@ -231,7 +230,7 @@
- uint32_t seed = initialSeed(0);
- double priceCorrelations[NS][NS];
- - randomCorrelation( priceCorrelations, &seed );
- + randomCorrelation( priceCorrelations, seed );
- double priceCovariance[NS][NS];
- for ( size_t i=0; i<NS; ++i )
- @@ -274,7 +273,7 @@
- printf( "VaR = %.16f\n", 100.0*NS - trialResults[(size_t)floor( 0.05 * numTrials )] );
- - free(trialResults);
- + delete [] trialResults;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment