@@ -11,6 +11,7 @@ import std::map::hashmap;
11
11
import std:: deque;
12
12
import std:: deque:: t;
13
13
import std:: arc;
14
+ import std:: par;
14
15
import io:: writer_util;
15
16
import comm:: * ;
16
17
import int:: abs;
@@ -515,116 +516,3 @@ fn main(args: [str]) {
515
516
#fmt ( "Total sequential: %? \t Total Parallel: %? \t Speedup: %?x" ,
516
517
total_seq, total_par, total_seq / total_par) ) ;
517
518
}
518
-
519
-
520
- // par stuff /////////////////////////////////////////////////////////
521
-
522
- mod par {
523
- import comm:: port;
524
- import comm:: chan;
525
- import comm:: send;
526
- import comm:: recv;
527
- import future:: future;
528
-
529
- #[ doc="The maximum number of tasks this module will spawn for a single
530
- operationg." ]
531
- const max_tasks : uint = 32 u;
532
-
533
- #[ doc="The minimum number of elements each task will process." ]
534
- const min_granularity : uint = 1024 u;
535
-
536
- #[ doc="An internal helper to map a function over a large vector and
537
- return the intermediate results.
538
-
539
- This is used to build most of the other parallel vector functions,
540
- like map or alli." ]
541
- fn map_slices < A : copy send, B : copy send> ( xs : [ A ] ,
542
- f : fn ~( uint , [ const A ] /& ) -> B )
543
- -> [ B ] {
544
-
545
- let len = xs. len ( ) ;
546
- if len < min_granularity {
547
- log ( info, "small slice" ) ;
548
- // This is a small vector, fall back on the normal map.
549
- [ f ( 0 u, xs) ]
550
- }
551
- else {
552
- let num_tasks = uint:: min ( max_tasks, len / min_granularity) ;
553
-
554
- let items_per_task = len / num_tasks;
555
-
556
- let mut futures = [ ] ;
557
- let mut base = 0 u;
558
- log ( info, "spawning tasks" ) ;
559
- while base < len {
560
- let end = uint:: min ( len, base + items_per_task) ;
561
- // FIXME: why is the ::<A, ()> annotation required here?
562
- vec:: unpack_slice :: < A , ( ) > ( xs) { |p, _len|
563
- let f = ptr:: addr_of ( f) ;
564
- futures += [ future:: spawn ( ) { |copy base|
565
- unsafe {
566
- let len = end - base;
567
- let slice = ( ptr:: offset ( p, base) ,
568
- len * sys:: size_of :: < A > ( ) ) ;
569
- log ( info, #fmt ( "pre-slice: %?" , ( base, slice) ) ) ;
570
- let slice : [ const A ] /& =
571
- unsafe :: reinterpret_cast ( slice) ;
572
- log ( info, #fmt ( "slice: %?" ,
573
- ( base, vec:: len ( slice) , end - base) ) ) ;
574
- assert ( vec:: len ( slice) == end - base) ;
575
- ( * f) ( base, slice)
576
- }
577
- } ] ;
578
- } ;
579
- base += items_per_task;
580
- }
581
- log ( info, "tasks spawned" ) ;
582
-
583
- log ( info, #fmt ( "num_tasks: %?" , ( num_tasks, futures. len ( ) ) ) ) ;
584
- assert ( num_tasks == futures. len ( ) ) ;
585
-
586
- let r = futures. map ( ) { |ys|
587
- ys. get ( )
588
- } ;
589
- assert ( r. len ( ) == futures. len ( ) ) ;
590
- r
591
- }
592
- }
593
-
594
- #[ doc="A parallel version of map." ]
595
- fn map < A : copy send, B : copy send> ( xs : [ A ] , f : fn ~( A ) -> B ) -> [ B ] {
596
- vec:: concat ( map_slices ( xs) { |_base, slice|
597
- vec:: map ( slice, f)
598
- } )
599
- }
600
-
601
- #[ doc="A parallel version of mapi." ]
602
- fn mapi < A : copy send, B : copy send> ( xs : [ A ] , f : fn ~( uint , A ) -> B ) -> [ B ] {
603
- let slices = map_slices ( xs) { |base, slice|
604
- vec:: mapi ( slice) { |i, x|
605
- f ( i + base, x)
606
- }
607
- } ;
608
- let r = vec:: concat ( slices) ;
609
- log ( info, ( r. len ( ) , xs. len ( ) ) ) ;
610
- assert ( r. len ( ) == xs. len ( ) ) ;
611
- r
612
- }
613
-
614
- #[ doc="Returns true if the function holds for all elements in the vector." ]
615
- fn alli < A : copy send> ( xs : [ A ] , f : fn ~( uint , A ) -> bool ) -> bool {
616
- vec:: all ( map_slices ( xs) { |base, slice|
617
- vec:: alli ( slice) { |i, x|
618
- f ( i + base, x)
619
- }
620
- } ) { |x| x }
621
- }
622
-
623
- #[ doc="Returns true if the function holds for any elements in the vector." ]
624
- fn any < A : copy send> ( xs : [ A ] , f : fn ~( A ) -> bool ) -> bool {
625
- vec:: any ( map_slices ( xs) { |_base, slice|
626
- vec:: any ( slice, f)
627
- } ) { |x| x }
628
- }
629
-
630
- }
0 commit comments