Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[UR] Add support for bidirectional USM prefetching #2312

Open
wants to merge 43 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
1e5218c
Actually implement USM migration flags
ianayl Oct 31, 2024
ca43f93
CUDA: add migration flag logic
ianayl Nov 5, 2024
90110bf
add preliminary testing -- BROKEN MATCH
ianayl Nov 8, 2024
fceb1a7
Fix CUDA conformance enqueue match patterns
ianayl Nov 11, 2024
8cfd770
Add hip adapter for urEnqueueUSMPrefetch
ianayl Nov 13, 2024
27b45d5
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Nov 13, 2024
7d5a8de
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Nov 13, 2024
fb02dac
Fix migration_flags yml spec
ianayl Nov 13, 2024
026c203
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Nov 19, 2024
a502a6e
Re-enable cl usm prefetch
ianayl Nov 19, 2024
287a6dd
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Nov 20, 2024
8cd3d7c
redisable opencl prefetch
ianayl Nov 20, 2024
37b7fa7
Rewrite OCL urEnqueueUSMPrefetch
ianayl Nov 21, 2024
4dca816
Add warnings, fix bug with legacy mapCLErrorToUR
ianayl Nov 21, 2024
5811a5b
Remove duplicate line
ianayl Nov 22, 2024
bec723b
Remove duplicate line
ianayl Nov 22, 2024
b70c04d
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Nov 28, 2024
698f896
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Nov 29, 2024
283dffb
Fix ctest errors
ianayl Dec 3, 2024
e194ae0
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Dec 3, 2024
5669cdf
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Dec 4, 2024
2143085
Add handling for unsupported prefetch combinations
ianayl Dec 10, 2024
c1dcb31
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Dec 10, 2024
6a9b4e5
Added warning messages and cleaned up code
ianayl Dec 11, 2024
869a089
enforce column width
ianayl Dec 11, 2024
0030f67
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Dec 11, 2024
491cf05
Fixed bug in hip
ianayl Dec 11, 2024
260322e
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Dec 12, 2024
65ca774
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Dec 13, 2024
8e819c2
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Dec 16, 2024
ff19760
Update testing for command buffer
ianayl Dec 20, 2024
0f9407c
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Dec 20, 2024
3aa5249
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Dec 23, 2024
17c485e
Fix issue with command dependencies
ianayl Jan 6, 2025
911679a
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Jan 7, 2025
88390f2
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Jan 7, 2025
dd11f85
Fix issue with disregarding event dependencies
ianayl Jan 7, 2025
f82c8a1
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Feb 5, 2025
1b0f730
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Feb 6, 2025
5e33542
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Feb 12, 2025
7d8eeaa
Merge commit 'd03f19a88e42cb98be9604ff24b61190d1e48727' into ianayl/2…
ianayl Feb 13, 2025
e62b498
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Feb 13, 2025
139b4b6
Merge branch 'main' of https://github.com/oneapi-src/unified-runtime …
ianayl Feb 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions include/ur_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -8279,18 +8279,20 @@ typedef enum ur_map_flag_t {
#define UR_MAP_FLAGS_MASK 0xfffffff8

///////////////////////////////////////////////////////////////////////////////
/// @brief Map flags
/// @brief USM migration flags, indicating the direction data is migrated in
typedef uint32_t ur_usm_migration_flags_t;
typedef enum ur_usm_migration_flag_t {
/// Default migration TODO: Add more enums!
UR_USM_MIGRATION_FLAG_DEFAULT = UR_BIT(0),
/// Migrate data from host to device
UR_USM_MIGRATION_FLAG_HOST_TO_DEVICE = UR_BIT(0),
/// Migrate data from device to host
UR_USM_MIGRATION_FLAG_DEVICE_TO_HOST = UR_BIT(1),
/// @cond
UR_USM_MIGRATION_FLAG_FORCE_UINT32 = 0x7fffffff
/// @endcond

} ur_usm_migration_flag_t;
/// @brief Bit Mask for validating ur_usm_migration_flags_t
#define UR_USM_MIGRATION_FLAGS_MASK 0xfffffffe
#define UR_USM_MIGRATION_FLAGS_MASK 0xfffffffc

///////////////////////////////////////////////////////////////////////////////
/// @brief Enqueue a command to map a region of the buffer object into the host
Expand Down Expand Up @@ -8549,7 +8551,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urEnqueueUSMPrefetch(
const void *pMem,
/// [in] size in bytes to be fetched
size_t size,
/// [in] USM prefetch flags
/// [in] USM migration flags
ur_usm_migration_flags_t flags,
/// [in] size of the event wait list
uint32_t numEventsInWaitList,
Expand Down Expand Up @@ -10909,7 +10911,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urCommandBufferAppendUSMPrefetchExp(
const void *pMemory,
/// [in] size in bytes to be fetched.
size_t size,
/// [in] USM prefetch flags
/// [in] USM migration flags
ur_usm_migration_flags_t flags,
/// [in] The number of sync points in the provided dependency list.
uint32_t numSyncPointsInWaitList,
Expand Down
26 changes: 20 additions & 6 deletions include/ur_print.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10300,8 +10300,11 @@ inline ur_result_t printFlag<ur_map_flag_t>(std::ostream &os, uint32_t flag) {
inline std::ostream &operator<<(std::ostream &os,
enum ur_usm_migration_flag_t value) {
switch (value) {
case UR_USM_MIGRATION_FLAG_DEFAULT:
os << "UR_USM_MIGRATION_FLAG_DEFAULT";
case UR_USM_MIGRATION_FLAG_HOST_TO_DEVICE:
os << "UR_USM_MIGRATION_FLAG_HOST_TO_DEVICE";
break;
case UR_USM_MIGRATION_FLAG_DEVICE_TO_HOST:
os << "UR_USM_MIGRATION_FLAG_DEVICE_TO_HOST";
break;
default:
os << "unknown enumerator";
Expand All @@ -10319,15 +10322,26 @@ inline ur_result_t printFlag<ur_usm_migration_flag_t>(std::ostream &os,
uint32_t val = flag;
bool first = true;

if ((val & UR_USM_MIGRATION_FLAG_DEFAULT) ==
(uint32_t)UR_USM_MIGRATION_FLAG_DEFAULT) {
val ^= (uint32_t)UR_USM_MIGRATION_FLAG_DEFAULT;
if ((val & UR_USM_MIGRATION_FLAG_HOST_TO_DEVICE) ==
(uint32_t)UR_USM_MIGRATION_FLAG_HOST_TO_DEVICE) {
val ^= (uint32_t)UR_USM_MIGRATION_FLAG_HOST_TO_DEVICE;
if (!first) {
os << " | ";
} else {
first = false;
}
os << UR_USM_MIGRATION_FLAG_HOST_TO_DEVICE;
}

if ((val & UR_USM_MIGRATION_FLAG_DEVICE_TO_HOST) ==
(uint32_t)UR_USM_MIGRATION_FLAG_DEVICE_TO_HOST) {
val ^= (uint32_t)UR_USM_MIGRATION_FLAG_DEVICE_TO_HOST;
if (!first) {
os << " | ";
} else {
first = false;
}
os << UR_USM_MIGRATION_FLAG_DEFAULT;
os << UR_USM_MIGRATION_FLAG_DEVICE_TO_HOST;
}
if (val != 0) {
std::bitset<32> bits(val);
Expand Down
13 changes: 8 additions & 5 deletions scripts/core/enqueue.yml
Original file line number Diff line number Diff line change
Expand Up @@ -849,13 +849,16 @@ etors:
value: "$X_BIT(2)"
--- #--------------------------------------------------------------------------
type: enum
desc: "Map flags"
class: $xDevice
desc: "USM migration flags, indicating the direction data is migrated in"
class: $xEnqueue
name: $x_usm_migration_flags_t
etors:
- name: DEFAULT
desc: "Default migration TODO: Add more enums! "
- name: HOST_TO_DEVICE
desc: "Migrate data from host to device"
value: "$X_BIT(0)"
- name: DEVICE_TO_HOST
desc: "Migrate data from device to host"
value: "$X_BIT(1)"
--- #--------------------------------------------------------------------------
type: function
desc: "Enqueue a command to map a region of the buffer object into the host address space and return a pointer to the mapped region"
Expand Down Expand Up @@ -1144,7 +1147,7 @@ params:
desc: "[in] size in bytes to be fetched"
- type: $x_usm_migration_flags_t
name: flags
desc: "[in] USM prefetch flags"
desc: "[in] USM migration flags"
- type: uint32_t
name: numEventsInWaitList
desc: "[in] size of the event wait list"
Expand Down
2 changes: 1 addition & 1 deletion scripts/core/exp-command-buffer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1024,7 +1024,7 @@ params:
desc: "[in] size in bytes to be fetched."
- type: $x_usm_migration_flags_t
name: flags
desc: "[in] USM prefetch flags"
desc: "[in] USM migration flags"
- type: uint32_t
name: numSyncPointsInWaitList
desc: "[in] The number of sync points in the provided dependency list."
Expand Down
18 changes: 15 additions & 3 deletions source/adapters/cuda/enqueue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1598,13 +1598,25 @@ UR_APIEXPORT ur_result_t UR_APICALL urEnqueueUSMPrefetch(
ur_queue_handle_t hQueue, const void *pMem, size_t size,
ur_usm_migration_flags_t flags, uint32_t numEventsInWaitList,
const ur_event_handle_t *phEventWaitList, ur_event_handle_t *phEvent) {
std::ignore = flags;
ur_device_handle_t Device = hQueue->getDevice();
CUdevice TargetDevice;
switch (flags) {
case UR_USM_MIGRATION_FLAG_HOST_TO_DEVICE:
TargetDevice = Device->get();
break;
case UR_USM_MIGRATION_FLAG_DEVICE_TO_HOST:
TargetDevice = CU_DEVICE_CPU;
break;
default:
setErrorMessage("Invalid USM migration flag",
UR_RESULT_ERROR_INVALID_ENUMERATION);
return UR_RESULT_ERROR_INVALID_ENUMERATION;
}

size_t PointerRangeSize = 0;
UR_CHECK_ERROR(cuPointerGetAttribute(
&PointerRangeSize, CU_POINTER_ATTRIBUTE_RANGE_SIZE, (CUdeviceptr)pMem));
UR_ASSERT(size <= PointerRangeSize, UR_RESULT_ERROR_INVALID_SIZE);
ur_device_handle_t Device = hQueue->getDevice();

// Certain cuda devices and Windows do not have support for some Unified
// Memory features. cuMemPrefetchAsync requires concurrent memory access
Expand Down Expand Up @@ -1641,7 +1653,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urEnqueueUSMPrefetch(
UR_CHECK_ERROR(EventPtr->start());
}
UR_CHECK_ERROR(
cuMemPrefetchAsync((CUdeviceptr)pMem, size, Device->get(), CuStream));
cuMemPrefetchAsync((CUdeviceptr)pMem, size, TargetDevice, CuStream));
if (phEvent) {
UR_CHECK_ERROR(EventPtr->record());
*phEvent = EventPtr.release();
Expand Down
19 changes: 16 additions & 3 deletions source/adapters/hip/enqueue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1365,10 +1365,24 @@ UR_APIEXPORT ur_result_t UR_APICALL urEnqueueUSMPrefetch(
ur_queue_handle_t hQueue, const void *pMem, size_t size,
ur_usm_migration_flags_t flags, uint32_t numEventsInWaitList,
const ur_event_handle_t *phEventWaitList, ur_event_handle_t *phEvent) {
std::ignore = flags;

void *HIPDevicePtr = const_cast<void *>(pMem);
ur_device_handle_t Device = hQueue->getDevice();
hipDevice_t TargetDevice;
switch (flags) {
case UR_USM_MIGRATION_FLAG_HOST_TO_DEVICE:
TargetDevice = Device->get();
break;
case UR_USM_MIGRATION_FLAG_DEVICE_TO_HOST:
// HIP doesn't have a constant for host like CUDA does; -1 is used instead
// https://github.com/ROCm/HIP/blob/3d60bd3a6415c2/docs/how-to/unified_memory.rst#L376
TargetDevice = -1;
break;
default:
setErrorMessage("Invalid USM migration flag",
UR_RESULT_ERROR_INVALID_ENUMERATION);
return UR_RESULT_ERROR_INVALID_ENUMERATION;
}

// HIP_POINTER_ATTRIBUTE_RANGE_SIZE is not an attribute in ROCM < 5,
// so we can't perform this check for such cases.
Expand Down Expand Up @@ -1428,8 +1442,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urEnqueueUSMPrefetch(
return UR_RESULT_ERROR_ADAPTER_SPECIFIC;
}

UR_CHECK_ERROR(
hipMemPrefetchAsync(pMem, size, hQueue->getDevice()->get(), HIPStream));
UR_CHECK_ERROR(hipMemPrefetchAsync(pMem, size, TargetDevice, HIPStream));
releaseEvent();
} catch (ur_result_t Err) {
return Err;
Expand Down
29 changes: 20 additions & 9 deletions source/adapters/level_zero/command_buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1304,13 +1304,18 @@ ur_result_t urCommandBufferAppendUSMPrefetchExp(
std::ignore = EventWaitList;
std::ignore = Event;
std::ignore = Command;
std::ignore = Flags;

if (CommandBuffer->IsInOrderCmdList) {
// Add the prefetch command to the command-buffer.
// Note that L0 does not handle migration flags.
ZE2UR_CALL(zeCommandListAppendMemoryPrefetch,
(CommandBuffer->ZeComputeCommandList, Mem, Size));
if (Flags == UR_USM_MIGRATION_FLAG_HOST_TO_DEVICE) {
// Add the prefetch command to the command-buffer.
ZE2UR_CALL(zeCommandListAppendMemoryPrefetch,
(CommandBuffer->ZeComputeCommandList, Mem, Size));
} else {
// L0 currently does not handle migration flags -- All other migration
// behavior is ignored:
logger::warning("USM migration from device to host is not currently "
"supported by level zero.");
}
} else {
std::vector<ze_event_handle_t> ZeEventList;
ze_event_handle_t ZeLaunchEvent = nullptr;
Expand All @@ -1324,10 +1329,16 @@ ur_result_t urCommandBufferAppendUSMPrefetchExp(
ZeEventList.data()));
}

// Add the prefetch command to the command-buffer.
// Note that L0 does not handle migration flags.
ZE2UR_CALL(zeCommandListAppendMemoryPrefetch,
(CommandBuffer->ZeComputeCommandList, Mem, Size));
if (Flags == UR_USM_MIGRATION_FLAG_HOST_TO_DEVICE) {
// Add the prefetch command to the command buffer.
ZE2UR_CALL(zeCommandListAppendMemoryPrefetch,
(CommandBuffer->ZeComputeCommandList, Mem, Size));
} else {
// L0 currently does not handle migration flags -- All other migration
// behavior is ignored:
logger::warning("USM migration from device to host is not currently "
"supported by level zero.");
}

// Level Zero does not have a completion "event" with the prefetch API,
// so manually add command to signal our event.
Expand Down
11 changes: 8 additions & 3 deletions source/adapters/level_zero/memory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1290,7 +1290,6 @@ ur_result_t urEnqueueUSMPrefetch(
/// [in,out][optional] return an event object that identifies this
/// particular command instance.
ur_event_handle_t *OutEvent) {
std::ignore = Flags;
// Lock automatically releases when this goes out of scope.
std::scoped_lock<ur_shared_mutex> lock(Queue->Mutex);

Expand Down Expand Up @@ -1330,8 +1329,14 @@ ur_result_t urEnqueueUSMPrefetch(
ZE2UR_CALL(zeCommandListAppendWaitOnEvents,
(ZeCommandList, WaitList.Length, WaitList.ZeEventList));
}
// TODO: figure out how to translate "flags"
ZE2UR_CALL(zeCommandListAppendMemoryPrefetch, (ZeCommandList, Mem, Size));

if (Flags == UR_USM_MIGRATION_FLAG_HOST_TO_DEVICE) {
ZE2UR_CALL(zeCommandListAppendMemoryPrefetch, (ZeCommandList, Mem, Size));
} else {
// L0 does not suppot migrating from device to host yet: skip procedure
logger::warning("urEnqueueUSMPrefetch: Prefetch from device to host not yet"
" supported by level zero");
}

// TODO: Level Zero does not have a completion "event" with the prefetch API,
// so manually add command to signal our event.
Expand Down
21 changes: 13 additions & 8 deletions source/adapters/level_zero/v2/queue_immediate_in_order.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -629,8 +629,6 @@ ur_result_t ur_queue_immediate_in_order_t::enqueueUSMPrefetch(
ur_event_handle_t *phEvent) {
TRACK_SCOPE_LATENCY("ur_queue_immediate_in_order_t::enqueueUSMPrefetch");

std::ignore = flags;

std::scoped_lock<ur_shared_mutex> lock(this->Mutex);

auto zeSignalEvent = getSignalEvent(phEvent, UR_COMMAND_USM_PREFETCH);
Expand All @@ -643,12 +641,19 @@ ur_result_t ur_queue_immediate_in_order_t::enqueueUSMPrefetch(
zeCommandListAppendWaitOnEvents,
(commandListManager.getZeCommandList(), numWaitEvents, pWaitEvents));
}
// TODO: figure out how to translate "flags"
ZE2UR_CALL(zeCommandListAppendMemoryPrefetch,
(commandListManager.getZeCommandList(), pMem, size));
if (zeSignalEvent) {
ZE2UR_CALL(zeCommandListAppendSignalEvent,
(commandListManager.getZeCommandList(), zeSignalEvent));

if (flags == UR_USM_MIGRATION_FLAG_HOST_TO_DEVICE) {
ZE2UR_CALL(zeCommandListAppendMemoryPrefetch,
(commandListManager.getZeCommandList(), pMem, size));
if (zeSignalEvent) {
ZE2UR_CALL(zeCommandListAppendSignalEvent,
(commandListManager.getZeCommandList(), zeSignalEvent));
}
} else {
// L0 does not suppot migrating from device to host yet: skip procedure
setErrorMessage("Prefetch from device to host not yet supported by level "
"zero.",
UR_RESULT_SUCCESS);
}

return UR_RESULT_SUCCESS;
Expand Down
4 changes: 2 additions & 2 deletions source/adapters/mock/ur_mockddi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6720,7 +6720,7 @@ __urdlllocal ur_result_t UR_APICALL urEnqueueUSMPrefetch(
const void *pMem,
/// [in] size in bytes to be fetched
size_t size,
/// [in] USM prefetch flags
/// [in] USM migration flags
ur_usm_migration_flags_t flags,
/// [in] size of the event wait list
uint32_t numEventsInWaitList,
Expand Down Expand Up @@ -9584,7 +9584,7 @@ __urdlllocal ur_result_t UR_APICALL urCommandBufferAppendUSMPrefetchExp(
const void *pMemory,
/// [in] size in bytes to be fetched.
size_t size,
/// [in] USM prefetch flags
/// [in] USM migration flags
ur_usm_migration_flags_t flags,
/// [in] The number of sync points in the provided dependency list.
uint32_t numSyncPointsInWaitList,
Expand Down
6 changes: 3 additions & 3 deletions source/adapters/opencl/common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@
namespace cl_adapter {

/* Global variables for urAdapterGetLastError() */
thread_local int32_t ErrorMessageCode = 0;
thread_local ur_result_t ErrorMessageCode = UR_RESULT_SUCCESS;
thread_local char ErrorMessage[MaxMessageSize]{};

[[maybe_unused]] void setErrorMessage(const char *Message, int32_t ErrorCode) {
[[maybe_unused]] void setErrorMessage(const char *Message,
ur_result_t ErrorCode) {
assert(strlen(Message) < cl_adapter::MaxMessageSize);
// Copy at most MaxMessageSize - 1 bytes to ensure the resultant string is
// always null terminated.
strncpy(cl_adapter::ErrorMessage, Message, MaxMessageSize - 1);

ErrorMessageCode = ErrorCode;
}
} // namespace cl_adapter
Expand Down
3 changes: 2 additions & 1 deletion source/adapters/opencl/common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ inline const OpenCLVersion V3_0(3, 0);

namespace cl_adapter {
constexpr size_t MaxMessageSize = 256;
extern thread_local int32_t ErrorMessageCode;
extern thread_local ur_result_t ErrorMessageCode;
extern thread_local char ErrorMessage[MaxMessageSize];

// Utility function for setting a message and warning
Expand Down Expand Up @@ -203,6 +203,7 @@ CONSTFIX char EnqueueWriteGlobalVariableName[] =
"clEnqueueWriteGlobalVariableINTEL";
CONSTFIX char EnqueueReadGlobalVariableName[] =
"clEnqueueReadGlobalVariableINTEL";
CONSTFIX char EnqueueMigrateMemName[] = "clEnqueueMigrateMemINTEL";
// Names of host pipe functions queried from OpenCL
CONSTFIX char EnqueueReadHostPipeName[] = "clEnqueueReadHostPipeINTEL";
CONSTFIX char EnqueueWriteHostPipeName[] = "clEnqueueWriteHostPipeINTEL";
Expand Down
1 change: 1 addition & 0 deletions source/adapters/opencl/extension_functions.def
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ CL_EXTENSION_FUNC(clMemBlockingFreeINTEL)
CL_EXTENSION_FUNC(clSetKernelArgMemPointerINTEL)
CL_EXTENSION_FUNC(clEnqueueMemFillINTEL)
CL_EXTENSION_FUNC(clEnqueueMemcpyINTEL)
CL_EXTENSION_FUNC(clEnqueueMigrateMemINTEL)
CL_EXTENSION_FUNC(clGetMemAllocInfoINTEL)
CL_EXTENSION_FUNC(clEnqueueWriteGlobalVariable)
CL_EXTENSION_FUNC(clEnqueueReadGlobalVariable)
Expand Down
Loading