Working with DPCTLSyclInterface library¶
The DPCLSyclInterface library is a C-API library which provides select C++ functions for casting from C opaque pointers to pointers to corresponding C++ classes.
This document explains the memory ownership model adopted by DPCTLSyclInterface.
Function declarations are decorated with tokens such as __dpctl_keep
, __dpctl_take
,
and __dpctl_give
. Use of these tokens in declarations serves to self-document memory
ownership semantics.
Token __dpctl_give
indicates that the function makes a new allocation and delegates
responsibility to free it to the caller. Creation functions, such as
DCPTLDevice_Create()
, belong to category of such functions.
The token __dpctl_take
indicates that the library deletes the allocation associated
with the object to which the token applies. Deletion functions, such as
DPCTLDevice_Delete()
, represent set of such functions.
The token __dpctl_keep
indicates that the library does not alter allocation associated
with the object to which the token applies. Functions to query integral device descriptors,
such as DPCTLDevice_GetMaxComputeUnits()
, are examples of such functions.
// filename: example_syclinterface.c
#include "stdint.h"
#include "stdio.h"
#include "dpctl_sycl_interface.h"
int main(void) {
// we own memory allocation associated DRef object
DPCTLSyclDeviceRef DRef = DPCTLDevice_Create();
// we own memory allocation associated with char array
const char* name = DPCTLDevice_GetName(DRef);
uint32_t cu = DPCTLDevice_GetMaxComputeUnits(DRef);
// Free allocations associated with DRef
DPCTLDevice_Delete(DRef);
printf("Device %s has %d compute units\n", name, cu);
// Free memory allocate for device name
DPCTLCString_Delete(name);
return 0;
}
Building the example:
icx example_syclinterface.c -fsanitize=address \
$(python -m dpctl --includes) $(python -m dpctl --library) \
-o example
Running the example displays the following output without errors:
$ ./a.x
Device Intel(R) Graphics [0x9a49] has 96 compute units