Skip to content

Commit

Permalink
added xml file and updated samples
Browse files Browse the repository at this point in the history
  • Loading branch information
bashbaug committed Oct 25, 2023
1 parent f0e1f71 commit 127ee46
Show file tree
Hide file tree
Showing 23 changed files with 9,393 additions and 179 deletions.
84 changes: 70 additions & 14 deletions layers/99_svmplusplus/emulate.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
// Copyright (c) 2022 Ben Ashbaugh
// Copyright (c) 2023 Ben Ashbaugh
//
// SPDX-License-Identifier: MIT
*/
Expand Down Expand Up @@ -82,7 +82,7 @@ static bool isUSMPtr(
type == CL_SVM_MEM_TYPE_SHARED_EXP;
}

static cl_device_id getAssociatedDeviceFromPropertie(
static cl_device_id getAssociatedDeviceFromProperties(
const cl_svm_mem_properties_exp* props)
{
if (props) {
Expand Down Expand Up @@ -112,7 +112,7 @@ void* CL_API_CALL clSVMAllocWithPropertiesEXP_EMU(
cl_uint alignment,
cl_int* errcode_ret)
{
cl_device_id device = getAssociatedDeviceFromPropertie(properties);
cl_device_id device = getAssociatedDeviceFromProperties(properties);

if (flags & CL_MEM_SVM_DEVICE_EXP) {
return clDeviceMemAllocINTEL(
Expand Down Expand Up @@ -202,6 +202,53 @@ cl_int CL_API_CALL clGetDeviceInfo_override(
size_t* param_value_size_ret)
{
switch(param_name) {
case CL_DEVICE_SVM_CAPABILITIES:
{
cl_device_unified_shared_memory_capabilities_intel deviceCaps = 0;
g_pNextDispatch->clGetDeviceInfo(
device,
CL_DEVICE_DEVICE_MEM_CAPABILITIES_INTEL,
sizeof(deviceCaps),
&deviceCaps,
nullptr );

cl_device_unified_shared_memory_capabilities_intel hostCaps = 0;
g_pNextDispatch->clGetDeviceInfo(
device,
CL_DEVICE_HOST_MEM_CAPABILITIES_INTEL,
sizeof(hostCaps),
&hostCaps,
nullptr );

// We can just check the single device shared capabilities:
cl_device_unified_shared_memory_capabilities_intel sharedCaps = 0;
g_pNextDispatch->clGetDeviceInfo(
device,
CL_DEVICE_SINGLE_DEVICE_SHARED_MEM_CAPABILITIES_INTEL,
sizeof(sharedCaps),
&sharedCaps,
nullptr );

cl_device_svm_capabilities svmCaps = 0;
g_pNextDispatch->clGetDeviceInfo(
device,
CL_DEVICE_SVM_CAPABILITIES,
sizeof(svmCaps),
&svmCaps,
nullptr );

svmCaps |= (deviceCaps != 0) ? CL_DEVICE_SVM_DEVICE_ALLOC_EXP : 0;
svmCaps |= (hostCaps != 0) ? CL_DEVICE_SVM_HOST_ALLOC_EXP : 0;
svmCaps |= (sharedCaps != 0) ? CL_DEVICE_SVM_SHARED_ALLOC_EXP : 0;

auto ptr = (cl_device_svm_capabilities*)param_value;
return writeParamToMemory(
param_value_size,
svmCaps,
param_value_size_ret,
ptr );
}
break;
case CL_DEVICE_EXTENSIONS:
{
size_t size = 0;
Expand All @@ -222,10 +269,9 @@ cl_int CL_API_CALL clGetDeviceInfo_override(

if( checkStringForExtension(
deviceExtensions.data(),
CL_EXP_NEW_SVM_EXTENSION_NAME ) == false )
CL_EXP_UNIFIED_SVM_EXTENSION_NAME ) == false )
{
std::string newExtensions;
newExtensions += CL_EXP_NEW_SVM_EXTENSION_NAME;

std::string oldExtensions(deviceExtensions.data());

Expand Down Expand Up @@ -274,7 +320,7 @@ cl_int CL_API_CALL clGetDeviceInfo_override(
bool found = false;
for( const auto& extension : extensions )
{
if( strcmp(extension.name, CL_EXP_NEW_SVM_EXTENSION_NAME) == 0 )
if( strcmp(extension.name, CL_EXP_UNIFIED_SVM_EXTENSION_NAME) == 0 )
{
found = true;
break;
Expand All @@ -287,7 +333,7 @@ cl_int CL_API_CALL clGetDeviceInfo_override(
cl_name_version& extension = extensions.back();

memset(extension.name, 0, CL_NAME_VERSION_MAX_NAME_SIZE);
strcpy(extension.name, CL_EXP_NEW_SVM_EXTENSION_NAME);
strcpy(extension.name, CL_EXP_UNIFIED_SVM_EXTENSION_NAME);

extension.version = version_cl_exp_new_svm_extension;

Expand All @@ -301,8 +347,7 @@ cl_int CL_API_CALL clGetDeviceInfo_override(
}
}
break;
// TODO
case CL_DEVICE_SVM_CAPABILITIES:
// USM aliases - pass through.
case CL_DEVICE_HOST_MEM_CAPABILITIES_EXP:
case CL_DEVICE_DEVICE_MEM_CAPABILITIES_EXP:
case CL_DEVICE_SINGLE_DEVICE_SHARED_MEM_CAPABILITIES_EXP:
Expand Down Expand Up @@ -347,10 +392,10 @@ cl_int CL_API_CALL clGetPlatformInfo_override(

if( checkStringForExtension(
platformExtensions.data(),
CL_EXP_NEW_SVM_EXTENSION_NAME ) == false )
CL_EXP_UNIFIED_SVM_EXTENSION_NAME ) == false )
{
std::string newExtensions;
newExtensions += CL_EXP_NEW_SVM_EXTENSION_NAME;
newExtensions += CL_EXP_UNIFIED_SVM_EXTENSION_NAME;

std::string oldExtensions(platformExtensions.data());

Expand Down Expand Up @@ -399,7 +444,7 @@ cl_int CL_API_CALL clGetPlatformInfo_override(
bool found = false;
for( const auto& extension : extensions )
{
if( strcmp(extension.name, CL_EXP_NEW_SVM_EXTENSION_NAME) == 0 )
if( strcmp(extension.name, CL_EXP_UNIFIED_SVM_EXTENSION_NAME) == 0 )
{
found = true;
break;
Expand All @@ -412,7 +457,7 @@ cl_int CL_API_CALL clGetPlatformInfo_override(
cl_name_version& extension = extensions.back();

memset(extension.name, 0, CL_NAME_VERSION_MAX_NAME_SIZE);
strcpy(extension.name, CL_EXP_NEW_SVM_EXTENSION_NAME);
strcpy(extension.name, CL_EXP_UNIFIED_SVM_EXTENSION_NAME);

extension.version = version_cl_exp_new_svm_extension;

Expand Down Expand Up @@ -457,6 +502,17 @@ cl_int CL_API_CALL clSetKernelArgSVMPointer_override(
arg_value);
}

void CL_API_CALL clSVMFree_override(
cl_context context,
void* ptr)
{
if (isUSMPtr(context, ptr)) {
clMemFreeINTEL(context, ptr);
}

g_pNextDispatch->clSVMFree(context, ptr);
}

cl_int CL_API_CALL clEnqueueSVMMemAdviseEXP_EMU(
cl_command_queue command_queue,
const void* ptr,
Expand Down Expand Up @@ -486,7 +542,7 @@ cl_int CL_API_CALL clEnqueueSVMMemcpy_override(
{
cl_context context = getContext(command_queue);

if (isUSMPtr(context, dst_ptr)) {
if (isUSMPtr(context, dst_ptr) || isUSMPtr(context, src_ptr)) {
return clEnqueueMemcpyINTEL(
command_queue,
blocking_copy,
Expand Down
168 changes: 4 additions & 164 deletions layers/99_svmplusplus/emulate.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,170 +7,6 @@
#include <CL/cl.h>
#include <CL/cl_ext.h>

#include <map>

// TODO: Move this to a shared header.

#define CL_EXP_NEW_SVM_EXTENSION_NAME \
"cl_exp_unified_svm"

// New-ish types and enums:

typedef cl_bitfield cl_device_unified_shared_memory_capabilities_exp; // analogous to cl_device_unified_shared_memory_capabilities_intel
typedef cl_properties cl_svm_mem_properties_exp; // analogous to cl_mem_properties_intel
typedef cl_uint cl_svm_mem_info_exp; // analogous to cl_mem_info_intel
typedef cl_uint cl_svm_mem_type_exp; // analogous to cl_unified_shared_memory_type_intel
typedef cl_uint cl_svm_mem_advice_exp; // analogous to cl_mem_advice_intel
typedef cl_bitfield cl_svm_free_flags_exp; // new
typedef cl_properties cl_svm_free_properties_exp; // new

/* cl_svm_mem_flags */
#define CL_MEM_SVM_DEVICE_EXP (1 << 16)
#define CL_MEM_SVM_HOST_EXP (1 << 17)
#define CL_MEM_SVM_SHARED_EXP (1 << 18)

/* cl_device_svm_capabilities */
// These may not be needed - can be derived from specific device queries!
#define CL_DEVICE_SVM_DEVICE_ALLOC_EXP (1 << 4)
#define CL_DEVICE_SVM_HOST_ALLOC_EXP (1 << 5)
#define CL_DEVICE_SVM_SHARED_ALLOC_EXP (1 << 6)

/* cl_svm_free_flags_exp */
#define CL_SVM_FREE_NON_BLOCKING_EXP (1 << 0)
#define CL_SVM_FREE_BLOCKING_EXP (1 << 1)

/* cl_svm_mem_properties_exp */
#define CL_SVM_MEM_ASSOCIATED_DEVICE_HANDLE_EXP 0x10100 // note: placeholder!
// consider: CL_SVM_MEM_DEVICE_HANDLE_LIST for cross-device allocations?

// Aliased types and enums:

/* cl_device_info - aliases for USM */
#define CL_DEVICE_HOST_MEM_CAPABILITIES_EXP 0x4190
#define CL_DEVICE_DEVICE_MEM_CAPABILITIES_EXP 0x4191
#define CL_DEVICE_SINGLE_DEVICE_SHARED_MEM_CAPABILITIES_EXP 0x4192
#define CL_DEVICE_CROSS_DEVICE_SHARED_MEM_CAPABILITIES_EXP 0x4193
#define CL_DEVICE_SHARED_SYSTEM_MEM_CAPABILITIES_EXP 0x4194

/* cl_unified_shared_memory_capabilities_intel - bitfield - aliases for USM */
#define CL_UNIFIED_SHARED_MEMORY_ACCESS_EXP (1 << 0)
#define CL_UNIFIED_SHARED_MEMORY_ATOMIC_ACCESS_EXP (1 << 1)
#define CL_UNIFIED_SHARED_MEMORY_CONCURRENT_ACCESS_EXP (1 << 2)
#define CL_UNIFIED_SHARED_MEMORY_CONCURRENT_ATOMIC_ACCESS_EXP (1 << 3)

// TODO: should these be cl_mem_svm_flags?
// CL_MEM_ALLOC_WRITE_COMBINED_INTEL (1 << 0)
// CL_MEM_ALLOC_INITIAL_PLACEMENT_DEVICE_INTEL (1 << 1)
// CL_MEM_ALLOC_INITIAL_PLACEMENT_HOST_INTEL (1 << 2)

/* cl_svm_mem_info_exp */
#define CL_SVM_MEM_TYPE_EXP 0x419A
#define CL_SVM_MEM_BASE_PTR_EXP 0x419B
#define CL_SVM_MEM_SIZE_EXP 0x419C
#define CL_SVM_MEM_DEVICE_EXP 0x419D

/* cl_svm_mem_type_exp */
#define CL_SVM_MEM_TYPE_UNKNOWN_EXP 0x4196
#define CL_SVM_MEM_TYPE_HOST_EXP 0x4197
#define CL_SVM_MEM_TYPE_DEVICE_EXP 0x4198
#define CL_SVM_MEM_TYPE_SHARED_EXP 0x4199
// TODO: do we need types for SVM buffer, SVM coarse grain buffer, SVM fine grain buffer, ... ?

/* cl_kernel_exec_info */
#define CL_KERNEL_EXEC_INFO_INDIRECT_HOST_ACCESS_EXP 0x4200
#define CL_KERNEL_EXEC_INFO_INDIRECT_DEVICE_ACCESS_EXP 0x4201
#define CL_KERNEL_EXEC_INFO_INDIRECT_SHARED_ACCESS_EXP 0x4202
// TODO: do we need indirect access flags for SVM buffer, ... ?

/* cl_command_type */
#define CL_COMMAND_MEMADVISE_EXP 0x4207

// New functions:

typedef void* CL_API_CALL
clSVMAllocWithPropertiesEXP_t(
cl_context context,
const cl_svm_mem_properties_exp* properties,
cl_svm_mem_flags flags,
size_t size,
cl_uint alignment,
cl_int* errcode_ret);

typedef clSVMAllocWithPropertiesEXP_t *
clSVMAllocWithPropertiesEXP_fn ;

typedef cl_int CL_API_CALL
clSVMFreeWithPropertiesEXP_t(
cl_context context,
const cl_svm_free_properties_exp* properties,
cl_svm_free_flags_exp flags,
void* ptr);

typedef clSVMFreeWithPropertiesEXP_t *
clSVMFreeWithPropertiesEXP_fn ;

typedef cl_int CL_API_CALL
clGetSVMMemInfoEXP_t(
const void* ptr,
cl_svm_mem_info_exp param_name,
size_t param_value_size,
void* param_value,
size_t* param_value_size_ret);

typedef clGetSVMMemInfoEXP_t *
clGetSVMMemInfoEXP_fn ;

typedef cl_int CL_API_CALL
clEnqueueSVMMemAdviseEXP_t(
cl_command_queue command_queue,
const void* ptr,
size_t size,
cl_svm_mem_advice_exp advice,
cl_uint num_events_in_wait_list,
const cl_event* event_wait_list,
cl_event* event);

typedef clEnqueueMemAdviseINTEL_t *
clEnqueueMemAdviseINTEL_fn ;

#if !defined(CL_NO_NON_ICD_DISPATCH_EXTENSION_PROTOTYPES)

extern CL_API_ENTRY void* CL_API_CALL
clSVMAllocWithPropertiesEXP(
cl_context context,
const cl_svm_mem_properties_exp* properties,
cl_svm_mem_flags flags,
size_t size,
cl_uint alignment,
cl_int* errcode_ret);

extern CL_API_ENTRY cl_int CL_API_CALL
clSVMFreeWithPropertiesEXP(
cl_context context,
const cl_svm_free_properties_exp* properties,
cl_svm_free_flags_exp flags,
void* ptr);

extern CL_API_ENTRY cl_int CL_API_CALL
clGetSVMMemInfoEXP(
const void* ptr,
cl_svm_mem_info_exp param_name,
size_t param_value_size,
void* param_value,
size_t* param_value_size_ret);

extern CL_API_ENTRY cl_int CL_API_CALL
clEnqueueSVMMemAdviseEXP(
cl_command_queue command_queue,
const void* ptr,
size_t size,
cl_svm_mem_advice_exp advice,
cl_uint num_events_in_wait_list,
const cl_event* event_wait_list,
cl_event* event);

#endif /* !defined(CL_NO_NON_ICD_DISPATCH_EXTENSION_PROTOTYPES) */

extern const struct _cl_icd_dispatch* g_pNextDispatch;

void* CL_API_CALL clSVMAllocWithPropertiesEXP_EMU(
Expand Down Expand Up @@ -214,6 +50,10 @@ cl_int CL_API_CALL clSetKernelArgSVMPointer_override(
cl_uint arg_index,
const void* arg_value);

void CL_API_CALL clSVMFree_override(
cl_context context,
void* ptr);

cl_int CL_API_CALL clEnqueueSVMMemAdviseEXP_EMU(
cl_command_queue command_queue,
const void* ptr,
Expand Down
1 change: 1 addition & 0 deletions layers/99_svmplusplus/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ static void _init_dispatch()
dispatch.clGetExtensionFunctionAddressForPlatform = clGetExtensionFunctionAddressForPlatform_override;
dispatch.clGetPlatformInfo = clGetPlatformInfo_override;
dispatch.clSetKernelArgSVMPointer = clSetKernelArgSVMPointer_override;
dispatch.clSVMFree = clSVMFree_override;
dispatch.clEnqueueSVMMemcpy = clEnqueueSVMMemcpy_override;
dispatch.clEnqueueSVMMemFill = clEnqueueSVMMemFill_override;
dispatch.clEnqueueSVMMigrateMem = clEnqueueSVMMigrateMem_override;
Expand Down
1 change: 1 addition & 0 deletions samples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ add_subdirectory( opengl )
add_subdirectory( python )
add_subdirectory( vulkan )
add_subdirectory( usm )
add_subdirectory( usvm )

add_subdirectory( 00_enumopencl )
add_subdirectory( 00_enumopenclpp )
Expand Down
2 changes: 1 addition & 1 deletion samples/usm/01_usmmeminfo/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

add_opencl_sample(
TEST
NUMBER 00
NUMBER 01
TARGET usmmeminfo
VERSION 120
CATEGORY usm
Expand Down
12 changes: 12 additions & 0 deletions samples/usvm/00_usvmqueries/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Copyright (c) 2023 Ben Ashbaugh
#
# SPDX-License-Identifier: MIT

add_opencl_sample(
TEST
NUMBER 00
TARGET usvmqueries
VERSION 300
CATEGORY usvm
SOURCES main.cpp
LIBS OpenCLExt)
Loading

0 comments on commit 127ee46

Please sign in to comment.