From d53264b9b3e9b79f1c68e10bed573956369c764e Mon Sep 17 00:00:00 2001 From: "raphael.bach" <raphael.bach@etu.hesge.ch> Date: Mon, 18 Jul 2022 22:22:52 +0200 Subject: [PATCH] Update `fmpi_new_domain()` and `fmpi_domain_set_inner()` for 2D support --- src/fmpi_domain.c | 49 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/src/fmpi_domain.c b/src/fmpi_domain.c index d5f25c9..f7ed806 100644 --- a/src/fmpi_domain.c +++ b/src/fmpi_domain.c @@ -84,10 +84,32 @@ struct fmpi_domain fmpi_new_domain( .stencil = stencil, .part_cnt = proc_cnt }; - domain.inner = fmpi_partition_block_1d(ctx, data); + switch(data->dim_cnt) { + case 1: { + domain.inner = fmpi_partition_block_1d(ctx, data); + break; + } + case 2: { + domain.inner = fmpi_partition_block_2d(ctx, data); + break; + } + default: break; + } if(stencil.type != FMPI_STENCIL_NONE) { - domain.halo = fmpi_halo_1d(ctx, domain.inner, stencil); - domain.inner.raw = (char *)domain.halo.raw + (data->type.size * stencil.length); + switch(data->dim_cnt) { + case 1: { + domain.halo = fmpi_halo_1d(ctx, domain.inner, stencil); + domain.inner.raw = (char *)domain.halo.raw + (data->type.size * stencil.length); + break; + } + case 2: { + domain.halo = fmpi_halo_2d(ctx, domain.inner, stencil); + const size_t offset = stencil.length * (domain.halo.dim_len[0] + 1) * data->type.size; + domain.inner.raw = (char *)domain.halo.raw + offset; + break; + } + default: break; + } } return domain; } @@ -101,7 +123,20 @@ void fmpi_domain_set_inner( assert(ctx != NULL); assert(domain != NULL); assert(data != NULL); - memcpy(domain->inner.raw, data, domain->inner.size); + const size_t dim_cnt = domain->inner.dim_cnt; + if(dim_cnt == 1) { + memcpy(domain->inner.raw, data, domain->inner.size); + } else if(dim_cnt == 2) { + const size_t type_size = domain->inner.type.size; + const size_t dim_len_y = domain->inner.dim_len[1]; + const size_t src_size_x = domain->inner.dim_len[0] * type_size; + for(size_t i = 0; i < dim_len_y; i++) { + const size_t dest_offset = i * domain->halo.dim_len[0] * type_size; + void * const dest = (char *)domain->inner.raw + dest_offset; + const void * const src = (const char *)data + (i * src_size_x); + memcpy(dest, src, src_size_x); + } + } } /*------------------------------------------------------------------------------ fmpi_halo_exchange_1d() @@ -256,13 +291,13 @@ static struct fmpi_data fmpi_halo_1d( ); } const size_t rank = (size_t)ctx->mpi->rank; - // Left boundary + // First rank if(rank == 0) { memcpy(((char *)halo.raw + type_size), data.raw, (data.size + type_size)); - // Right boundary + // Last rank } else if(rank == (size_t)(ctx->mpi->size - 1)) { memcpy(halo.raw, ((const char *)(data.raw) - type_size), (data.size + type_size)); - // Middle + // Middle rank } else { memcpy(halo.raw, ((const char *)(data.raw) - type_size), size); } -- GitLab