@@ -149,7 +149,8 @@ module Multicore_backend (Backend : No_device_backend) = struct
149149
150150 let is_dev_queue_empty state = Queue. size state.Device_config. queue = 0
151151 let is_idle stream = is_dev_queue_empty stream.state && stream.state.is_ready
152- let name = " multicore " ^ name
152+ let name = " multicore_" ^ name
153+ let get_name stream = [% string " %{name}:0:%{stream.stream_id#Int}" ]
153154
154155 let % track3_l_sexp await stream =
155156 assert (Domain. is_main_domain () );
@@ -162,18 +163,17 @@ module Multicore_backend (Backend : No_device_backend) = struct
162163 Stdlib.Condition. wait d.host_wait_for_idle d.mut
163164 done ;
164165 Mut. unlock d.mut;
165- Option. iter d.stream_error ~f: (fun e -> Exn. reraise e @@ name ^ " " ^ stream.unique_name ))
166+ Option. iter d.stream_error ~f: (fun e -> Exn. reraise e @@ get_name stream))
166167
167168 (* * TODO: Returns the event indicating if any currently running or scheduled computations on the
168169 stream have completed. *)
169170 let all_work _stream = Device_config. Not_implemented_yet
170171
171172 let % track3_l_sexp schedule_task stream task =
172173 assert (Domain. is_main_domain () );
173- [% log_result " schedule_task" , Task. describe task, stream.unique_name ];
174+ [% log_result " schedule_task" , Task. describe task, get_name stream];
174175 let d = stream.state in
175- Option. iter d.Device_config. stream_error ~f: (fun e ->
176- Exn. reraise e @@ name ^ " " ^ stream.unique_name);
176+ Option. iter d.Device_config. stream_error ~f: (fun e -> Exn. reraise e @@ get_name stream);
177177 if not d.keep_spinning then invalid_arg " Multicore_backend: stream not available" ;
178178 if not @@ Queue. try_push d.queue task then (
179179 await stream;
@@ -185,7 +185,7 @@ module Multicore_backend (Backend : No_device_backend) = struct
185185
186186 let global_run_no = ref 0
187187
188- let % track3_l_sexp spinup_stream ~unique_name : stream =
188+ let % track3_l_sexp spinup_stream ~stream_id : stream =
189189 Int. incr global_run_no;
190190 let state =
191191 {
@@ -217,17 +217,17 @@ module Multicore_backend (Backend : No_device_backend) = struct
217217 with e ->
218218 state.stream_error < - Some e;
219219 state.keep_spinning < - false ;
220- [% log1 unique_name , " exception" , Exn. to_string e];
220+ [% log1 " stream " , (stream_id : int ) , " exception" , Exn. to_string e];
221221 (* TODO: we risk raising this error multiple times because await and schedule_task raise
222222 stream_error. But this is fine if we assume all exceptions are fatal. *)
223223 raise e
224224 in
225- make_stream ~device: Device_config. CPU ~state ~unique_name ~runner: (Domain. spawn worker)
225+ make_stream ~device: Device_config. CPU ~state ~stream_id ~runner: (Domain. spawn worker)
226226
227227 type nonrec context = { stream : stream ; ctx : context } [@@ deriving sexp_of ]
228228
229229 let ctx_arrays context = ctx_arrays context.ctx
230- let init stream = { stream; ctx = init (name ^ " " ^ stream.unique_name ) }
230+ let init stream = { stream; ctx = init (get_name stream) }
231231 let initialize = initialize
232232 let is_initialized = is_initialized
233233
@@ -237,7 +237,6 @@ module Multicore_backend (Backend : No_device_backend) = struct
237237
238238 let compile = compile
239239 let compile_batch = compile_batch
240- let get_name stream = stream.unique_name
241240
242241 let link { ctx; stream } code =
243242 let task = link ~merge_buffer: stream.merge_buffer ctx code in
@@ -264,30 +263,25 @@ module Multicore_backend (Backend : No_device_backend) = struct
264263
265264 let num_devices () = 1
266265 let suggested_num_streams Device_config. CPU = Domain. recommended_domain_count () - 1
267- let used_names = Hash_set. create (module String )
268266
269267 let cleanup_stream stream =
270268 assert (Domain. is_main_domain () );
271269 await stream;
272270 stream.state.keep_spinning < - false ;
273271 Stdlib.Condition. broadcast stream.state.dev_wait_for_work;
274- Hash_set. remove used_names stream.unique_name;
275272 Domain. join stream.runner
276273
277274 let get_device ~ordinal =
278275 if ordinal <> 0 then
279276 invalid_arg [% string " Multicore_backend.get_device %{ordinal#Int}: only device 0 exists" ];
280277 Device_config. CPU
281278
279+ let latest_stream_id = ref (- 1 )
280+
282281 let new_stream Device_config. CPU =
283282 assert (Domain. is_main_domain () );
284- let rec unique_name suffix =
285- let name = " stream " ^ Int. to_string suffix in
286- if Hash_set. mem used_names name then unique_name (suffix + 1 ) else name
287- in
288- let unique_name = unique_name 0 in
289- Hash_set. add used_names unique_name;
290- let stream = spinup_stream ~unique_name in
283+ Int. incr latest_stream_id;
284+ let stream = spinup_stream ~stream_id: ! latest_stream_id in
291285 Stdlib.Gc. finalise cleanup_stream stream;
292286 stream
293287
@@ -300,14 +294,13 @@ module Multicore_backend (Backend : No_device_backend) = struct
300294 (* TODO: pass description to from_host. *)
301295 schedule_task dst.stream
302296 (Task. Task
303- { context_lifetime = dst; description = " from_host on " ^ dst.stream.unique_name ; work })
297+ { context_lifetime = dst; description = " from_host on " ^ get_name dst.stream; work })
304298
305299 let to_host ~src_ptr ~src hosted =
306300 let work () = buffer_to_host hosted ~src: src_ptr in
307301 (* TODO: pass description to to_host. *)
308302 schedule_task src.stream
309- (Task. Task
310- { context_lifetime = src; description = " to_host on " ^ src.stream.unique_name; work })
303+ (Task. Task { context_lifetime = src; description = " to_host on " ^ get_name src.stream; work })
311304
312305 let device_to_device tn ~into_merge_buffer ~dst_ptr ~dst ~src_ptr ~src =
313306 let dev = dst.stream in
@@ -332,8 +325,8 @@ module Multicore_backend (Backend : No_device_backend) = struct
332325 buffer_to_buffer ~dst: merge_ptr ~src: src_ptr ~size_in_bytes
333326 in
334327 let description =
335- " device_to_device " ^ Tnode. debug_name tn ^ " dst " ^ dev.unique_name ^ " src "
336- ^ src.stream.unique_name
328+ " device_to_device " ^ Tnode. debug_name tn ^ " dst " ^ get_name dev ^ " src "
329+ ^ get_name src.stream
337330 in
338331 schedule_task dev (Task. Task { context_lifetime = (src, dst); description; work })
339332end
@@ -383,20 +376,18 @@ module Sync_backend (Backend : No_device_backend) = struct
383376 let num_devices () = 1
384377 let suggested_num_streams Device_config. CPU = ! sync_suggested_num_streams
385378 let get_used_memory Device_config. CPU = Backend. get_used_memory ()
386- let next_stream = ref 0
379+ let latest_stram_id = ref ( - 1 )
387380
388381 let new_stream Device_config. CPU : stream =
389- Int. incr next_stream;
390- make_stream ~device: Device_config. CPU ~state: ()
391- ~unique_name: (" stream " ^ Int. to_string (! next_stream - 1 ))
392- ~runner: ()
382+ Int. incr latest_stram_id;
383+ make_stream ~device: Device_config. CPU ~state: () ~stream_id: ! latest_stram_id ~runner: ()
393384
394385 type code = Backend .code [@@ deriving sexp_of ]
395386 type code_batch = Backend .code_batch [@@ deriving sexp_of ]
396387
397388 let all_work _stream = ()
398389 let is_idle _stream = true
399- let name = " sync " ^ Backend. name
390+ let name = " sync_ " ^ Backend. name
400391 let await _stream = ()
401392 (* let global_run_no = ref 0 *)
402393
@@ -422,7 +413,7 @@ module Sync_backend (Backend : No_device_backend) = struct
422413 Array. map routines
423414 ~f: (Option. map ~f: (fun task -> { task with context = { ctx = task.context; stream } })) )
424415
425- let get_name stream = stream.unique_name
416+ let get_name stream = [ % string " %{name}:0:%{ stream.stream_id#Int} " ]
426417 let from_host ~dst_ptr ~dst :_ hosted = host_to_buffer hosted ~dst: dst_ptr
427418 let to_host ~src_ptr ~src :_ hosted = buffer_to_host hosted ~src: src_ptr
428419
0 commit comments