Skip to content
Snippets Groups Projects
Verified Commit 29d0db24 authored by raphael.bach's avatar raphael.bach
Browse files

Add `fmpi_futhark_new_data_{sync,async}()`

parent 6b5f1fa3
No related branches found
No related tags found
No related merge requests found
......@@ -126,9 +126,16 @@ int fmpi_futhark_sync(const struct fmpi_futhark_ctx * ctx);
*/
_Bool fmpi_futhark_check_error(const struct fmpi_futhark_ctx * ctx, const char * func);
/*------------------------------------------------------------------------------
fmpi_futhark_new_data()
fmpi_futhark_new_data_sync()
------------------------------------------------------------------------------*/
void * fmpi_futhark_new_data(
void * fmpi_futhark_new_data_sync(
const struct fmpi_futhark_ctx * ctx, const void * data,
enum fmpi_type_base type, size_t dim_cnt, size_t x, size_t y, size_t z
);
/*------------------------------------------------------------------------------
fmpi_futhark_new_data_async()
------------------------------------------------------------------------------*/
void * fmpi_futhark_new_data_async(
const struct fmpi_futhark_ctx * ctx, const void * data,
enum fmpi_type_base type, size_t dim_cnt, size_t x, size_t y, size_t z
);
......
......@@ -156,9 +156,26 @@ _Bool fmpi_futhark_check_error(
return false;
}
/*------------------------------------------------------------------------------
fmpi_futhark_new_data()
fmpi_futhark_new_data_sync()
------------------------------------------------------------------------------*/
void * fmpi_futhark_new_data(
void * fmpi_futhark_new_data_sync(
const struct fmpi_futhark_ctx * const ctx, const void * const data,
const enum fmpi_type_base type, const size_t dim_cnt,
const size_t x, const size_t y, const size_t z
){
assert(ctx != NULL);
assert(data != NULL);
assert(dim_cnt <= FMPI_DIM_MAX);
const size_t idx = FMPI_PRIV_FUTHARK_FUNC_IDX(dim_cnt, type);
void * new_data = fmpi_futhark_new_data_func_list[idx](ctx, data, x, y, z);
fmpi_futhark_sync(ctx);
fmpi_futhark_check_error(ctx, "futhark_new_##T##_##D##");
return new_data;
}
/*------------------------------------------------------------------------------
fmpi_futhark_new_data_async()
------------------------------------------------------------------------------*/
void * fmpi_futhark_new_data_async(
const struct fmpi_futhark_ctx * const ctx, const void * const data,
const enum fmpi_type_base type, const size_t dim_cnt,
const size_t x, const size_t y, const size_t z
......@@ -236,18 +253,17 @@ void * fmpi_futhark_get_data_async(
#define FMPI_FUTHARK_DEFINITION(D, T) \
void * fmpi_futhark_new_##D##d_##T( \
const struct fmpi_futhark_ctx * const ctx, const void * const array, \
const struct fmpi_futhark_ctx * const ctx, const void * const data, \
const size_t x, const size_t y, const size_t z \
){ \
_Static_assert((D) <= FMPI_DIM_MAX, ""); \
assert(ctx != NULL); \
assert(array != NULL); \
struct futhark_##T##_##D##d * data = FMPI_FUTHARK_NEW_##D(T, ctx->ctx, array, x, y, z); \
if(data == NULL) { \
fmpi_futhark_check_error(ctx, CPL_STRINGIFY(futhark_new_##T##_##D##d)); \
assert(data != NULL); \
struct futhark_##T##_##D##d * new_data = FMPI_FUTHARK_NEW_##D(T, ctx->ctx, data, x, y, z); \
if(new_data == NULL) { \
FMPI_RAISE_FUTHARK_ERROR(ctx, CPL_STRINGIFY(futhark_new_##T##_##D##d)"() failed!"); \
} \
fmpi_futhark_sync(ctx); \
return data; \
return new_data; \
} \
int fmpi_futhark_free_##D##d_##T( \
const struct fmpi_futhark_ctx * const ctx, void * const data \
......
......@@ -64,14 +64,35 @@ struct fmpi_task fmpi_task_register(
FMPI_RAISE_ERROR(ctx->err_handler, "FMPI", "fmpi_new_domain() failed!");
continue;
}
void * start = fmpi_futhark_new_data(
void * data = NULL;
if(task.type == FMPI_TASK_TYPE_SYNC) {
data = fmpi_futhark_new_data_sync(
ctx->fut, task.domains[i].parts[rank].start, task.domains[i].data.type.base,
task.domains[i].data.dim_cnt,
task.domains[i].parts[rank].dim_len[0],
task.domains[i].parts[rank].dim_len[1],
task.domains[i].parts[rank].dim_len[2]
);
if(data == NULL) {
FMPI_RAISE_ERROR(ctx->err_handler, "FMPI",
"fmpi_futhark_new_data_sync() failed!"
);
}
} else {
data = fmpi_futhark_new_data_async(
ctx->fut, task.domains[i].parts[rank].start, task.domains[i].data.type.base,
task.domains[i].data.dim_cnt,
task.domains[i].parts[rank].dim_len[0],
task.domains[i].parts[rank].dim_len[1],
task.domains[i].parts[rank].dim_len[2]
);
task.args.in[i].start = start;
if(data == NULL) {
FMPI_RAISE_ERROR(ctx->err_handler, "FMPI",
"fmpi_futhark_new_data_async() failed!"
);
}
}
task.args.in[i].start = data;
}
ctx->tasks[ctx->task_cnt++] = task;
if(task.type == FMPI_TASK_TYPE_SYNC) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment