onnx-mlir/include/OnnxMlirRuntime.h

117 lines
3.8 KiB
C
Raw Permalink Normal View History

Cleanup rtmemref api (#238) * Detect llvm-project commit change in utils/clone-mlir.sh and rebuild llvm-project for zLinux Jenkins build bot * Cleanup RtMemRef API - use forward declaration to hide private data fields - RtMemRef.h: external user header, C/C++ - _RtMemRef.h: internal user header, C++ only - RtMemRef.hpp and RtMemRef.cpp: implementation header and file - add external APIs OrderedRtMemRefDict *ormrd_create(RtMemRef **rmrs, int n) RtMemRef **ormrd_getRmrs(OrderedRtMemRefDict *ormrd) int ormrd_getNumOfRmrs(OrderedRtMemRefDict *ormrd) for creating and querying OrderedRtMemRefDict with RtMemRef arrays - data buffer installed by rmr_setData() will be managed by user - unique_ptr<RtMemRef> must use custom deleter <RtMemRef,decltype(&rmr_destroy)> * See if I have write access. * Remove test CMake code. * Use new API. * Format code. * Format code & rename variables for readability. * Remove used API spec. * Rename OrderedRtMemRefDict -> RtMemRefList, _dataMalloc -> _owningData. * OrderedRtMemRefDict -> RtMemRefList * Update KrnlToLLVM.cpp * Trigger Jenkins * Restart Jenkins * OrderedRtMemRefDict -> RtRmrRefList * More OrderedRtMemRefDict -> RtMemRefList. * Format jni wrapper. * Rename API functions to maintain stylistic consistency. * Bug fix. * Bug fix. * Format code. * Fix RtMemRefUtils. * Format code. * Using llvm function naming scheme. * Rename runtime api file name to project name (onnx-mlir) as per convention. * Include the new runtime header file. * Reflect api header file name change in build script. * Bug fix. * Remove C++ code. * Revert "Remove C++ code." This reverts commit b217dfabae99e42db30721600cb5507866d4dc98. * Clarify memory management responsibility. * Add constructor to specify name & data ownership. * Include stdbool. * Remove dictionary semantics from RtMemRefList * Bug fix. * Format code. * Format code. * Use macro to define database of metadata. * Prevent formatter from acting on metadata decl. * Nit. * Restore backend unit tests. * Use spaces instead of tabs for better formatting. * Use explicit template instantiation. * Update RtMemRef struct doc. * Make runtime compilable both in c and c++ mode. Build two versions of the runtime library, one c version as the user-facing c runtime, and one c++ version as the one used inside this project. * Bug fix, avoid stack allocation for output rmr list. * Change _dyn_entry_point_main_graph -> run_main_graph for better memorability. * Write a complete introductory tutorial on c99 Runtime and a test for it. * Add onnx installation as dependency. * Use target_include_directory to avoid installation. * Format code. * Fix cmake target_include_directories. * Address compiler warning. * First pass of RtMemRef->OMTensor. * Second pass of RtMemRef -> OMTensor. * nit, omtList -> omTensorList. * omt -> omTensor for clarity. * Rename OnnxMlirInternal.h -> OnnxMlirRuntime.hpp because there's no internal/external API, only C/C++ API. * Format code. * Restructure Runtime source code and move header -> /include and test -> /test/unit. * Bugfix. * Format code. * Add unit test for OMTensor ctor. * Update JNI CMake include directory. * Bugfix. * No need to re-declare ONNX types. * Disable runtime doc test on non-x86 platforms. * Rename OMTensor fields to be more sensible. * Fix data type mismatch. * size_t -> int64_t, prefer fixed width integers. * Use consistent header guard style. * Further tweak OMTensor API. * Bugfix. * Bugfix. * Format code. * Add doxygen config file. * Tweak OMTensor API. * Tweak API doc, hide OMTensorList implementation. * Format code. * Add new documentation item for Runtime API. * Hide internal use only API declarations, move their comments to their implementations. * Clarify ownership semantics in relevant API documentations. * Fix PyRuntime. * Remove alignment concerns from public API and include explaination of alignment issue in struct OMTensor definition. * Print out unsupported numpy dtype. * Use preferred way of type comparison in pybind11. * Debug s390x issue. * Remove debug code. * Clarify semantics of strides/shape setter/getter, use \brief to include short description of API function. * Improve documentation. * Single out unpolished C++ API declarations. * Clarify OMTensorList API. * Bugfix. * Bugfix. * Assert after malloc. * Handle malloc failures. * Nit. * Tweak legal notices. * Format code. * Remove doxygen generated files. * Tweak legal notice format. * Upgrade Cython Numpy installation depends on Cython. Co-authored-by: Tian Jin <tjingrant@gmail.com>
2020-10-10 22:32:09 +08:00
//===------- OnnxMlirRuntime.h - ONNX-MLIR Runtime API Declarations -------===//
//
// Copyright 2019-2020 The IBM Research Authors.
//
// =============================================================================
//
// This file contains declaration of external OMTensor data structures and
// helper functions.
//
//===----------------------------------------------------------------------===//
#ifndef ONNX_MLIR_ONNXMLIRRUNTIME_H
#define ONNX_MLIR_ONNXMLIRRUNTIME_H
#ifdef __cplusplus
#include <cstdint>
#else
#include <stdbool.h>
#include <stdint.h>
#endif
#include <onnx-mlir/Runtime/OMTensor.h>
#include <onnx-mlir/Runtime/OMTensorList.h>
/*! \mainpage ONNX-MLIR Runtime API documentation
*
* \section intro_sec Introduction
*
* ONNX-MLIR project comes with an executable `onnx-mlir` capable
* of compiling onnx models to a shared library. In this documentation, we
* demonstrate how to interact programmatically with the compiled
* shared library using ONNX-MLIR's Runtime API.
*
* \section c-runtime-api C Runtime API
*
* \subsection data-structures Data Structures
*
* `OMTensor` is the data structure used to describe the runtime information
* (rank, shape, data type, etc) associated with a tensor input or output.
*
* `OMTensorList` is the data structure used to hold a list of pointers to
* OMTensor so that they can be passed into and out of the compiled model as
* inputs and outputs.
*
* \subsection model-entry-point-signature Model Entry Point Signature
*
* All compiled model will have the same exact C function signature equivalent
* to:
*
* ```c
* OMTensorList* run_main_graph(OMTensorList*);
* ```
*
* Intuitively, the model takes a list of tensors as input and returns a list of
* ensors as output.
*
* \subsection invoke-models-using-c-runtime-api Invoke Models Using C Runtime
* API
*
* We demonstrate using the API functions to run a simple ONNX model consisting
* of an add operation. To create such an onnx model, use this
* <a href="gen_add_onnx.py" target="_blank"><b>python script</b></a>
*
* To compile the above model, run `onnx-mlir add.onnx` and a binary library
* "add.so" should appear. We can use the following C code to call into the
* compiled function computing the sum of two inputs:
*
* ```c
* #include <OnnxMlirRuntime.h>
* #include <stdio.h>
*
* OMTensorList *run_main_graph(OMTensorList *);
*
* int main() {
* // Shared shape & rank.
* int64_t shape[] = {2, 2};
* int64_t rank = 2;
* // Construct x1 omt filled with 1.
* float x1Data[] = {1., 1., 1., 1., 1., 1.};
* int64_t *x1Shape = {2, 2};
* OMTensor *x1 = omTensorCreate(x1Data, shape, rank, ONNX_TYPE_FLOAT);
* // Construct x2 omt filled with 2.
* float x2Data[] = {2., 2., 2., 2., 2., 2.};
* int64_t *x2Shape = {2, 2};
* OMTensor *x2 = omTensorCreate(x2Data, shape, rank, ONNX_TYPE_FLOAT);
* // Construct a list of omts as input.
* OMTensor *list[2] = {x1, x2};
* OMTensorList *input = omTensorListCreate(list, 2);
* // Call the compiled onnx model function.
* OMTensorList *outputList = run_main_graph(input);
* // Get the first omt as output.
* OMTensor *y = omTensorListGetOmtByIndex(outputList, 0);
* float *outputPtr = (float *)omTensorGetDataPtr(y);
* // Print its content, should be all 3.
* for (int i = 0; i < 6; i++)
* printf("%f ", outputPtr[i]);
* return 0;
* }
* ```
*
* Compile with `gcc main.c add.so -o add`, you should see an executable `add`
* appearing. Run it, and the output should be:
*
* ```
* 3.000000 3.000000 3.000000 3.000000 3.000000 3.000000
* ```
* Exactly as it should be.
*
* \subsection reference Reference
*
* For full reference to available C Runtime API, refer to
*`include/onnx-mlir/Runtime/OMTensor.h` and
* `include/onnx-mlir/Runtime/OMTensorList.h`.
*
*/
#endif // ONNX_MLIR_ONNXMLIRRUNTIME_H