supersat commented on code in PR #11018: URL: https://github.com/apache/tvm/pull/11018#discussion_r853386964
########## src/runtime/threading_backend.cc: ########## @@ -34,13 +34,61 @@ #endif #if defined(__hexagon__) #include <dlfcn.h> +#include <qurt.h> +#include <stdlib.h> +#define HEXAGON_STACK_SIZE 65536 +#define HEXAGON_STACK_ALIGNMENT 32 #endif #include <algorithm> #include <thread> #define CURRENT_THREAD_HANDLE (static_cast<std::thread::native_handle_type>(0)) namespace tvm { namespace runtime { namespace threading { +#ifdef __hexagon__ +// pthreads are broken on older versions of qurt, so +// we need to use native APIs instead of std::threads +class QuRTThread { + typedef std::function<void()> Callback; + + public: + explicit QuRTThread(Callback worker_callback) : f(worker_callback) { + static int id = 1; + qurt_thread_attr_t attr; + char name[32]; + posix_memalign(&stack, HEXAGON_STACK_ALIGNMENT, HEXAGON_STACK_SIZE); + qurt_thread_attr_init(&attr); + qurt_thread_attr_set_stack_size(&attr, HEXAGON_STACK_SIZE); + qurt_thread_attr_set_stack_addr(&attr, stack); + snprintf(name, sizeof(name), "worker %d", id++); + qurt_thread_attr_set_name(&attr, name); + qurt_thread_create(&thread, &attr, (void (*)(void*))run_func, this); + } + QuRTThread(QuRTThread&& other) : thread(other.thread), f(other.f), stack(other.stack) { + other.thread = 0; + } + ~QuRTThread() { + if (thread) { + join(); + free(stack); + } + } + bool joinable() const { return qurt_thread_get_id() != thread; } Review Comment: QuRTThread implements a subset of the std::thread API. I could change it to use Google's C++ style, but then I would need to add more #ifdefs around where it's used (e.g., line 107). What's preferable here? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@tvm.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org