You're on the right track. Generally, the way to run something on Hexagon is to run an app on the CPU, and have it offload code to Hexagon via the FastRPC mechanism. If your Hexagon code has function `foo`, and you want to call it from the CPU, you create the IDL description of `foo`s interface, and the generated stub/skel libraries are the CPU/Hexagon sides respectively of the remote call to `foo`.
The direct communication via C or C++ program running on CPU is certainly possible, but it's not necessarily convenient for use with TVM: you would use TVM to build a shared library for Hexagon, then you would need to write that C/C++ code that would load it and execute it. TVM does have a framework to make the whole thing easier. There is a tool called "RPC tracker", which serves as a hub to which actual RPC servers connect. An app wanting to offload something would connect to the tracker, and from the tracker it would get the connection with the corresponding RPC server. The app could then upload the code for remote execution and run it. There is already an app that performs the role of the RPC server: it's the cpp_rpc program, so most of the pieces of the puzzle are present. Now, the workflow is basically as follows: 1. Start the RPC tracker on a PC. It will typically listen on port 9190. Once it starts, leave it running. 2. Set up port forwarding on the device (this is so that the TCP/IP connection between the tracker and the app will work): ``` adb forward tcp:5001 tcp:5001 adb reverse tcp:9190 tcp:9190 ``` 3. Copy the tvm_rpc app to some directory on the device. I usually copy the stub libraries there as well (but it may work with the libraries in /vendor/lib as well). Then start the app (the key is just some identifier that the RPC server will register itself under with the tracker): ``` cd /the/path/on/device export LD_LIBRARY_PATH=.:${LD_LIBRARY_PATH} # this is if stub libs are in this dir export ADSP_LIBRARY_PATH=/vendor/lib/rfsa/adsp:${ADSP_LIBRARY_PATH} ./tvm_rpc server --host=127.0.0.1 --port=5001 --tracker=127.0.0.1:9190 --key=<some-word> ``` 4. At this point you can run a TVM python code on your PC and have it communicate with the device. >From the point of view of the python code itself, you need to indicate in your >schedule which part of your kernel needs to be outlined. If `s` is the >schedule, and `Op` is the operation which you want to offload, mark it as >`pipeline`: ``` px, x = s[Op].split(s[Op].op.axis[0], nparts=1) s[Op].bind(px, tvm.te.thread_axis("pipeline")) ``` Then do `tvm.build` with ``` target = tvm.target.hexagon() target_host = llvm -mtriple=aarch64-unknown-linux-android26 ``` (you can use a different version of Android as the OS here). The output of `tvm.build`, let's call it `m`, will be a module with code built for AArch64. It will also contain another module in it with the code for Hexagon. Now you should be able to save both of these modules individually: ``` m.save('cpu.so') m.imported_modules[0].save('hexagon.so') # this will also create a .json file ``` At this point you can establish a connection: ``` tracker = tvm.rpc.connect_tracker(tracker_host, tracker_port) remote = tracker.request(key, priority=0, session_timeout=60) ``` The `tracket_host`/`tracker_port` are the hostname and port number of the tracker. You can use `127.0.0.1` and `9190` here. The `key` parameter is the identifier you used with `tvm_rpc` app. Finally, upload all the files to the device, and them load them on the device (you may need to add full path names): ``` remote.upload('cpu.so') remote.upload('hexagon.so') remote.upload('hexagon.tvm_meta.json') remote_cpu = remote.load_module('cpu.so') remote_hexagon = remote.load_module('hexagon.so') remote_cpu.import_module(remote_hexagon) ``` Here, `remote_cpu` is the callable remote module which you can invoke: ``` remote_cpu(a) ``` Remember that `a` has to have the remote Hexagon context, i.e. `ctx = remote.hexagon(0)`. Feel free to ask more questions if something isn't clear. --- [Visit Topic](https://discuss.tvm.apache.org/t/implementation-of-hexagon-runtime-for-target/9284/2) to respond. You are receiving this because you enabled mailing list mode. To unsubscribe from these emails, [click here](https://discuss.tvm.apache.org/email/unsubscribe/cc798e30eda12727d6e54ff728897fac7fe2fd1cf11309296307013e803e3c7e).