How to compile CVU Configuration Application?ο
This section weβll discuss about how we can write and compile the CVU Configuration Application for configuring the EV74 graphs.
Need of CVU Configuration Applicationο
1280x720
resolution to 640x480
using EV74βs SIMA_RESIZE graph/kernel, the kernel must know what is the input shape and what is the expected output shape. This configuration will set such parameters and graph becomes ready to use.File Structureο
There are 3 files needed for any CVU Configuration Application to compile.
cvu_cfg_main.cpp
ο
This is source file which holds a code to mostly parse the command line parameters (such as a JSON configuration file) to the app and calling a necessary function.
cvu_cfg_graph.cpp
ο
int
and double
type.send_i32_param
This sends the integer type parameter to EV74 for configuration
send_float_param
This sends double type parameter to EV74 for configuration
CMakeLists.txt
ο
This is a cmake file required to cross-compile the CVU Configuration Application and generate an executable binary compatible with A65.
Compilationο
cvu_cfg_main.cpp
ο
The cvu_cfg_main.cpp
for this will look like this.
Note
Here, weβre considering the process_resize.json
passed as the only argument to the main.
1#include <getopt.h>
2#include <sys/stat.h>
3#include <unistd.h>
4
5#include <cstring>
6#include <iostream>
7
8extern void configure_graph(const char *json_fpath);
9
10bool is_valid_path(const char *path) {
11 struct stat buffer;
12 return (stat(path, &buffer) == 0);
13}
14
15int main(int argc, char **argv) {
16 const char *json_path = argv[1];
17
18 if(is_valid_path(json_path)) {
19 configure_graph(json_path);
20 } else {
21 std::cerr << "Invalid path: " << json_path << std::endl;
22 return 1;
23 }
24
25 return 0;
26}
cvu_cfg_graph.cpp
ο
The cvu_cfg_graph.cpp
looks like this.
1#include <string.h>
2#include <simaai/parser.h>
3#include <simaai/ev_cfg_helper.h>
4#include <simaai/platform/simaevxxipc.h>
5
6#define SIMA_IPC_CODE_GRAPH_SIMA_ATOMIC_RESIZE (8)
7#define INPUT_WIDTH (1)
8#define INPUT_HEIGHT (2)
9#define OUTPUT_WIDTH (3)
10#define OUTPUT_HEIGHT (4)
11#define BATCH_SIZE (5)
12#define RSZ_TYPE (6)
13
14void configure_graph(const char *json_in) {
15 simaai_params_t *params = parser_node_struct_init();
16 if (params == NULL) {
17 std::cout << "Unable to create params \n";
18 }
19 if ((parse_json_file(json_in, params) != PARSER_SUCCESS)) {
20 std::cout << "Unable to start parser \n";
21 }
22
23 uint8_t *buf = (uint8_t *)calloc(1, sizeof(uint8_t) * 16);
24
25 int val = *((int *)parser_get_int(params, "img_height"));
26 send_i32_param(2, SIMA_IPC_CODE_GRAPH_SIMA_ATOMIC_RESIZE, INPUT_HEIGHT, buf, val);
27 send_i32_param(2, SIMA_IPC_CODE_GRAPH_SIMA_ATOMIC_RESIZE, INPUT_HEIGHT, buf, val);
28
29 val = *((int *)parser_get_int(params, "img_width"));
30 send_i32_param(2, SIMA_IPC_CODE_GRAPH_SIMA_ATOMIC_RESIZE, INPUT_WIDTH, buf, val);
31
32 val = *((int *)parser_get_int(params, "output_width"));
33 send_i32_param(2, SIMA_IPC_CODE_GRAPH_SIMA_ATOMIC_RESIZE, OUTPUT_WIDTH, buf, val);
34
35 val = *((int *)parser_get_int(params, "output_height"));
36 send_i32_param(2, SIMA_IPC_CODE_GRAPH_SIMA_ATOMIC_RESIZE, OUTPUT_HEIGHT, buf, val);
37
38 val = *((int *)parser_get_int(params, "batch_size"));
39 send_i32_param(2, SIMA_IPC_CODE_GRAPH_SIMA_ATOMIC_RESIZE, BATCH_SIZE, buf, val);
40
41 val = *((int *)parser_get_int(params, "rsz_type"));
42 send_i32_param(2, SIMA_IPC_CODE_GRAPH_SIMA_ATOMIC_RESIZE, RSZ_TYPE, buf, val);
43
44 std::cout << "Completed Resize Graph Configure \n";
45 free(buf);
46}
CMakeLists.txt
ο
This CMakeLists.txt
contains the configuration to compile and generate binary. It looks like this.
1 cmake_minimum_required(VERSION 3.16)
2
3 # set the project name
4 set(GRAPH_NAME "resize_008")
5 set(PROJECT_NAME "CVU Graph Cfg. App.")
6
7 project("${PROJECT_NAME}"
8 VERSION 0.1
9 DESCRIPTION "CVU Graph Configuration Application"
10 LANGUAGES C CXX)
11
12 set(PIPELINE_SOURCES
13 cvu_cfg_graph.cpp)
14
15 execute_process(
16 COMMAND git rev-parse --abbrev-ref HEAD
17 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
18 OUTPUT_VARIABLE GIT_BRANCH
19 OUTPUT_STRIP_TRAILING_WHITESPACE
20 )
21
22 # Get the latest abbreviated commit hash of the working branch
23 execute_process(
24 COMMAND git log -1 --format=%h
25 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
26 OUTPUT_VARIABLE GIT_COMMIT_HASH
27 OUTPUT_STRIP_TRAILING_WHITESPACE
28 )
29
30 link_directories(${CMAKE_INSTALL_DIR}/core
31 ${CMAKE_INSTALL_DIR}/gst
32 )
33
34 include(GNUInstallDirs)
35
36 # ev-configuration genertion executable
37 set(EV_EXEC_NAME "${GRAPH_NAME}_cvu_cfg_app")
38
39 add_executable(${EV_EXEC_NAME}
40 cvu_cfg_main.cpp
41 cvu_cfg_graph.cpp)
42
43 target_link_libraries(${EV_EXEC_NAME}
44 PUBLIC
45 simaaiparser
46 evhelpers)
47
48 INSTALL(TARGETS "${EV_EXEC_NAME}")
Compileο
Create a directory named
build
and change directory to it.
1mkdir build && cd build
Export
poky
βs environment for usingcmake
.
1source /opt/poky/4.0.10/environment-setup-cortexa65-poky-linux
Run
cmake
1cmake ..
Run
make
1make
This will generate a binary named ev_cfg_app
inside build
directory which is A65 executable.