You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.c 3.1 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /**
  2. * \file example/c_example/main.c
  3. * MegEngine is Licensed under the Apache License, Version 2.0 (the "License")
  4. *
  5. * Copyright (c) 2014-2021 Megvii Inc. All rights reserved.
  6. *
  7. * Unless required by applicable law or agreed to in writing,
  8. * software distributed under the License is distributed on an
  9. * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. */
  11. #include "lite-c/global_c.h"
  12. #include "lite-c/network_c.h"
  13. #include "lite-c/tensor_c.h"
  14. #include <stdio.h>
  15. #include <string.h>
  16. #define LITE_CAPI_CHECK(_expr) \
  17. do { \
  18. int _ret = (_expr); \
  19. if (_ret) { \
  20. fprintf(stderr, "error msg: %s", LITE_get_last_error()); \
  21. return -1; \
  22. } \
  23. } while (0)
  24. int basic_c_interface(const char* mode_path) {
  25. //! create and load the network
  26. LiteNetwork c_network;
  27. LITE_CAPI_CHECK(
  28. LITE_make_network(&c_network, *default_config(), *default_network_io()));
  29. LITE_CAPI_CHECK(LITE_load_model_from_path(c_network, mode_path));
  30. //! set input data to input tensor
  31. LiteTensor c_input_tensor;
  32. LITE_CAPI_CHECK(LITE_get_io_tensor(c_network, "data", LITE_IO, &c_input_tensor));
  33. void* dst_ptr;
  34. size_t length_in_byte;
  35. LITE_CAPI_CHECK(
  36. LITE_get_tensor_total_size_in_byte(c_input_tensor, &length_in_byte));
  37. LITE_CAPI_CHECK(LITE_get_tensor_memory(c_input_tensor, &dst_ptr));
  38. //! copy or forward data to network
  39. memset(dst_ptr, 5, length_in_byte);
  40. //! forward
  41. LITE_CAPI_CHECK(LITE_forward(c_network));
  42. LITE_CAPI_CHECK(LITE_wait(c_network));
  43. //! get the output data or read tensor data
  44. const char* output_name;
  45. LiteTensor c_output_tensor;
  46. //! get the first output tensor name
  47. LITE_CAPI_CHECK(LITE_get_output_name(c_network, 0, &output_name));
  48. LITE_CAPI_CHECK(
  49. LITE_get_io_tensor(c_network, output_name, LITE_IO, &c_output_tensor));
  50. void* output_ptr;
  51. size_t length_output_in_byte;
  52. LITE_CAPI_CHECK(LITE_get_tensor_memory(c_output_tensor, &output_ptr));
  53. LITE_CAPI_CHECK(LITE_get_tensor_total_size_in_byte(
  54. c_output_tensor, &length_output_in_byte));
  55. size_t out_length = length_output_in_byte / sizeof(float);
  56. printf("length=%zu\n", out_length);
  57. float max = -1.0f;
  58. float sum = 0.0f;
  59. for (size_t i = 0; i < out_length; i++) {
  60. float data = ((float*)(output_ptr))[i];
  61. sum += data;
  62. if (max < data)
  63. max = data;
  64. }
  65. printf("max=%e, sum=%e\n", max, sum);
  66. return 0;
  67. }
  68. int main(int argc, char** argv) {
  69. if (argc < 2) {
  70. printf("usage: lite_c_examples <model file> , just test C interface "
  71. "build.\n");
  72. return -1;
  73. }
  74. return basic_c_interface(argv[1]);
  75. }
  76. // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}