diff --git a/python/tvm/contrib/hexagon/session.py b/python/tvm/contrib/hexagon/session.py index 87a37b66a77c..56bd1b79faad 100644 --- a/python/tvm/contrib/hexagon/session.py +++ b/python/tvm/contrib/hexagon/session.py @@ -56,7 +56,7 @@ def __init__( launcher: "HexagonLauncherRPC", remote_kw: dict, session_name: str = "hexagon-rpc", - remote_stack_size_bytes: int = 128 * 1024, + remote_stack_size_bytes: int = 256 * 1024, # Min size for main thread in QuRT/sim rpc_receive_buffer_size_bytes: int = 2 * 1024 * 1024, ): self._launcher = launcher diff --git a/src/runtime/hexagon/rpc/simulator/session.cc b/src/runtime/hexagon/rpc/simulator/session.cc index d1cc6c4613b3..b0f71c7bcf8a 100644 --- a/src/runtime/hexagon/rpc/simulator/session.cc +++ b/src/runtime/hexagon/rpc/simulator/session.cc @@ -188,7 +188,7 @@ MaybeRange to_range(const MaybeString& str) { class SimulatorRPCChannel final : public RPCChannel { public: - SimulatorRPCChannel(std::string args); + SimulatorRPCChannel(int stack_size, std::string args); ~SimulatorRPCChannel() final; size_t Send(const void* data, size_t size) final; size_t Recv(void* data, size_t size) final; @@ -520,7 +520,7 @@ detail::Optional SimulatorRPCChannel::GetCPU(const detail::MaybeStri .Default(none); } -SimulatorRPCChannel::SimulatorRPCChannel(std::string args) { +SimulatorRPCChannel::SimulatorRPCChannel(int stack_size, std::string args) { const auto* api_v2 = tvm::runtime::Registry::Get("device_api.hexagon.v2"); ICHECK(api_v2 != nullptr); tvm::runtime::Registry::Register("device_api.hexagon", true).set_body(*api_v2); @@ -573,7 +573,9 @@ SimulatorRPCChannel::SimulatorRPCChannel(std::string args) { CHECKED_CALL(ConfigureCosim, cosim_file_); CHECKED_CALL(ConfigureExecutableBinary, sdk.runelf.c_str()); - std::string cmdline = sdk.runelf + " " + sdk.runmain + " -- libhexagon_rpc_sim.so"; + std::string stack_arg = + stack_size > 0 ? std::string(" -stack_size=") + std::to_string(stack_size) : ""; + std::string cmdline = sdk.runelf + " " + sdk.runmain + stack_arg + " -- libhexagon_rpc_sim.so"; char* parg = &cmdline[0]; CHECKED_CALL(ConfigureAppCommandLine, 1, &parg); @@ -1314,9 +1316,9 @@ TVM_REGISTER_GLOBAL("tvm.contrib.hexagon.create_hexagon_session") ICHECK(args.size() >= 4) << args.size() << " is less than 4"; std::string session_name = args[0]; - // For target, the second parameter is remote_stack_size_bytes, ignore it. + int stack_size = args[1]; std::string sim_args = args[2]; - auto channel = std::make_unique(sim_args); + auto channel = std::make_unique(stack_size, sim_args); std::shared_ptr endpoint = RPCEndpoint::Create(std::move(channel), session_name, "", nullptr); std::shared_ptr session = CreateClientSession(endpoint);