diff --git a/src/runtime_src/hip/api/hip_device.cpp b/src/runtime_src/hip/api/hip_device.cpp index 32011da8fb1..16fd9837e80 100644 --- a/src/runtime_src/hip/api/hip_device.cpp +++ b/src/runtime_src/hip/api/hip_device.cpp @@ -17,7 +17,7 @@ device_init(); } namespace { -std::once_flag device_init_flag; +thread_local std::once_flag device_init_flag; // Creates devices at library load // User may not explicitly call init or device create @@ -44,6 +44,8 @@ device_init() // create all devices ahead // Used when user doesn't explicitly create device for (uint32_t i = 0; i < dev_count; i++) { + if (device_cache.count(static_cast(i)) > 0) + continue; auto dev = std::make_shared(i); device_cache.add(i, std::move(dev)); } diff --git a/src/runtime_src/hip/core/memory.cpp b/src/runtime_src/hip/core/memory.cpp index cc0275f8766..3bc789e0bb2 100644 --- a/src/runtime_src/hip/core/memory.cpp +++ b/src/runtime_src/hip/core/memory.cpp @@ -171,12 +171,14 @@ namespace xrt::core::hip void memory_database::insert(uint64_t addr, size_t size, std::shared_ptr hip_mem) { + std::lock_guard lock(m_mutex); m_addr_map.insert({address_range_key(addr, size), hip_mem}); } void memory_database::remove(uint64_t addr) { + std::lock_guard lock(m_mutex); m_addr_map.erase(address_range_key(addr, 0)); } diff --git a/src/runtime_src/hip/core/memory.h b/src/runtime_src/hip/core/memory.h index 1c649a72fcf..9d38e219ee7 100644 --- a/src/runtime_src/hip/core/memory.h +++ b/src/runtime_src/hip/core/memory.h @@ -126,6 +126,7 @@ namespace xrt::core::hip { private: addr_map m_addr_map; + std::mutex m_mutex; protected: memory_database();