//---------------------------------------- double CBratAlgoFilterLoess2D::Run(CVectorBratAlgorithmParam& args) { int32_t iRecord = m_callerProduct->GetCurrentRecordNumber(); if (iRecord == m_callerProductRecordPrev) { // Do nothing: data have been already computed return m_loess; } m_varValueArray = NULL; setDefaultValue(m_loess); OpenProductFile(); SetParamValues(args); if (GetDataWindowSize() < 1) { PrepareReturn(); return m_loess; } if (GetDataWindowSize() == 1) { m_loess = m_varValue; PrepareReturn(); return m_loess; } if ( m_varValueArray == NULL) { ComputeSingle(); } else { ComputeMean(); } PrepareReturn(); return m_loess; }
INLINE void StopMeasure(int staticthreadnum, int& dynthreadnum) { if (!fDynAdapt) { return; } //fStop = DSP_rdtsc(); fStop = GetMicroSeconds(); fCounter = (fCounter + 1) % KDSPMESURE; if (fCounter == 0) { float mean = ComputeMean(); // Recompute dynthreadnum is timing différence is sufficient... //printf("mean = %f fOldMean = %f\n", mean, fOldMean); if (fabs(mean - fOldMean) / fOldMean > MEAN_TRESHOLD) { if (mean > fOldMean) { // Worse... if (fOldfDynamicNumThreads > dynthreadnum) { fOldfDynamicNumThreads = dynthreadnum; dynthreadnum += 1; } else { fOldfDynamicNumThreads = dynthreadnum; dynthreadnum -= 1; } } else { // Better... if (fOldfDynamicNumThreads > dynthreadnum) { fOldfDynamicNumThreads = dynthreadnum; dynthreadnum -= 1; } else { fOldfDynamicNumThreads = dynthreadnum; dynthreadnum += 1; } } fOldMean = mean; dynthreadnum = Range(1, staticthreadnum, dynthreadnum); //printf("dynthreadnum = %d\n", dynthreadnum); } } // And keep computation time fTiming[fCounter] = fStop - fStart; }