From 5ef979b20938fefe451cc671fb1ce49e0c8b3ad8 Mon Sep 17 00:00:00 2001 From: PietroGhg Date: Mon, 20 Nov 2023 12:23:50 +0000 Subject: [PATCH 1/5] Correctly implement reference counting for Native CPU --- source/adapters/native_cpu/context.cpp | 4 +++- source/adapters/native_cpu/context.hpp | 3 ++- source/adapters/native_cpu/kernel.cpp | 4 +++- source/adapters/native_cpu/program.cpp | 4 +++- source/adapters/native_cpu/queue.cpp | 8 ++++++-- source/adapters/native_cpu/queue.hpp | 3 ++- 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/source/adapters/native_cpu/context.cpp b/source/adapters/native_cpu/context.cpp index e8732646f5..9cceeb4551 100644 --- a/source/adapters/native_cpu/context.cpp +++ b/source/adapters/native_cpu/context.cpp @@ -38,7 +38,9 @@ urContextRetain(ur_context_handle_t hContext) { UR_APIEXPORT ur_result_t UR_APICALL urContextRelease(ur_context_handle_t hContext) { - delete hContext; + hContext->decrementReferenceCount(); + if(hContext->getReferenceCount() == 0) + delete hContext; return UR_RESULT_SUCCESS; } diff --git a/source/adapters/native_cpu/context.hpp b/source/adapters/native_cpu/context.hpp index 04404d7988..465c4a8c8c 100644 --- a/source/adapters/native_cpu/context.hpp +++ b/source/adapters/native_cpu/context.hpp @@ -13,8 +13,9 @@ #include #include "device.hpp" +#include "common.hpp" -struct ur_context_handle_t_ { +struct ur_context_handle_t_ : RefCounted { ur_context_handle_t_(ur_device_handle_t_ *phDevices) : _device{phDevices} {} ur_device_handle_t _device; diff --git a/source/adapters/native_cpu/kernel.cpp b/source/adapters/native_cpu/kernel.cpp index 96648e57f8..67826a7d61 100644 --- a/source/adapters/native_cpu/kernel.cpp +++ b/source/adapters/native_cpu/kernel.cpp @@ -182,7 +182,9 @@ UR_APIEXPORT ur_result_t UR_APICALL urKernelRetain(ur_kernel_handle_t hKernel) { UR_APIEXPORT ur_result_t UR_APICALL urKernelRelease(ur_kernel_handle_t hKernel) { - delete hKernel; + hKernel->decrementReferenceCount(); + if(hKernel->getReferenceCount() == 0) + delete hKernel; return UR_RESULT_SUCCESS; } diff --git a/source/adapters/native_cpu/program.cpp b/source/adapters/native_cpu/program.cpp index 389626fa70..f48b9d25f2 100644 --- a/source/adapters/native_cpu/program.cpp +++ b/source/adapters/native_cpu/program.cpp @@ -95,7 +95,9 @@ urProgramRetain(ur_program_handle_t hProgram) { UR_APIEXPORT ur_result_t UR_APICALL urProgramRelease(ur_program_handle_t hProgram) { - delete hProgram; + hProgram->decrementReferenceCount(); + if(hProgram->getReferenceCount() == 0) + delete hProgram; return UR_RESULT_SUCCESS; } diff --git a/source/adapters/native_cpu/queue.cpp b/source/adapters/native_cpu/queue.cpp index d4e85ce989..1680b076a9 100644 --- a/source/adapters/native_cpu/queue.cpp +++ b/source/adapters/native_cpu/queue.cpp @@ -43,12 +43,16 @@ UR_APIEXPORT ur_result_t UR_APICALL urQueueCreate( UR_APIEXPORT ur_result_t UR_APICALL urQueueRetain(ur_queue_handle_t hQueue) { std::ignore = hQueue; + hQueue->incrementReferenceCount(); - DIE_NO_IMPLEMENTATION; + return UR_RESULT_SUCCESS; } UR_APIEXPORT ur_result_t UR_APICALL urQueueRelease(ur_queue_handle_t hQueue) { - delete hQueue; + hQueue->decrementReferenceCount(); + if(hQueue->getReferenceCount() == 0) + delete hQueue; + return UR_RESULT_SUCCESS; } diff --git a/source/adapters/native_cpu/queue.hpp b/source/adapters/native_cpu/queue.hpp index 0c7d812496..5e9039dd24 100644 --- a/source/adapters/native_cpu/queue.hpp +++ b/source/adapters/native_cpu/queue.hpp @@ -8,5 +8,6 @@ // //===----------------------------------------------------------------------===// #pragma once +#include "common.hpp" -struct ur_queue_handle_t_ {}; +struct ur_queue_handle_t_ : RefCounted {}; From ca374bc8969e4dac2fe3ce5234900a5319d6a336 Mon Sep 17 00:00:00 2001 From: PietroGhg Date: Mon, 20 Nov 2023 13:12:40 +0000 Subject: [PATCH 2/5] use common helper --- source/adapters/native_cpu/common.hpp | 10 ++++++++++ source/adapters/native_cpu/context.cpp | 8 +++----- source/adapters/native_cpu/kernel.cpp | 4 +--- source/adapters/native_cpu/program.cpp | 5 +---- source/adapters/native_cpu/queue.cpp | 4 +--- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/source/adapters/native_cpu/common.hpp b/source/adapters/native_cpu/common.hpp index 36ae7abd8b..2c1f48e4d0 100644 --- a/source/adapters/native_cpu/common.hpp +++ b/source/adapters/native_cpu/common.hpp @@ -11,6 +11,7 @@ #pragma once #include "ur/ur.hpp" +#include constexpr size_t MaxMessageSize = 256; @@ -63,8 +64,17 @@ struct _ur_object { struct RefCounted { std::atomic_uint32_t _refCount; + std::mutex _mutex; void incrementReferenceCount() { _refCount++; } void decrementReferenceCount() { _refCount--; } RefCounted() : _refCount{1} {} uint32_t getReferenceCount() const { return _refCount; } }; + +template +inline void decrementOrDelete(T* refC) { + refC->decrementReferenceCount(); + std::lock_guard lock(refC->_mutex); + if (refC->getReferenceCount() == 0) + delete refC; +} diff --git a/source/adapters/native_cpu/context.cpp b/source/adapters/native_cpu/context.cpp index 9cceeb4551..962525d1fc 100644 --- a/source/adapters/native_cpu/context.cpp +++ b/source/adapters/native_cpu/context.cpp @@ -32,15 +32,13 @@ urContextCreate(uint32_t DeviceCount, const ur_device_handle_t *phDevices, UR_APIEXPORT ur_result_t UR_APICALL urContextRetain(ur_context_handle_t hContext) { - std::ignore = hContext; - DIE_NO_IMPLEMENTATION + hContext->incrementReferenceCount(); + return UR_RESULT_SUCCESS; } UR_APIEXPORT ur_result_t UR_APICALL urContextRelease(ur_context_handle_t hContext) { - hContext->decrementReferenceCount(); - if(hContext->getReferenceCount() == 0) - delete hContext; + decrementOrDelete(hContext); return UR_RESULT_SUCCESS; } diff --git a/source/adapters/native_cpu/kernel.cpp b/source/adapters/native_cpu/kernel.cpp index 67826a7d61..7a5c6be308 100644 --- a/source/adapters/native_cpu/kernel.cpp +++ b/source/adapters/native_cpu/kernel.cpp @@ -182,9 +182,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urKernelRetain(ur_kernel_handle_t hKernel) { UR_APIEXPORT ur_result_t UR_APICALL urKernelRelease(ur_kernel_handle_t hKernel) { - hKernel->decrementReferenceCount(); - if(hKernel->getReferenceCount() == 0) - delete hKernel; + decrementOrDelete(hKernel); return UR_RESULT_SUCCESS; } diff --git a/source/adapters/native_cpu/program.cpp b/source/adapters/native_cpu/program.cpp index f48b9d25f2..f55f7b7fa6 100644 --- a/source/adapters/native_cpu/program.cpp +++ b/source/adapters/native_cpu/program.cpp @@ -95,10 +95,7 @@ urProgramRetain(ur_program_handle_t hProgram) { UR_APIEXPORT ur_result_t UR_APICALL urProgramRelease(ur_program_handle_t hProgram) { - hProgram->decrementReferenceCount(); - if(hProgram->getReferenceCount() == 0) - delete hProgram; - + decrementOrDelete(hProgram); return UR_RESULT_SUCCESS; } diff --git a/source/adapters/native_cpu/queue.cpp b/source/adapters/native_cpu/queue.cpp index 1680b076a9..516e66db64 100644 --- a/source/adapters/native_cpu/queue.cpp +++ b/source/adapters/native_cpu/queue.cpp @@ -49,9 +49,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urQueueRetain(ur_queue_handle_t hQueue) { } UR_APIEXPORT ur_result_t UR_APICALL urQueueRelease(ur_queue_handle_t hQueue) { - hQueue->decrementReferenceCount(); - if(hQueue->getReferenceCount() == 0) - delete hQueue; + decrementOrDelete(hQueue); return UR_RESULT_SUCCESS; } From bffa67de6b1a0087eb62fe1ddce6c5ebb43bd62e Mon Sep 17 00:00:00 2001 From: PietroGhg Date: Mon, 20 Nov 2023 13:31:06 +0000 Subject: [PATCH 3/5] Remove mutex --- source/adapters/native_cpu/common.hpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/adapters/native_cpu/common.hpp b/source/adapters/native_cpu/common.hpp index 2c1f48e4d0..22dfe8220c 100644 --- a/source/adapters/native_cpu/common.hpp +++ b/source/adapters/native_cpu/common.hpp @@ -11,7 +11,6 @@ #pragma once #include "ur/ur.hpp" -#include constexpr size_t MaxMessageSize = 256; @@ -64,7 +63,6 @@ struct _ur_object { struct RefCounted { std::atomic_uint32_t _refCount; - std::mutex _mutex; void incrementReferenceCount() { _refCount++; } void decrementReferenceCount() { _refCount--; } RefCounted() : _refCount{1} {} @@ -74,7 +72,6 @@ struct RefCounted { template inline void decrementOrDelete(T* refC) { refC->decrementReferenceCount(); - std::lock_guard lock(refC->_mutex); if (refC->getReferenceCount() == 0) delete refC; } From 413de311138fb9d0d570230b0ee3d4ff9d32be5b Mon Sep 17 00:00:00 2001 From: PietroGhg Date: Tue, 21 Nov 2023 11:12:06 +0000 Subject: [PATCH 4/5] Formatting --- source/adapters/native_cpu/common.hpp | 3 +-- source/adapters/native_cpu/context.hpp | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/source/adapters/native_cpu/common.hpp b/source/adapters/native_cpu/common.hpp index 22dfe8220c..9647fdbf24 100644 --- a/source/adapters/native_cpu/common.hpp +++ b/source/adapters/native_cpu/common.hpp @@ -69,8 +69,7 @@ struct RefCounted { uint32_t getReferenceCount() const { return _refCount; } }; -template -inline void decrementOrDelete(T* refC) { +template inline void decrementOrDelete(T *refC) { refC->decrementReferenceCount(); if (refC->getReferenceCount() == 0) delete refC; diff --git a/source/adapters/native_cpu/context.hpp b/source/adapters/native_cpu/context.hpp index 465c4a8c8c..30bfb31d71 100644 --- a/source/adapters/native_cpu/context.hpp +++ b/source/adapters/native_cpu/context.hpp @@ -12,8 +12,8 @@ #include -#include "device.hpp" #include "common.hpp" +#include "device.hpp" struct ur_context_handle_t_ : RefCounted { ur_context_handle_t_(ur_device_handle_t_ *phDevices) : _device{phDevices} {} From b7731bc8680179410fca8d87c4aa24828a3ca942 Mon Sep 17 00:00:00 2001 From: PietroGhg Date: Wed, 22 Nov 2023 15:24:32 +0000 Subject: [PATCH 5/5] atomic incr/decr-compare --- source/adapters/native_cpu/common.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/adapters/native_cpu/common.hpp b/source/adapters/native_cpu/common.hpp index 9647fdbf24..d792cbbbcf 100644 --- a/source/adapters/native_cpu/common.hpp +++ b/source/adapters/native_cpu/common.hpp @@ -61,16 +61,16 @@ struct _ur_object { ur_shared_mutex Mutex; }; +// Todo: replace this with a common helper once it is available struct RefCounted { std::atomic_uint32_t _refCount; - void incrementReferenceCount() { _refCount++; } - void decrementReferenceCount() { _refCount--; } + uint32_t incrementReferenceCount() { return ++_refCount; } + uint32_t decrementReferenceCount() { return --_refCount; } RefCounted() : _refCount{1} {} uint32_t getReferenceCount() const { return _refCount; } }; template inline void decrementOrDelete(T *refC) { - refC->decrementReferenceCount(); - if (refC->getReferenceCount() == 0) + if (refC->decrementReferenceCount() == 0) delete refC; }