@@ -82,6 +82,8 @@ int main( int argc, char *argv[] )
82
82
ze_device_handle_t pDevice = nullptr ;
83
83
uint32_t driverCount = 0 ;
84
84
zel_tracer_handle_t tracer = nullptr ;
85
+ std::vector<ze_driver_handle_t > drivers;
86
+ std::vector<ze_device_handle_t > devices_per_driver;
85
87
if ( init_ze (legacy_init, driverCount, driverTypeDesc) )
86
88
{
87
89
@@ -106,7 +108,6 @@ int main( int argc, char *argv[] )
106
108
}
107
109
}
108
110
109
- std::vector<ze_driver_handle_t > drivers;
110
111
if (legacy_init) {
111
112
status = zeDriverGet (&driverCount, nullptr );
112
113
if (status != ZE_RESULT_SUCCESS) {
@@ -129,89 +130,102 @@ int main( int argc, char *argv[] )
129
130
}
130
131
}
131
132
132
- for ( uint32_t driver = 0 ; driver < driverCount ; ++driver )
133
+ for ( size_t driver = 0 ; driver < drivers. size () ; ++driver )
133
134
{
134
135
std::cout << " Driver # " << driver << " \n " ;
135
136
pDriver = drivers[driver];
136
137
pDevice = findDevice ( pDriver, type );
138
+ if (pDevice) {
139
+ devices_per_driver.push_back (pDevice);
140
+ } else {
141
+ devices_per_driver.push_back (nullptr );
142
+ }
137
143
}
138
144
}
139
145
140
- if ( !pDevice )
146
+ if ( devices_per_driver. empty () || drivers. empty () )
141
147
{
142
148
std::cout << " Did NOT find matching " << to_string (type) <<" device!" << " \n " ;
143
149
return -1 ;
144
150
}
145
151
152
+ for (size_t driver_idx = 0 ; driver_idx < drivers.size (); ++driver_idx) {
153
+ if (driver_idx >= devices_per_driver.size () || devices_per_driver[driver_idx] == nullptr ) {
154
+ std::cout << " No valid device found for Driver #" << driver_idx << std::endl;
155
+ continue ;
156
+ }
157
+ pDriver = drivers[driver_idx];
158
+ pDevice = devices_per_driver[driver_idx];
159
+ std::cout << " Executing on Driver #" << driver_idx << " , Device #" << 0 << std::endl;
160
+ // Create the context
161
+ ze_context_handle_t context;
162
+ ze_context_desc_t context_desc = {};
163
+ context_desc.stype = ZE_STRUCTURE_TYPE_CONTEXT_DESC;
164
+ status = zeContextCreate (pDriver, &context_desc, &context);
165
+ if (status != ZE_RESULT_SUCCESS) {
166
+ std::cout << " zeContextCreate Failed with return code: " << to_string (status) << std::endl;
167
+ continue ;
168
+ }
146
169
147
- // Create the context
148
- ze_context_handle_t context;
149
- ze_context_desc_t context_desc = {};
150
- context_desc.stype = ZE_STRUCTURE_TYPE_CONTEXT_DESC;
151
- status = zeContextCreate (pDriver, &context_desc, &context);
152
- if (status != ZE_RESULT_SUCCESS) {
153
- std::cout << " zeContextCreate Failed with return code: " << to_string (status) << std::endl;
154
- exit (1 );
155
- }
156
-
157
- // Create an immediate command list for direct submission
158
- ze_command_queue_desc_t altdesc = {};
159
- altdesc.stype = ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC;
160
- ze_command_list_handle_t command_list = {};
161
- status = zeCommandListCreateImmediate (context, pDevice, &altdesc, &command_list);
162
- if (status != ZE_RESULT_SUCCESS) {
163
- std::cout << " zeCommandListCreateImmediate Failed with return code: " << to_string (status) << std::endl;
164
- exit (1 );
165
- }
170
+ // Create an immediate command list for direct submission
171
+ ze_command_queue_desc_t altdesc = {};
172
+ altdesc.stype = ZE_STRUCTURE_TYPE_COMMAND_QUEUE_DESC;
173
+ ze_command_list_handle_t command_list = {};
174
+ status = zeCommandListCreateImmediate (context, pDevice, &altdesc, &command_list);
175
+ if (status != ZE_RESULT_SUCCESS) {
176
+ std::cout << " zeCommandListCreateImmediate Failed with return code: " << to_string (status) << std::endl;
177
+ continue ;
178
+ }
166
179
167
- // Create an event to be signaled by the device
168
- ze_event_pool_desc_t ep_desc = {};
169
- ep_desc.stype = ZE_STRUCTURE_TYPE_EVENT_POOL_DESC;
170
- ep_desc.count = 1 ;
171
- ep_desc.flags = ZE_EVENT_POOL_FLAG_HOST_VISIBLE;
172
- ze_event_desc_t ev_desc = {};
173
- ev_desc.stype = ZE_STRUCTURE_TYPE_EVENT_DESC;
174
- ev_desc.signal = ZE_EVENT_SCOPE_FLAG_HOST;
175
- ev_desc.wait = ZE_EVENT_SCOPE_FLAG_HOST;
176
- ze_event_handle_t event;
177
- ze_event_pool_handle_t event_pool;
178
-
179
- status = zeEventPoolCreate (context, &ep_desc, 1 , &pDevice, &event_pool);
180
- if (status != ZE_RESULT_SUCCESS) {
181
- std::cout << " zeEventPoolCreate Failed with return code: " << to_string (status) << std::endl;
182
- exit ( 1 ) ;
183
- }
180
+ // Create an event to be signaled by the device
181
+ ze_event_pool_desc_t ep_desc = {};
182
+ ep_desc.stype = ZE_STRUCTURE_TYPE_EVENT_POOL_DESC;
183
+ ep_desc.count = 1 ;
184
+ ep_desc.flags = ZE_EVENT_POOL_FLAG_HOST_VISIBLE;
185
+ ze_event_desc_t ev_desc = {};
186
+ ev_desc.stype = ZE_STRUCTURE_TYPE_EVENT_DESC;
187
+ ev_desc.signal = ZE_EVENT_SCOPE_FLAG_HOST;
188
+ ev_desc.wait = ZE_EVENT_SCOPE_FLAG_HOST;
189
+ ze_event_handle_t event;
190
+ ze_event_pool_handle_t event_pool;
191
+
192
+ status = zeEventPoolCreate (context, &ep_desc, 1 , &pDevice, &event_pool);
193
+ if (status != ZE_RESULT_SUCCESS) {
194
+ std::cout << " zeEventPoolCreate Failed with return code: " << to_string (status) << std::endl;
195
+ continue ;
196
+ }
184
197
185
- status = zeEventCreate (event_pool, &ev_desc, &event);
186
- if (status != ZE_RESULT_SUCCESS) {
187
- std::cout << " zeEventCreate Failed with return code: " << to_string (status) << std::endl;
188
- exit ( 1 ) ;
189
- }
198
+ status = zeEventCreate (event_pool, &ev_desc, &event);
199
+ if (status != ZE_RESULT_SUCCESS) {
200
+ std::cout << " zeEventCreate Failed with return code: " << to_string (status) << std::endl;
201
+ continue ;
202
+ }
190
203
191
- // signal the event from the device and wait for completion
192
- zeCommandListAppendSignalEvent (command_list, event);
193
- zeEventHostSynchronize (event, UINT64_MAX );
194
- std::cout << " Congratulations, the device completed execution!\n " ;
204
+ // signal the event from the device and wait for completion
205
+ zeCommandListAppendSignalEvent (command_list, event);
206
+ zeEventHostSynchronize (event, UINT64_MAX );
207
+ std::cout << " Congratulations, Executing on Driver # " << driver_idx << " , Device # " << 0 << " completed execution!" << std::endl ;
195
208
196
- zeContextDestroy (context);
197
- zeCommandListDestroy (command_list);
198
- zeEventDestroy (event);
199
- zeEventPoolDestroy (event_pool);
209
+ zeContextDestroy (context);
210
+ zeCommandListDestroy (command_list);
211
+ zeEventDestroy (event);
212
+ zeEventPoolDestroy (event_pool);
200
213
201
- if (tracing_enabled) {
202
- status = zelTracerDestroy (tracer);
203
- if (status != ZE_RESULT_SUCCESS) {
204
- std::cout << " zelTracerDestroy Failed with return code: " << to_string (status) << std::endl;
205
- exit (1 );
214
+ if (tracing_enabled) {
215
+ status = zelTracerDestroy (tracer);
216
+ if (status != ZE_RESULT_SUCCESS) {
217
+ std::cout << " zelTracerDestroy Failed with return code: " << to_string (status) << std::endl;
218
+ exit (1 );
219
+ }
206
220
}
207
- }
208
221
209
- if (tracing_runtime_enabled) {
210
- std::cout << " Disable Tracing Layer after init" << std::endl;
211
- status = zelDisableTracingLayer ();
212
- if (status != ZE_RESULT_SUCCESS) {
213
- std::cout << " zelDisableTracingLayer Failed with return code: " << to_string (status) << std::endl;
214
- exit (1 );
222
+ if (tracing_runtime_enabled) {
223
+ std::cout << " Disable Tracing Layer after init" << std::endl;
224
+ status = zelDisableTracingLayer ();
225
+ if (status != ZE_RESULT_SUCCESS) {
226
+ std::cout << " zelDisableTracingLayer Failed with return code: " << to_string (status) << std::endl;
227
+ exit (1 );
228
+ }
215
229
}
216
230
}
217
231
0 commit comments