示例#1
0
void PhaseFit::PrintResidual(float *params) {
  unsigned int nRead = signal.size();
  unsigned int nData = nRead * nFlow;

  float *tmp = new float[nData];
  Evaluate(tmp,params);

  float *y   = new float[nData];
  for(unsigned int iRead=0, iY=0; iRead<nRead; iRead++)
    for(unsigned int iFlow=0; iFlow<nFlow; iFlow++)
      y[iY++] = (float) signal[iRead][iFlow];

  float res = CalcResidual(y, tmp, len);

  cout << "Residual = " << setiosflags(ios::fixed) << setprecision(3) << res << "\n";
  for(unsigned int iRead=0, iY=0; iRead<std::min(nRead,(unsigned int)2); iRead++) {
    cout << "raw res [" << iRead << "]: ";
    unsigned int iYsave = iY;
    for(unsigned int iFlow=0; iFlow<nFlow; iFlow++,iY++)
      cout << " " << setiosflags(ios::fixed) << setprecision(3) << y[iY] - tmp[iY];
    cout << "\n";
    iY = iYsave;
    cout << "wt res  [" << iRead << "]: ";
    for(unsigned int iFlow=0; iFlow<nFlow; iFlow++,iY++)
      cout << " " << setiosflags(ios::fixed) << setprecision(3) << residualWeight[iY] * (y[iY] - tmp[iY]);
    cout << "\n";
  }

  delete [] y;
  delete [] tmp;
}
/////////////////////////////////////
//          Main Method            //
/////////////////////////////////////
int main()
{
    double tstart0, tstop0, ttime0;
    double tstart0_imp, tstop0_imp, ttime0_imp;

    std::cout<<"Reading file.."<<std::endl << std::endl;   
    
    // Read in the vector   
    std::vector<seed_t> seed_vector = ReadFile();
    seed_vector  = ExtendVector(seed_vector, 100); 
    const int seed_entries = seed_vector.size();
  
    ////////////////////////////
    // Structs:  Residual 
    ////////////////////////////
    float * residuals;
    residuals = (float*) _mm_malloc(sizeof(float)*seed_entries,64);

    std::cout<<"Structs: Residual" << std::endl;
    int i = 0, num_threads, chunk;

    #pragma omp parallel
    #pragma omp master
    num_threads = omp_get_num_threads();
    chunk = seed_entries/num_threads;
    
    tstart0 = dtime();   
    #pragma ivdep
    {     
        //#pragma omp parallel for private(i)
        #pragma omp parallel for simd private(i)
        for(i = 0; i < seed_entries; i++)
        {
            residuals[i] = CalcResidual(seed_vector[i]);
        }
    }

    tstop0 = dtime();
    ttime0 = tstop0 - tstart0;
    std::cout<<" Elapsed time: " << ttime0 <<"s"<< std::endl<<std::endl;


    ////////////////////////////
    // Structs:  Square Residual 
    ////////////////////////////
    float * square_residuals;
    square_residuals = (float*) _mm_malloc(sizeof(float)*seed_entries,64);

    std::cout<<"Structs: Residual Squared" << std::endl;
    //int i, num_threads, chunk;

    tstart0_imp = dtime();   
    #pragma ivdep
    {     
        //#pragma omp parallel for private(i)
        #pragma omp parallel for simd private(i)
        for(i = 0; i < seed_entries; i++)
        {
            square_residuals[i] = CalcSquareResidual(seed_vector[i]);
        }
    }

    tstop0_imp = dtime();
    ttime0_imp = tstop0_imp - tstart0_imp;
    std::cout<<" Elapsed time: " << ttime0_imp <<"s"<< std::endl<<std::endl;

    
    ////////////////////////////
    // Error Checking 
    ////////////////////////////
    int tot_errs = 0;
    for(int i = 0; i < seed_entries; i++)
    {   
        float epsilon = 0.00001;
        
        if(fabs(residuals[i] - sqrt(square_residuals[i])) > epsilon)
        {    
            std::cout<<residuals[i] - sqrt(square_residuals[i]) << std::endl;
            tot_errs++;
        }
    }
    std::cout<<"Total errors for square method: " << tot_errs << std::endl;

    _mm_free(residuals);
    _mm_free(square_residuals);

    return 0;
}