blob: 5b23afbc2ac4e3b6d6f484e7339f135ac0ef1a30 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#[macro_use]
extern crate lazy_static;
mod types;
pub mod utils;
use std::ffi::CStr;
use std::os::raw::{c_char, c_int};
use std::{collections::HashMap, convert::TryFrom, env, sync::Mutex};
use tvm_graph_rt::{Graph, GraphExecutor, SystemLibModule, Tensor as TVMTensor};
use types::Tensor;
#[no_mangle]
pub extern "C" fn entrypoint(argc: c_int, argv: *const *const c_char) -> i32 {
assert_eq!(argc, 2);
// convert `argv` to `Vec<str>`
let argv: Vec<_> = (0..argc)
.map(|i| unsafe { CStr::from_ptr(*argv.add(i as usize)).to_string_lossy() })
.collect();
// Arguments are referenced in ODD indices
run(argv[1].as_ref())
}
lazy_static! {
static ref SYSLIB: SystemLibModule = SystemLibModule::default();
static ref GRAPH_EXECUTOR: Mutex<GraphExecutor<'static, 'static>> = {
let graph = Graph::try_from(include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/outlib/graph.json"
)))
.unwrap();
let params_bytes =
include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/outlib/graph.params"));
let params = tvm_graph_rt::load_param_dict(params_bytes)
.unwrap()
.into_iter()
.map(|(k, v)| (k, v.to_owned()))
.collect::<HashMap<String, TVMTensor<'static>>>();
let mut exec = GraphExecutor::new(graph, &*SYSLIB).unwrap();
exec.load_params(params);
Mutex::new(exec)
};
}
fn run(input_file: &str) -> i32 {
let in_tensor = utils::load_input(input_file);
let input: TVMTensor = in_tensor.as_dltensor().into();
// since this executor is not multi-threaded, we can acquire lock once
let mut executor = GRAPH_EXECUTOR.lock().unwrap();
executor.set_input("Input3", input);
executor.run();
let output = executor.get_output(0).unwrap().as_dltensor(false);
let out_tensor: Tensor = output.into();
utils::handle_output(out_tensor)
}