@@ -2426,42 +2426,62 @@ void CmiSyncVectorSendAndFree(int destPE, int n, int *sizes, char **msgs) {
24262426#define REDN_DBG (...)
24272427#endif
24282428
2429+ static constexpr unsigned int CmiLogMaxReductions = 4u ;
2430+ static constexpr int CmiMaxReductions = 1u << CmiLogMaxReductions ;
2431+ static constexpr int CmiReductionsNumChildren = 4 ;
2432+
2433+ struct CmiReduction {
2434+ void * localData ;
2435+ char * * remoteData ;
2436+ struct {
2437+ CmiHandler destination ;
2438+ CmiReduceMergeFn mergeFn ;
2439+ CmiReducePupFn pupFn ;
2440+ CmiReduceDeleteFn deleteFn ;
2441+ } ops ;
2442+ int localSize ;
2443+ int parent ;
2444+ short int numRemoteReceived ;
2445+ short int numChildren ;
2446+ CmiUInt2 seqID ;
2447+ char localContributed ;
2448+ };
2449+
24292450CpvStaticDeclare (int , CmiReductionMessageHandler );
24302451CpvStaticDeclare (int , CmiReductionDynamicRequestHandler );
24312452
24322453CpvStaticDeclare (int , CmiNodeReductionMessageHandler );
24332454CpvStaticDeclare (int , CmiNodeReductionDynamicRequestHandler );
24342455
24352456CpvStaticDeclare (CmiReduction * * , _reduce_info );
2436- CpvStaticDeclare (int , _reduce_info_size ); /* This is the log2 of the size of the array */
2437- CpvStaticDeclare (CmiUInt2 , _reduce_seqID_global ); /* This is used only by global reductions */
2438- CpvStaticDeclare (CmiUInt2 , _reduce_seqID_request );
2439- CpvStaticDeclare (CmiUInt2 , _reduce_seqID_dynamic );
2457+ CpvStaticDeclare (CmiReductionID , _reduce_seqID_global ); /* This is used only by global reductions */
2458+ CpvStaticDeclare (CmiReductionID , _reduce_seqID_request );
2459+ CpvStaticDeclare (CmiReductionID , _reduce_seqID_dynamic );
24402460
24412461CsvStaticDeclare (CmiReduction * * , _nodereduce_info );
2442- CsvStaticDeclare (int , _nodereduce_info_size );
2443- CsvStaticDeclare (CmiUInt2 , _nodereduce_seqID_global );
2444- CsvStaticDeclare (CmiUInt2 , _nodereduce_seqID_request );
2445- CsvStaticDeclare (CmiUInt2 , _nodereduce_seqID_dynamic );
2462+ CsvStaticDeclare (CmiReductionID , _nodereduce_seqID_global );
2463+ CsvStaticDeclare (CmiReductionID , _nodereduce_seqID_request );
2464+ CsvStaticDeclare (CmiReductionID , _nodereduce_seqID_dynamic );
24462465
2447- enum {
2466+ enum : CmiReductionID {
24482467 CmiReductionID_globalOffset = 0 , /* Reductions that involve the whole set of processors */
24492468 CmiReductionID_requestOffset = 1 , /* Reductions IDs that are requested by all the processors (i.e during intialization) */
24502469 CmiReductionID_dynamicOffset = 2 , /* Reductions IDs that are requested by only one processor (typically at runtime) */
24512470 CmiReductionID_multiplier = 3
24522471};
24532472
24542473static CmiReduction * CmiGetReductionCreate (int id , short int numChildren ) {
2455- int index = id & ~((~0u )<<CpvAccess (_reduce_info_size ));
2456- CmiReduction * red = CpvAccess (_reduce_info )[index ];
2474+ const int idx = id & ~((~0u ) << CmiLogMaxReductions );
2475+ auto & redref = CpvAccess (_reduce_info )[idx ];
2476+ CmiReduction * red = redref ;
24572477 if (red != NULL && red -> seqID != id ) {
24582478 /* The table needs to be expanded */
24592479 CmiAbort ("Too many simultaneous reductions" );
24602480 }
24612481 if (red == NULL || red -> numChildren < numChildren ) {
24622482 CmiReduction * newred ;
24632483 CmiAssert (red == NULL || red -> localContributed == 0 );
2464- if (numChildren == 0 ) numChildren = 4 ;
2484+ if (numChildren == 0 ) numChildren = CmiReductionsNumChildren ;
24652485 newred = (CmiReduction * )malloc (sizeof (CmiReduction )+ numChildren * sizeof (void * ));
24662486 newred -> numRemoteReceived = 0 ;
24672487 newred -> localContributed = 0 ;
@@ -2473,25 +2493,24 @@ static CmiReduction* CmiGetReductionCreate(int id, short int numChildren) {
24732493 red = newred ;
24742494 red -> numChildren = numChildren ;
24752495 red -> remoteData = (char * * )(red + 1 );
2476- CpvAccess ( _reduce_info )[ index ] = red ;
2496+ redref = red ;
24772497 }
24782498 return red ;
24792499}
24802500
2481- static CmiReduction * CmiGetReduction (int id ) {
2482- return CmiGetReductionCreate (id , 0 );
2483- }
2484-
24852501static void CmiClearReduction (int id ) {
2486- int index = id & ~((~0u )<<CpvAccess (_reduce_info_size ));
2487- free (CpvAccess (_reduce_info )[index ]);
2488- CpvAccess (_reduce_info )[index ] = NULL ;
2502+ const int idx = id & ~((~0u ) << CmiLogMaxReductions );
2503+ auto & redref = CpvAccess (_reduce_info )[idx ];
2504+ auto red = redref ;
2505+ redref = nullptr ;
2506+ free (red );
24892507}
24902508
24912509static CmiReduction * CmiGetNextReduction (short int numChildren ) {
24922510 int id = CpvAccess (_reduce_seqID_global );
2493- CpvAccess (_reduce_seqID_global ) += CmiReductionID_multiplier ;
2494- if (id > 0xFFF0 ) CpvAccess (_reduce_seqID_global ) = CmiReductionID_globalOffset ;
2511+ int newid = id + CmiReductionID_multiplier ;
2512+ if (id > 0xFFF0 ) newid = CmiReductionID_globalOffset ;
2513+ CpvAccess (_reduce_seqID_global ) = newid ;
24952514 return CmiGetReductionCreate (id , numChildren );
24962515}
24972516
@@ -2505,16 +2524,17 @@ CmiReductionID CmiGetDynamicReduction(void) {
25052524}
25062525
25072526static CmiReduction * CmiGetNodeReductionCreate (int id , short int numChildren ) {
2508- int index = id & ~((~0u )<<CsvAccess (_nodereduce_info_size ));
2509- CmiReduction * red = CsvAccess (_nodereduce_info )[index ];
2527+ const int idx = id & ~((~0u ) << CmiLogMaxReductions );
2528+ auto & redref = CsvAccess (_nodereduce_info )[idx ];
2529+ CmiReduction * red = redref ;
25102530 if (red != NULL && red -> seqID != id ) {
25112531 /* The table needs to be expanded */
25122532 CmiAbort ("Too many simultaneous reductions" );
25132533 }
25142534 if (red == NULL || red -> numChildren < numChildren ) {
25152535 CmiReduction * newred ;
25162536 CmiAssert (red == NULL || red -> localContributed == 0 );
2517- if (numChildren == 0 ) numChildren = 4 ;
2537+ if (numChildren == 0 ) numChildren = CmiReductionsNumChildren ;
25182538 newred = (CmiReduction * )malloc (sizeof (CmiReduction )+ numChildren * sizeof (void * ));
25192539 newred -> numRemoteReceived = 0 ;
25202540 newred -> localContributed = 0 ;
@@ -2526,25 +2546,24 @@ static CmiReduction* CmiGetNodeReductionCreate(int id, short int numChildren) {
25262546 red = newred ;
25272547 red -> numChildren = numChildren ;
25282548 red -> remoteData = (char * * )(red + 1 );
2529- CsvAccess ( _nodereduce_info )[ index ] = red ;
2549+ redref = red ;
25302550 }
25312551 return red ;
25322552}
25332553
2534- static CmiReduction * CmiGetNodeReduction (int id ) {
2535- return CmiGetNodeReductionCreate (id , 0 );
2536- }
2537-
25382554static void CmiClearNodeReduction (int id ) {
2539- int index = id & ~((~0u )<<CsvAccess (_nodereduce_info_size ));
2540- free (CsvAccess (_nodereduce_info )[index ]);
2541- CsvAccess (_nodereduce_info )[index ] = NULL ;
2555+ const int idx = id & ~((~0u ) << CmiLogMaxReductions );
2556+ auto & redref = CsvAccess (_nodereduce_info )[idx ];
2557+ auto red = redref ;
2558+ redref = nullptr ;
2559+ free (red );
25422560}
25432561
25442562static CmiReduction * CmiGetNextNodeReduction (short int numChildren ) {
25452563 int id = CsvAccess (_nodereduce_seqID_global );
2546- CsvAccess (_nodereduce_seqID_global ) += CmiReductionID_multiplier ;
2547- if (id > 0xFFF0 ) CsvAccess (_nodereduce_seqID_global ) = CmiReductionID_globalOffset ;
2564+ int newid = id + CmiReductionID_multiplier ;
2565+ if (id > 0xFFF0 ) newid = CmiReductionID_globalOffset ;
2566+ CsvAccess (_nodereduce_seqID_global ) = newid ;
25482567 return CmiGetNodeReductionCreate (id , numChildren );
25492568}
25502569
@@ -2806,7 +2825,7 @@ void CmiListReduce(int npes, int *pes, void *msg, int size, CmiReduceMergeFn mer
28062825 }
28072826 CmiAssert (myPos < npes );
28082827 red -> numChildren = npes - (myPos << 2 ) - 1 ;
2809- if (red -> numChildren > 4 ) red -> numChildren = 4 ;
2828+ if (red -> numChildren > CmiReductionsNumChildren ) red -> numChildren = CmiReductionsNumChildren ;
28102829 if (red -> numChildren < 0 ) red -> numChildren = 0 ;
28112830 if (myPos == 0 ) red -> parent = -1 ;
28122831 else red -> parent = pes [(myPos - 1 ) >> 2 ];
@@ -2832,7 +2851,7 @@ void CmiListReduceStruct(int npes, int *pes,
28322851 }
28332852 CmiAssert (myPos < npes );
28342853 red -> numChildren = npes - (myPos << 2 ) - 1 ;
2835- if (red -> numChildren > 4 ) red -> numChildren = 4 ;
2854+ if (red -> numChildren > CmiReductionsNumChildren ) red -> numChildren = CmiReductionsNumChildren ;
28362855 if (red -> numChildren < 0 ) red -> numChildren = 0 ;
28372856 red -> parent = (myPos - 1 ) >> 2 ;
28382857 if (myPos == 0 ) red -> parent = -1 ;
@@ -2881,26 +2900,30 @@ void CmiNodeReduceStructID(void *data, CmiReducePupFn pupFn,
28812900 CmiGlobalNodeReduceStruct (data , pupFn , mergeFn , dest , deleteFn , red );
28822901}
28832902
2884- void CmiHandleReductionMessage (void * msg ) {
2885- CmiReduction * red = CmiGetReduction (CmiGetRedID (msg ));
2886- if (red -> numRemoteReceived == red -> numChildren ) red = CmiGetReductionCreate (CmiGetRedID (msg ), red -> numChildren + 4 );
2903+ static void CmiHandleReductionMessage (void * msg ) {
2904+ const auto id = CmiGetRedID (msg );
2905+
2906+ CmiReduction * red = CmiGetReductionCreate (id , 0 );
2907+ if (red -> numRemoteReceived == red -> numChildren )
2908+ red = CmiGetReductionCreate (id , red -> numChildren + CmiReductionsNumChildren );
28872909 red -> remoteData [red -> numRemoteReceived ++ ] = (char * )msg ;
28882910 REDN_DBG ("[%d] CmiReduce::remote %hd\n" ,CmiMyPe (),red -> seqID );
28892911 CmiSendReduce (red );
28902912}
28912913
2892- void CmiHandleNodeReductionMessage (void * msg ) {
2893- CmiReduction * red = CmiGetNodeReduction (CmiGetRedID (msg ));
2894- if (red -> numRemoteReceived == red -> numChildren ) red = CmiGetNodeReductionCreate (CmiGetRedID (msg ), red -> numChildren + 4 );
2914+ static void CmiHandleNodeReductionMessage (void * msg ) {
2915+ const auto id = CmiGetRedID (msg );
2916+
2917+ CmiReduction * red = CmiGetNodeReductionCreate (id , 0 );
2918+ if (red -> numRemoteReceived == red -> numChildren )
2919+ red = CmiGetNodeReductionCreate (id , red -> numChildren + CmiReductionsNumChildren );
28952920 red -> remoteData [red -> numRemoteReceived ++ ] = (char * )msg ;
28962921 REDN_DBG ("[%d:%d][%d] CmiNodeReduce::remote %hd\n" ,
28972922 CmiMyNode (),CmiMyRank (),CmiMyPe (),red -> seqID );
28982923 CmiSendNodeReduce (red );
28992924}
29002925
29012926void CmiReductionsInit (void ) {
2902- int i ;
2903-
29042927 CpvInitialize (int , CmiReductionMessageHandler );
29052928 CpvAccess (CmiReductionMessageHandler ) = CmiRegisterHandler ((CmiHandler )CmiHandleReductionMessage );
29062929 CpvInitialize (int , CmiReductionDynamicRequestHandler );
@@ -2911,31 +2934,31 @@ void CmiReductionsInit(void) {
29112934 CpvInitialize (int , CmiNodeReductionDynamicRequestHandler );
29122935 CpvAccess (CmiNodeReductionDynamicRequestHandler ) = CmiRegisterHandler ((CmiHandler )CmiNodeReductionHandleDynamicRequest );
29132936
2914- CpvInitialize (CmiUInt2 , _reduce_seqID_global );
2937+ CpvInitialize (CmiReductionID , _reduce_seqID_global );
29152938 CpvAccess (_reduce_seqID_global ) = CmiReductionID_globalOffset ;
2916- CpvInitialize (CmiUInt2 , _reduce_seqID_request );
2939+ CpvInitialize (CmiReductionID , _reduce_seqID_request );
29172940 CpvAccess (_reduce_seqID_request ) = CmiReductionID_requestOffset ;
2918- CpvInitialize (CmiUInt2 , _reduce_seqID_dynamic );
2941+ CpvInitialize (CmiReductionID , _reduce_seqID_dynamic );
29192942 CpvAccess (_reduce_seqID_dynamic ) = CmiReductionID_dynamicOffset ;
2920- CpvInitialize (int , _reduce_info_size );
2921- CpvAccess (_reduce_info_size ) = 4 ;
29222943 CpvInitialize (CmiReduction * * , _reduce_info );
2923- CpvAccess (_reduce_info ) = (CmiReduction * * )malloc (16 * sizeof (CmiReduction * ));
2924- for (i = 0 ; i < 16 ; ++ i ) CpvAccess (_reduce_info )[i ] = NULL ;
2944+ auto redinfo = (CmiReduction * * )malloc (CmiMaxReductions * sizeof (CmiReduction * ));
2945+ for (int i = 0 ; i < CmiMaxReductions ; ++ i )
2946+ redinfo [i ] = nullptr ;
2947+ CpvAccess (_reduce_info ) = redinfo ;
29252948
29262949 if (CmiMyRank () == 0 )
29272950 {
2928- CsvInitialize (CmiUInt2 , _nodereduce_seqID_global );
2951+ CsvInitialize (CmiReductionID , _nodereduce_seqID_global );
29292952 CsvAccess (_nodereduce_seqID_global ) = CmiReductionID_globalOffset ;
2930- CsvInitialize (CmiUInt2 , _nodereduce_seqID_request );
2953+ CsvInitialize (CmiReductionID , _nodereduce_seqID_request );
29312954 CsvAccess (_nodereduce_seqID_request ) = CmiReductionID_requestOffset ;
2932- CsvInitialize (CmiUInt2 , _nodereduce_seqID_dynamic );
2955+ CsvInitialize (CmiReductionID , _nodereduce_seqID_dynamic );
29332956 CsvAccess (_nodereduce_seqID_dynamic ) = CmiReductionID_dynamicOffset ;
2934- CsvInitialize (int , _nodereduce_info_size );
2935- CsvAccess (_nodereduce_info_size ) = 4 ;
29362957 CsvInitialize (CmiReduction * * , _nodereduce_info );
2937- CsvAccess (_nodereduce_info ) = (CmiReduction * * )malloc (16 * sizeof (CmiReduction * ));
2938- for (i = 0 ; i < 16 ; ++ i ) CsvAccess (_nodereduce_info )[i ] = NULL ;
2958+ auto noderedinfo = (CmiReduction * * )malloc (CmiMaxReductions * sizeof (CmiReduction * ));
2959+ for (int i = 0 ; i < CmiMaxReductions ; ++ i )
2960+ noderedinfo [i ] = nullptr ;
2961+ CsvAccess (_nodereduce_info ) = noderedinfo ;
29392962 }
29402963}
29412964
0 commit comments