This is an automated email from the ASF dual-hosted git repository. masahi pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push: new e47eed13d9 Add methods to get the size of VTCM on device as well as the allocated size of the HexagonVtcmPool (#13511) e47eed13d9 is described below commit e47eed13d9a0af3bab5fc6fafbc8228797419249 Author: Janet Schneider <21978033+jane...@users.noreply.github.com> AuthorDate: Tue Nov 29 19:54:41 2022 -0600 Add methods to get the size of VTCM on device as well as the allocated size of the HexagonVtcmPool (#13511) * Get device size and allocated size of VTCM * Add python API --- src/runtime/hexagon/hexagon_device_api.cc | 6 ++++++ src/runtime/hexagon/hexagon_vtcm_pool.cc | 15 ++++++++------- src/runtime/hexagon/hexagon_vtcm_pool.h | 14 ++++++++++---- tests/cpp-runtime/hexagon/hexagon_vtcm_pool_tests.cc | 9 +++++++-- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/runtime/hexagon/hexagon_device_api.cc b/src/runtime/hexagon/hexagon_device_api.cc index 51cc976e46..a1d55db42f 100644 --- a/src/runtime/hexagon/hexagon_device_api.cc +++ b/src/runtime/hexagon/hexagon_device_api.cc @@ -299,6 +299,12 @@ TVM_REGISTER_GLOBAL("device_api.hexagon.release_resources") api->ReleaseResources(); }); +TVM_REGISTER_GLOBAL("device_api.hexagon.vtcm_device_bytes") + .set_body([](TVMArgs args, TVMRetValue* rv) { + HexagonDeviceAPI* api = HexagonDeviceAPI::Global(); + *rv = static_cast<int32_t>(api->VtcmPool()->VtcmDeviceBytes()); + }); + TVM_REGISTER_GLOBAL("device_api.hexagon").set_body([](TVMArgs args, TVMRetValue* rv) { DeviceAPI* ptr = HexagonDeviceAPI::Global(); *rv = static_cast<void*>(ptr); diff --git a/src/runtime/hexagon/hexagon_vtcm_pool.cc b/src/runtime/hexagon/hexagon_vtcm_pool.cc index 17089852a9..8373ef61c9 100644 --- a/src/runtime/hexagon/hexagon_vtcm_pool.cc +++ b/src/runtime/hexagon/hexagon_vtcm_pool.cc @@ -29,20 +29,19 @@ HexagonVtcmPool::HexagonVtcmPool() { compute_res_attr_t res_info; HEXAGON_SAFE_CALL(HAP_compute_res_attr_init(&res_info)); - unsigned int total_block_size; unsigned int avail_block_size; compute_res_vtcm_page_t total_block_layout; compute_res_vtcm_page_t avail_block_layout; - HEXAGON_SAFE_CALL(compute_resource_query_VTCM(/* application_id = */ 0, &total_block_size, + HEXAGON_SAFE_CALL(compute_resource_query_VTCM(/* application_id = */ 0, &vtcm_device_size_, &total_block_layout, &avail_block_size, &avail_block_layout)); - DLOG(INFO) << "HexagonVtcmPool total " << total_block_size << " avail " << avail_block_size; + DLOG(INFO) << "HexagonVtcmPool total " << vtcm_device_size_ << " avail " << avail_block_size; CHECK(avail_block_size >= (1024 * 1024)) << "Less than 1MB VTCM available"; // allocate nbytes of vtcm on a single page HEXAGON_SAFE_CALL(HAP_compute_res_attr_set_vtcm_param_v2(&res_info, - /*vtcm_size = */ total_block_size, + /*vtcm_size = */ vtcm_device_size_, /*min_page_size = */ 1, /*min_vtcm_size = */ avail_block_size)); @@ -50,11 +49,13 @@ HexagonVtcmPool::HexagonVtcmPool() { // hanging, both in the simulator and on hardware. context_id_ = HAP_compute_res_acquire(&res_info, /*timeout = */ 0); CHECK(context_id_) << "HAP_compute_res_acquire failed to acquire requested VTCM resource."; - HEXAGON_SAFE_CALL(HAP_compute_res_attr_get_vtcm_ptr_v2(&res_info, &vtcm_data_, &vtcm_size_)); + HEXAGON_SAFE_CALL( + HAP_compute_res_attr_get_vtcm_ptr_v2(&res_info, &vtcm_data_, &vtcm_allocated_size_)); CHECK(vtcm_data_ != nullptr) << "HAP_compute_res_acquire returned nullptr when allocating VTCM."; - CHECK(vtcm_size_ >= avail_block_size) + CHECK(vtcm_allocated_size_ >= avail_block_size) << "HAP_compute_res_acquire failed to allocate minimum amount of VTCM"; - free_.emplace_back(std::pair<char*, size_t>(static_cast<char*>(vtcm_data_), vtcm_size_)); + free_.emplace_back( + std::pair<char*, size_t>(static_cast<char*>(vtcm_data_), vtcm_allocated_size_)); // DebugDump(); } diff --git a/src/runtime/hexagon/hexagon_vtcm_pool.h b/src/runtime/hexagon/hexagon_vtcm_pool.h index 2e0918e997..88b8f1470c 100644 --- a/src/runtime/hexagon/hexagon_vtcm_pool.h +++ b/src/runtime/hexagon/hexagon_vtcm_pool.h @@ -68,7 +68,10 @@ class HexagonVtcmPool { void Free(void* ptr, size_t nbytes); //! \brief Returns the total number of bytes in this pool - size_t TotalBytes() { return reinterpret_cast<size_t>(vtcm_size_); } + size_t VtcmDeviceBytes() { return reinterpret_cast<size_t>(vtcm_device_size_); } + + //! \brief Returns the total number of bytes in this pool + size_t VtcmAllocatedBytes() { return reinterpret_cast<size_t>(vtcm_allocated_size_); } bool IsVtcm(void* ptr, unsigned size) { auto char_ptr = static_cast<char*>(ptr); @@ -76,15 +79,18 @@ class HexagonVtcmPool { auto char_vtcm = static_cast<char*>(vtcm_data_); CHECK(vtcm_data_ != nullptr); - if (char_ptr >= char_vtcm && (char_ptr + size) <= (char_vtcm + vtcm_size_)) { + if (char_ptr >= char_vtcm && (char_ptr + size) <= (char_vtcm + vtcm_allocated_size_)) { return true; } return false; } private: - //! \brief Total size of VTCM pool - unsigned int vtcm_size_; + //! \brief Total size of VTCM memory on device + unsigned int vtcm_device_size_; + + //! \brief Total size of VTCM pool allocated on device + unsigned int vtcm_allocated_size_; //! \brief Pointer to the beginning of the pool void* vtcm_data_; diff --git a/tests/cpp-runtime/hexagon/hexagon_vtcm_pool_tests.cc b/tests/cpp-runtime/hexagon/hexagon_vtcm_pool_tests.cc index 81bd31cc84..8240241eee 100644 --- a/tests/cpp-runtime/hexagon/hexagon_vtcm_pool_tests.cc +++ b/tests/cpp-runtime/hexagon/hexagon_vtcm_pool_tests.cc @@ -27,13 +27,15 @@ using namespace tvm::runtime::hexagon; class HexagonVtcmPoolTest : public ::testing::Test { void SetUp() override { vtcm_pool = HexagonDeviceAPI::Global()->VtcmPool(); - max_bytes = vtcm_pool->TotalBytes(); + max_bytes = vtcm_pool->VtcmAllocatedBytes(); + device_bytes = vtcm_pool->VtcmDeviceBytes(); } void TearDown() override {} public: HexagonVtcmPool* vtcm_pool; size_t max_bytes; + size_t device_bytes; size_t four_k_block = 4096; size_t two_k_block = 2048; size_t one_k_block = 1024; @@ -44,6 +46,9 @@ TEST_F(HexagonVtcmPoolTest, basic) { void* ptr; void* ptr2; + CHECK(device_bytes >= max_bytes) << "VTCM device size " << device_bytes + << " not greater than or equal to allocated size " << max_bytes; + ptr = vtcm_pool->Allocate(max_bytes); CHECK((reinterpret_cast<uintptr_t>(ptr) & 0x7FF) == 0) << "Must be multiple of 2k " << ptr << " " << max_bytes; @@ -123,7 +128,7 @@ TEST_F(HexagonVtcmPoolTest, free_alloc_combinations) { void* ptr3; void* ptr4; void* new_ptr; - size_t max_less_3_blocks = vtcm_pool->TotalBytes() - (3 * two_k_block); + size_t max_less_3_blocks = max_bytes - (3 * two_k_block); ptr1 = vtcm_pool->Allocate(two_k_block); ptr2 = vtcm_pool->Allocate(two_k_block); ptr3 = vtcm_pool->Allocate(two_k_block);