@@ -115,14 +115,30 @@ fn make_graph(N: uint, edges: [(node_id, node_id)]) -> graph {
115
115
}
116
116
117
117
graph. map ( ) { |v|
118
- let mut neighbors = [ ] ;
119
- v. each_key ( ) { |u|
120
- neighbors += [ u] ;
121
- true
122
- } ;
118
+ map:: vec_from_set ( v)
119
+ }
120
+ }
121
+
122
+ fn gen_search_keys ( graph : graph , n : uint ) -> [ node_id ] {
123
+ let keys = map:: int_hash ( ) ;
124
+ let r = rand:: rng ( ) ;
125
+
126
+ impl methods for rand:: rng {
127
+ fn r64 ( ) -> u64 {
128
+ self . next ( ) as u64 << 32 u + self . next ( ) as u64
129
+ }
130
+ }
123
131
124
- neighbors
132
+ while keys. size ( ) < n {
133
+ let k = r. r64 ( ) % graph. len ( ) as node_id ;
134
+
135
+ if graph[ k] . len ( ) > 0 u && vec:: any ( graph[ k] ) { |i|
136
+ i != k
137
+ } {
138
+ map:: set_add ( keys, k) ;
139
+ }
125
140
}
141
+ map:: vec_from_set ( keys)
126
142
}
127
143
128
144
#[ doc="Returns a vector of all the parents in the BFS tree rooted at key.
@@ -315,7 +331,9 @@ fn validate(edges: [(node_id, node_id)],
315
331
}
316
332
317
333
fn main ( ) {
318
- let scale = 14 u;
334
+ let scale = 15 u;
335
+ let num_keys = 16 u;
336
+ let do_validate = false ;
319
337
320
338
let start = time:: precise_time_s ( ) ;
321
339
let edges = make_edges ( scale, 16 u) ;
@@ -335,21 +353,54 @@ fn main() {
335
353
total_edges / 2 u,
336
354
stop - start) ) ;
337
355
338
- let root = 0 ;
356
+ let mut total_seq = 0.0 ;
357
+ let mut total_par = 0.0 ;
358
+
359
+ gen_search_keys ( graph, num_keys) . map ( ) { |root|
360
+ io:: stdout ( ) . write_line ( "" ) ;
361
+ io:: stdout ( ) . write_line ( #fmt ( "Search key: %?" , root) ) ;
339
362
340
- let start = time:: precise_time_s ( ) ;
341
- let bfs_tree = pbfs ( graph, root) ;
342
- let stop = time:: precise_time_s ( ) ;
363
+ let start = time:: precise_time_s ( ) ;
364
+ let bfs_tree = bfs ( graph, root) ;
365
+ let stop = time:: precise_time_s ( ) ;
343
366
344
- io:: stdout ( ) . write_line ( #fmt ( "BFS completed in %? seconds." ,
345
- stop - start) ) ;
367
+ total_seq += stop - start;
346
368
347
- let start = time:: precise_time_s ( ) ;
348
- assert ( validate ( edges, root, bfs_tree) ) ;
349
- let stop = time:: precise_time_s ( ) ;
369
+ io:: stdout ( ) . write_line ( #fmt ( "Sequential BFS completed in %? seconds." ,
370
+ stop - start) ) ;
350
371
351
- io:: stdout ( ) . write_line ( #fmt ( "Validation completed in %? seconds." ,
352
- stop - start) ) ;
372
+ if do_validate {
373
+ let start = time:: precise_time_s ( ) ;
374
+ assert ( validate ( edges, root, bfs_tree) ) ;
375
+ let stop = time:: precise_time_s ( ) ;
376
+
377
+ io:: stdout ( ) . write_line ( #fmt ( "Validation completed in %? seconds." ,
378
+ stop - start) ) ;
379
+ }
380
+
381
+ let start = time:: precise_time_s ( ) ;
382
+ let bfs_tree = pbfs ( graph, root) ;
383
+ let stop = time:: precise_time_s ( ) ;
384
+
385
+ total_par += stop - start;
386
+
387
+ io:: stdout ( ) . write_line ( #fmt ( "Parallel BFS completed in %? seconds." ,
388
+ stop - start) ) ;
389
+
390
+ if do_validate {
391
+ let start = time:: precise_time_s ( ) ;
392
+ assert ( validate ( edges, root, bfs_tree) ) ;
393
+ let stop = time:: precise_time_s ( ) ;
394
+
395
+ io:: stdout ( ) . write_line ( #fmt ( "Validation completed in %? seconds." ,
396
+ stop - start) ) ;
397
+ }
398
+ } ;
399
+
400
+ io:: stdout ( ) . write_line ( "" ) ;
401
+ io:: stdout ( ) . write_line (
402
+ #fmt ( "Total sequential: %? \t Total Parallel: %? \t Speedup: %?x" ,
403
+ total_seq, total_par, total_seq / total_par) ) ;
353
404
}
354
405
355
406
0 commit comments