Revered dimension switch. Still not working correctly
This commit is contained in:
parent
2d759b106a
commit
59addafa5d
@ -2,7 +2,7 @@
|
|||||||
TAG ?= CLANG
|
TAG ?= CLANG
|
||||||
ENABLE_MPI ?= true
|
ENABLE_MPI ?= true
|
||||||
ENABLE_OPENMP ?= false
|
ENABLE_OPENMP ?= false
|
||||||
COMM_TYPE ?= v2
|
COMM_TYPE ?= v3
|
||||||
|
|
||||||
#Feature options
|
#Feature options
|
||||||
OPTIONS += -DARRAY_ALIGNMENT=64
|
OPTIONS += -DARRAY_ALIGNMENT=64
|
||||||
|
@ -22,7 +22,7 @@ static int sum(int* sizes, int position)
|
|||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void assembleResult(Comm* c, double* src, double* dst, int jmax, int imax)
|
static void assembleResult(Comm* c, double* src, double* dst, int imax, int jmax)
|
||||||
{
|
{
|
||||||
MPI_Request* requests;
|
MPI_Request* requests;
|
||||||
int numRequests = 1;
|
int numRequests = 1;
|
||||||
@ -35,10 +35,10 @@ static void assembleResult(Comm* c, double* src, double* dst, int jmax, int imax
|
|||||||
|
|
||||||
requests = (MPI_Request*)malloc(numRequests * sizeof(MPI_Request));
|
requests = (MPI_Request*)malloc(numRequests * sizeof(MPI_Request));
|
||||||
|
|
||||||
/* all ranks send their bulk array, but including external boundary layer */
|
/* all ranks send their bulk array, including the external boundary layer */
|
||||||
MPI_Datatype bulkType;
|
MPI_Datatype bulkType;
|
||||||
int oldSizes[NDIMS] = { c->imaxLocal + 2, c->jmaxLocal + 2 };
|
int oldSizes[NDIMS] = { c->jmaxLocal + 2, c->imaxLocal + 2 };
|
||||||
int newSizes[NDIMS] = { c->imaxLocal, c->jmaxLocal };
|
int newSizes[NDIMS] = { c->jmaxLocal, c->imaxLocal };
|
||||||
int starts[NDIMS] = { 1, 1 };
|
int starts[NDIMS] = { 1, 1 };
|
||||||
|
|
||||||
if (commIsBoundary(c, LEFT)) {
|
if (commIsBoundary(c, LEFT)) {
|
||||||
@ -75,12 +75,25 @@ static void assembleResult(Comm* c, double* src, double* dst, int jmax, int imax
|
|||||||
if (c->rank == 0) {
|
if (c->rank == 0) {
|
||||||
for (int i = 0; i < c->size; i++) {
|
for (int i = 0; i < c->size; i++) {
|
||||||
MPI_Datatype domainType;
|
MPI_Datatype domainType;
|
||||||
int oldSizes[NDIMS] = { imax + 2, jmax + 2 };
|
int oldSizes[NDIMS] = { jmax + 2, imax + 2 };
|
||||||
int newSizes[NDIMS] = { newSizesI[i], newSizesJ[i] };
|
int newSizes[NDIMS] = { newSizesJ[i], newSizesI[i] };
|
||||||
int coords[NDIMS];
|
int coords[NDIMS];
|
||||||
MPI_Cart_coords(c->comm, i, NDIMS, coords);
|
MPI_Cart_coords(c->comm, i, NDIMS, coords);
|
||||||
int starts[NDIMS] = { sum(newSizesI, coords[IDIM]),
|
int starts[NDIMS] = { sum(newSizesJ, coords[JDIM]),
|
||||||
sum(newSizesJ, coords[JDIM]) };
|
sum(newSizesI, coords[IDIM]) };
|
||||||
|
printf(
|
||||||
|
"Rank: %d, Coords(i,j): %d %d, Size(i,j): %d %d, Target Size(i,j): %d %d "
|
||||||
|
"Starts(i,j): %d %d\n",
|
||||||
|
i,
|
||||||
|
coords[IDIM],
|
||||||
|
coords[JDIM],
|
||||||
|
oldSizes[IDIM],
|
||||||
|
oldSizes[JDIM],
|
||||||
|
newSizes[IDIM],
|
||||||
|
newSizes[JDIM],
|
||||||
|
starts[IDIM],
|
||||||
|
starts[JDIM]);
|
||||||
|
|
||||||
MPI_Type_create_subarray(NDIMS,
|
MPI_Type_create_subarray(NDIMS,
|
||||||
oldSizes,
|
oldSizes,
|
||||||
newSizes,
|
newSizes,
|
||||||
@ -91,6 +104,7 @@ static void assembleResult(Comm* c, double* src, double* dst, int jmax, int imax
|
|||||||
MPI_Type_commit(&domainType);
|
MPI_Type_commit(&domainType);
|
||||||
|
|
||||||
MPI_Irecv(dst, 1, domainType, i, 0, c->comm, &requests[i + 1]);
|
MPI_Irecv(dst, 1, domainType, i, 0, c->comm, &requests[i + 1]);
|
||||||
|
MPI_Type_free(&domainType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,8 +196,8 @@ void commShift(Comm* c, double* f, double* g)
|
|||||||
MPI_REQUEST_NULL };
|
MPI_REQUEST_NULL };
|
||||||
|
|
||||||
/* shift G */
|
/* shift G */
|
||||||
double* buf = g + 1;
|
|
||||||
/* receive ghost cells from bottom neighbor */
|
/* receive ghost cells from bottom neighbor */
|
||||||
|
double* buf = g + 1;
|
||||||
MPI_Irecv(buf,
|
MPI_Irecv(buf,
|
||||||
1,
|
1,
|
||||||
c->bufferTypes[BOTTOM],
|
c->bufferTypes[BOTTOM],
|
||||||
@ -192,13 +206,13 @@ void commShift(Comm* c, double* f, double* g)
|
|||||||
c->comm,
|
c->comm,
|
||||||
&requests[0]);
|
&requests[0]);
|
||||||
|
|
||||||
buf = g + (c->jmaxLocal) * (c->imaxLocal + 2) + 1;
|
|
||||||
/* send ghost cells to top neighbor */
|
/* send ghost cells to top neighbor */
|
||||||
|
buf = g + (c->jmaxLocal) * (c->imaxLocal + 2) + 1;
|
||||||
MPI_Isend(buf, 1, c->bufferTypes[TOP], c->neighbours[TOP], 0, c->comm, &requests[1]);
|
MPI_Isend(buf, 1, c->bufferTypes[TOP], c->neighbours[TOP], 0, c->comm, &requests[1]);
|
||||||
|
|
||||||
/* shift F */
|
/* shift F */
|
||||||
buf = f + (c->imaxLocal + 2);
|
|
||||||
/* receive ghost cells from left neighbor */
|
/* receive ghost cells from left neighbor */
|
||||||
|
buf = f + (c->imaxLocal + 2);
|
||||||
MPI_Irecv(buf,
|
MPI_Irecv(buf,
|
||||||
1,
|
1,
|
||||||
c->bufferTypes[LEFT],
|
c->bufferTypes[LEFT],
|
||||||
@ -207,8 +221,8 @@ void commShift(Comm* c, double* f, double* g)
|
|||||||
c->comm,
|
c->comm,
|
||||||
&requests[2]);
|
&requests[2]);
|
||||||
|
|
||||||
buf = f + (c->imaxLocal + 2) + (c->imaxLocal + 1);
|
|
||||||
/* send ghost cells to right neighbor */
|
/* send ghost cells to right neighbor */
|
||||||
|
buf = f + (c->imaxLocal + 2) + (c->imaxLocal);
|
||||||
MPI_Isend(buf,
|
MPI_Isend(buf,
|
||||||
1,
|
1,
|
||||||
c->bufferTypes[RIGHT],
|
c->bufferTypes[RIGHT],
|
||||||
@ -228,44 +242,18 @@ void commCollectResult(Comm* c,
|
|||||||
double* u,
|
double* u,
|
||||||
double* v,
|
double* v,
|
||||||
double* p,
|
double* p,
|
||||||
int jmax,
|
int imax,
|
||||||
int imax)
|
int jmax)
|
||||||
{
|
{
|
||||||
#ifdef _MPI
|
#ifdef _MPI
|
||||||
|
|
||||||
int offset[c->size * NDIMS];
|
|
||||||
int imaxLocal[c->size];
|
|
||||||
int jmaxLocal[c->size];
|
|
||||||
|
|
||||||
MPI_Gather(&c->imaxLocal, 1, MPI_INT, imaxLocal, 1, MPI_INT, 0, MPI_COMM_WORLD);
|
|
||||||
MPI_Gather(&c->jmaxLocal, 1, MPI_INT, jmaxLocal, 1, MPI_INT, 0, MPI_COMM_WORLD);
|
|
||||||
|
|
||||||
if (c->rank == 0) {
|
|
||||||
for (int i = 0; i < c->size; i++) {
|
|
||||||
int coords[NDIMS];
|
|
||||||
MPI_Cart_coords(c->comm, i, NDIMS, coords);
|
|
||||||
offset[i * NDIMS + IDIM] = sum(imaxLocal, coords[IDIM]);
|
|
||||||
offset[i * NDIMS + JDIM] = sum(jmaxLocal, coords[JDIM]);
|
|
||||||
printf("Rank: %d, Coords(j,i): %d %d, Size(j,i): %d %d "
|
|
||||||
"Offset(j,i): %d %d\n",
|
|
||||||
i,
|
|
||||||
coords[JDIM],
|
|
||||||
coords[IDIM],
|
|
||||||
jmaxLocal[i],
|
|
||||||
imaxLocal[i],
|
|
||||||
offset[i * NDIMS + JDIM],
|
|
||||||
offset[i * NDIMS + IDIM]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* collect P */
|
/* collect P */
|
||||||
assembleResult(c, p, pg, jmax, imax);
|
assembleResult(c, p, pg, imax, jmax);
|
||||||
|
|
||||||
/* collect U */
|
/* collect U */
|
||||||
assembleResult(c, u, ug, jmax, imax);
|
assembleResult(c, u, ug, imax, jmax);
|
||||||
|
|
||||||
/* collect V */
|
/* collect V */
|
||||||
assembleResult(c, v, vg, jmax, imax);
|
assembleResult(c, v, vg, imax, jmax);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ static int sum(int* sizes, int position)
|
|||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void assembleResult(Comm* c, double* src, double* dst, int jmax, int imax)
|
static void assembleResult(Comm* c, double* src, double* dst, int imax, int jmax)
|
||||||
{
|
{
|
||||||
MPI_Request* requests;
|
MPI_Request* requests;
|
||||||
int numRequests = 1;
|
int numRequests = 1;
|
||||||
@ -36,7 +36,7 @@ static void assembleResult(Comm* c, double* src, double* dst, int jmax, int imax
|
|||||||
|
|
||||||
requests = (MPI_Request*)malloc(numRequests * sizeof(MPI_Request));
|
requests = (MPI_Request*)malloc(numRequests * sizeof(MPI_Request));
|
||||||
|
|
||||||
/* all ranks send their bulk array, but including external boundary layer */
|
/* all ranks send their bulk array, including the external boundary layer */
|
||||||
MPI_Datatype bulkType;
|
MPI_Datatype bulkType;
|
||||||
int oldSizes[NDIMS] = { c->jmaxLocal + 2, c->imaxLocal + 2 };
|
int oldSizes[NDIMS] = { c->jmaxLocal + 2, c->imaxLocal + 2 };
|
||||||
int newSizes[NDIMS] = { c->jmaxLocal, c->imaxLocal };
|
int newSizes[NDIMS] = { c->jmaxLocal, c->imaxLocal };
|
||||||
@ -82,6 +82,19 @@ static void assembleResult(Comm* c, double* src, double* dst, int jmax, int imax
|
|||||||
MPI_Cart_coords(c->comm, i, NDIMS, coords);
|
MPI_Cart_coords(c->comm, i, NDIMS, coords);
|
||||||
int starts[NDIMS] = { sum(newSizesJ, coords[JDIM]),
|
int starts[NDIMS] = { sum(newSizesJ, coords[JDIM]),
|
||||||
sum(newSizesI, coords[IDIM]) };
|
sum(newSizesI, coords[IDIM]) };
|
||||||
|
printf(
|
||||||
|
"Rank: %d, Coords(i,j): %d %d, Size(i,j): %d %d, Target Size(i,j): %d %d "
|
||||||
|
"Starts(i,j): %d %d\n",
|
||||||
|
i,
|
||||||
|
coords[IDIM],
|
||||||
|
coords[JDIM],
|
||||||
|
oldSizes[IDIM],
|
||||||
|
oldSizes[JDIM],
|
||||||
|
newSizes[IDIM],
|
||||||
|
newSizes[JDIM],
|
||||||
|
starts[IDIM],
|
||||||
|
starts[JDIM]);
|
||||||
|
|
||||||
MPI_Type_create_subarray(NDIMS,
|
MPI_Type_create_subarray(NDIMS,
|
||||||
oldSizes,
|
oldSizes,
|
||||||
newSizes,
|
newSizes,
|
||||||
@ -92,6 +105,7 @@ static void assembleResult(Comm* c, double* src, double* dst, int jmax, int imax
|
|||||||
MPI_Type_commit(&domainType);
|
MPI_Type_commit(&domainType);
|
||||||
|
|
||||||
MPI_Irecv(dst, 1, domainType, i, 0, c->comm, &requests[i + 1]);
|
MPI_Irecv(dst, 1, domainType, i, 0, c->comm, &requests[i + 1]);
|
||||||
|
MPI_Type_free(&domainType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,44 +208,18 @@ void commCollectResult(Comm* c,
|
|||||||
double* u,
|
double* u,
|
||||||
double* v,
|
double* v,
|
||||||
double* p,
|
double* p,
|
||||||
int jmax,
|
int imax,
|
||||||
int imax)
|
int jmax)
|
||||||
{
|
{
|
||||||
#ifdef _MPI
|
#ifdef _MPI
|
||||||
|
|
||||||
int offset[c->size * NDIMS];
|
|
||||||
int imaxLocal[c->size];
|
|
||||||
int jmaxLocal[c->size];
|
|
||||||
|
|
||||||
MPI_Gather(&c->imaxLocal, 1, MPI_INT, imaxLocal, 1, MPI_INT, 0, MPI_COMM_WORLD);
|
|
||||||
MPI_Gather(&c->jmaxLocal, 1, MPI_INT, jmaxLocal, 1, MPI_INT, 0, MPI_COMM_WORLD);
|
|
||||||
|
|
||||||
if (c->rank == 0) {
|
|
||||||
for (int i = 0; i < c->size; i++) {
|
|
||||||
int coords[NDIMS];
|
|
||||||
MPI_Cart_coords(c->comm, i, NDIMS, coords);
|
|
||||||
offset[i * NDIMS + IDIM] = sum(imaxLocal, coords[IDIM]);
|
|
||||||
offset[i * NDIMS + JDIM] = sum(jmaxLocal, coords[JDIM]);
|
|
||||||
printf("Rank: %d, Coords(j,i): %d %d, Size(j,i): %d %d "
|
|
||||||
"Offset(j,i): %d %d\n",
|
|
||||||
i,
|
|
||||||
coords[JDIM],
|
|
||||||
coords[IDIM],
|
|
||||||
jmaxLocal[i],
|
|
||||||
imaxLocal[i],
|
|
||||||
offset[i * NDIMS + JDIM],
|
|
||||||
offset[i * NDIMS + IDIM]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* collect P */
|
/* collect P */
|
||||||
assembleResult(c, p, pg, jmax, imax);
|
assembleResult(c, p, pg, imax, jmax);
|
||||||
|
|
||||||
/* collect U */
|
/* collect U */
|
||||||
assembleResult(c, u, ug, jmax, imax);
|
assembleResult(c, u, ug, imax, jmax);
|
||||||
|
|
||||||
/* collect V */
|
/* collect V */
|
||||||
assembleResult(c, v, vg, jmax, imax);
|
assembleResult(c, v, vg, imax, jmax);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,12 +43,18 @@ void commPrintConfig(Comm* c)
|
|||||||
c->neighbours[TOP],
|
c->neighbours[TOP],
|
||||||
c->neighbours[LEFT],
|
c->neighbours[LEFT],
|
||||||
c->neighbours[RIGHT]);
|
c->neighbours[RIGHT]);
|
||||||
|
printf("\tIs boundary:\n");
|
||||||
|
printf("\t\tLEFT: %d\n", commIsBoundary(c, LEFT));
|
||||||
|
printf("\t\tRIGHT: %d\n", commIsBoundary(c, RIGHT));
|
||||||
|
printf("\t\tBOTTOM: %d\n", commIsBoundary(c, BOTTOM));
|
||||||
|
printf("\t\tTOP: %d\n", commIsBoundary(c, TOP));
|
||||||
printf("\tCoordinates (i,j) %d %d\n", c->coords[IDIM], c->coords[JDIM]);
|
printf("\tCoordinates (i,j) %d %d\n", c->coords[IDIM], c->coords[JDIM]);
|
||||||
|
printf("\tDims (i,j) %d %d\n", c->dims[IDIM], c->dims[JDIM]);
|
||||||
printf("\tLocal domain size (i,j) %dx%d\n", c->imaxLocal, c->jmaxLocal);
|
printf("\tLocal domain size (i,j) %dx%d\n", c->imaxLocal, c->jmaxLocal);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
MPI_Barrier(MPI_COMM_WORLD);
|
MPI_Barrier(MPI_COMM_WORLD);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,7 +96,7 @@ static void testWriteFile(char* filename, double* grid, int imax, int jmax)
|
|||||||
|
|
||||||
for (int j = 0; j < jmax + 2; j++) {
|
for (int j = 0; j < jmax + 2; j++) {
|
||||||
for (int i = 0; i < imax + 2; i++) {
|
for (int i = 0; i < imax + 2; i++) {
|
||||||
fprintf(fp, "%f ", grid[j * (imax + 2) + i]);
|
fprintf(fp, "%.2f ", grid[j * (imax + 2) + i]);
|
||||||
}
|
}
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum direction { LEFT = 0, RIGHT, BOTTOM, TOP, NDIRS };
|
enum direction { LEFT = 0, RIGHT, BOTTOM, TOP, NDIRS };
|
||||||
enum dimension { IDIM = 0, JDIM, NDIMS };
|
enum dimension { JDIM = 0, IDIM, NDIMS };
|
||||||
enum layer { HALO = 0, BULK };
|
enum layer { HALO = 0, BULK };
|
||||||
enum op { MAX = 0, SUM };
|
enum op { MAX = 0, SUM };
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ static void writeResults(Solver* s)
|
|||||||
double* vg = allocate(64, bytesize);
|
double* vg = allocate(64, bytesize);
|
||||||
double* pg = allocate(64, bytesize);
|
double* pg = allocate(64, bytesize);
|
||||||
|
|
||||||
commCollectResult(&s->comm, ug, vg, pg, s->u, s->v, s->p, s->jmax, s->imax);
|
commCollectResult(&s->comm, ug, vg, pg, s->u, s->v, s->p, s->imax, s->jmax);
|
||||||
writeResult(s, ug, vg, pg);
|
writeResult(s, ug, vg, pg);
|
||||||
|
|
||||||
free(ug);
|
free(ug);
|
||||||
|
@ -515,7 +515,7 @@ void writeResult(Solver* s, double* u, double* v, double* p)
|
|||||||
y = (double)(j - 0.5) * dy;
|
y = (double)(j - 0.5) * dy;
|
||||||
for (int i = 1; i <= imax; i++) {
|
for (int i = 1; i <= imax; i++) {
|
||||||
x = (double)(i - 0.5) * dx;
|
x = (double)(i - 0.5) * dx;
|
||||||
fprintf(fp, "%.2f %.2f %f\n", x, y, p[j * (imax) + i]);
|
fprintf(fp, "%.2f %.2f %f\n", x, y, p[j * (imax + 2) + i]);
|
||||||
}
|
}
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user