From 8a5d284c7254d48fdb45a69b7516b5d4350a3146 Mon Sep 17 00:00:00 2001 From: "Benjamin T. Liu" Date: Wed, 25 Feb 2026 14:01:50 -0800 Subject: [PATCH 1/3] Prevent resource manager from being created by empty managed arrays --- src/chai/ManagedArray.inl | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/chai/ManagedArray.inl b/src/chai/ManagedArray.inl index b829ae68..e496194c 100644 --- a/src/chai/ManagedArray.inl +++ b/src/chai/ManagedArray.inl @@ -25,7 +25,6 @@ CHAI_HOST_DEVICE ManagedArray::ManagedArray(): m_is_slice(false) { #if !defined(CHAI_DEVICE_COMPILE) - m_resource_manager = ArrayManager::getInstance(); m_pointer_record = &ArrayManager::s_null_record; #endif } @@ -37,6 +36,7 @@ ManagedArray::ManagedArray( std::initializer_list allocators): ManagedArray() { + m_resource_manager = ArrayManager::getInstance(); m_pointer_record = new PointerRecord(); int i = 0; for (int s = CPU; s < NUM_EXECUTION_SPACES; ++s) { @@ -169,6 +169,9 @@ CHAI_HOST void ManagedArray::allocate( const UserCallback& cback) { if(!m_is_slice) { + if (m_resource_manager == nullptr) { + m_resource_manager = ArrayManager::getInstance(); + } if (elems > 0) { CHAI_LOG(Debug, "Allocating array of size " << elems << " in space " << space); @@ -300,6 +303,9 @@ template CHAI_INLINE CHAI_HOST void ManagedArray::reset() { + if (m_resource_manager == nullptr) { + m_resource_manager = ArrayManager::getInstance(); + } m_resource_manager->resetTouch(m_pointer_record); } @@ -312,6 +318,9 @@ CHAI_HOST_DEVICE size_t ManagedArray::size() const { template CHAI_INLINE CHAI_HOST void ManagedArray::registerTouch(ExecutionSpace space) { + if (m_resource_manager == nullptr) { + m_resource_manager = ArrayManager::getInstance(); + } if (m_active_pointer && (m_pointer_record == nullptr || m_pointer_record == &ArrayManager::s_null_record)) { CHAI_LOG(Warning,"registerTouch called on ManagedArray with nullptr pointer record."); m_pointer_record = m_resource_manager->makeManaged((void *)m_active_base_pointer,m_size,space,true); @@ -324,6 +333,9 @@ CHAI_INLINE CHAI_HOST_DEVICE typename ManagedArray::T_non_const ManagedArray::pick(size_t i) const { #if !defined(CHAI_DEVICE_COMPILE) + if (m_resource_manager == nullptr) { + m_resource_manager = ArrayManager::getInstance(); + } #if defined(CHAI_ENABLE_GPU_SIMULATION_MODE) if (m_resource_manager->isGPUSimMode()) { return (T_non_const)(m_active_pointer[i]); @@ -352,6 +364,9 @@ template CHAI_INLINE CHAI_HOST_DEVICE void ManagedArray::set(size_t i, T val) const { #if !defined(CHAI_DEVICE_COMPILE) + if (m_resource_manager == nullptr) { + m_resource_manager = ArrayManager::getInstance(); + } #if defined(CHAI_ENABLE_GPU_SIMULATION_MODE) if (m_resource_manager->isGPUSimMode()) { m_active_pointer[i] = val; @@ -556,7 +571,7 @@ ManagedArray::operator= (std::nullptr_t) { m_offset = 0; #if !defined(CHAI_DEVICE_COMPILE) m_pointer_record = &ArrayManager::s_null_record; - m_resource_manager = ArrayManager::getInstance(); + m_resource_manager = nullptr; #else m_pointer_record = nullptr; m_resource_manager = nullptr; From cb34112f147a218ba848f11954aed637b3d661f1 Mon Sep 17 00:00:00 2001 From: "Benjamin T. Liu" Date: Thu, 26 Feb 2026 14:47:28 -0800 Subject: [PATCH 2/3] Limit resource manager creation to allocations --- src/chai/ManagedArray.inl | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/chai/ManagedArray.inl b/src/chai/ManagedArray.inl index e496194c..c58b9454 100644 --- a/src/chai/ManagedArray.inl +++ b/src/chai/ManagedArray.inl @@ -304,7 +304,7 @@ CHAI_INLINE CHAI_HOST void ManagedArray::reset() { if (m_resource_manager == nullptr) { - m_resource_manager = ArrayManager::getInstance(); + return; } m_resource_manager->resetTouch(m_pointer_record); } @@ -319,7 +319,7 @@ template CHAI_INLINE CHAI_HOST void ManagedArray::registerTouch(ExecutionSpace space) { if (m_resource_manager == nullptr) { - m_resource_manager = ArrayManager::getInstance(); + return; } if (m_active_pointer && (m_pointer_record == nullptr || m_pointer_record == &ArrayManager::s_null_record)) { CHAI_LOG(Warning,"registerTouch called on ManagedArray with nullptr pointer record."); @@ -333,9 +333,6 @@ CHAI_INLINE CHAI_HOST_DEVICE typename ManagedArray::T_non_const ManagedArray::pick(size_t i) const { #if !defined(CHAI_DEVICE_COMPILE) - if (m_resource_manager == nullptr) { - m_resource_manager = ArrayManager::getInstance(); - } #if defined(CHAI_ENABLE_GPU_SIMULATION_MODE) if (m_resource_manager->isGPUSimMode()) { return (T_non_const)(m_active_pointer[i]); @@ -364,9 +361,6 @@ template CHAI_INLINE CHAI_HOST_DEVICE void ManagedArray::set(size_t i, T val) const { #if !defined(CHAI_DEVICE_COMPILE) - if (m_resource_manager == nullptr) { - m_resource_manager = ArrayManager::getInstance(); - } #if defined(CHAI_ENABLE_GPU_SIMULATION_MODE) if (m_resource_manager->isGPUSimMode()) { m_active_pointer[i] = val; From 938bb968591f8e1e80de46ce55bd3236e629eaba Mon Sep 17 00:00:00 2001 From: "Benjamin T. Liu" Date: Mon, 2 Mar 2026 12:54:38 -0800 Subject: [PATCH 3/3] Add comments --- src/chai/ManagedArray.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/chai/ManagedArray.hpp b/src/chai/ManagedArray.hpp index 467494e0..55abbd7f 100644 --- a/src/chai/ManagedArray.hpp +++ b/src/chai/ManagedArray.hpp @@ -134,6 +134,8 @@ class ManagedArray : public CHAICopyable /*! * \brief Allocate data for the ManagedArray in the specified space. * + * Once a ManagedArray is allocated, it will have a valid resource manager. + * * \param elems Number of elements to allocate. * \param space Execution space in which to allocate data. * \param cback User defined callback for memory events (alloc, free, move) @@ -289,6 +291,7 @@ class ManagedArray : public CHAICopyable * \brief Return the value of element i in the ManagedArray. * ExecutionSpace space to the current one * + * \pre ManagedArray must be allocated * \param index The index of the element to be fetched * \param space The index of the element to be fetched * \return The value of the i-th element in the ManagedArray. @@ -299,6 +302,7 @@ class ManagedArray : public CHAICopyable /*! * \brief Set the value of element i in the ManagedArray to be val. * + * \pre ManagedArray must be allocated * \param index The index of the element to be set * \param val Source location of the value * \tparam T The type of data value in ManagedArray.