@@ -589,16 +589,13 @@ dart_ret_t dart_accumulate(
589589 dart_datatype_t dtype ,
590590 dart_operation_t op )
591591{
592- MPI_Datatype mpi_dtype ;
593- MPI_Op mpi_op ;
594592 dart_team_unit_t team_unit_id = DART_TEAM_UNIT_ID (gptr .unitid );
595593 uint64_t offset = gptr .addr_or_offs .offset ;
596594 int16_t seg_id = gptr .segid ;
597595 dart_team_t teamid = gptr .teamid ;
598596
599597 CHECK_IS_BASICTYPE (dtype );
600- mpi_dtype = dart__mpi__datatype_struct (dtype )-> basic .mpi_type ;
601- mpi_op = dart__mpi__op (op );
598+ MPI_Op mpi_op = dart__mpi__op (op );
602599
603600
604601 dart_team_data_t * team_data = dart_adapt_teamlist_get (teamid );
@@ -651,24 +648,118 @@ dart_ret_t dart_accumulate(
651648 DART_LOG_TRACE ("dart_accumulate: MPI_Accumulate (src %p, size %zu)" ,
652649 src_ptr , remainder );
653650
654- CHECK_MPI_RET (
655- MPI_Accumulate (
651+ MPI_Datatype mpi_dtype = dart__mpi__datatype_struct (dtype )-> basic .mpi_type ;
652+ CHECK_MPI_RET (
653+ MPI_Accumulate (
654+ src_ptr ,
655+ remainder ,
656+ mpi_dtype ,
657+ team_unit_id .id ,
658+ offset ,
659+ remainder ,
660+ mpi_dtype ,
661+ mpi_op ,
662+ win ),
663+ "MPI_Accumulate" );
664+ }
665+
666+ DART_LOG_DEBUG ("dart_accumulate > finished" );
667+ return DART_OK ;
668+ }
669+
670+
671+ dart_ret_t dart_accumulate_blocking_local (
672+ dart_gptr_t gptr ,
673+ const void * values ,
674+ size_t nelem ,
675+ dart_datatype_t dtype ,
676+ dart_operation_t op )
677+ {
678+ dart_team_unit_t team_unit_id = DART_TEAM_UNIT_ID (gptr .unitid );
679+ uint64_t offset = gptr .addr_or_offs .offset ;
680+ int16_t seg_id = gptr .segid ;
681+ dart_team_t teamid = gptr .teamid ;
682+
683+ CHECK_IS_BASICTYPE (dtype );
684+ MPI_Op mpi_op = dart__mpi__op (op );
685+
686+ dart_team_data_t * team_data = dart_adapt_teamlist_get (teamid );
687+ if (dart__unlikely (team_data == NULL )) {
688+ DART_LOG_ERROR ("dart_accumulate ! failed: Unknown team %i!" , teamid );
689+ return DART_ERR_INVAL ;
690+ }
691+
692+ CHECK_UNITID_RANGE (team_unit_id , team_data );
693+
694+ DART_LOG_DEBUG ("dart_accumulate() nelem:%zu dtype:%ld op:%d unit:%d" ,
695+ nelem , dtype , op , team_unit_id .id );
696+
697+ dart_segment_info_t * seginfo = dart_segment_get_info (
698+ & (team_data -> segdata ), seg_id );
699+ if (dart__unlikely (seginfo == NULL )) {
700+ DART_LOG_ERROR ("dart_accumulate ! "
701+ "Unknown segment %i on team %i" , seg_id , teamid );
702+ return DART_ERR_INVAL ;
703+ }
704+
705+ MPI_Win win = seginfo -> win ;
706+ offset += dart_segment_disp (seginfo , team_unit_id );
707+
708+ // chunk up the put
709+ const size_t nchunks = nelem / MAX_CONTIG_ELEMENTS ;
710+ const size_t remainder = nelem % MAX_CONTIG_ELEMENTS ;
711+ const char * src_ptr = (const char * ) values ;
712+
713+ MPI_Request reqs [2 ];
714+ int num_reqs = 0 ;
715+
716+ if (nchunks > 0 ) {
717+ DART_LOG_TRACE ("dart_accumulate: MPI_Raccumulate (src %p, size %zu)" ,
718+ src_ptr , nchunks * MAX_CONTIG_ELEMENTS );
719+ CHECK_MPI_RET (
720+ MPI_Raccumulate (
656721 src_ptr ,
657- remainder ,
658- mpi_dtype ,
722+ nchunks ,
723+ dart__mpi__datatype_maxtype ( dtype ) ,
659724 team_unit_id .id ,
660725 offset ,
661- remainder ,
662- mpi_dtype ,
726+ nchunks ,
727+ dart__mpi__datatype_maxtype ( dtype ) ,
663728 mpi_op ,
664- win ),
665- "MPI_Accumulate" );
729+ win ,
730+ & reqs [num_reqs ++ ]),
731+ "MPI_Accumulate" );
732+ offset += nchunks * MAX_CONTIG_ELEMENTS ;
733+ src_ptr += nchunks * MAX_CONTIG_ELEMENTS ;
666734 }
667735
736+ if (remainder > 0 ) {
737+ DART_LOG_TRACE ("dart_accumulate: MPI_Raccumulate (src %p, size %zu)" ,
738+ src_ptr , remainder );
739+
740+ MPI_Datatype mpi_dtype = dart__mpi__datatype_struct (dtype )-> basic .mpi_type ;
741+ CHECK_MPI_RET (
742+ MPI_Raccumulate (
743+ src_ptr ,
744+ remainder ,
745+ mpi_dtype ,
746+ team_unit_id .id ,
747+ offset ,
748+ remainder ,
749+ mpi_dtype ,
750+ mpi_op ,
751+ win ,
752+ & reqs [num_reqs ++ ]),
753+ "MPI_Accumulate" );
754+ }
755+
756+ MPI_Waitall (num_reqs , reqs , MPI_STATUSES_IGNORE );
757+
668758 DART_LOG_DEBUG ("dart_accumulate > finished" );
669759 return DART_OK ;
670760}
671761
762+
672763dart_ret_t dart_fetch_and_op (
673764 dart_gptr_t gptr ,
674765 const void * value ,
0 commit comments