@@ -120,3 +120,93 @@ TEST_P(urEnqueueKernelLaunch3DTest, Success) {
120
120
ASSERT_SUCCESS (urQueueFinish (queue));
121
121
ValidateBuffer (buffer, buffer_size, val);
122
122
}
123
+
124
+ struct urEnqueueKernelLaunchWithVirtualMemory : uur::urKernelExecutionTest {
125
+
126
+ void SetUp () override {
127
+ program_name = " fill_usm" ;
128
+ UUR_RETURN_ON_FATAL_FAILURE (uur::urKernelExecutionTest::SetUp ());
129
+
130
+ ur_bool_t virtual_memory_support = false ;
131
+ ASSERT_SUCCESS (urDeviceGetInfo (
132
+ device, UR_DEVICE_INFO_VIRTUAL_MEMORY_SUPPORT, sizeof (ur_bool_t ),
133
+ &virtual_memory_support, nullptr ));
134
+ if (!virtual_memory_support) {
135
+ GTEST_SKIP () << " Virtual memory is not supported." ;
136
+ }
137
+
138
+ ASSERT_SUCCESS (urVirtualMemGranularityGetInfo (
139
+ context, device, UR_VIRTUAL_MEM_GRANULARITY_INFO_MINIMUM,
140
+ sizeof (granularity), &granularity, nullptr ));
141
+
142
+ alloc_size = 1024 ;
143
+ virtual_page_size =
144
+ uur::RoundUpToNearestFactor (alloc_size, granularity);
145
+
146
+ ASSERT_SUCCESS (urPhysicalMemCreate (context, device, virtual_page_size,
147
+ nullptr , &physical_mem));
148
+
149
+ ASSERT_SUCCESS (urVirtualMemReserve (context, nullptr , virtual_page_size,
150
+ &virtual_ptr));
151
+
152
+ ASSERT_SUCCESS (urVirtualMemMap (context, virtual_ptr, virtual_page_size,
153
+ physical_mem, 0 ,
154
+ UR_VIRTUAL_MEM_ACCESS_FLAG_READ_WRITE));
155
+
156
+ int pattern = 0 ;
157
+ ASSERT_SUCCESS (urEnqueueUSMFill (queue, virtual_ptr, sizeof (pattern),
158
+ &pattern, virtual_page_size, 0 , nullptr ,
159
+ nullptr ));
160
+ ASSERT_SUCCESS (urQueueFinish (queue));
161
+ }
162
+
163
+ void TearDown () override {
164
+
165
+ if (virtual_ptr) {
166
+ EXPECT_SUCCESS (
167
+ urVirtualMemUnmap (context, virtual_ptr, virtual_page_size));
168
+ EXPECT_SUCCESS (
169
+ urVirtualMemFree (context, virtual_ptr, virtual_page_size));
170
+ }
171
+
172
+ if (physical_mem) {
173
+ EXPECT_SUCCESS (urPhysicalMemRelease (physical_mem));
174
+ }
175
+
176
+ UUR_RETURN_ON_FATAL_FAILURE (uur::urKernelExecutionTest::TearDown ());
177
+ }
178
+
179
+ size_t granularity = 0 ;
180
+ size_t alloc_size = 0 ;
181
+ size_t virtual_page_size = 0 ;
182
+ ur_physical_mem_handle_t physical_mem = nullptr ;
183
+ void *virtual_ptr = nullptr ;
184
+ };
185
+ UUR_INSTANTIATE_DEVICE_TEST_SUITE_P (urEnqueueKernelLaunchWithVirtualMemory);
186
+
187
+ TEST_P (urEnqueueKernelLaunchWithVirtualMemory, Success) {
188
+ size_t work_dim = 1 ;
189
+ size_t global_offset = 0 ;
190
+ size_t global_size = alloc_size / sizeof (uint32_t );
191
+ uint32_t fill_val = 42 ;
192
+
193
+ ASSERT_SUCCESS (urKernelSetArgPointer (kernel, 0 , nullptr , virtual_ptr));
194
+ ASSERT_SUCCESS (
195
+ urKernelSetArgValue (kernel, 1 , sizeof (fill_val), nullptr , &fill_val));
196
+
197
+ ur_event_handle_t kernel_evt;
198
+ ASSERT_SUCCESS (urEnqueueKernelLaunch (queue, kernel, work_dim,
199
+ &global_offset, &global_size, nullptr ,
200
+ 0 , nullptr , &kernel_evt));
201
+
202
+ std::vector<uint32_t > data (global_size);
203
+ ASSERT_SUCCESS (urEnqueueUSMMemcpy (queue, true , data.data (), virtual_ptr,
204
+ alloc_size, 1 , &kernel_evt, nullptr ));
205
+
206
+ ASSERT_SUCCESS (urQueueFinish (queue));
207
+
208
+ // verify fill worked
209
+ for (size_t i = 0 ; i < data.size (); i++) {
210
+ ASSERT_EQ (fill_val, data.at (i));
211
+ }
212
+ }
0 commit comments