Synchronous tensor I/O custom module sample

This sample expects that you've already produced a working version of the basic sample (including compiler installation and CMake setup).

This sample demonstrates adding custom modules callable from compiler-produced programs that take and return tensor types. By default custom calls are treated as blocking operations that synchronize with the underlying device to ensure all passed tensor buffer views are host coherent and it's assumed that any returned tensor buffer views are ready for use when the call returns.

This approach is the easiest to integrate and looks similar to classic ML frameworks custom calls. There are many significant performance implications of using this approach, though, and synchronous calls should only be used when no asynchronous approach is possible. See the async tensor sample for how to define custom calls that work asynchronously.

Instructions

  1. Compile the example module to a .vmfb file:

    iree-compile --iree-hal-target-backends=llvm-cpu samples/custom_module/sync/test/example.mlir -o=/tmp/example.vmfb
    
  2. Build the iree_samples_custom_module_sync_run CMake target :

    cmake -B ../iree-build/ -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo . \
        -DCMAKE_C_FLAGS=-DIREE_VM_EXECUTION_TRACING_FORCE_ENABLE=1
    cmake --build ../iree-build/ --target iree_samples_custom_module_sync_run
    

    (here we force runtime execution tracing for demonstration purposes)

    See here for general instructions on building using CMake.

  3. Run the example program to call the main function:

    ../iree-build/samples/custom_module/sync/custom-module-sync-run \
        /tmp/example.vmfb example.main