Skip to content

Commit

Permalink
Onnxifi dummy backend (onnx#1192)
Browse files Browse the repository at this point in the history
* onnxifi dummy backend

* msvcrtd

* Revert "msvcrtd"

This reverts commit 7706a01.

* shared lib not allowed

* Revert "shared lib not allowed"

This reverts commit 889da5a.

* msvc support for onnxifi_loader.lib & onnxifi_dummy.lib

* msvc

* formatted

* path corrected

* indent, top_dir and backendIDs

* change backedn nums to 1

* added NULL pointer exception handling

* new interface supported
  • Loading branch information
zrphercule authored and bddppq committed Jul 26, 2018
1 parent 16a85cc commit 61b4ef2
Show file tree
Hide file tree
Showing 8 changed files with 552 additions and 203 deletions.
1 change: 1 addition & 0 deletions .travis/script.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ script_path=$(python -c "import os; import sys; print(os.path.realpath(sys.argv[
source "${script_path%/*}/setup.sh"

# onnx c++ API tests
export LD_LIBRARY_PATH="${top_dir}/.setuptools-cmake-build/:$LD_LIBRARY_PATH"
find .setuptools-cmake-build/ -name "onnx_gtests" -ls -exec {} \;

# onnx python API tests
Expand Down
461 changes: 281 additions & 180 deletions CMakeLists.txt

Large diffs are not rendered by default.

56 changes: 35 additions & 21 deletions cmake/unittest.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,11 @@ set(${UT_NAME}_libs
add_whole_archive_flag(onnx tmp)
list(APPEND ${UT_NAME}_libs ${tmp})
list(APPEND ${UT_NAME}_libs onnx_proto)
list(APPEND ${UT_NAME}_libs onnxifi_loader)
list(APPEND ${UT_NAME}_libs ${PROTOBUF_LIBRARIES})

file(GLOB_RECURSE ${UT_NAME}_src
"${ONNX_ROOT}/onnx/test/c++/*.cc"
"${ONNX_ROOT}/onnx/test/cpp/*.cc"
)

function(AddTest)
Expand All @@ -49,41 +50,54 @@ function(AddTest)
target_compile_options(${_UT_TARGET} PRIVATE
/EHsc # exception handling - C++ may throw, extern "C" will not
)
target_compile_options(${_UT_TARGET} PRIVATE /MT)
if(${ONNX_USE_MSVC_STATIC_RUNTIME})
if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
target_compile_options(${_UT_TARGET} PRIVATE /MTd)
else()
target_compile_options(${_UT_TARGET} PRIVATE /MT)
endif()
else()
if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
target_compile_options(${_UT_TARGET} PRIVATE /MDd)
else()
target_compile_options(${_UT_TARGET} PRIVATE /MD)
endif()
endif()

endif()

if(MSVC)
target_compile_options(${_UT_TARGET} PRIVATE
/wd4146 # unary minus operator applied to unsigned type, result still unsigned from include\google\protobuf\wire_format_lite.h
)
target_compile_options(${_UT_TARGET} PRIVATE
/wd4146 # unary minus operator applied to unsigned type, result still unsigned from include\google\protobuf\wire_format_lite.h
)
endif()

set(TEST_ARGS)
if (ONNX_GENERATE_TEST_REPORTS)
# generate a report file next to the test program
list(APPEND TEST_ARGS
"--gtest_output=xml:$<SHELL_PATH:$<TARGET_FILE:${_UT_TARGET}>.$<CONFIG>.results.xml>")
# generate a report file next to the test program
list(APPEND TEST_ARGS
"--gtest_output=xml:$<SHELL_PATH:$<TARGET_FILE:${_UT_TARGET}>.$<CONFIG>.results.xml>")
endif()

add_test(NAME ${_UT_TARGET}
COMMAND ${_UT_TARGET} ${TEST_ARGS}
WORKING_DIRECTORY $<TARGET_FILE_DIR:${_UT_TARGET}>
)
COMMAND ${_UT_TARGET} ${TEST_ARGS}
WORKING_DIRECTORY $<TARGET_FILE_DIR:${_UT_TARGET}>
)

endfunction(AddTest)

AddTest(
TARGET ${UT_NAME}
SOURCES ${${UT_NAME}_src}
LIBS ${${UT_NAME}_libs}
)
TARGET ${UT_NAME}
SOURCES ${${UT_NAME}_src}
LIBS ${${UT_NAME}_libs}
)

set(TEST_DATA_SRC ${ONNX_ROOT}/onnx/test/c++/testdata)
set(TEST_DATA_SRC ${ONNX_ROOT}/onnx/test/cpp/testdata)
set(TEST_DATA_DES $<TARGET_FILE_DIR:${UT_NAME}>/testdata)

# Copy test data from source to destination.
add_custom_command(
TARGET ${UT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${TEST_DATA_SRC}
${TEST_DATA_DES})
TARGET ${UT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${TEST_DATA_SRC}
${TEST_DATA_DES})
133 changes: 133 additions & 0 deletions onnx/onnxifi_dummy.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
/*
* Dummy implementation of ONNX backend interface for manual test.
* Prints the name of the called function and backend name on each call.
*/

#include <stdlib.h>
#include <string.h>
#include <math.h>

#include "onnxifi.h"

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI
onnxGetBackendIDs(onnxBackendID* backendIDs, size_t* numBackends) {
if (backendIDs == NULL || numBackends == NULL) {
return ONNXIFI_STATUS_INVALID_POINTER;
}
*numBackends = 1;
*backendIDs = 0;
return ONNXIFI_STATUS_SUCCESS;
}

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI
onnxReleaseBackendID(onnxBackendID backendID) {
return ONNXIFI_STATUS_SUCCESS;
}

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI onnxGetBackendInfo(
onnxBackendID backendID,
onnxBackendInfo infoType,
void* infoValue,
size_t* infoValueSize) {
if (infoValueSize == NULL) {
return ONNXIFI_STATUS_INVALID_POINTER;
}
if (infoValue != NULL) {
*infoValueSize = *infoValueSize > 10 ? 10 : *infoValueSize;
memset(infoValue, 0, *infoValueSize);
} else {
*infoValueSize = sizeof(uint64_t);
}
return ONNXIFI_STATUS_SUCCESS;
}

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI
onnxGetBackendCompatibility(
onnxBackendID backendID,
size_t onnxModelSize,
const void* onnxModel) {
if (onnxModel == NULL && onnxModelSize != 0){
return ONNXIFI_STATUS_INVALID_POINTER;
}
return ONNXIFI_STATUS_SUCCESS;
}

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI onnxInitBackend(
onnxBackendID backendID,
const uint64_t* auxpropertiesList,
onnxBackend* backend) {
if (backend == NULL) {
return ONNXIFI_STATUS_INVALID_POINTER;
}
*backend = NULL;
return ONNXIFI_STATUS_SUCCESS;
}

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI
onnxReleaseBackend(onnxBackend backend) {
return ONNXIFI_STATUS_SUCCESS;
}

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI
onnxInitEvent(onnxBackend backend, onnxEvent* event) {
if (event == NULL) {
return ONNXIFI_STATUS_INVALID_POINTER;
}
*event = NULL;
return ONNXIFI_STATUS_SUCCESS;
}

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI
onnxSignalEvent(onnxEvent event) {
return ONNXIFI_STATUS_SUCCESS;
}

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI
onnxWaitEvent(onnxEvent event) {
return ONNXIFI_STATUS_SUCCESS;
}

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI
onnxReleaseEvent(onnxEvent event) {
return ONNXIFI_STATUS_SUCCESS;
}

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI onnxInitGraph(
onnxBackend backend,
size_t onnxModelSize,
const void* onnxModel,
uint32_t weightCount,
const onnxTensorDescriptorV1* weightDescriptors,
onnxGraph* graph) {
if (graph == NULL) {
return ONNXIFI_STATUS_INVALID_POINTER;
}
*graph = NULL;
return ONNXIFI_STATUS_SUCCESS;
}

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI onnxSetGraphIO(
onnxGraph graph,
uint32_t inputsCount,
const onnxTensorDescriptorV1* inputDescriptors,
uint32_t outputsCount,
const onnxTensorDescriptorV1* outputDescriptors) {
return ONNXIFI_STATUS_SUCCESS;
}

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI onnxRunGraph(
onnxGraph graph,
const onnxMemoryFenceV1* inputFence,
onnxMemoryFenceV1* outputFence) {
if (outputFence == NULL) {
return ONNXIFI_STATUS_INVALID_POINTER;
}
outputFence->type = ONNXIFI_SYNCHRONIZATION_EVENT;
outputFence->event = NULL;
return ONNXIFI_STATUS_SUCCESS;
}

ONNXIFI_PUBLIC ONNXIFI_CHECK_RESULT onnxStatus ONNXIFI_ABI
onnxReleaseGraph(onnxGraph graph) {
return ONNXIFI_STATUS_SUCCESS;
}
File renamed without changes.
100 changes: 100 additions & 0 deletions onnx/test/cpp/onnxifi_backend_test.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#include <iostream>

#include "gtest/gtest.h"
#include "onnx/onnxifi_loader.h"
#include "onnx/onnxifi.h"

#if defined(__APPLE__)
#define ONNXIFI_DUMMY_LIBRARY "libonnxifi_dummy.dylib"
#elif defined(_WIN32)
#define ONNXIFI_DUMMY_LIBRARY L"onnxifi_dummy.dll"
#else
#define ONNXIFI_DUMMY_LIBRARY "libonnxifi_dummy.so"
#endif


namespace ONNX_NAMESPACE
{
namespace Test
{
TEST(OnnxifiLoadTest, OnnxifiDummyBackend)
{

#define EXPECT_EQ_OSS(X) EXPECT_EQ(X, ONNXIFI_STATUS_SUCCESS)
onnxifi_library dummy_backend;
EXPECT_TRUE(onnxifi_load(1, ONNXIFI_DUMMY_LIBRARY, &dummy_backend));

onnxBackendID backendID;
onnxBackend backend;
onnxEvent event;
onnxGraph graph;

//Testing onnxGetBackendIDs
size_t numBackends = -1;

EXPECT_EQ_OSS(dummy_backend.onnxGetBackendIDs(
&backendID, &numBackends));
EXPECT_EQ(numBackends, 1);

//Testing onnxReleaseBackendID
EXPECT_EQ_OSS(
dummy_backend.onnxReleaseBackendID(backendID));

// Testing onnxGetBackendInfo
onnxBackendInfo infoType = 0;
char infoValue[11] = "abc";
size_t infoValueSize = 3;

EXPECT_EQ_OSS(dummy_backend.onnxGetBackendInfo(
backendID, infoType, infoValue, &infoValueSize));
EXPECT_EQ(infoValue[0], 0);

//Testing onnxGetBackendCompatibility
char onnxModel[] = "";
size_t onnxModelSize = 0;
EXPECT_EQ_OSS(dummy_backend.onnxGetBackendCompatibility(backendID, onnxModelSize, onnxModel));

//Testing onnxInitBackend
uint64_t auxpropertiesList = 0;
EXPECT_EQ_OSS(dummy_backend.onnxInitBackend(backendID, &auxpropertiesList, &backend));

//Testing onnxReleaseBackend
EXPECT_EQ_OSS(dummy_backend.onnxReleaseBackend(backend));

//Testing onnxInitEvent
EXPECT_EQ_OSS(dummy_backend.onnxInitEvent(backend, &event));

//Testing onnxSignalEvent
EXPECT_EQ_OSS(dummy_backend.onnxSignalEvent(event));

//Testing onnxWaitEvent
EXPECT_EQ_OSS(dummy_backend.onnxWaitEvent(event));

//Testing onnxReleaseEvent
EXPECT_EQ_OSS(dummy_backend.onnxReleaseEvent(event));

//Testing onnxInitGraph
uint32_t weightCount = 1;
onnxTensorDescriptorV1 weightDescriptors;
EXPECT_EQ_OSS(dummy_backend.onnxInitGraph(backend, onnxModelSize, &onnxModel, weightCount, &weightDescriptors, &graph));

//Testing onnxInitGraph
uint32_t inputsCount = 1;
onnxTensorDescriptorV1 inputDescriptors;
uint32_t outputsCount = 1;
onnxTensorDescriptorV1 outputDescriptors;
EXPECT_EQ_OSS(dummy_backend.onnxSetGraphIO(graph, inputsCount, &inputDescriptors, outputsCount, &outputDescriptors));

//Testing onnxRunGraph
onnxMemoryFenceV1 inputFence, outputFence;
EXPECT_EQ_OSS(dummy_backend.onnxRunGraph(graph, &inputFence, &outputFence));
EXPECT_EQ(outputFence.type, ONNXIFI_SYNCHRONIZATION_EVENT);

//Testing onnxReleaseGraph
EXPECT_EQ_OSS(dummy_backend.onnxReleaseGraph(graph));

#undef EXPECT_EQ_OSS
}

}
}
File renamed without changes.
4 changes: 2 additions & 2 deletions onnx/test/c++/test_main.cc → onnx/test/cpp/test_main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@
GTEST_API_ int main(int argc, char** argv)
{
std::cout << "Running main() from test_main.cc" << std::endl;
testing::InitGoogleTest(&argc, argv);
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
}

0 comments on commit 61b4ef2

Please sign in to comment.