<!DOCTYPE html>
<html>

<!--
Copyright 2022 The IREE Authors

Licensed under the Apache License v2.0 with LLVM Exceptions.
See https://llvm.org/LICENSE.txt for license information.
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-->

<head>
  <meta charset="utf-8" />
  <title>IREE Dynamic Web Benchmarks</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" href="/ghost.svg" type="image/svg+xml">

  <style>
    body {
      padding: 16px;
    }
  </style>

  <!-- https://getbootstrap.com/ for some webpage styling-->
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>

  <script src="./iree_api.js"></script>
</head>

<body>
  <div class="container">
    <h1>IREE Dynamic Web Benchmarks</h1>

    <p>
      <br><b>Note:</b> Some outputs are logged to the console.</p>
    </p>

    <!-- TODO: button to run startup benchmarks -->
    <!-- TODO: button to run inference benchmarks -->
    <!-- TODO: button to run all benchmarks -->
    <!-- TODO: UI to set number of iterations -->

  </div>

  <script>

    async function runProgramBenchmarks(programPath, functionName, inputs) {
      // Program loading.
      // The IREE runtime has already been initialized, so this:
      //   * issues an XMLHttpRequest for the program data
      //   * passes the program data in via the WebAssembly heap
      //   * creates an IREE "runtime session" and loads the program into it
      console.log("Running benchmarks for program '" + programPath +
                  "' and function '" + functionName + "'");
      const startLoadTime = performance.now();
      const program = await ireeLoadProgram(programPath);
      const totalLoadTime = performance.now() - startLoadTime;
      console.log("  Application load time (including overheads): " +
                  totalLoadTime.toFixed(3) + "ms");

      // Function calling.
      // The runtime is initialized and the program is loaded, so this:
      //   * passes the inputs in as a string from JS to Wasm
      //   * parses the inputs string into buffer data
      //   * invokes the function
      //   * formats the function outputs into a string and passes that to JS
      const startCallTime = performance.now();
      const iterations = 1;
      const resultObject =
          await ireeCallFunction(program, functionName, inputs, iterations);
      const totalCallTime = performance.now() - startCallTime;
      console.log("  Application call time (including overheads): " +
                  totalCallTime.toFixed(3) + "ms");
    }

    async function runAllBenchmarks() {
      await runProgramBenchmarks("deeplabv3_wasm.vmfb", "main", "1x257x257x3xf32");
      await runProgramBenchmarks("mobile_ssd_v2_float_coco_wasm.vmfb", "main", "1x320x320x3xf32");
      await runProgramBenchmarks("posenet_wasm.vmfb", "main", "1x353x257x3xf32");
      await runProgramBenchmarks("mobilebertsquad_wasm.vmfb", "main", ["1x384xi32", "1x384xi32", "1x384xi32"]);
      await runProgramBenchmarks("mobilenet_v2_1.0_224_wasm.vmfb", "main", "1x224x224x3xf32");
      await runProgramBenchmarks("MobileNetV3SmallStaticBatch_wasm.vmfb", "main", "1x224x224x3xf32");
    }

    async function main() {
      // General runtime initialization.
      // The IREE API script has already been loaded, so this:
      //   * initializes a Web Worker
      //   * loads the IREE runtime worker script
      //   * loads the IREE runtime JavaScript bundle (compiled via Emscripten)
      //   * instantiates the IREE runtime WebAssembly module
      //   * initializes the IREE runtime (runtime context, HAL devices, etc.)
      //   * (if threading is enabled) creates worker thread Web Workers
      const startInitTime = performance.now();
      await ireeInitializeWorker();
      const totalInitTime = performance.now() - startInitTime;
      console.log("IREE runtime initialized after " + totalInitTime.toFixed(3) + "ms");

      await runAllBenchmarks();
    }

    console.log("=== Running benchmarks ===");
    main().then(() => { console.log("=== Finished running benchmarks ==="); })
          .catch((error) => { console.error("Error: '" + error + "'"); });

  </script>
</body>

</html>
