diff --git a/include/fmpi_domain.h b/include/fmpi_domain.h index 41c8c61bc38f2746dd9eaac1a331edff9cf093ca..51cb754a23b0fb56f8d9cb190fcfd292357c24fc 100644 --- a/include/fmpi_domain.h +++ b/include/fmpi_domain.h @@ -58,6 +58,13 @@ struct fmpi_domain fmpi_new_domain( const struct fmpi_ctx * ctx, const struct fmpi_data * data, struct fmpi_stencil stencil ); +/*------------------------------------------------------------------------------ + fmpi_domain_set_inner() +------------------------------------------------------------------------------*/ +void fmpi_domain_set_inner( + const struct fmpi_ctx * ctx, const struct fmpi_domain * domain, + const void * data +); /*============================================================================== GUARD ==============================================================================*/ diff --git a/src/fmpi_domain.c b/src/fmpi_domain.c index a83d4d3622e334a116cd4da49afa488fc2de5ee6..4927832425c5753582cd14da88e2b8fd6db2208a 100644 --- a/src/fmpi_domain.c +++ b/src/fmpi_domain.c @@ -73,9 +73,22 @@ struct fmpi_domain fmpi_new_domain( domain.inner = fmpi_partition_block_1d(ctx, data); 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); } return domain; } +/*------------------------------------------------------------------------------ + fmpi_domain_set_inner() +------------------------------------------------------------------------------*/ +void fmpi_domain_set_inner( + const struct fmpi_ctx * const ctx, const struct fmpi_domain * const domain, + const void * const data +){ + assert(ctx != NULL); + assert(domain != NULL); + assert(data != NULL); + memcpy(domain->inner.raw, data, domain->inner.size); +} /*============================================================================== PRIVATE FUNCTION DEFINITION ==============================================================================*/ diff --git a/src/fmpi_task.c b/src/fmpi_task.c index 6022fb12712e26d2ecd5b0570d8975b4327a62e0..3119a205398ab5ca6fbcbe517aa2b05eadda31be 100644 --- a/src/fmpi_task.c +++ b/src/fmpi_task.c @@ -116,7 +116,7 @@ int fmpi_task_run_sync( "fmpi_futhark_get_data_sync() failed!" ); } - const int err = fmpi_futhark_free_data_sync( + int err = fmpi_futhark_free_data_sync( ctx->fut, task->args.out.gpu, task->args.out.type.base, task->args.out.dim_cnt ); @@ -127,16 +127,11 @@ int fmpi_task_run_sync( } } if(task->stencil.type != FMPI_STENCIL_NONE) { - const int rank = ctx->mpi->rank; - size_t type_size = task->domains[0].halo.type.size; - void * const halo = task->domains[0].halo.raw; - const void * const inner = task->args.out.raw; - void * const dest = (rank == 0) ? ((char *)halo + type_size) : halo; - const void * const src = (rank != 0) ? ((const char *)inner - type_size) : inner; - const size_t inner_size = task->domains[0].inner.size; - const size_t size = (rank != (ctx->mpi->size - 1)) ? (inner_size + type_size) : inner_size; - memcpy(dest, src, size); + fmpi_domain_set_inner(ctx, &task->domains[0], task->args.out.raw); + const int rank = ctx->mpi->rank; + size_t type_size = task->domains[0].inner.type.size; + const size_t idx_1 = type_size; const size_t idx_nm2 = (task->domains[0].halo.cnt-2) * type_size; const size_t idx_nm1 = idx_nm2 + idx_1;