diff --git a/projects/clr/hipamd/src/hip_context.cpp b/projects/clr/hipamd/src/hip_context.cpp index 3779c317d2..caf6b195c2 100644 --- a/projects/clr/hipamd/src/hip_context.cpp +++ b/projects/clr/hipamd/src/hip_context.cpp @@ -115,6 +115,16 @@ amd::HostQueue* getNullStream(amd::Context& ctx) { return nullptr; } +// ================================================================================================ +int getDeviceID(amd::Context& ctx) { + for (auto& it : g_devices) { + if (it->asContext() == &ctx) { + return it->deviceId(); + } + } + return -1; +} + // ================================================================================================ amd::HostQueue* getNullStream() { Device* device = getCurrentDevice(); diff --git a/projects/clr/hipamd/src/hip_device_runtime.cpp b/projects/clr/hipamd/src/hip_device_runtime.cpp index d2c9d30bfa..7ba0e5d0d7 100644 --- a/projects/clr/hipamd/src/hip_device_runtime.cpp +++ b/projects/clr/hipamd/src/hip_device_runtime.cpp @@ -467,7 +467,7 @@ hipError_t hipDeviceSynchronize ( void ) { queue->finish(); - hip::Stream::syncNonBlockingStreams(); + hip::Stream::syncNonBlockingStreams(hip::getCurrentDevice()->deviceId()); HIP_RETURN(hipSuccess); } diff --git a/projects/clr/hipamd/src/hip_internal.hpp b/projects/clr/hipamd/src/hip_internal.hpp index 6fdded7ff5..bcc6954435 100644 --- a/projects/clr/hipamd/src/hip_internal.hpp +++ b/projects/clr/hipamd/src/hip_internal.hpp @@ -210,7 +210,7 @@ namespace hip { const std::vector GetCUMask() const { return cuMask_; } /// Sync all non-blocking streams - static void syncNonBlockingStreams(); + static void syncNonBlockingStreams(int deviceId = -1); /// Destroy all streams on a given device static void destroyAllStreams(int deviceId); @@ -325,6 +325,8 @@ namespace hip { extern amd::HostQueue* getNullStream(amd::Context&); /// Get default stream of the thread extern amd::HostQueue* getNullStream(); + /// Get device ID associated with the ROCclr context + int getDeviceID(amd::Context& ctx); /// Check if stream is valid extern bool isValid(hipStream_t& stream); }; diff --git a/projects/clr/hipamd/src/hip_memory.cpp b/projects/clr/hipamd/src/hip_memory.cpp index 1f1d3e16b8..0aed8e2318 100644 --- a/projects/clr/hipamd/src/hip_memory.cpp +++ b/projects/clr/hipamd/src/hip_memory.cpp @@ -86,7 +86,7 @@ hipError_t ihipFree(void *ptr) size_t offset = 0; amd::Memory* memory_object = getMemoryObject(ptr, offset); - + int deviceID = -1; if (memory_object != nullptr) { // Check if it's an allocation in system memory and can be shared across all devices if (memory_object->getMemFlags() & CL_MEM_SVM_FINE_GRAIN_BUFFER) { @@ -102,7 +102,9 @@ hipError_t ihipFree(void *ptr) } else { // Wait on the device, associated with the current memory object hip::getNullStream(memory_object->getContext())->finish(); + deviceID = hip::getDeviceID(memory_object->getContext()); } + hip::Stream::syncNonBlockingStreams(deviceID); amd::SvmBuffer::free(memory_object->getContext(), ptr); return hipSuccess; } diff --git a/projects/clr/hipamd/src/hip_stream.cpp b/projects/clr/hipamd/src/hip_stream.cpp index 36b0060bc1..99f15e6277 100644 --- a/projects/clr/hipamd/src/hip_stream.cpp +++ b/projects/clr/hipamd/src/hip_stream.cpp @@ -148,11 +148,13 @@ int Stream::DeviceId(const hipStream_t hStream) { return deviceId; } -void Stream::syncNonBlockingStreams() { +void Stream::syncNonBlockingStreams(int deviceId) { amd::ScopedLock lock(streamSetLock); for (auto& it : streamSet) { if (it->Flags() & hipStreamNonBlocking) { - it->asHostQueue()->finish(); + if (deviceId == -1 || it->DeviceId() == deviceId) { + it->asHostQueue()->finish(); + } } } }