| # Microkernel enumerators |
| |
| XNNPACK frequently needs to define code for each microkernel, such as tests, |
| benchmarks, and declaring functions. To facilitate this, XNNPACK uses a pattern |
| where a header invokes a macro for each microkernel. To use these headers, |
| `#define` the appropriate macro, and then `#include` the microkernel enumerator |
| header. |
| |
| For example, to print the name of every `f32-vtanh` microkernel and its batch |
| size: |
| |
| ``` |
| #define XNN_UKERNEL(arch_flags, fn_name, batch_tile, vector_tile, datatype) \ |
| printf("%s %d\n", #fn_name, batch_tile); |
| #include "src/f32-vtanh/f32-vtanh.inc" |
| #undef XNN_UKERNEL |
| ``` |
| |
| It's good practice to `#undef` the macro after including the header, to avoid |
| accidental contamination of other macro enumerator header usages. |
| |
| ## Adding new kernels |
| |
| The microkernel enumerator header associated with a new microkernel should be |
| the only place where manual edits are necessary. After manually adding the |
| microkernel to the enumerator header, tests and benchmarks will be generated |
| automatically. |