@@ -24,6 +24,10 @@ Supported CUDA APIs
24
24
* **CudaExternalMemoryGetMappedBuffer **
25
25
* **cudaExternalMemoryGetMappedMipmappedArray **
26
26
* **cudaImportExternalMemory **
27
+ * **cudaDestroyExternalSemaphore **
28
+ * **cudaImportExternalSemaphore **
29
+ * **cudaSignalExternalSemaphoresAsync **
30
+ * **cudaWaitExternalSemaphoresAsync **
27
31
28
32
Examples
29
33
********
@@ -98,55 +102,105 @@ CUDA
98
102
99
103
.. code-block :: none
100
104
101
- // Create a resource using Vulkan APIs
105
+ VkDevice device = {};
106
+
107
+ // Create a texture resource using Vulkan APIs
102
108
VkImage vkTexture;
109
+ VkImageCreateInfo imageCreateInfo = {}; // init and fill texture descriptor
110
+ vkCreateImage(device, &imageCreateInfo, nullptr, &vkTexture);
111
+
112
+ // Create a semaphore resource using Vulkan APIs
113
+ VkSemaphore vkSemaphore;
114
+ VkSemaphoreCreateInfo semaphoreInfo = {}; // init and fill semaphore descriptor
115
+ vkCreateSemaphore(device, &semaphoreInfo, nullptr, &vkSemaphore);
103
116
104
- cudaExternalMemoryHandleDesc memHandleDesc; cudaExternalMemoryMipmappedArrayDesc mipmapDesc;
117
+ cudaStream_t stream;
118
+ cudaStreamCreate(&stream);
119
+
120
+ cudaExternalMemoryHandleDesc memHandleDesc;
121
+ cudaExternalMemoryMipmappedArrayDesc mipmapDesc;
105
122
cudaExternalMemory_t externalMemory;
123
+ cudaExternalSemaphoreHandleDesc semHandleDesc;
124
+ cudaExternalSemaphore_t externalSemaphore;
125
+ cudaExternalSemaphoreWaitParams waitParams;
126
+ cudaExternalSemaphoreSignalParams signalParams;
127
+
106
128
107
- // Import the memory from external resource (Vulkan )
129
+ // Import the memory from external resource (vkTexture )
108
130
cudaImportExternalMemory(&externalMemory, &memHandleDesc);
131
+ // Import the semaphore from external resource (vkSemaphore)
132
+ cudaImportExternalSemaphore(&externalSemaphore, &semHandleDesc);
133
+
134
+ // Wait on the semaphore using external resource
135
+ cudaWaitExternalSemaphoresAsync(&externalSemaphore, &waitParams, 1, stream);
109
136
110
137
// Get the mapped array from the CUDA resource
111
138
cudaMipmappedArray_t cudaMipmappedArray = nullptr;
112
- cudaExternalMemoryGetMappedMipmappedArray(&cudaMipmappedArray,
113
- externalMemory,
114
- &mipmapDesc);
139
+ cudaExternalMemoryGetMappedMipmappedArray(&cudaMipmappedArray, externalMemory, &mipmapDesc);
140
+
141
+ // Signal the semaphore using external resource
142
+ cudaSignalExternalSemaphoresAsync(&externalSemaphore, &signalParams, 1, stream);
115
143
116
144
// Retrieve the tex data as a cudaArray from cudaMipmappedArray
117
145
cudaArray_t cudaArr;
118
146
cudaGetMipmappedArrayLevel(&cudaArr, cudaMipmappedArray, 0);
119
147
120
- // Destroy the CUDA resource
148
+ // Destroy the CUDA resources
121
149
cudaDestroyExternalMemory(externalMemory);
150
+ cudaDestroyExternalSemaphore(externalSemaphore);
122
151
123
152
Migrated Code
124
153
125
154
.. code-block :: none
126
155
127
- // Create a resource using Vulkan APIs
156
+ VkDevice device = {};
157
+
158
+ // Create a texture resource using Vulkan APIs
128
159
VkImage vkTexture;
160
+ VkImageCreateInfo imageCreateInfo = {}; // init and fill texture descriptor
161
+ vkCreateImage(device, &imageCreateInfo, nullptr, &vkTexture);
162
+
163
+ // Create a semaphore resource using Vulkan APIs
164
+ VkSemaphore vkSemaphore;
165
+ VkSemaphoreCreateInfo semaphoreInfo = {}; // init and fill semaphore descriptor
166
+ vkCreateSemaphore(device, &semaphoreInfo, nullptr, &vkSemaphore);
167
+
168
+ dpct::queue_ptr stream;
169
+ stream = dpct::get_current_device().create_queue();
129
170
130
171
dpct::experimental::external_mem_handle_desc memHandleDesc;
131
172
dpct::experimental::external_mem_img_desc mipmapDesc;
132
173
sycl::ext::oneapi::experimental::external_mem externalMemory;
174
+ dpct::experimental::external_sem_handle_desc semHandleDesc;
175
+ dpct::experimental::external_sem_wrapper_ptr externalSemaphore;
176
+ dpct::experimental::external_sem_params waitParams;
177
+ dpct::experimental::external_sem_params signalParams;
178
+
133
179
134
- // Import the memory from external resource (Vulkan )
180
+ // Import the memory from external resource (vkTexture )
135
181
dpct::experimental::import_external_memory(&externalMemory, &memHandleDesc));
182
+ // Import the semaphore from external resource (vkSemaphore)
183
+ dpct::experimental::import_external_semaphore(&externalSemaphore, &semHandleDesc);
184
+
185
+ // Wait on the semaphore using external resource
186
+ dpct::experimental::wait_external_semaphore(&externalSemaphore, &waitParams, 1, stream);
136
187
137
188
// Get the mapped array from the CUDA resource
138
189
dpct::experimental::image_mem_wrapper_ptr cudaMipmappedArray = nullptr;
139
- cudaMipmappedArray = new dpct::experimental::image_mem_wrapper(
140
- externalMemory,
141
- &mipmapDesc);
190
+ cudaMipmappedArray = new dpct::experimental::image_mem_wrapper(externalMemory, &mipmapDesc);
191
+
192
+ // Signal the semaphore using external resource
193
+ dpct::experimental::signal_external_semaphore(&externalSemaphore, &signalParams, 1, stream);
142
194
143
195
// Retrieve the tex data as a cudaArray from cudaMipmappedArray
144
196
dpct::experimental::image_mem_wrapper_ptr cudaArr;
145
197
cudaArr = cudaMipmappedArray->get_mip_level(0);
146
198
147
- // Destroy the CUDA resource
199
+ // Destroy the CUDA resources
148
200
sycl::ext::oneapi::experimental::release_external_memory(
149
201
externalMemory, dpct::get_in_order_queue());
202
+ delete externalSemaphore;
203
+
150
204
151
205
Additional Migration Examples
152
206
-----------------------------
0 commit comments