preprocessed_tbb.c

       1  # 1 "<stdin>"
          # 1 "<built-in>"
          # 1 "<command-line>"
          # 1 "/usr/include/stdc-predef.h" 1 3 4
          # 1 "<command-line>" 2
          # 1 "<stdin>"
          # 13 "<stdin>"
          tbb::cache_aligned_allocator<FTYPE> memory_ftype;
          tbb::cache_aligned_allocator<parm> memory_parm;
          # 27 "<stdin>"
          int NUM_TRIALS = DEFAULT_NUM_TRIALS;
          int nThreads = 1;
          int nSwaptions = 1;
          int iN = 11;
          
          int iFactors = 3;
          parm *swaptions;
          
          long seed = 1979;
          long swaption_seed;
          
          
          FTYPE *dSumSimSwaptionPrice_global_ptr;
          FTYPE *dSumSquareSimSwaptionPrice_global_ptr;
          int chunksize;
          
          
          
          struct Worker {
           Worker(   ){}
           void operator(   )(  const tbb::blocked_range<int> &range ) const {
           FTYPE pdSwaptionPrice[2];
           int begin = range.begin(   );
           int end = range.end(   );
          
           for(  int i=begin; i!=end; i++ ) {
           int iSuccess = HJM_Swaption_Blocking(  pdSwaptionPrice,   swaptions[i].dStrike,  
           swaptions[i].dCompounding,   swaptions[i].dMaturity,  
           swaptions[i].dTenor,   swaptions[i].dPaymentInterval,  
           swaptions[i].iN,   swaptions[i].iFactors,   swaptions[i].dYears,  
           swaptions[i].pdYield,   swaptions[i].ppdFactors,  
           swaption_seed+i,   NUM_TRIALS,   BLOCK_SIZE,   0 );
           assert(  iSuccess == 1 );
           swaptions[i].dSimSwaptionMeanPrice = pdSwaptionPrice[0];
           swaptions[i].dSimSwaptionStdError = pdSwaptionPrice[1];
          
           }
          
          
          
           }
          };
          
          
          
          
      57  void * worker(  void *arg ){
           int tid = *(  (  int * )arg );
           FTYPE pdSwaptionPrice[2];
          
           int beg,   end,   chunksize;
           if (  tid < (  nSwaptions % nThreads ) ) {
           chunksize = nSwaptions/nThreads + 1;
           beg = tid * chunksize;
           end = (  tid+1 )*chunksize;
           } else {
           chunksize = nSwaptions/nThreads;
           int offsetThread = nSwaptions % nThreads;
           int offset = offsetThread * (  chunksize + 1 );
           beg = offset + (  tid - offsetThread ) * chunksize;
           end = offset + (  tid - offsetThread + 1 ) * chunksize;
           }
          
           if(  tid == nThreads -1  )
           end = nSwaptions;
          
           for(  int i=beg; i < end; i++ ) {
           int iSuccess = HJM_Swaption_Blocking(  pdSwaptionPrice,   swaptions[i].dStrike,  
           swaptions[i].dCompounding,   swaptions[i].dMaturity,  
           swaptions[i].dTenor,   swaptions[i].dPaymentInterval,  
           swaptions[i].iN,   swaptions[i].iFactors,   swaptions[i].dYears,  
           swaptions[i].pdYield,   swaptions[i].ppdFactors,  
           swaption_seed+i,   NUM_TRIALS,   BLOCK_SIZE,   0 );
           assert(  iSuccess == 1 );
           swaptions[i].dSimSwaptionMeanPrice = pdSwaptionPrice[0];
           swaptions[i].dSimSwaptionStdError = pdSwaptionPrice[1];
           }
          
           return NULL;
          }
          
          
          
      94  void print_usage(  char *name ) {
           fprintf(  stderr,  "Usage: %s OPTION [OPTIONS]...\n",   name );
           fprintf(  stderr,  "Options:\n" );
           fprintf(  stderr,  "\t-ns [number of swaptions (  should be > number of threads]\n" );
           fprintf(  stderr,  "\t-sm [number of simulations]\n" );
           fprintf(  stderr,  "\t-nt [number of threads]\n" );
           fprintf(  stderr,  "\t-sd [random number seed]\n" );
          }
          
          
          
          
          
     107  int main(  int argc,   char *argv[] )
          {
           int iSuccess = 0;
           int i,  j;
          
           FTYPE **factors=NULL;
          
          
          
          
          
          
          
           printf(  "PARSEC Benchmark Suite\n" );
           fflush(  NULL );
          
          
          
          
          
           if(  argc == 1 )
           {
           print_usage(  argv[0] );
           exit(  1 );
           }
          
           for (  int j=1; j<argc; j++ ) {
           if (  !strcmp(  "-sm",   argv[j] ) ) {NUM_TRIALS = atoi(  argv[++j] );}
           else if (  !strcmp(  "-nt",   argv[j] ) ) {nThreads = atoi(  argv[++j] );}
           else if (  !strcmp(  "-ns",   argv[j] ) ) {nSwaptions = atoi(  argv[++j] );}
           else if (  !strcmp(  "-sd",   argv[j] ) ) {seed = atoi(  argv[++j] );}
           else {
           fprintf(  stderr,  "Error: Unknown option: %s\n",   argv[j] );
           print_usage(  argv[0] );
           exit(  1 );
           }
           }
          
           if(  nSwaptions < nThreads ) {
           fprintf(  stderr,  "Error: Fewer swaptions than threads.\n" );
           print_usage(  argv[0] );
           exit(  1 );
           }
          
           printf(  "Number of Simulations: %d,   Number of threads: %d Number of swaptions: %d\n",   NUM_TRIALS,   nThreads,   nSwaptions );
           swaption_seed = (  long )(  2147483647L * RanUnif(  &seed ) );
          
          
          
          
           tbb::task_scheduler_init init(  nThreads );
          # 184 "<stdin>"
           if (  (  nThreads < 1 ) || (  nThreads > 1024 ) )
           {
           fprintf(  stderr,  "Number of threads must be between 1 and %d.\n",   1024 );
           exit(  1 );
           }
          # 199 "<stdin>"
           factors = dmatrix(  0,   iFactors-1,   0,   iN-2 );
          
           factors[0][0]= .01;
           factors[0][1]= .01;
           factors[0][2]= .01;
           factors[0][3]= .01;
           factors[0][4]= .01;
           factors[0][5]= .01;
           factors[0][6]= .01;
           factors[0][7]= .01;
           factors[0][8]= .01;
           factors[0][9]= .01;
          
           factors[1][0]= .009048;
           factors[1][1]= .008187;
           factors[1][2]= .007408;
           factors[1][3]= .006703;
           factors[1][4]= .006065;
           factors[1][5]= .005488;
           factors[1][6]= .004966;
           factors[1][7]= .004493;
           factors[1][8]= .004066;
           factors[1][9]= .003679;
          
           factors[2][0]= .001000;
           factors[2][1]= .000750;
           factors[2][2]= .000500;
           factors[2][3]= .000250;
           factors[2][4]= .000000;
           factors[2][5]= -.000250;
           factors[2][6]= -.000500;
           factors[2][7]= -.000750;
           factors[2][8]= -.001000;
           factors[2][9]= -.001250;
          
          
           swaptions =
          
           (  parm * )memory_parm.allocate(  sizeof(  parm )*nSwaptions,   NULL );
          
          
          
          
           int k;
           for (  i = 0; i < nSwaptions; i++ ) {
           swaptions[i].Id = i;
           swaptions[i].iN = iN;
           swaptions[i].iFactors = iFactors;
           swaptions[i].dYears = 5.0 + (  (  int )(  60*RanUnif(  &seed ) ) )*0.25;
          
           swaptions[i].dStrike = 0.1 + (  (  int )(  49*RanUnif(  &seed ) ) )*0.1;
           swaptions[i].dCompounding = 0;
           swaptions[i].dMaturity = 1.0;
           swaptions[i].dTenor = 2.0;
           swaptions[i].dPaymentInterval = 1.0;
          
           swaptions[i].pdYield = dvector(  0,  iN-1 );;
           swaptions[i].pdYield[0] = .1;
           for(  j=1;j<=swaptions[i].iN-1;++j )
           swaptions[i].pdYield[j] = swaptions[i].pdYield[j-1]+.005;
          
           swaptions[i].ppdFactors = dmatrix(  0,   swaptions[i].iFactors-1,   0,   swaptions[i].iN-2 );
           for(  k=0;k<=swaptions[i].iFactors-1;++k )
           for(  j=0;j<=swaptions[i].iN-2;++j )
           swaptions[i].ppdFactors[k][j] = factors[k][j];
           }
          # 275 "<stdin>"
           Worker w;
           tbb::parallel_for(  tbb::blocked_range<int>(  0,  nSwaptions,  1 ),  w );
          # 315 "<stdin>"
           for (  i = 0; i < nSwaptions; i++ ) {
           fprintf(  stderr,  "Swaption %d: [SwaptionPrice: %.10lf StdError: %.10lf] \n",  
           i,   swaptions[i].dSimSwaptionMeanPrice,   swaptions[i].dSimSwaptionStdError );
          
           }
          
           for (  i = 0; i < nSwaptions; i++ ) {
           free_dvector(  swaptions[i].pdYield,   0,   swaptions[i].iN-1 );
           free_dmatrix(  swaptions[i].ppdFactors,   0,   swaptions[i].iFactors-1,   0,   swaptions[i].iN-2 );
           }
          
          
          
           memory_parm.deallocate(  swaptions,   sizeof(  parm ) );
          # 339 "<stdin>"
           return iSuccess;
          }
          
          
          
          
     256  int HJM_SimPath_Yield(  FTYPE **ppdHJMPath,   int iN,   int iFactors,   FTYPE dYears,   FTYPE *pdYield,   FTYPE **ppdFactors );
     257  int HJM_SimPath_Forward(  FTYPE **ppdHJMPath,   int iN,   int iFactors,   FTYPE dYears,   FTYPE *pdForward,   FTYPE *pdTotalDrift,  
           FTYPE **ppdFactors,   long *iSeed );
     259  int HJM_Yield_to_Forward(  FTYPE *pdForward,   int iN,   FTYPE *pdYield );
     260  int HJM_Factors(  FTYPE **ppdFactors,  int iN,   int iFactors,   FTYPE *pdVol,   FTYPE **ppdFacBreak );
     261  int HJM_Drifts(  FTYPE *pdTotalDrift,   FTYPE **ppdDrifts,   int iN,   int iFactors,   FTYPE dYears,   FTYPE **ppdFactors );
     262  int HJM_Correlations(  FTYPE **ppdHJMCorr,   int iN,   int iFactors,   FTYPE **ppdFactors );
     263  int HJM_Forward_to_Yield(  FTYPE *pdYield,   int iN,   FTYPE *pdForward );
     264  int Discount_Factors(  FTYPE *pdDiscountFactors,   int iN,   FTYPE dYears,   FTYPE *pdRatePath );
     265  FTYPE dMax(   FTYPE dA,   FTYPE dB  );