/// <summary> /// A case where we don't have specific iteration time. /// </summary> private long RunAuto() { long invokeCount = TargetAccuracy.MinInvokeCount.Resolve(Resolver); double maxError = TargetAccuracy.MaxStdErrRelative.Resolve(Resolver); // TODO: introduce a StdErr factor double minIterationTome = TimeUnit.Convert(Engine.MinIterationTimeMs, TimeUnit.Millisecond, TimeUnit.Nanosecond); double resolution = TargetClock.GetResolution().Nanoseconds; int iterationCounter = 0; while (true) { iterationCounter++; var measurement = RunIteration(IterationMode.Pilot, iterationCounter, invokeCount); double iterationTime = measurement.Nanoseconds; double operationError = 2.0 * resolution / invokeCount; // An operation error which has arisen due to the Chronometer precision double operationMaxError = iterationTime / invokeCount * maxError; // Max acceptable operation error bool isFinished = operationError < operationMaxError && iterationTime >= minIterationTome; if (isFinished) { break; } if (invokeCount >= MaxInvokeCount) { break; } invokeCount *= 2; } WriteLine(); return(invokeCount); }
/// <summary> /// A case where we don't have specific iteration time. /// </summary> private long RunAuto() { int unrollFactor = TargetJob.Run.UnrollFactor.Resolve(Resolver); Func <long, long> autocorrect = count => (count + unrollFactor - 1) / unrollFactor * unrollFactor; long invokeCount = autocorrect(TargetAccuracy.MinInvokeCount.Resolve(Resolver)); double maxError = TargetAccuracy.MaxStdErrRelative.Resolve(Resolver); // TODO: introduce a StdErr factor double minIterationTime = Engine.MinIterationTime.Nanoseconds; double resolution = TargetClock.GetResolution().Nanoseconds; int iterationCounter = 0; while (true) { iterationCounter++; var measurement = RunIteration(IterationMode.Pilot, iterationCounter, invokeCount, unrollFactor); double iterationTime = measurement.Nanoseconds; double operationError = 2.0 * resolution / invokeCount; // An operation error which has arisen due to the Chronometer precision double operationMaxError = iterationTime / invokeCount * maxError; // Max acceptable operation error bool isFinished = operationError < operationMaxError && iterationTime >= minIterationTime; if (isFinished) { break; } if (invokeCount >= MaxInvokeCount) { break; } invokeCount *= 2; } WriteLine(); return(invokeCount); }