in Tools/WinMLRunner/src/Run.cpp [402:469]
void IterateBindAndEvaluate(const int maxBindAndEvalIterations, int& lastIteration, CommandLineArgs& args, OutputHelper& output,
LearningModelSession& session, HRESULT& lastHr,
const LearningModelDeviceWithMetadata& device, const InputBindingType inputBindingType,
const InputDataType inputDataType,
Profiler<WINML_MODEL_TEST_PERF>& profiler, const std::wstring& imagePath)
{
Timer iterationTimer;
for (; lastIteration < maxBindAndEvalIterations; lastIteration++)
{
#if defined(_AMD64_)
// PIX markers only work on AMD64
// If PIX tool was attached then capture already began for the first iteration before
// session creation. This is to begin PIX capture for each iteration after the first
// iteration.
if (lastIteration > 0)
{
StartPIXCapture(output);
}
#endif
if (args.IsTimeLimitIterations())
{
if (lastIteration == 1)
{
iterationTimer.Start();
}
else if (lastIteration >= 1 && iterationTimer.Stop() >= args.IterationTimeLimit())
{
std::cout << "Iteration time exceeded limit specified. Exiting.." << std::endl;
break;
}
}
LearningModelBinding context(session);
lastHr = BindInputs(context, session, output, device, args, inputBindingType, inputDataType, lastIteration, profiler, imagePath);
if (FAILED(lastHr))
{
break;
}
LearningModelEvaluationResult result = nullptr;
bool capture_perf = args.IsPerformanceCapture() || args.IsPerIterationCapture();
lastHr = EvaluateModel(result, context, session, args, output, capture_perf, lastIteration, profiler);
if (FAILED(lastHr))
{
output.PrintEvaluatingInfo(lastIteration + 1, device.DeviceType, inputBindingType, inputDataType,
device.DeviceCreationLocation, "[FAILED]");
break;
}
else if (!args.TerseOutput() || lastIteration == 0)
{
output.PrintEvaluatingInfo(lastIteration + 1, device.DeviceType, inputBindingType, inputDataType,
device.DeviceCreationLocation, "[SUCCESS]");
// Only print eval results on the first iteration, iff it's not garbage data
if (!args.IsGarbageInput() || args.IsSaveTensor())
{
BindingUtilities::PrintOrSaveEvaluationResults(session.Model(), args, result.Outputs(), output, lastIteration);
}
if (args.TerseOutput() && args.NumIterations() > 1)
{
printf("Binding and Evaluating %d more time%s...", args.NumIterations() - 1,
(args.NumIterations() == 2 ? "" : "s"));
}
}
#if defined(_AMD64_)
EndPIXCapture(output);
#endif
}
}