# Custom operations (C++)

Custom operation allows you to add an operation into the graph, which
is unknown to the Cloud AI (aka 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
prior to 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

There are 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 is added to a machine learning model
and the model is trained. The resulted model trained is stored for
inference - either as ONNX file, Torchscript, TensorFlow savedmodel, or
else. 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. In order 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-exec**.

## 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 make sure 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 is 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 is specific to custom operations, like the 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 is 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,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)

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. In order to
do that, provide basic information about the operation (name,
type), as well as describing 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 afterwards. 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 `params`.

    - 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 is 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. This can be used to specify
additional include directories, compile time MACROS, and so on. 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, as well as 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(CustomOpIOTensor *inputs, int32_t numInputs,
                           CustomOpIOTensor *outputs, int32_t numOutputs,
                           CustomOpParam *params, int32_t numParams)
    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(CustomOpIOTensor *outputs, const int32_t numOutputs,
                               const CustomOpIOTensor *inputs, const int32_t numInputs,
                               const CustomOpParam *params, const int32_t numParams)
    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 operatopm 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 config information).

{C++}
       const char \*customOpSelectImpl(CustomOpIOTensor *inputs, int32_t numInputs,
                                       CustomOpIOTensor *outputs, int32_t numOutputs,
                                       CustomOpParam *params, int32_t numParams,
                                       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 onwards 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 array of input tensors, array of output
tensors, array of parameters and a pointer to custom operation context.

{C++}
       typedef void (*customOpInterpreterKernel_t)(
                      CustomOpIOTensor *inputs, int32_t numInputs,
                      CustomOpIOTensor *outputs, int32_t numOutputs,
                      CustomOpParam *params, int32_t numParams,
                      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 params 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 (CustomOpIOTensor *inputs, int32_t numInputs,
                       CustomOpIOTensor *outputs, int32_t numOutputs,
                       CustomOpParam *params, int32_t numParams,
                       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,UklGRtgaAABXRUJQVlA4TMwaAAAv/0RGAD/EoJEkReff4OtgnNk+1oCgbducP8yj2P60YdQ2kqThz2fYzPPa5ZCqzL/atm0Yp8z0G+mMKAEBAZQTqGihUE4ICEQrWgJOoFDRQjlRfrOMUyHjdwIlINApe1+0UKiRhpqAS4Ohy0wys3UlmrwXLXdaZzn/dv3P/T7X/10813skFrf9ct04mQRMS9ZpSjXFmJq2qXQSL71FlMWb4DRaCt2E3mELu//3nd85M1eyZZULWnnOjI7Gq5mI/suibatqq8Wtd5jSdJ8TPCKRR/N5U+cvzf1n7j9z/5n7z9x/5v4z95+xlz3zONCTX3ce2NkXeS0NI67Z1POjkTMKKPLJZZTdm7ZEGFZBZN0bOD1w8HqGzYMCyYci++3iWju2HAK3/PG09TDzDRERxrDBuabMutkU0bAsrw2DlZU0WljppodfWB4Uie9arveGwWz7sV1ZMCGP5OsV+cvqphWpbu28hpflPVmt/iLrTRXZ5Vkt4GKWCiRESSp/aQSS6mndTbJ4ENSrxJvS/s5CFo3aPen9JTX2BpF1JbZSGUQVAML3e2iP7FI3lMojoluuzdpC9AVRqm9F81lbGNdokqRobWmcBJ5h6e2JLFacqwlWXmLEzGDZl103CxERAr0s32ok/UVoWnMoCEmVEYisUOWaQJopd1D9aimJqN23CkjbXiAwMlAVgMKV2rMibnBVU3fWImWLYyXFXjYTfSLJBbpqRaiBCiychxccPRSz4lyN9XYQy4mZxbJyIxLCHr0GXjRxub4mauNPXK5tKN2TFX3Yhp0dG5IeZAQyFGsTuajdlEVY7sgeqg9Lkd1q1Ta8thmW2gisRXpoKyMDVWF4g8qsZVGWKgtrwNoGzuBqRdhNsuZh9YkUJyvR5ToS16wlBRAI1vZEXqtLkQYSblX2q7WYczV5uV6rZZcTMxPeFJG9LYpIXS53MIARLSspFBt24OJ9xQgkoMA1Qmt/AWtxIA1CIwn7BWUlCyuDOykQQWAzWIEGkFgKFdW/gABNEnk4fV6bIrJYVcIKXoAg/OlCpDDsW9mVdzVQ7cX6Jidm9or6PLx8MIhsMSy9WZF4yLD0oRwx1vuw483C5+FNbb7BsPKHGLIFsK7Gf6uFpNqImdWyJaJ1WSAi9qpawqYNIFCVqsvUKKhBdr3p2dDUS7LDCPRhpy57soALZALucJF1j8QrtJWRYUExaF8iO2sJlgeXUaSyWbC+7IDVtxKJy+bHrPa6+ZrVFW0gJa6JsoCd6s2erO3Oa5yroapatNpgzYmZvSal9x3+hXuDQmyw6oGKldiUNr1ZFvIeCSPQzZ5YHfimxooB0mJJ2CG2o61UBgIWLVH4mlgnD9KarLqfyIe/EH3MGys9lLxCIxbENRX9vnuTL9TQHdbVRQqRs8mImcWmSO6XSQsJW3+x4XKB95fsikTufpKeJEKUdQO279G7VbgbTyw90Ib5egtZVCvPYtWTzUJKj+ketxMsxFYqA1SRTSPcWtUQ1N4VZFkl0dqq3x3Y3ZPVLtFXd4lnVknWO9YJa+tS4hpyXw1KJvzFvhUEnmLuK2JdbTcgIuxw/u9CJKQM7d5q/HXAciSl/5tEGt7QDFHWAFzAd/7S3H/m/jP3n/nOfOvVGVn61gQz6t3OjCzJBMPGjCzN/afzx1pi94chLziWLEQgDY99WXV/GMCCY1ctY6OMKfQ/1+zxpSs3e4Rs0mwR54Jjh8HWcrkcO9g2G2dBdzEiB5Zi90QENcwg8VpwLF0s7L4Iv7QUuljaXpH0IOK5tBRiBFiTZDOsk8jauV7Zkc22uas1B9nuifStwrMvSYY9Sp1NIrLjgiwWlsAtGXYlSWgKDPU18VtbbE+k3rQlC7IUKHWtV/a4wecyu9IQ2whltIbZJVsuyGJhUQi7ZNiVpFIXknp1IYU8vM8tSNa5ttiFrGF9emFdlzvy2tKxXtnRyYERq0JfglDaFxF77RyNyF0QR0Xqhqkq7ivqFIVNlJnphiwWFmGXDLuSfaKlyIrCLUiWWVsstwSUhWwuqy5ERJzrtRuVHPRFsrHfO9tooJuXokgxoQFk2G8VZ4VUkydhNsnC/TBdLCxl358t8uYMZZ9nUwSqmyoyutk29N2S/kHzdAANn5obCvNuivM/zV5klZkkPguOpYuFxYUjMuuI9YVZkCwnkFRV9+QvEq3GB5frUU2GUwbGVSmUgmoslSMPYJNfkpkkXguOZRYL+7hVwSyd1hu6IFnXGmsbdvDtmb1RvsnKXTJLZiC62vGSX4wts8mN14JjucXC7stftrj7ah6XNWEt0QK32DALkmUEks0ywTP1GvG7IbnXK7uWOPpgWxNfitkEQjW1BazimcjDx17abx1aR2KWl2z5wDCqkUbaqFZSaIdEaKaM7h+blcNkDKN/3BmFO2zwVkL4nUYqPlFtuQGFohuzfVayHjvG3Zq1s1wuxw9K149scvdv3Om5/8ypw+TDSjXdJoLJh4NrNl3xJKWuE2cHhl5qw39aiTK187Rz2Clmo1ME1DKzsQpEJIASFFEYrlxTFbl0TWy+hch/VS/LJXJhfVFVrzZc1IWqLkQ1OrDyFiKgFsTkg24RL0WbL2FzYzYB0SiilCtXRS4VjtMoUhZko9cuNiE1wm+xsTWKaOFYNBFaTu2/eGK1XbJGdos4C/krqQ1qAipUQAEmhHJcORERIZwUlGY3RFs5sdh0CWK0SCxWFgnhBzMPPvjMuJDuPxoPQ5gtB7Q2mCIKMRsMNmK6WDT7CPMUV095IgnWGJYxEp9G1D4L4dXz58aDtKxHhZQkfW6wwM/pYpbFzpjw8qUjw7bZsFfZfdzJA9nBQEuIuHPRmxKJSsWdk+bhrhFyYJ+DZtnALKbPZjmBLPAWykVtiAsMq/GUyXIiDjyyCM0iNsJ3jcgYX4N9og0ARWy/RJ/o5JpiDr16ER9WzKun8HN6It6QN2AEsqvaLzlrujuMjoJZun70U9ePbdP1Q2TuE6Z04cjmMJNN6LTRclFUBxlt6vIxVdjZ1mkn2yaISKgiSgYIECkA96cjFK1WQDHy0gaIE+nDvb0ZlGRYSjP5kxKsKqumGLafWQDjqjUB7Ys6toIv+zCIPnJNpmsgxBWzYoqDbn2JQQMMNJsOOerlDuulSl4JHZ49aRJG7FGn9tAAFYEdGTmhtmJlqYk4cEA1FSUlq9RkZkmlRSQp2TQwy43ckIDmoMKax1AiEx6yLQJVfUix5YVDhBBbPTAKxpThTZKXbPDzlnwIrlWqCT7xkR4GiZR5gaMouow8PMQ06W345YD3Iy3Jho4MBSYWlJWVlLOUBJWmCGr5nWJ4UiRHayBLLWWPlHGVQJpLBk5EUVHdJEXRZviIHHJEXFBhVEE2UxGUEpOF/OkILqKIghwGJaAgB5qxbFIK1HDHMvpGfJsxspGIchTjizIls5BAWUGroWWCCNYSjeRGBikRQDGBb3nJTKStprJkK4zTjqahe1BHSslE145mVmdKBZVmrNWSthrwSnEEUJHssCeDPBQIcqQw8S/mRkiizUCuJawXDsZIpkEJtATiXVPBpkZOAFhrc6xWDqeSvuDWnZMozEHsBsuYBxqbTXtEjOQxC/LaluTRjIHFpBS2+hOjExAQEnMN0Cgo0G4Cp9NGQQL5lYZXvuUlk4AMRYYjGyJE4dqkMqZFKIIZGmS4KKciYmF1QlTWyIC60DeRflHjgtMek4lAsuFAR3Eb9nI7Rs9NgagZHUi1kdtaC7DWZlCpvMqYBL2XwkSJyUAxwY8YvYB8LqhCUxxI1jEL+oL5NWMUMJMnOSFBCLE6+ZOnKVDSSPwCU5iS5xAtPGo1JKpdqTryTNm4R30lMDoZHwQ3MblPN057IlhMBHqQQACDQp2QCCzeQD4HxXEIJdbarHhucpPiJLlDajRY/jRaAS5IIS6JwXGQW2JiSnOBwMyRM4ndOi7BhhfParzamlXbTTKCMBEiKwONIxUNZIiJUIDAEvDXMiQwjQZ10J1iKxIhmOqmGikE6k0fe5KiQG8igzWJKDBpox3Bl8CjtMJgipvQ7E+QVBEJ9LhVK8KNVGi34clGCsjJgroSaq3QIMYi0T7R+Age84UlqRsoPaklGF4xAjkgwkEcgYtqDMS0wwAW4EFABLbEcR5SlUMNSJcwIfY73j4i5Wds24kRj3sW9jqUBkgfpBhCNhiknIhGahjAfS8qDecEMMYFMY3YnFVa473D+Mu5w9lDoQIHR1Q5PIA4B4wpsywk8llUOFKhoYGJVbbgBEWt2lASrTRxWYKbaiBmmeBoecnsDYks2cpLhYExLYJLSntoliTgycK11RgS1si3qiNLYWAEBlN9oOcc651ihSWPshCTE3hBgmkPeZeGUUk0aQC3BJNnVkg04tuMoUYiCGHeYc3M1E4i1Ua6PqNDmYXPOAE9IB10EGkYRhRtJTCm5Q1HHBWh7ikbAyFmYqX9BYW4NFm/sq4Q0JEZeziIQDC4epENxnPB1wdSchxdkpyAs9ujBV4DVmUg9z3hOarMWMcdPLJnXp+47FUtHFEpa3tvdkSoKqOZYDa6FBxRh5JUD+1Gpg5Mpccd/P/3FONNaRtP+jo28d7bZ+EkHWd4yrxY3jNj56U0SILZPvYoRuTPzz3Q4SMZSK8/fetxOu/SlJUgIoFUkDLETSOKFFOoHmaQX+z7FAGTKNyAvjgyL/6CSEck5gfwrfALrDhuwOBMelVpUZOPG+4xJP3zwoeP1XmXjhDeQxrh7YbkMBgSTBfEiRfBfuol0oE1okjOlgpfECUzO8hvhm76HpAu6szIbAVlpEacYwBfoUd4UtiAKqZTbTl+NrdRROSXq+Nz3iXfY8e/VGkeBvwQDLHNFExaRXRIl0Xs2BSD8VGKk9sO23/cFKYLfDGoJmZy/33sk0KrmdvhASsoOWKPBhDIDWBEzCqKR4jFMa5xkuOE1fsfeuqL51/muHDHaJ13aSTSVk6lCooJQ0JRocYJlGwc43CIkmtfKUx7YzFkzDlIDNEePa0IVCDotUSECeuBXtoJ4hrX+Bjg1ns+/MSzz73w09//4/SH57/49CPv/xPh5+l4nXeJ1xSxaBYYDIZOwcSVVO8pmMSqZI+RHAv4GgUyTTZgmHtGbFe4rRzkFXNMwUQLf3FMwcTF7Ww8fFQUigEnGV9l8HWanDYOcGw5B82WqysMAVL8vGBP0hauqjDauWP7kU99ee+Hv/nHW9eff+7zT6TeLdTSU+BvT73zmJ13idHEQUssxNjIl1Sl4Tk6K8HReok4L4PeRASS0koghpvMyzGx7duCBWoT0UGjINuXISqJ2+gat48KxlhOMnoX5OU6cYEFJ/bdO3gsanKjeSAk9aGaSsiGR0we2bz77g8+ar77gzf/+Oefv3j+3FMff+9tPpb+sOHf3x7wT5Pox4TOzzHnJ3Ja5ElOSOThIgFTXIi2agJTFQtMUTDZIVoYmHYRql2pOvJM2bhDG6/Jh+gVy3yuh7Oh9jtGrFYi0IMIAnymYILg7w3kc1CIimJAF1CdsEermwzun7SAowYfj1C3YLKQs++21cEA51smix8p0sJeI4NRbpB3ojjgociNazw6eduZ9z38iS99/5Xf/vP0RhbzWLqj3Y3VF4yc3HfszrvEa/IkmOqmGjSZC6ZEOMokGBTojfJyMlGgUdoRfAnWJajPG9HsRpr9iQulTUjalBmoYCh5IhIeC7T7sEhshJQ2BDhEA7TvIHQAXzaiGGJthoMoQ2PRyOOWez/0xDPfefFnf/rDGy/0n3n0g3e+e0D9jr/9Vjm25l06bEDpGwREYEscp6RoNoYE//DggJNCnUqMu5B1dPe7e/vt7zv99Ncu/OS3f//VK+svPPWxrTODfiJ54D3H87xLnCZPigkegDDXDvG1lUihAgdHMhvDgqlWaPIDlDpg7JoOc+b+jz357PrGL67/7ifPf+2zj35g9Y5xa94lVlMxlbTTaGayJCsqo82kzRs9Usm3giNLZmAEiik+MKefAPaCy5yk6ARPQsaHgtdCZsPlI0DASkYycUus5ASWprW8484bp89884XXfvfXX7y4fvaJj9x769g27xKrCW9GyZbSqKdTMKEMrSTyJ+tizivoWUnM7TscKJA02bghcqxJAgY4u86QV8wBmhg8sHrAdh8fFVPB8Yxk+ioTnSZPV8cdvPnM+x586kvfe+W3fz/90fe/8umH421vG3C/kxGfcOfoJK8Q7XNZPArTWdO+ljEV5Za7P/TYM/0fvPGnmk/T9cXq7lu4fndjPFXlOMCEaSY/vO19D3/6Kxd+1FQyb3zvS0+tt87czPQ7Hp85iikYks4eDUSmeLTuBPzLf/zrtee/+cyjH7jzHdOecfenl7TuBHwHN+9IV43WnYCl08aZBz6q57w7AXdtYP+wcr166HnPHemxz3z1wg/f+mc9WZTg6ATcheCsGTZX/tuKq0UOcbrtvfmpc+df/vmfb7x5ej0/8dH7znA/1mVjdU/Szz/3/E/f+sdvfnj+y596ZJsdyXls52B7qstL0D1J+xvY08jUKJKooMCPy34JPt6H/+hF8uE/KFxRq6oq+ylY6cWojSqrgsJ/NlZy+ZrqUILx+v2PPP3F8z/85T9+f/2F55594sP3cHO4jVhG37xLB9BbbcC384VY45HqZGb6bdx+dsBzRPl5fGLfZJuvjx3Isd97jND1kkA/GKGrDPiRuFy2G8enYGVj86l95CQysJ+NVbExmvm3fuLck+3m471x34c1f/sHr//+b798+fwXn3qIX8HBGMBLfeGH16sHA77BmR1ewVG2M4zWN/CYn45UNw+TPW4YVzJwQmjEBZcT2t5l7eXxyRzS05x0O4fvBdpRHxMTQhnIpyZEuBypNL1EtF26Rj4SEuU/GyvIrij51u8am56/xck770hnP/XVvR++9Y/64wtf//xjqcet2uAYYCTOuySaRhKtO8xkKizpMBFNE/vDsW8FELJKMZBYrl1yAB+FGsNJQQkOFjRYM58NEwRg0GXBL5EXyfsoD3z8yXPXF2/+OawX1/Ppxx9IwqTjgxE575LExIXTmKNJpBXG8Qc7One4yZQkUxuqSAHrlZs0KZMobV3BUonWSH9BTrzAaBidmqkD8aWR4gq3maWQUWMYs0ELOpu+kMF6awget3ZPjpCf6ycHqK8FIEUvD5V7DE3Pff35VVPJ/OHeV2+c3b6Dm53oGGI0zruEyquSyBwxHlnj1SJWilpj+Cz8ZEo5kRYbMuxVwOpctrpwdC3itMh/1UYU6q7U3MAJxOOAwEz+xG4qEwY1eW2I2ZocNPmSQWsH7HH6VydNlARTpFBiZI7KFjsknlrYT8HKE9QAChdkRxqeYHhFP3wfuyaN44uROe+SJBrMNPNBvWDMt4Y4L+lZG1ljxGReU1YQRyNn9moDIPYnpVM8JCLQgwwCKAFrl0Rg9UUhHw8J3KBp4B5PcXLcocdfJFcf9IwelTRoR0VOIQu+haINp6f4sVidRvZTsHLhziI0y6nl8wxP2pfv+GNkzrvEv4UrlsS8K+tCvUDnJCMCFEuwKlwkMKsyMNE1K5pMiSjQm8RuJBogmLzRCuMFyBm4x0OjbHLsdxINFCnSylNUpKAcLPFRhf5TzKFKHsZvqEb6KVh54vhsrKSo4pc8wPDh45BROu8SW31TApkkeFBgIwFCA2HyQBp5OgiIwAHAuLt5riExBI8XI2Gi7HdHqyGmHCU/vshkOQYZrfMuUcM4rM0DgcQzzRwg0hOija06o2xwKgMVODg0yrAYisc1T5b0VY4et7yMX7eNTo7BeZcYQEQiV58oJ7TfwTc2SAsnQ4Wg6SYouiKTuFkcWSpHUKZm7AWJnQpmey4/S7MLrAhXwzMUj6uVXWyhmBwx+Qgisv30uSdviIw6jt15lzirY0SI8bk1MRMrrEaE+iT7PSyV1okFdRTmFiH+YSrESPBBklWViNur+2YxkJ156PxJTgbv8YDmVVMnrXFnRlM6HhjpCQlD1z60t2JHfr0tJul4kNPoX15rx4DRkYohKRz+cWemjUwjxh2c90A/er1FqLlrhsYBEkx2kIYz5Bw0iKdOEf2BUnhUrbY86LvJgimdsZ1Mws1UARPaSNrmSp5MF4l9ZpTfiH2fYs5GlLBtCgds6IjAmgGuJzsZjbfAhTXtMOYYsdcBc2NYNMIFY7UaiOhxCdrhbBhEh1y2ONRhGb+hQcsAzuEpyhQS7ItesB88DDdukj+2Jzo8XpyQ0XjJpkD3eeeIvQzQholmKmMdHXOEEe3D+DvvUjUZ6o+DvJzQLEz5E8kORZ63dqc0jYTWIwMz5kc2XjvMw0mtRCdEJ0DUB1P4HusRe6xDhFds9CQHZFIumLCiKWP0vEtKguJhwVN1nHJSEBsOW1GM3yYYyQwoS7PHiB2FPfpSZMbaRKpxiB6/512q3M9nI5K4CYtIcwqJrvTKIMIVf+R3qMeIIpQabLidNiMmu4GDMgwN9njnGL/nXcqGi/pEccbxBMEqLF9oWlSrwVU4TOA8xpTQiiU0RUqecjK4HUnqAagnaGoIZtubpERlwZ3IW8iIHrvnXaJVWDbIopSslJhBBjgG4qlmT48ximJMKiid2jnlhGbJ7bLAAQ7XW9mqyFhz0SCBhGbmwkwceGTZ4Mcats8LGqjo8XveJWaDSqytBMNYBQm16Abg4zGegNf81KTQqJqCbuDOGk+Yxish7VnJMZIvKirwTAVapPwBkcLIrxtIhfYvInocn3epmNCewl2Zy2CoWJC4Ku2UceMbiY/cuAsTyLxLYCBqd6OstZIAH4/xaEpmw/Xw7IGJYt6lgsE1kCyZg29OydmaTlpHkq/HiKJswHBWX0yzBiaKeZeImaAqQSMKg6M5JYES5rb61MJjyToK47MpDB2kcQe3TThKpvU7eThaCWI3D1Mpwei0n2nAuINz/5n7z9x/5v4zX5dg+nQ60dz9o/u3M/efuf/8bxDxzR+OB2kdZ/bc+r5xId04QhTz0oyJsTEdpU0woeOHmO25/8z8ibnrh+TY8aOfpOOHdv+yzPslmNBJoks77ozI3H/m6RGMdP42Wrp+xDz3n5k/OXb+7juspuNHUen4kbp/Web+ouX//Y07I3P/mefHzowsTTDsvTojS+tl5y/N/WfuP3P/mfvP3H/m/jP3n7n/zP3nfytYAg==)

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 CustomOpIOTensor *inputs, const int32_t numInputs,
                      const CustomOpIOTensor *outputs, const int32_t numOutputs,
                      const CustomOpParam *params, const int32_t numParams,
                      const CustomOpContext *ctx, 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 execute in parallel on multiple
NSPs with reduced memory footprint. Do the following to tile an operation:

1. Specify tilability of each output of the custom operation by
configuring fields of `TileConfig` datastructure accessible in 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.
2. Provide the mapping of each output tile to its corresponding input
tiles using `customOpMapTiles` function. Compiler uses each outputs
`TileConfig` 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. Because of this, when an operation is tiled,
make sure 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: [<comma separated list of in/out/scratch names>]
            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

Loggin is available through printf style macros
`AIC_PRINT_*`, defined in `CustomOpLog.h`. 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 run time using `qaic-log`
tool with `-c n` and `-s NNNetwork` flags as shown in the following example.

/opt/qti-aic/tools/qaic-log -l <log_level> -c n -s NNNetwork
    Copy to clipboard

In the previous code example, `<log-level>` is first letter of log level, that is any of
`f/e/w/i(default)/d`. For more details, run the following:

qaic-log -h
    Copy to clipboard

#### Datatype support

Custom operations support various data types for tensors and parameters as
listed in `CustomOpDataType`. The datatype 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 datatypes 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 cannot 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-exec 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-exec`.

-register-custom-op=<config-file>           Register custom op using this configuration file
                                                Specify multiple times to register multiple configs
    Copy to clipboard

Here is an example for running `qaic-exec` with a model which has custom
operations, and providing a configuration file.

/opt/qti-aic/exec/qaic-exec -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 on 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 <cite>Hexagon NPU SDK Documentation &lt;https://www.qualcomm.com/developer/software/hexagon-npu-sdk&gt;</cite> page.

Last Published: May 01, 2026

[Previous Topic
Model architecture](https://docs.qualcomm.com/bundle/publicresource/80-99100-3/topics/index_Model-Architecture-Support.md) [Next Topic
Model sharding](https://docs.qualcomm.com/bundle/publicresource/80-99100-3/topics/index_model_sharding.md)