This is an automated email from the ASF dual-hosted git repository.
zhaowu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-tvm.git
The following commit(s) were added to refs/heads/master by this push:
new 1b17b73 Changes to cpp_rpc to make it work on Android (+ Hexagon
offloading) (#5535)
1b17b73 is described below
commit 1b17b73b9310976fc95e1a6af871c5cdc0c0a346
Author: Krzysztof Parzyszek <[email protected]>
AuthorDate: Thu May 7 22:36:36 2020 -0500
Changes to cpp_rpc to make it work on Android (+ Hexagon offloading) (#5535)
* Changes to cpp_rpc to make it work on Android (+ Hexagon offloading)
- Implement getNextString to break up std::string into words. stringstream
just doesn't work on Android.
- string::find_last_of doesn't look for the last substring, but the
last character from a given string.
- Use SIGTERM to terminate processes (this isn't necessary, but using
SIGKILL is not a good practice).
- Convert "./rpc" to a full path. When a module is uploaded and offloaded
to Hexagon, the dlopen on Hexagon needs an absolute path (or a path
without directories).
* Only set the absolute patch on non-Windows platforms
Windows has different macros for the maximum path length.
---
apps/cpp_rpc/rpc_env.cc | 10 ++++++++++
apps/cpp_rpc/rpc_server.cc | 34 ++++++++++++++++++++++++++++++----
2 files changed, 40 insertions(+), 4 deletions(-)
diff --git a/apps/cpp_rpc/rpc_env.cc b/apps/cpp_rpc/rpc_env.cc
index b5dc51b..4a363cb 100644
--- a/apps/cpp_rpc/rpc_env.cc
+++ b/apps/cpp_rpc/rpc_env.cc
@@ -67,7 +67,17 @@ namespace {
namespace tvm {
namespace runtime {
RPCEnv::RPCEnv() {
+#ifndef _WIN32
+ char cwd[PATH_MAX];
+ if (char *rc = getcwd(cwd, sizeof(cwd))) {
+ base_ = std::string(cwd) + "/rpc";
+ } else {
+ base_ = "./rpc";
+ }
+#else
base_ = "./rpc";
+#endif
+
mkdir(base_.c_str(), 0777);
TVM_REGISTER_GLOBAL("tvm.rpc.server.workpath").set_body([](TVMArgs args,
TVMRetValue* rv) {
static RPCEnv env;
diff --git a/apps/cpp_rpc/rpc_server.cc b/apps/cpp_rpc/rpc_server.cc
index 57a68f4..2c8bdfa 100644
--- a/apps/cpp_rpc/rpc_server.cc
+++ b/apps/cpp_rpc/rpc_server.cc
@@ -66,6 +66,22 @@ static pid_t waitPidEintr(int* status) {
}
#endif
+#ifdef __ANDROID__
+static std::string getNextString(std::stringstream* iss) {
+ std::string str = iss->str();
+ size_t start = iss->tellg();
+ size_t len = str.size();
+ // Skip leading spaces.
+ while (start < len && isspace(str[start])) start++;
+
+ size_t end = start;
+ while (end < len && !isspace(str[end])) end++;
+
+ iss->seekg(end);
+ return str.substr(start, end-start);
+}
+#endif
+
/*!
* \brief RPCServer RPC Server class.
* \param host The hostname of the server, Default=0.0.0.0
@@ -164,9 +180,9 @@ class RPCServer {
int status = 0;
const pid_t finished_first = waitPidEintr(&status);
if (finished_first == timer_pid) {
- kill(worker_pid, SIGKILL);
+ kill(worker_pid, SIGTERM);
} else if (finished_first == worker_pid) {
- kill(timer_pid, SIGKILL);
+ kill(timer_pid, SIGTERM);
} else {
LOG(INFO) << "Child pid=" << finished_first << " unexpected, but
still continue.";
}
@@ -260,7 +276,12 @@ class RPCServer {
std::stringstream ssin(remote_key);
std::string arg0;
+#ifndef __ANDROID__
ssin >> arg0;
+#else
+ arg0 = getNextString(&ssin);
+#endif
+
if (arg0 != expect_header) {
code = kRPCMismatch;
CHECK_EQ(conn.SendAll(&code, sizeof(code)), sizeof(code));
@@ -274,7 +295,11 @@ class RPCServer {
CHECK_EQ(conn.SendAll(&keylen, sizeof(keylen)), sizeof(keylen));
CHECK_EQ(conn.SendAll(server_key.c_str(), keylen), keylen);
LOG(INFO) << "Connection success " << addr->AsString();
+#ifndef __ANDROID__
ssin >> *opts;
+#else
+ *opts = getNextString(&ssin);
+#endif
*conn_sock = conn;
return;
}
@@ -301,8 +326,9 @@ class RPCServer {
int GetTimeOutFromOpts(const std::string& opts) const {
const std::string option = "-timeout=";
- if (opts.find(option) == 0) {
- const std::string cmd = opts.substr(opts.find_last_of(option) + 1);
+ size_t pos = opts.rfind(option);
+ if (pos != std::string::npos) {
+ const std::string cmd = opts.substr(pos + option.size());
CHECK(support::IsNumber(cmd)) << "Timeout is not valid";
return std::stoi(cmd);
}