Skip to content

Commit d202b5c

Browse files
committed
Use UMF Proxy pool manager with UMF CUDA memory provider in UR
UMF Proxy pool manager is just a wrapper for the UMF memory provider (CUDA memory provider in this case) plus it adds also tracking of memory allocations. Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 8e4b5c3 commit d202b5c

File tree

6 files changed

+88
-21
lines changed

6 files changed

+88
-21
lines changed

source/adapters/cuda/context.hpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,21 @@ CreateHostMemoryProvider(ur_device_handle_t_ *DeviceHandle,
100100
return UR_RESULT_SUCCESS;
101101
}
102102

103+
static ur_result_t
104+
CreateHostMemoryPool(umf_memory_provider_handle_t MemoryProviderHost,
105+
umf_memory_pool_handle_t *MemoryPoolHost) {
106+
107+
umf_memory_pool_handle_t _MemoryPoolHost = nullptr;
108+
109+
umf_result_t UmfResult =
110+
umf::createMemoryProxyPool(MemoryProviderHost, &_MemoryPoolHost);
111+
UMF_RETURN_UR_ERROR(UmfResult);
112+
113+
*MemoryPoolHost = _MemoryPoolHost;
114+
115+
return UR_RESULT_SUCCESS;
116+
}
117+
103118
struct ur_context_handle_t_ {
104119

105120
struct deleter_data {
@@ -112,8 +127,10 @@ struct ur_context_handle_t_ {
112127
std::vector<ur_device_handle_t> Devices;
113128
std::atomic_uint32_t RefCount;
114129

115-
// UMF CUDA memory provider for the host memory (UMF_MEMORY_TYPE_HOST)
130+
// UMF CUDA memory provider and pool for the host memory
131+
// (UMF_MEMORY_TYPE_HOST)
116132
umf_memory_provider_handle_t MemoryProviderHost = nullptr;
133+
umf_memory_pool_handle_t MemoryPoolHost = nullptr;
117134

118135
ur_context_handle_t_(const ur_device_handle_t *Devs, uint32_t NumDevices)
119136
: Devices{Devs, Devs + NumDevices}, RefCount{1} {
@@ -125,9 +142,13 @@ struct ur_context_handle_t_ {
125142
// (UMF_MEMORY_TYPE_HOST) from any device (Devices[0] is used here, because
126143
// it is guaranteed to exist).
127144
UR_CHECK_ERROR(CreateHostMemoryProvider(Devices[0], &MemoryProviderHost));
145+
UR_CHECK_ERROR(CreateHostMemoryPool(MemoryProviderHost, &MemoryPoolHost));
128146
};
129147

130148
~ur_context_handle_t_() {
149+
if (MemoryPoolHost) {
150+
umfPoolDestroy(MemoryPoolHost);
151+
}
131152
if (MemoryProviderHost) {
132153
umfMemoryProviderDestroy(MemoryProviderHost);
133154
}

source/adapters/cuda/device.hpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include <ur/ur.hpp>
1313

14+
#include <umf/memory_pool.h>
1415
#include <umf/memory_provider.h>
1516

1617
#include "common.hpp"
@@ -84,9 +85,17 @@ struct ur_device_handle_t_ {
8485

8586
MemoryProviderDevice = nullptr;
8687
MemoryProviderShared = nullptr;
88+
MemoryPoolDevice = nullptr;
89+
MemoryPoolShared = nullptr;
8790
}
8891

8992
~ur_device_handle_t_() {
93+
if (MemoryPoolDevice) {
94+
umfPoolDestroy(MemoryPoolDevice);
95+
}
96+
if (MemoryPoolShared) {
97+
umfPoolDestroy(MemoryPoolShared);
98+
}
9099
if (MemoryProviderDevice) {
91100
umfMemoryProviderDestroy(MemoryProviderDevice);
92101
}
@@ -131,11 +140,15 @@ struct ur_device_handle_t_ {
131140
// bookkeeping for mipmappedArray leaks in Mapping external Memory
132141
std::map<CUarray, CUmipmappedArray> ChildCuarrayFromMipmapMap;
133142

134-
// UMF CUDA memory provider for the device memory (UMF_MEMORY_TYPE_DEVICE)
143+
// UMF CUDA memory provider and pool for the device memory
144+
// (UMF_MEMORY_TYPE_DEVICE)
135145
umf_memory_provider_handle_t MemoryProviderDevice;
146+
umf_memory_pool_handle_t MemoryPoolDevice;
136147

137-
// UMF CUDA memory provider for the shared memory (UMF_MEMORY_TYPE_SHARED)
148+
// UMF CUDA memory provider and pool for the shared memory
149+
// (UMF_MEMORY_TYPE_SHARED)
138150
umf_memory_provider_handle_t MemoryProviderShared;
151+
umf_memory_pool_handle_t MemoryPoolShared;
139152
};
140153

141154
int getAttribute(ur_device_handle_t Device, CUdevice_attribute Attribute);

source/adapters/cuda/memory.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemBufferCreate(
5050
cuMemHostRegister(HostPtr, size, CU_MEMHOSTREGISTER_DEVICEMAP));
5151
AllocMode = BufferMem::AllocMode::UseHostPtr;
5252
} else if (flags & UR_MEM_FLAG_ALLOC_HOST_POINTER) {
53-
UMF_CHECK_ERROR(umfMemoryProviderAlloc(hContext->MemoryProviderHost, size,
54-
0, &HostPtr));
53+
HostPtr = umfPoolMalloc(hContext->MemoryPoolHost, size);
54+
UMF_CHECK_PTR(HostPtr);
5555
AllocMode = BufferMem::AllocMode::AllocHostPtr;
5656
} else if (flags & UR_MEM_FLAG_ALLOC_COPY_HOST_POINTER) {
5757
AllocMode = BufferMem::AllocMode::CopyIn;
@@ -442,8 +442,8 @@ ur_result_t allocateMemObjOnDeviceIfNeeded(ur_mem_handle_t Mem,
442442
CU_MEMHOSTALLOC_DEVICEMAP));
443443
UR_CHECK_ERROR(cuMemHostGetDevicePointer(&DevPtr, Buffer.HostPtr, 0));
444444
} else {
445-
UMF_CHECK_ERROR(umfMemoryProviderAlloc(hDevice->MemoryProviderDevice,
446-
Buffer.Size, 0, (void **)&DevPtr));
445+
*(void **)&DevPtr = umfPoolMalloc(hDevice->MemoryPoolDevice, Buffer.Size);
446+
UMF_CHECK_PTR(*(void **)&DevPtr);
447447
}
448448
} else {
449449
CUarray ImageArray{};

source/adapters/cuda/platform.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include <sstream>
2121

2222
static ur_result_t
23-
CreateDeviceMemoryProviders(ur_platform_handle_t_ *Platform) {
23+
CreateDeviceMemoryProvidersPools(ur_platform_handle_t_ *Platform) {
2424
umf_cuda_memory_provider_params_handle_t CUMemoryProviderParams = nullptr;
2525

2626
umf_result_t UmfResult =
@@ -48,6 +48,18 @@ CreateDeviceMemoryProviders(ur_platform_handle_t_ *Platform) {
4848
CUMemoryProviderParamsUnique.get(), device, context,
4949
UMF_MEMORY_TYPE_SHARED, &device_handle->MemoryProviderShared);
5050
UMF_RETURN_UR_ERROR(UmfResult);
51+
52+
// create UMF CUDA memory pool for the device memory
53+
// (UMF_MEMORY_TYPE_DEVICE)
54+
UmfResult = umf::createMemoryProxyPool(device_handle->MemoryProviderDevice,
55+
&device_handle->MemoryPoolDevice);
56+
UMF_RETURN_UR_ERROR(UmfResult);
57+
58+
// create UMF CUDA memory pool for the shared memory
59+
// (UMF_MEMORY_TYPE_SHARED)
60+
UmfResult = umf::createMemoryProxyPool(device_handle->MemoryProviderShared,
61+
&device_handle->MemoryPoolShared);
62+
UMF_RETURN_UR_ERROR(UmfResult);
5163
}
5264

5365
return UR_RESULT_SUCCESS;
@@ -134,7 +146,7 @@ urPlatformGet(ur_adapter_handle_t *, uint32_t, uint32_t NumEntries,
134146
static_cast<uint32_t>(i)});
135147
}
136148

137-
UR_CHECK_ERROR(CreateDeviceMemoryProviders(&Platform));
149+
UR_CHECK_ERROR(CreateDeviceMemoryProvidersPools(&Platform));
138150
} catch (const std::bad_alloc &) {
139151
// Signal out-of-memory situation
140152
for (int i = 0; i < NumDevices; ++i) {

source/adapters/cuda/usm.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -125,18 +125,17 @@ ur_result_t USMFreeImpl(ur_context_handle_t hContext, void *Pointer) {
125125
UR_ASSERT(DeviceOrdinal < NumDevices, UR_RESULT_ERROR_INVALID_DEVICE);
126126

127127
ur_device_handle_t Device = Platform->Devices[DeviceOrdinal].get();
128-
umf_memory_provider_handle_t MemoryProvider;
128+
umf_memory_pool_handle_t MemoryPool;
129129

130130
if (IsManaged) {
131-
MemoryProvider = Device->MemoryProviderShared;
131+
MemoryPool = Device->MemoryPoolShared;
132132
} else if (Type == CU_MEMORYTYPE_DEVICE) {
133-
MemoryProvider = Device->MemoryProviderDevice;
133+
MemoryPool = Device->MemoryPoolDevice;
134134
} else {
135-
MemoryProvider = hContext->MemoryProviderHost;
135+
MemoryPool = hContext->MemoryPoolHost;
136136
}
137137

138-
UMF_CHECK_ERROR(umfMemoryProviderFree(MemoryProvider, Pointer,
139-
0 /* size is unknown */));
138+
UMF_CHECK_ERROR(umfPoolFree(MemoryPool, Pointer));
140139
} catch (ur_result_t Err) {
141140
Result = Err;
142141
}
@@ -158,8 +157,8 @@ ur_result_t USMDeviceAllocImpl(void **ResultPtr, ur_context_handle_t,
158157
uint32_t Alignment) {
159158
try {
160159
ScopedContext Active(Device);
161-
UMF_CHECK_ERROR(umfMemoryProviderAlloc(Device->MemoryProviderDevice, Size,
162-
Alignment, ResultPtr));
160+
*ResultPtr = umfPoolMalloc(Device->MemoryPoolDevice, Size);
161+
UMF_CHECK_PTR(*ResultPtr);
163162
} catch (ur_result_t Err) {
164163
return Err;
165164
}
@@ -180,8 +179,8 @@ ur_result_t USMSharedAllocImpl(void **ResultPtr, ur_context_handle_t,
180179
uint32_t Alignment) {
181180
try {
182181
ScopedContext Active(Device);
183-
UMF_CHECK_ERROR(umfMemoryProviderAlloc(Device->MemoryProviderShared, Size,
184-
Alignment, ResultPtr));
182+
*ResultPtr = umfPoolMalloc(Device->MemoryPoolShared, Size);
183+
UMF_CHECK_PTR(*ResultPtr);
185184
} catch (ur_result_t Err) {
186185
return Err;
187186
}
@@ -199,8 +198,8 @@ ur_result_t USMHostAllocImpl(void **ResultPtr, ur_context_handle_t hContext,
199198
ur_usm_host_mem_flags_t, size_t Size,
200199
uint32_t Alignment) {
201200
try {
202-
UMF_CHECK_ERROR(umfMemoryProviderAlloc(hContext->MemoryProviderHost, Size,
203-
Alignment, ResultPtr));
201+
*ResultPtr = umfPoolMalloc(hContext->MemoryPoolHost, Size);
202+
UMF_CHECK_PTR(*ResultPtr);
204203
} catch (ur_result_t Err) {
205204
return Err;
206205
}

source/common/umf_helpers.hpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <umf/memory_pool_ops.h>
1717
#include <umf/memory_provider.h>
1818
#include <umf/memory_provider_ops.h>
19+
#include <umf/pools/pool_proxy.h>
1920
#include <umf/providers/provider_cuda.h>
2021
#include <ur_api.h>
2122

@@ -30,6 +31,13 @@
3031

3132
#define UMF_CHECK_ERROR(UmfResult) UR_CHECK_ERROR(umf::umf2urResult(UmfResult));
3233

34+
#define UMF_CHECK_PTR(ptr) \
35+
do { \
36+
if ((ptr) == nullptr) { \
37+
UR_CHECK_ERROR(UR_RESULT_ERROR_OUT_OF_HOST_MEMORY); \
38+
} \
39+
} while (0)
40+
3341
#define UMF_RETURN_UMF_ERROR(UmfResult) \
3442
do { \
3543
umf_result_t UmfResult_ = (UmfResult); \
@@ -328,6 +336,20 @@ inline umf_result_t createMemoryProvider(
328336
return UMF_RESULT_SUCCESS;
329337
}
330338

339+
inline umf_result_t createMemoryProxyPool(umf_memory_provider_handle_t provider,
340+
umf_memory_pool_handle_t *pool) {
341+
342+
umf_memory_pool_handle_t _pool = nullptr;
343+
344+
umf_result_t UmfResult =
345+
umfPoolCreate(umfProxyPoolOps(), provider, nullptr, 0, &_pool);
346+
UMF_RETURN_UMF_ERROR(UmfResult);
347+
348+
*pool = _pool;
349+
350+
return UMF_RESULT_SUCCESS;
351+
}
352+
331353
} // namespace umf
332354

333355
#endif /* UMF_HELPERS_H */

0 commit comments

Comments
 (0)