Skip to content

Commit b6d60ca

Browse files
authored
Fix element redistribution issue (#37)
1 parent b2a77e4 commit b6d60ca

13 files changed

+170
-131
lines changed

src/genmap-impl.h

+6-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
/* rcb_element is used for rcb and rib */
2929
struct rcb_element {
30-
unsigned char type;
30+
int type;
3131
GenmapInt proc;
3232
GenmapInt origin;
3333
GenmapInt seq;
@@ -38,7 +38,7 @@ struct rcb_element {
3838

3939
/* rsb_element should be a superset of rcb_element */
4040
struct rsb_element {
41-
unsigned char type;
41+
int type;
4242
GenmapInt proc;
4343
GenmapInt origin;
4444
GenmapInt seq;
@@ -99,12 +99,15 @@ typedef enum {
9999
FIEDLER,
100100
NFIEDLER,
101101
FIEDLERSORT,
102-
BISECT,
102+
BISECTANDREPAIR,
103103
LANCZOS,
104104
NLANCZOS,
105105
WEIGHTEDLAPLACIAN,
106106
TQLI,
107107
LAPLACIANSETUP,
108+
FINDNBRS,
109+
CSRMATSETUP,
110+
CSRTOPSETUP,
108111
PRECONDSETUP,
109112
RQI,
110113
NRQI,

src/genmap-laplacian.c

+17-11
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
#define min(a, b) ((b) < (a) ? (b) : (a))
44

5-
static void GenmapFindNeighbors(struct array *nbrs, genmap_handle h,
6-
struct comm *cc) {
5+
static void genmap_find_neighbors(struct array *nbrs, genmap_handle h,
6+
struct comm *cc) {
77
sint lelt = genmap_get_nel(h);
88
sint nv = genmap_get_nvertices(h);
99

@@ -38,9 +38,7 @@ static void GenmapFindNeighbors(struct array *nbrs, genmap_handle h,
3838
size = vertices.n;
3939
vertex *vPtr = vertices.ptr;
4040

41-
buffer buf;
42-
buffer_init(&buf, 1024);
43-
sarray_sort(vertex, vPtr, size, vertexId, 1, &buf);
41+
sarray_sort(vertex, vPtr, size, vertexId, 1, &h->buf);
4442

4543
struct array a;
4644
array_init(csr_entry, &a, 10);
@@ -67,14 +65,13 @@ static void GenmapFindNeighbors(struct array *nbrs, genmap_handle h,
6765

6866
sarray_transfer(csr_entry, &a, proc, 1, &cr);
6967
// TODO: Check if the last line is redundant
70-
sarray_sort_2(csr_entry, a.ptr, a.n, r, 1, c, 1, &buf);
71-
sarray_sort(csr_entry, a.ptr, a.n, r, 1, &buf);
68+
sarray_sort_2(csr_entry, a.ptr, a.n, r, 1, c, 1, &h->buf);
69+
// sarray_sort(csr_entry, a.ptr, a.n, r, 1, &h->buf);
7270

7371
array_init(entry, nbrs, lelt);
7472

7573
if (a.n == 0) {
7674
crystal_free(&cr);
77-
buffer_free(&buf);
7875
array_free(&vertices);
7976
array_free(&a);
8077
}
@@ -96,21 +93,30 @@ static void GenmapFindNeighbors(struct array *nbrs, genmap_handle h,
9693
}
9794
}
9895

99-
sarray_sort_2(entry, nbrs->ptr, nbrs->n, r, 1, c, 1, &buf);
96+
sarray_sort_2(entry, nbrs->ptr, nbrs->n, r, 1, c, 1, &h->buf);
10097

10198
crystal_free(&cr);
102-
buffer_free(&buf);
10399
array_free(&vertices);
104100
array_free(&a);
105101
}
106102

107103
int GenmapInitLaplacian(genmap_handle h, struct comm *c) {
108104
struct array entries;
109-
GenmapFindNeighbors(&entries, h, c);
105+
106+
metric_tic(c, FINDNBRS);
107+
genmap_find_neighbors(&entries, h, c);
108+
metric_toc(c, FINDNBRS);
109+
110+
metric_tic(c, CSRMATSETUP);
110111
csr_mat_setup(&entries, c, &h->M);
112+
metric_toc(c, CSRMATSETUP);
113+
111114
array_free(&entries);
112115

116+
metric_toc(c, CSRTOPSETUP);
113117
h->gsh = get_csr_top(h->M, c);
118+
metric_toc(c, CSRTOPSETUP);
119+
114120
GenmapRealloc(h->M->row_off[h->M->rn], &h->b);
115121

116122
#if defined(GENMAP_DEBUG)

src/genmap-load-balance.c

+31
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,34 @@ void genmap_load_balance(struct array *eList, uint nel, int nv, double *coord,
6868

6969
free(element);
7070
}
71+
72+
void genmap_restore_original(int *part, int *seq, struct crystal *cr,
73+
struct array *eList, buffer *bfr) {
74+
struct rcb_element *element = eList->ptr;
75+
size_t unit_size;
76+
if (element->type == GENMAP_RSB_ELEMENT) // RSB
77+
unit_size = sizeof(struct rsb_element);
78+
else
79+
unit_size = sizeof(struct rcb_element);
80+
81+
sarray_transfer_(eList, unit_size, offsetof(struct rcb_element, origin), 1,
82+
cr);
83+
84+
uint nel = eList->n;
85+
if (element->type == GENMAP_RSB_ELEMENT) // RSB
86+
sarray_sort(struct rsb_element, eList->ptr, nel, globalId, 1, bfr);
87+
else
88+
sarray_sort(struct rcb_element, eList->ptr, nel, globalId, 1, bfr);
89+
90+
int e;
91+
for (e = 0; e < nel; e++) {
92+
element = eList->ptr + e * unit_size;
93+
part[e] = element->origin; // element[e].origin;
94+
}
95+
96+
if (seq != NULL)
97+
for (e = 0; e < nel; e++) {
98+
element = eList->ptr + e * unit_size;
99+
seq[e] = element->seq; // element[e].seq;
100+
}
101+
}

0 commit comments

Comments
 (0)