|  | # "Custom Module" samples | 
|  |  | 
|  | These samples demonstrate how to extend IREE with custom host code that can be | 
|  | called from compiled modules. All modules regardless of type can call into each | 
|  | other to allow for arbitrary module configurations. | 
|  |  | 
|  | ## Basic sample | 
|  |  | 
|  | [samples/custom_module/basic/](/samples/custom_module/basic/README.md) shows how | 
|  | to add a basic C++ custom module and use many of the more advanced features of | 
|  | the module system. | 
|  |  | 
|  | * C++ VM wrappers for defining modules and using reference types | 
|  | * Weak imports/fallback functions | 
|  | * Custom types exposed to the compiler | 
|  |  | 
|  | ## Tensor I/O | 
|  |  | 
|  | ### Synchronous call sample | 
|  |  | 
|  | [samples/custom_module/sync/](/samples/custom_module/sync/README.md) | 
|  | shows how to pass tensors to and from custom module imports with synchronous | 
|  | execution. This approximates what a classic ML synchronous custom op may do by | 
|  | presenting the tensor I/O as if they were host-synchronous buffers. This is the | 
|  | lowest-performance way of running custom code and should be avoided when | 
|  | possible. | 
|  |  | 
|  | * `tensor` types <-> HAL buffer views | 
|  | * Host buffer mapping and manipulation | 
|  |  | 
|  | ### Asynchronous call sample | 
|  |  | 
|  | [samples/custom_module/async/](/samples/custom_module/async/README.md) | 
|  | shows how to pass tensors to and from custom module imports with asynchronous | 
|  | execution. This shows how to move tensors across threads/frameworks in a | 
|  | non-blocking way that allows IREE to overlap execution with custom user code. | 
|  |  | 
|  | * `tensor` types <-> HAL buffer views | 
|  | * Fences for waiting on inputs and signaling readiness of outputs | 
|  | * Side-effect annotations for wait-free imports |