Migration Examples#

External Memory Interoperability#

SYCLomatic now supports experimental migration of DirectX (11/12) and Vulkan Interoperability with CUDA using option --use-experimental-features=bindless_images.

Supported CUDA APIs#

  • cudaGraphicsMapResources

  • cudaGraphicsResourceGetMappedPointer

  • cudaGraphicsSubResourceGetMappedArray

  • cudaGraphicsResourceGetMappedMipmappedArray

  • cudaGraphicsUnmapResources

  • cudaGraphicsUnregisterResource

  • cudaGraphicsResourceSetMapFlags

  • cudaGraphicsD3D11RegisterResource

  • cudaDestroyExternalMemory

  • CudaExternalMemoryGetMappedBuffer

  • cudaExternalMemoryGetMappedMipmappedArray

  • cudaImportExternalMemory

Examples#

DirectX-CUDA Interoperability#

CUDA

// Create a resource using DirectX APIs
ID3D11Resource *d3dResource

cudaGraphicsResource_t cudaResource;

// Register the DirectX resource with CUDA
cudaGraphicsD3D11RegisterResource(&cudaResource, d3dResource,
                                  cudaGraphicsRegisterFlagsNone);

// Set the flags for CUDA resource mapping
cudaGraphicsResourceSetMapFlags(cudaResource, cudaGraphicsMapFlagsNone);

// Map the CUDA resource for access
cudaGraphicsMapResources(1, &cudaResource);

// Get the mapped array from the CUDA resource
cudaArray_t cudaArr;
cudaGraphicsSubResourceGetMappedArray(&cudaArr, cudaResource, 0, 0);

// Unmap the CUDA resource
cudaGraphicsUnmapResources(1, &cudaResource);

// Unregister the CUDA resource
cudaGraphicsUnregisterResource(cudaResource);

Migrated Code

// Create a resource using DirectX APIs
ID3D11Resource *d3dResource

dpct::experimental::external_mem_wrapper_ptr cudaResource;

// Register the DirectX resource with CUDA
cudaResource = new dpct::experimental::external_mem_wrapper(d3dResource,
                                                            0);

// Set the flags for CUDA resource mapping
/*
DPCT1026:1: The call to cudaGraphicsResourceSetMapFlags was removed because this functionality is deprecated in DX12 and hence is not supported in SYCL.
*/

// Map the CUDA resource for access
dpct::experimental::map_resources(1, &cudaResource);

// Get the mapped array from the CUDA resource
dpct::experimental::image_mem_wrapper_ptr cudaArr;
cudaArr = cudaResource->get_sub_resource_mapped_array(0, 0);

// Unmap the CUDA resource
dpct::experimental::unmap_resources(1, &cudaResource);

// Unregister the CUDA resource
delete cudaResource;

Vulkan-CUDA Interoperability#

CUDA

// Create a resource using Vulkan APIs
VkImage vkTexture;

cudaExternalMemoryHandleDesc memHandleDesc; cudaExternalMemoryMipmappedArrayDesc mipmapDesc;
cudaExternalMemory_t externalMemory;

// Import the memory from external resource (Vulkan)
cudaImportExternalMemory(&externalMemory, &memHandleDesc);

// Get the mapped array from the CUDA resource
cudaMipmappedArray_t cudaMipmappedArray = nullptr;
cudaExternalMemoryGetMappedMipmappedArray(&cudaMipmappedArray,
                                          externalMemory,
                                          &mipmapDesc);

// Retrieve the tex data as a cudaArray from cudaMipmappedArray
cudaArray_t cudaArr;
cudaGetMipmappedArrayLevel(&cudaArr, cudaMipmappedArray, 0);

// Destroy the CUDA resource
cudaDestroyExternalMemory(externalMemory);

Migrated Code

// Create a resource using Vulkan APIs
VkImage vkTexture;

dpct::experimental::external_mem_handle_desc memHandleDesc;
dpct::experimental::external_mem_img_desc mipmapDesc;
sycl::ext::oneapi::experimental::external_mem externalMemory;

// Import the memory from external resource (Vulkan)
dpct::experimental::import_external_memory(&externalMemory, &memHandleDesc));

// Get the mapped array from the CUDA resource
dpct::experimental::image_mem_wrapper_ptr cudaMipmappedArray = nullptr;
cudaMipmappedArray = new dpct::experimental::image_mem_wrapper(
                             externalMemory,
                             &mipmapDesc);

// Retrieve the tex data as a cudaArray from cudaMipmappedArray
dpct::experimental::image_mem_wrapper_ptr cudaArr;
cudaArr = cudaMipmappedArray->get_mip_level(0);

// Destroy the CUDA resource
sycl::ext::oneapi::experimental::release_external_memory(
        externalMemory, dpct::get_in_order_queue());

Additional Migration Examples#

Example: Migrate QuickSilver to SYCL Version#

View a list of detailed steps to migrate CUDA version of QuickSilver to SYCL version.

Example: Migrate cudaSift to SYCL Version#

View a list of detailed steps to migrate CUDA version of cudaSift to SYCL version.

Example: Migrate hplinpack to SYCL Version#

View a list of detailed steps to migrate CUDA version of hplinpack to SYCL version.

Example: Migrate bitcracker to SYCL Version#

View a list of detailed steps to migrate CUDA version of bitcracker to SYCL version.