int run()

in Tools/WinMLRunner/src/Run.cpp [527:625]


int run(CommandLineArgs& args,
        Profiler<WINML_MODEL_TEST_PERF>& profiler,
        const std::vector<LearningModelDeviceWithMetadata>& deviceList,
        const LearningModelSessionOptions& sessionOptions) try
{
    // Initialize COM in a multi-threaded environment.
    winrt::init_apartment();
    OutputHelper output(args.NumIterations());

#if defined(_AMD64_)
    PrintIfPIXToolAttached(output);
#endif

    // Profiler is a wrapper class that captures and stores timing and memory usage data on the
    // CPU and GPU.
    profiler.Enable();

    output.SetCSVFileName(args.OutputPath());
    if (args.IsSaveTensor() || args.IsPerIterationCapture())
    {
        output.SetDefaultPerIterationFolder(args.PerIterationDataPath());
        output.SetDefaultCSVFileNamePerIteration();
    }

    if (!args.ModelPath().empty() || !args.FolderPath().empty())
    {
        std::vector<InputBindingType> inputBindingTypes = args.FetchInputBindingTypes();
        std::vector<InputDataType> inputDataTypes = args.FetchInputDataTypes();
        std::vector<std::wstring> modelPaths = args.ModelPath().empty()
                                                   ? GetModelsInDirectory(args, &output)
                                                   : std::vector<std::wstring>(1, args.ModelPath());
        HRESULT lastHr = S_OK;
        if (args.IsConcurrentLoad())
        {
            ConcurrentLoadModel(modelPaths, args.NumThreads(), args.ThreadInterval(), true);
            return 0;
        }
        for (const auto& path : modelPaths)
        {
            LearningModel model = nullptr;

            LoadModel(model, path, args.IsPerformanceCapture() || args.IsPerIterationCapture(), output, args, 0,
                      profiler);
            for (auto& learningModelDevice : deviceList)
            {
                lastHr = CheckIfModelAndConfigurationsAreSupported(model, path, learningModelDevice.DeviceType, inputDataTypes);
                if (FAILED(lastHr))
                {
                    continue;
                }
#if defined(_AMD64_)
                StartPIXCapture(output);
#endif
                LearningModelSession session = nullptr;
                for (auto inputDataType : inputDataTypes)
                {
                    for (auto inputBindingType : inputBindingTypes)
                    {
                        // Clear up session, bind, eval performance metrics after configuration iteration
                        if (args.IsPerformanceCapture() || args.IsPerIterationCapture())
                        {
                            // Resets all values from profiler for bind and evaluate.
                            profiler.Reset(WINML_MODEL_TEST_PERF::BIND_VALUE, WINML_MODEL_TEST_PERF::COUNT);
                        }
                        for (uint32_t sessionCreationIteration = 0;
                            sessionCreationIteration < args.NumSessionCreationIterations();
                            sessionCreationIteration++)
                        {
                            lastHr = CreateSession(session, model, learningModelDevice,args, output, profiler, sessionOptions);
                            if (FAILED(lastHr))
                            {
                                continue;
                            }
                            if (args.IsImageInput())
                            {
                                for (const std::wstring& inputImagePath : args.ImagePaths())
                                {
                                    RunConfiguration(args, output, session, lastHr, inputBindingType, inputDataType,
                                                     profiler, path, inputImagePath, sessionCreationIteration,
                                                     learningModelDevice);
                                }
                            }
                            else
                            {
                                RunConfiguration(args, output, session, lastHr, inputBindingType, inputDataType,
                                                 profiler, path, L"", sessionCreationIteration,
                                                 learningModelDevice);
                            }
                            // Close and destroy session
                            session.Close();
                        }
                    }
                }
            }
        }
        return lastHr;
    }
    return 0;
}