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; }