Skip to content

Commit 773eaf6

Browse files
Converse: Apply stylistic cleanup to reduction code
1 parent a442300 commit 773eaf6

File tree

3 files changed

+84
-77
lines changed

3 files changed

+84
-77
lines changed

src/ck-core/ckmemcheckpoint.C

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1466,7 +1466,8 @@ static void reportChkpSeqHandler(char * m)
14661466
{
14671467
CmiFree(m);
14681468
CmiResetGlobalReduceSeqID();
1469-
CmiResetGlobalNodeReduceSeqID();
1469+
if (CmiMyRank() == 0)
1470+
CmiResetGlobalNodeReduceSeqID();
14701471
char *msg = (char*)CmiAlloc(CmiMsgHeaderSizeBytes+sizeof(int));
14711472
int num = CpvAccess(chkpNum);
14721473
if(CkMyNode() == CpvAccess(_crashedNode))

src/conv-core/convcore.C

Lines changed: 82 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
24292450
CpvStaticDeclare(int, CmiReductionMessageHandler);
24302451
CpvStaticDeclare(int, CmiReductionDynamicRequestHandler);
24312452

24322453
CpvStaticDeclare(int, CmiNodeReductionMessageHandler);
24332454
CpvStaticDeclare(int, CmiNodeReductionDynamicRequestHandler);
24342455

24352456
CpvStaticDeclare(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

24412461
CsvStaticDeclare(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

24542473
static 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-
24852501
static 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

24912509
static 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

25072526
static 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-
25382554
static 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

25442562
static 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

29012926
void 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

src/conv-core/converse.h

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1316,23 +1316,6 @@ typedef void * (*CmiReduceMergeFn)(int*,void*,void**,int);
13161316
typedef void (*CmiReducePupFn)(void*,void*);
13171317
typedef void (*CmiReduceDeleteFn)(void*);
13181318

1319-
typedef struct {
1320-
void *localData;
1321-
char **remoteData;
1322-
int localSize;
1323-
short int numRemoteReceived;
1324-
short int numChildren;
1325-
int parent;
1326-
CmiUInt2 seqID;
1327-
char localContributed;
1328-
struct {
1329-
CmiHandler destination;
1330-
CmiReduceMergeFn mergeFn;
1331-
CmiReducePupFn pupFn;
1332-
CmiReduceDeleteFn deleteFn;
1333-
} ops;
1334-
} CmiReduction;
1335-
13361319
typedef CmiUInt2 CmiReductionID;
13371320

13381321
void * CmiReduceMergeFn_random(int*, void*, void**, int);

0 commit comments

Comments
 (0)