# Custom operations (C++) Custom operation allows you to add an operation into the graph, which is unknown to the Cloud AI (also known as QAic) compiler. For example, a certain graph isn’t part of the operation set supported for the various models that the compiler knows to load and compile. With custom operations, you can register a new operation before loading or defining the graph, and then use this new operation in the new graph created. The QAic compiler uses the registration information to create a graph which you can compile. ![image](data:image/png;base64,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) As an example, ONNX node definition supports domains. You can create an ONNX model file that has nodes that come from the non-default domain, and then register these nodes definition in the QAic compiler. ## Custom operations workflow This section describes the three stages to create and work with a custom operation. ![image](data:image/png;base64,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) The first stage is to create the custom operation in one of the machine learning frameworks such as PyTorch or TensorFlow. After creating this operation, it’s added to a machine learning model and the model is trained. The resulted model trained is stored for inference - either as ONNX file or TensorFlow saved model. For each framework/trained-model, the way to specify a custom operation is a bit different, and as such the way QAic Compiler knows to identify the custom operation varies. Current version supports Custom Operations for ONNX Models. More details on it below. The second stage is to prepare a package for the custom operation/s, which contains: - The information needed for QAic Compiler to integrate the operations in the ML graph. - Implementations to be used when compiling the graph to a binary. The content of this stage is explained in details on next sections. The third stage is compilation. To compile a model that has the custom operation inside, the operation package needs to be registered first. After successful registration, the model can be loaded and compiled using `qaic-compile`. ## Custom operation package The custom operations package is prepared by you, and contains all files needed to register operations within the compiler. Tag the custom operations package with a version number to ensure that your customer operation package is compatible with the installed Apps SDK. The files in the custom operations package are used by the QAic compiler to compile that model into a binary. The following drawing shows the content of a package, and the next sections describe each component in details. ![image](data:image/png;base64,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) Briefly: - The configuration file describes the version number, custom operations and related files, and is used by the QAic Compiler to bootstrap the package, registering its content within the compiler. - Custom Op Function files (`Foo1OpFunc.so`, `Foo2OpFunc.so`) contain utility functions used by the compiler during compilation of the model. - Implementation files contain the implementations of the operations for different compilation targets. Also, you can provide multiple implementations (selected by the `selection` function). Although the custom operation package can be written as described in the next sections, it’s recommended to use the utility script `/opt/qti-aic/tools/custom-op/gen_custom_op_package.py` to generate the structure of the custom operations package. The script takes in an ONNX or TensorFlow model and generates a package for each custom operation present in the input model. For more details run the following: python3 /opt/qti-aic/tools/custom-ops/gen_custom_op_package.py --help Copy to clipboard After the skeleton code is generated for custom ops, user needs to write the necessary functionality that’s specific to custom operations, like the kernel, verification, selection, shape inference function as described in the next sections. ### Model a custom operation To better understand the content of the package, this section briefly discusses what’s needed to model any machine learning operation, so that it can be placed in a graph and compiled. The following diagram shows modeling of one operation. ![image](data:image/png;base64,UklGRuAPAABXRUJQVlA4TNQPAAAvxQF0ACcFObZt09Y83OfZtv1SeDm8yH/9rt2zfdJwXdu26exnW7FRgupJASk2I1+27Uc4tu0obJ5sjaUxszu2Owgne0+XlplpC8ww8x+AMUkSfCSsgRQKEN4JaxQAAQghjDGR0kyGYYSiRFSyEkFgQvXn/yNBTECCmCRiBApCM8KROYFzihRcAk2JM0KxAVOAMUGJg6mjJIMagcuUDRn0AFIAPezwnyTv33d34i42OAPAg2NAWiW76EWMEpv9ByGU+M+HkZL++TBShAisUUri/CjlGvt11kDgnXmbwDnhzL/yLemXCecCa4RzgTPCOWX/erw9yoXPwJ1CzYEJVZlABwIgQB6o2J7BDmzAdNkhABRQoAtEIKALCj9QAwan+P7aV37hYADgohSppKM02cUJFwAH3P2cDtTn/xNxkv42JJsZQ7WoawMMcML7vy0jlPyZfzoAJ4AebDDEFcAR30xHWi2qOa+yTlFJfkUJBb+IOg5eh/7lTdmaOcK519GPW1x5n/8697d9bXD0ws8RnTOurHXOUev+1Ky3JCOUVY0NHXsLPP7/tbZt/39HY2ZmqBO12+KMmaHcpmCnXj1Is3jMzBivi5vEftWOorgd/6XXeZ5zSZZ0WXotjSP6TwuSJLttVHNCGLwlVTNYLB7cEP49E/t2FL3Y7zE3XnB5wYvTgWv/bha8oJH/FEu+e2ea6NY7k+Wnd1+hZNzfpbH5vMhH08Qx81uSfDtNGPcOmp9fotd+zX0oW37G7LvfXBKNj2J3Kov6dy8TTUQjckK4yIsrJ5UOkgg29X9fpNvnB0lufFnZ4sq4OgZ9Ycwcoolu+80ocGxuNr+7BA634HbHu9PGiU3unRe+Uv0kD8wnaeLjaZrZAqPDy0Qzd8+D7jvG7ttLpole3SITghyVrED8jk/ZOX/x7bTpHXZMlzJx+7yAD9lowODRG0w2iw4ox+P3aeY3w6uy031EEGNC9/ZfhPWEjpYVI8TyId9Om17wzS2/woCLJz9Hm9/xKRBzh+klRgR2faluge6Z/+5FkGShj42MAdy+uXMe0hMrjJ4VOn9remNuXMzc/U+zCYDbhJBgNynyviHawuiggnLKPCFSav4MV0IWlKwUZ3hfDnt5LAJwHKV7EfE+7DNR0V8G0FWsi06HmZEdPau8BmxQ7Sz1pEKz+b1pPDGIBfqCOuiMNS0LeWBlUGyL6TI5dAFnPrcdhetU6AU/v0fm5VuP8p69maUmcCc/2vyOd3U7FvVp7hL4Mkii788f3w+6KHiH0QNoAtGzynM035fDrTiVZaaFCQhsVtQmmnakuiKmnt8qPrdL8JybYMdX3qZmletofqNcJn7C14gf0RgLkGnQbPIV512gBiKRaX7P158z9x1tArfzteYdmBLoiBW8rXTbpzQmEoKjhpZVXiOdkZ5tfyoazWazOfKfDSb54aviE38NhCs+e7zwBA2GHV7hiZH/bKRASNTK24RE1GgPimrfj27vq3TfWszbi0q91PG8cHZxAPRmFwdH0GjnbUL+4V4xGNi/mFCpl5XtHZYDIuhMIY7tYTkk36iBTUAmWtxJQMH30It8ieJR7ZNi6udkurWWsoNjV/FFTyh1jEjZ86p/wAAuFkzQaAs/KhvxMqJ5wELRy+H4LNBowzmRacejvDbeK1TqLV009CXSA9pqejkcFOgRhxSBFdLgE18Ujomml7dfVpD7rUGahYmSt9/GwIaXW1zpTkj3LUGthSN+TDS9fEy35vNPo+0pTap901cqb7YB6AU9Ymot0UlEk7h4YX5uohxufewAIRpU+/x/ZMcIiBofwi0J+UEhEZW9uEi9HH7/Nkzn/rrOD88b+c+GCVx50bWFJwbDj38Xn/ihKP513ZH/rK/lwauKT9w8EK56YmvhCRoMW6cKT4wKZpVMHDkWlwMnxgsPm5Zjeq0cOVYUgZWixNo4tlubXCMaBxOiuSUY6BfAapVASDM7fsgoFRZo0nSLSeNghFYmccGszi1NHTw8PqWYHTy8MHXwgeUi0WTTskT5BccPwe6tYPoKWuhmxWPFDh+HLRx/+xgM3gsCGAyOHCuC8D82LRcLYqwcf1twCFbmlnS4VcFglY+0pHHgBDeB3yK6lWiijRLjcP1TNK5T+bJlVcP8xx8EPgvi8Es0OYUoIgtF8f7tyH9G/nMKPddQVuMZC09SVuMLCztPo4zG2XuS55z9Xjbj8YctfPFsRrPfca2Frdd5GY1zd51KTEjUyhyh7yVTndQT+q4jaLSZSr1sodo39eq+tcgCCnazdFHtEzXaA8IiB9VJdhGrCjrRa+8KurUW05tdtAM9KwJCMn1U+6WO1yt1EiFotJMlXhU0IhbfIcgChKVOjPEhGgmvxOnEXhaJV4XYZPflqKu8bsoVitErLIfkhz6PZlTqmMJJpUqdRbyATLS4oqDgC1XyE6VS9yUBZyBy5IwCEBBlkSipiuqglajZgIlZBZmOVnz5C7D4xsde/CwQo7/3Gm3cJLDBqMz1wo6l6PTK1T9g7BLdnwmgS/mo2q2VE305gK4hM9ByDMmH1GRZEC1VW3W4ZgN/OVYV1HS0xMVG4OLD1olQ/GwitpEPJyfcDppaUAc2kFKAkYMtxD7iJ/u2bo33NjUDZbtB55ZlESiCiLTiI1JK3tatkZqOvl3ERlCIUPxsfhBUnyvQIw7RsS2IQw+OrqSCG9OUMxVAAo22BHMUcKKiLJFRrEJ/8B8Urwp6OtLBbAQLSvGzjnmF12VVoqJcBYXpxZYB5qgiyxIVaZUI8aqgpqOk5igg4dCH/COjXgUh3bcQ9oFjeRoxOaoEZqXWikW31konejrCQfsFbyFK8TNPj6glrs0qb7ajIC7boLP0iKm10CwUJxQpAC4KOQ2BkqNsopQlIopVIsSrgp6OdBAbgYsPBVCKn3kqde4lXrUPx7soKLdQAqLGh1BY/CAQoLKXCrwADr9KBpgjLPiyQStLRKRVMotYVdDTkQ7KRvBC/KAIxc8nd+FD373fpax/wvM2GCTAbyviUu37yZOW7JMnLdk7iVInpldvdjElpCD7lJCC7F0OrDgAWHEAsOIstLvJcv6KnOESY5rP4Elr9oMnrdk7CGX+imWGiyHCDJeBk9rsB05qs3dFk1JHIn+B/D42zjSfgTdJbfYDb5La7N2xsCOPPVEmiCRG6rJPjNRl//8y5AyXKNN8EiN12SdG6rJ3EAEfXQjQp/tEmeaTGKnLPjFSl72D8PhUPVCQM1wiTPNJjrRlnxypzb4o3oXf+Innd2QzPrPyaEazf9rKxTsyGmelgM+vzWo8Z+GpzGb/iIVd12Q1++v3FMW/yzryn3W9PLG18MRgePCq4hM3R6Zwxch/1tfy49/FJ34YCFdfeFnhiaI4U2RkMGvjRYq18XRy4MR4AWPlyDGbRVEkp6+sTa4SbVo27TQJwRrR3JJupsmwzRqLrJKJhamDh9lXWLA0KIwrfobjh4xgjoXGzYaFdgsgcfAw28jXNy1bzKQM+04akUnc6w/8DgO4WDCrc0ucgeJnJEwfe2A5vzI+pbTDX7Ayt8Qcf/vYFLezmCky0kYZu6FTSaCvQF8SftD1eCUvo23zFeI4YkPI2IEVEihdTwwaMkGjm8sRG9uC3OMt8M+kWcSF/7EpT6+sipVDC1Ew47GG7CfQ4QAY5IU0HhN0uFUuxtLkwAnTGw6+sWRByihAj4B2K8QcWhDpiCYKK+Nw/ZOTGV8jkiIHTihHXqWdlFFtjOkCX8/MfQCnzPhBIECTNj/3f1COuG27Do+pqZH/jPwnt/DMww6Ox/ZacX8hn0gB53z9uHvjvJijGD3u4DhzVwrY77k3rouL5+A495RjQn+o0q012lqxQyLyhxK92cV42AydTPBnvSWp1EsdY1AuYFT7rdCXBI32sFkJyyGMaQGZaPEIZyqLOn5YNjaljrDwUEoYCgvh5EK6r7d7jTZSqZe9oQOVvW6tDHu2MCl1QIfbcaWFnCLFC80CnVxIUOpU6i2kW2sNH3wQQLpvLXrcDpoKJ7PngIUixWgW7OREqv2yed0fkvSIQwwGAPiAgJQCpAU6uRCsVTC7OBRRzpeioUgxmoUzCQmiLF8eVsCozDuHFTiPBKQUvAssXAr2F3H+4MMvGFJgd6j2TVkrb7YBrQmgSHFbzcKNwIglPslynTp8wMGuVe3z/9EWcPUj8FBKGEoLFyI+V3ys3BNcfc8oqd417O7Cr8fB8zZ6IfSHDqE/xAj9dFLt+zEn1ySOWwoZkolSZwjAX7PYLJiYk2sSxy2FDEsdYzW7OIwYwOQa9xL79i/vLQ5AzN0JiDQJQEzcsZpZJv6QLyf5VOrsKyxYGhR8xc8yuSZp3FLIsNTBXcYBkO91a9CupX/VpUzcsZjZJv50a2UsXfUPHO/QggnMFqnUtXlD+uSapHFGIVW6tZYD8D2lnTqRx1cm7ljMlIk/0gZ3AFlKBewjvVnFWp9ckzTOKKTjUEokJ+7YEBN/7MDARwKxpbCsEsvkmoTJfCGjwE4uQ2xlC3IHsSAmXISDKDZBlBPGGYXUX260XUQgBr5aKwqWiT9KWbnGAIyJQhqHUIltck2yOKOQtre5Bf0kRJm4Y8Ey8UcpK7TrEVNriXTESYgGbBLxScmS+UJGoNpvtB2DZSKPmLhjNbNP/BGTfAKixoelDlqgEgzZCurnVurlZBeZL2SUQ5Pvnvu3oe/Cu/AuKuR/KBTFb6dPVeD8S69zb5y5LR6nXefgOG138uza6uCI+TO108WF3F4U/7ruyH/WE3MDOTjO2BWPi8jBcfaegjjHYGP751uN/H++1cj/51t5oe92HPQ4qHLyOKiS1BoC9GYXbRYxEF9hUytxnFNJXgwjOM9YVPu+g/E8L/O44nFQOuXEcUUls4ZzHgfF+1TiOKOSGcMxj4Mi4h0ycRxUST8LuOdxUNV+o500zqhkxhbOeRwUyCRNpirpEDL/OKhUkvlKZhQXPQ6q1EmazFcyo4vMPw4qlU0cVEkqu+b+beg78S68kyr53wlF8dvpUxS4piD8FcGi+HdZR/6zjphdWx0c2+24v5A7U8D5l17n3jhzezzOuM7BccbuUXTPtxr5/3yrEfTPtxpehH4qifHUHGU6TeK4pZIBfsc0BOjNLtosYqDdHk0at1QywL9XPpSIHtp0GvfieV7mccnToOBrw1TgikpmDZc8DUr5Cn9YPN8qYzjjaVCpwhmVRPCZFhkg80+DSiXOqGTGFs54GpTlZYc+38ohOOdpUKkg85XMKM54GlSqrlMzX8mMLlzyNChlOk3ii6xX0hHEL74T78I7p5L/rVAUv51ef8LXj7s3zovL4w6OM1PAMw+7OPbE4wkX1/GxvUXxr+uO/GddL18+XHhiMPz1VfGJhyJTuGLkP+tduemrghfI/x4vevGCBw==) The Operation Info block in the diagram represents the modeling of the operation itself as a black box, which you need to be connect inside a graph. To do that, provide basic information about the operation (name, type), and describe the inputs, outputs and parameters of the operation. ![image](data:image/png;base64,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) You can model any operation in a machine learning graph (not just custom operations) by defining its set of inputs, outputs, and parameters. The inputs and outputs are tensors. Inputs come from the operations before this one, and outputs are the tensors created by the operation, and provided to the operation or operations that come after. For the inputs and outputs, you need to specify the maximal rank supported by the operation. The actual values per dimension are populated by the compiler during graph creation. Parameters are the constant values provided to the operation as part of the configuration, for example, kernel size and alpha value. Parameters can be scalar (single value) or a vector of values. In addition to the operations information, the modeling of the operation includes a collection of utility functions and implementations. Utility functions help the compiler during the compilation. You must implement the following functions. - Verification function: Receives a set of inputs, outputs and parameters, populated with actual values that the operation is going to work on. The function should validate that the values are correct and the operation can support this combination. - Shape inference function: Receives a set of inputs and parameters, populated with actual values that the operation is going to work on. The function is doing shape inference of the outputs. For example, it returns the tensor size on each dimension. - Selection function: Receives a set of inputs, outputs and parameters, populated with actual values that the operation is going to work on. In addition it receives the compilation target (AIC or Interpreter). The function returns a string containing the name of the adequate implementation to use for this configuration. ### Configuration file The configuration file is part of the custom operation package. There is a single configuration file which provides the required information for all operations in package. The file is YAML formatted. The following is an example of a configuration file for a single operation. ![image](data:image/png;base64,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) The configuration file contains a `version` number which indicates the custom operation package version. The compiler uses the file to verify compatibility of the custom operation package and the installed Apps SDK. Operations are described in the `CustomOps` section. Each operation section has the following: - Operation Info, defining the operation `name`, `type`, `inputs`, `outputs` and `parameters`. - For each input and output, the relevant fields are the `name` and `maxDims` (maximal rank of the tensor) - For input, there is also optional constant field, which can be true/false, to indicate if it’s a constant. - For each parameter, the relevant fields are `name`, `datatype` (bool, float, int), `scalar` (true or false). - If parameter `scalar` field is `false`, meaning this is an array (1d vector), and then need to provide `size`. - Optionally, you can request for scratch memory to store and load intermediate computations inside the kernel. - Location of the custom operation functions - Implementations The information provided per implementation is as follows: - Target `Backend`. - `type`: Used by the backend during selection process (see explanation next). - `impl`: Location of the implementation file. - `config` (optional): Additional information on this implementation, to be used by the backend. - `compilerArgs` (optional): Hexagon-clang compiler options specific to the AIC backend implementation. Use this option to specify additional build settings, such as include directories and compile time MACROS. User is responsible for passing valid compilation options using this field. The configuration file can provide the information for multiple operations. in this case, each operation is defined in a separated YAML section. The following is an example configuration file. ![image](data:image/png;base64,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) ### Custom operation functions You must provide a shared library which has three functions: verification, shape inference, and selection. The path to the shared library and the library name is specified in `functionsLibrary` field of the configuration file. The API of these functions is C, and defined in `CustomOpFunctions.h`. The types used are defined in `CustomOpTypes.h`. #### Verification function The compiler uses the verification function at the graph construction stage to validate that the custom operation implementation supports the combination of inputs, outputs, and parameters. {C++} bool customOpVerify(const CustomOpPropertiesHandle *const opProp) Copy to clipboard #### Shape inference function The compiler uses the shape inference function at graph construction stage to receive the output dimensions expected by the custom operation. In some models, specifying the output dimensions is optional so the compiler has no way to known the output dimensions of a custom operation (for internal known operations, it has shape inference functions). The function receives the input dimensions and parameters, and is expected to fill in the correct output dimensions. {C++} bool customOpInferShape(CustomOpPropertiesHandle *const opProp) Copy to clipboard #### Selection function By design, the custom operation lets you provide multiple implementations suitable for different configurations. For example, you can provide implementation for float vs. one for integer or provide specialized implementation for specific parameter value. Implement the selection function to return the adequate flavor of custom operation implementation based on the node configuration (inputs, outputs, parameters) The returned string represents the flavor. Used by the Backend Op repository to select the proper implementation based on configuration information (see details on configuration information). {C++} const char \*customOpSelectImpl(const CustomOpPropertiesHandle *const opProp, const CustomOpKernelInfo *const kernelInfos, const int32_t numKernels, const char *backend) Copy to clipboard ### Implement custom operations You must implement the compilation targets (Interpreter, AIC) and register them in the configuration file. This section describes the implementations signatures and relation with the configuration file. The SDK comes with custom operation examples which show how such implementations look like, and how do they get build #### Implement the interpreter The interpreter implementation is provided to the compiler as a shared library (or collection of shared libraries). Each shared library can contain multiple versions (flavors) of implementations of the operation, referred to as kernels. A kernel is selected at model compilation time by the selection function. The developer is responsible for compilation of these shared libraries. Because the interface is in C, you can compile the shared libraries using compilers such as GCC or CLANG. In addition, because these shared libraries are running on the host computer, the developer can open files, dump results, and use `stdout` and `stderr` for printing debug messages. This makes the Interpreter implementation a very effective way to debug the operation functionality as part of model execution. The signature of the kernel (implementation) is generic, and fits any custom operation. It contains a pointer to custom op context. {C++} typedef void (*customOpInterpreterKernel_t)( CustomOpContext *ctx) Copy to clipboard - The signature is defined in `/opt/qti-aic/dev/inc/CustomOpInterpreterInterface.h` - The relevant types defined in `/opt/qti-aic/dev/inc/CustomOpTypes.h` - CustomOpContext is defined in `/opt/qti-aic/dev/inc/CustomOpContext.h` The order of inputs, outputs, and parameters has to match the order defined in the configuration file. During the model compilation, the compiler is organizing the inputs, outputs and parameters passed to the kernel based on that order. When creating an implementation, create a kernel (or multiple kernels) which has the signature as above and compile it into a shared library. For example: {C++} void customFoo (CustomOpContext *ctx) { // Foo implementation is here } Copy to clipboard The next section explains how the mapping between library / kernel name and compile-time selection is happening. ##### Configuration information and implementations The compiler uses the information in the `implementations` section of the configuration file and the selection function, to allocate the proper implementation or kernel and use it. When the target is interpreter, and the compiler encounters a custom operation, it does the following: - Calls the selection function. - Based on returned string, looks for the specific implementation in the `implementations` section, by trying to make the `type` field of each. - Opens the shared library in the `impl` field. - Tries to get a function pointer (using `dlsym()`), using the name specified in the `type` field. ![image](data:image/png;base64,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) Make sure that the kernel names in the code or shared-library match the string as it appears in the `type` field. #### Implement AIC The AIC implementation is provided as a C/C++ file. Just like in the case of interpreter target, you can provide a file (or multiple files) with multiple kernels (implementations) of the custom operation. The AIC compilation target API is similar to the Interpreter API, except for an additional thread identifier, `threadId`, passed to it. {C++} typedef void (*customOpAICKernel_t)( const CustomOpContext *context, const int32_t threadId) Copy to clipboard You can use up to four threads available on the AI core. When the compiler generates the code, it calls the implementation four times, one time from each thread, passing to it the current `threadID`. This allows the compiler to maximize performance during compilation by taking full advantage of the hardware. AIC implementation signature is defined in `/opt/qti-aic/dev/inc/CustomOpAICInterface.h`. ##### Configuration information and AIC implementations Similarly to the interpreter target, when compiling to the AIC target, the compiler uses the information in the `implementations` section of the configuration file to allocate the proper implementation or kernel and use it. - Calls the selection function. - Based on returned string, looks for the specific implementation in the `implementations` section, by trying to make the `type` field of each. - Looks for the C/C++ file in the `impl` field. - Tries to find a kernel using the name specified in `type`. ![image](data:image/png;base64,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) #### Writing tiled custom operations Custom operations, by default, are configured to compile and run on one neural signal processor (NSP). You can configure custom operations to run in a tiled manner so that computation, along with inputs and outputs, can be split and distributed across multiple NSPs. Computing on tiled inputs and outputs helps boost performance because computation is split to run in parallel on multiple NSPs with reduced memory footprint. Do the following to tile an operation: - Configure the supported tiling axes and alignment requirements for each custom operation output by setting the fields in the `TileConfigHandle` data structure available through the `customOpSetTileConfig` function. This step describes two things: 1. Axis along which an output can be sliced to form tiles, and 2. Alignment requirement for each axis that should be considered before slicing an output to form a tile. See `/opt/qti-aic/dev/inc/CutomOpTileCon8fig.h` for details. 1. Provide the mapping of each output tile to its corresponding input tiles using `customOpMapTiles` function. Compiler uses each outputs `TileConfigHandle` information to determine its tile size. The tiled outputs are made available in the `customOpMapTiles` function so that you can provide a mapping of output tiles to corresponding input tiles. For example, if compiler splits each output of a custom operation into N tiles then `customOpMapTiles` is invoked N times, once per output tile. If the parameters configured by the user in `customOpSetTileConfig` and `customOpMapTiles` are valid, then the compiler tiles the custom operation, otherwise the operation isn’t be tiled. NSP cores on the AIC hardware don’t have a shared memory. Due to this, when an operation is tiled, ensure that all required input dependencies to compute a tiled output are mapped accurately in the `customOpMapTiles` function. #### Request scratch memory Custom operations can require scratch memory to store and load intermediate computations within the kernel. You can request scratch memory in the configuration file under the Operation Info section by specifying the `name` and `size` of the required buffer(s) as follows: scratchBuffers: - name: scratchBuf1 size: 1024 # size in bytes. - name: scratchBuf2 size: 2048 # size in bytes. Copy to clipboard - Scratch buffers, allocated by the compiler, exist throughout the lifespan of a custom operation function call, but the content isn’t preserved between calls. - The compiler tries to allocate these buffers in the device VTCM. However, its allocation in the VTCM isn’t guaranteed. - Scratch buffers are accessible only within the custom operation implementation through the `CustomOpContext*`, which is available to every implementation. - Scratch buffers remain untiled even when the custom operation is tiled and the requested scratch buffer size is available to each tiled custom operation. {C++} float *buf1 = (float *)customOpContext->scratchBuffers[0].buf; int *buf2 = (int *)customOpContext->scratchBuffers[1].buf; int buf1Size = customOpContext->scratchBuffers[0].size; int buf2Size = customOpContext->scratchBuffers[1].size; Copy to clipboard #### Configure the memory for the AIC backend VTCM, DDR, and CacheableDDR memory locations are available on the device. As shown in the following example, you can use `memoryConfig` in the YAML configuration file to specify a memory placement preference for each input, output, and scratch buffer associated with the custom operations so that the compiler can prioritize buffer placement. - implementation - backend: AIC type: funcName impl: fileName.cpp memoryConfig: #DDR/VTCM/CacheableDDR: [] DDR: [inName1, outName2] CacheableDDR: [inName2] VTCM: [scratchBufName1] requiredFor: [inName2, scratchBufName1] Copy to clipboard As shown in the previous example, there are three preference lists available (`VTCM`, `DDR`, and `CacheableDDR`). If an input, output, or scratch buffer is listed under the `VTCM` list, compiler tries to place the listed buffer in the devices VTCM location. However, the placement in VTCM isn’t guaranteed by the compiler. The same holds true for the entries in the rn whenever your preferred memory configuration can’t be satisfied during model compilation. If placement of a particular buffer in the specified memory location is a stringent requirement, then you can add it to the `requiredFor` list. If the compiler fails to allocate a buffer that’s listed in the `requiredFor` list, then the model compilation fails with an error message. Altering the default memory configuration can change overall performance of the model because the memory locations are also used by the compiler for other operations in the model. Use the following guidelines for better performance: - VTCM is efficient for vector memory accesses. - `CacheableDDR` is efficient for scalar memory accesses. - DDR access is relatively slower. #### Synchronize threads on the AIC backend Custom operation kernels on the AIC backend can use four threads running on the NSP. You can synchronize all threads, if needed, using the sync function pointer from the `CustomOpContext`. customOpContext->syncThread(threadId); Copy to clipboard Execution waits for all threads to reach `syncThread` before proceeding. #### Log messages to the AIC backend Use the `printf`-style macros `AIC_PRINT_*` defined in `CustomOpLog.h` for logging. This allows runtime logging on the AIC target. For 64-bit values, wrap the argument with `AIC_LOG64` macros. AIC_PRINT_INFO(ctx, "decimal num: %d; unsigned num: %u; C-string: %s;", -1, 0xFF, "myCustomOp"); AIC_PRINT_INFO(ctx, "int64_t HEX num: 0x" AIC_LOG64X_FMT, AIC_LOG64_DATA(0x1122334455667788)); AIC_PRINT_INFO(ctx, "fp32 num: %f", 3.141590f); Copy to clipboard To collect logs automatically, run the QAic monitor service on the host computer. This requires to issue a one-time command on host to start Qmonitor: sudo /opt/qti-aic/scripts/qaic-monitor-service.sh start Copy to clipboard Different log message types are available: `AIC_PRINT_DEBUG`, `AIC_PRINT_INFO`, `AIC_PRINT_WARN`, `AIC_PRINT_ERROR`, and `AIC_PRINT_FATAL`, each corresponding to decreasing level of verbosity. Compiler option, `AIC_CUSTOMOP_LOG_COMPILE_LEVEL`, controls verbosity level which can be set to: `AIC_CUSTOMOP_LOG_LEVEL_FATAL`, `AIC_CUSTOMOP_LOG_LEVEL_ERROR`, `AIC_CUSTOMOP_LOG_LEVEL_WARN`, `AIC_CUSTOMOP_LOG_LEVEL_INFO` (default), or `AIC_CUSTOMOP_LOG_LEVEL_DEBUG`. All message types above given verbosity level are filtered out. You can override `AIC_CUSTOMOP_LOG_COMPILE_LEVEL` using the `compilerArgs` field on the custom operation configuration YAML file as shown in the following example: implementations: - backend: AIC compilerArgs: -DAIC_CUSTOMOP_LOG_COMPILE_LEVEL=AIC_CUSTOMOP_LOG_LEVEL_ERROR Copy to clipboard Logs are collected in the `/var/log/qti-aic/QID_\` folders, with each AIC device having its own folder. You can add a maximum of ten format specifiers to a single format string when using `AIC_PRINT*()` with the AIC backend. `AIC_PRINT_*` macros map to print when a custom operation is compiled for backends other than AIC. You can configure the log verbosity level at runtime using `qaic-log` tool with `-c n` and `-s NNNetwork` flags as shown in the following example. /opt/qti-aic/tools/qaic-log -l -c n -s NNNetwork Copy to clipboard In the previous code example, `` is first letter of log level, that’s any of `f/e/w/i(default)/d`. For more details, run the following: qaic-log -h Copy to clipboard #### Data type support Custom operations support various data types for tensors and parameters as listed in `CustomOpDataType`. The data type of input and output tensors of custom operations (`CustomOpIOtensor`) can be one of the following types: `float`, `float16_ty` (AIC backend only), and `int8_t`, depending on the selected compilation option. `CustomOpTensor` is a `float` type when the model is compiled with float precision. Similarly, when the model is compiled with the `-convert-to-fp16` flag or using a quantization profile, tensors are `float16_ty` or `int8_t` type, respectively. Using different data types for tensors is > > > limited. You can also use `int8_t`, `int16_t`, `int32_t`, and `int64_t` to represent index types. Tensors aren’t quantized when index types are specified in the input model, irrespective of the model compilation options chosen. When model is quantized using a quantization profile `CustomOpIOTensor_s` are quantized using a scale and offset. You can dequantize input and output `_CustomOpIOTensor` data using the `scale` and `offset` as follows: `dequant(x) = (x - offset) * scale`, where `scale` and `offset` are accessible from `CustomOpContext` using the following APIs: {C++} float getInputScale(const CustomOpContext *ctx, const int32_t inputIdx); int32_t getInputOffset(const CustomOpContext *ctx, const int32_t inputIdx); float getOutputScale(const CustomOpContext *ctx, const int32_t outputIdx); int32_t getOutputOffset(const CustomOpContext *ctx, const int32_t outputIdx); Copy to clipboard Other software components, like [AI Model Efficiency Toolkit (AIMET)](https://github.com/quic/aimet) or profile-guided quantization (PGQ) profiler, can represent quantization parameters differently, but that doesn’t affect how custom operations represent scale and offset. #### Capabilities and limitations The custom operation code can use any basic C/C++ functionality, including control code, loops, etc. In addition, the code can use HVX intrinsic for using the embedded vector units. The code is limited to run on a single AI Core of the overall number of available cores. When implementing AIC, there are the following limitations: - Typical OS services don’t exist on the hardware. You can’t use STDIO to write logs, open files or create threads. - Dynamic memory allocation isn’t supported. Only static memory allocation is allowed. Avoid using `malloc/new`, `std` data types (like `std::vector` which requires dynamic allocation), or defining arrays with an unknown size at compile time (like `array[argument #6]`). ## Compilation As explained in **Compiler Tools**, `qaic-compile` is a command-line sample application, provided in the Apps SDK both as code and as prebuilt binary. It supports compiling and running a model. For supporting custom operations, a new command-line option was added to `qaic-compile`. -register-custom-op= Register custom op using this configuration file Specify multiple times to register multiple configs Copy to clipboard Here is an example for running `qaic-compile` with a model which has custom operations, and providing a configuration file. /opt/qti-aic/exec/qaic-compile -m=./mlp_custom.onnx -register-custom-op=./CustomReluConfig.yaml -aic-hw -aic-hw-version=2.0 -input-list-file=input.list -write-output-dir=./ -write-output-start-iter=1 -write-output-num-samples=1 Copy to clipboard ## Next steps - End-to-end examples of custom operations are available in the Apps SDK at `/opt/qti-aic/examples/apps/custom-op/`. - When writing code to run on AIC, you can use the HVX intrinsic to use the internal vector units of the AI Core. For more information about the HVX intrinsic, download the download [\*](https://docs.qualcomm.com/doc/80-99100-3/topic/index_custom_ops.html#id1)Qualcomm Hexagon V66 HVX Programmers Reference Manual\* from the Hexagon NPU SDK Documentation <https://www.qualcomm.com/developer/software/hexagon-npu-sdk> page. Last Published: Aug 25, 2026 [Previous Topic Advanced model techniques](https://docs.qualcomm.com/bundle/publicresource/80-99100-3/topics/index_Advanced-model-techniques.md) [Next Topic Model sharding](https://docs.qualcomm.com/bundle/publicresource/80-99100-3/topics/index_model_sharding.md)