#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include "yaxt.h"
#include "tests.h"
#include "test_redist_common.h"
build_odd_selection_xmap(
int src_num_indices,
MPI_Comm comm)
{
enum {
selection_stride = 2,
};
if (src_num_indices < 0)
PUT_ERR("error: src_num_indices < 0");
* sizeof (index_list[0]));
for (int i = 0; i < src_num_indices; ++i)
index_list[i] = (
Xt_int)(i + 1);
int dst_num_indices
= (int)((src_num_indices + selection_stride - 1) / selection_stride);
for (int i = 0; i < dst_num_indices; ++i)
index_list[i] = (
Xt_int)(i * selection_stride + 1);
free(index_list);
return xmap;
}
int result;
return ((result == MPI_IDENT) || (result == MPI_CONGRUENT));
}
void
int sync_mode,
int num_redists,
const void *src[num_redists],
size_t dst_num_elems, void *dst[num_redists],
void *dst_buf_base,
prepare_dst dst_prep,
const void *dst_prep_info,
const void *ref_dst_data,
MPI_Datatype dst_data_dt,
MPI_Datatype ref_dst_data_dt,
const char *file, int line)
{
size_t dt_extent;
{
MPI_Aint dt_lb, dt_extent_;
xt_mpi_call(MPI_Type_get_extent(dst_data_dt, &dt_lb, &dt_extent_), comm);
dt_extent = (size_t)dt_extent_;
}
size_t dst_size = dst_num_elems * dt_extent;
int start_txmode = sync_mode == sync_mode_test_a ? 1 : 0,
end_txmode = sync_mode == sync_mode_test_s ? 1 : 2;
for (int txmode = start_txmode; txmode < end_txmode; ++txmode) {
dst_prep(dst_buf_base, dst_prep_info, dst_num_elems);
if (txmode == 0) {
} else {
wrap_a_exchange(redist, num_redists, src, dst);
}
bool compare_failed = false;
if (dst_data_dt == ref_dst_data_dt) {
compare_failed = memcmp(dst_buf_base, ref_dst_data, dst_size);
} else if (dst_data_dt == MPI_DOUBLE && ref_dst_data_dt == MPI_INT) {
const double *dst_cmp = dst_buf_base;
const int *ref_dst_cmp = ref_dst_data;
for (size_t i = 0; i < dst_num_elems; ++i)
compare_failed |= (dst_cmp[i] != ref_dst_cmp[i]);
} else if (dst_data_dt == MPI_DOUBLE && ref_dst_data_dt == MPI_LONG) {
const double *dst_cmp = dst_buf_base;
const long *ref_dst_cmp = ref_dst_data;
for (size_t i = 0; i < dst_num_elems; ++i)
compare_failed |= (dst_cmp[i] != (double)ref_dst_cmp[i]);
} else if (dst_data_dt == MPI_DOUBLE && ref_dst_data_dt == MPI_SHORT) {
const double *dst_cmp = dst_buf_base;
const short *ref_dst_cmp = ref_dst_data;
for (size_t i = 0; i < dst_num_elems; ++i)
compare_failed |= (dst_cmp[i] != ref_dst_cmp[i]);
} else if (dst_data_dt == MPI_DOUBLE && ref_dst_data_dt == MPI_LONG_LONG) {
const double *dst_cmp = dst_buf_base;
const long long *ref_dst_cmp = ref_dst_data;
for (size_t i = 0; i < dst_num_elems; ++i)
compare_failed |= (dst_cmp[i] != (double)ref_dst_cmp[i]);
} else if (dst_data_dt == MPI_DOUBLE
&& ref_dst_data_dt == MPI_DATATYPE_NULL) {
const double *dst_cmp = dst_buf_base;
for (size_t i = 0; i < dst_num_elems; ++i)
compare_failed |= (dst_cmp[i] != (double)i);
} else
Xt_abort(comm, "internal error: unhandled test case!", file, line);
if (compare_failed)
PUT_ERR("error in xt_redist_s/a_exchange, called from %s, line %d\n",
file, line);
}
}
void
fill_array_double(void *dst, const void *dst_prep_info, size_t dst_num_elems)
{
(void)dst_prep_info;
double *restrict a = dst;
for (size_t i = 0; i < dst_num_elems; ++i)
a[i] = -1;
}
void
fill_array_float(void *dst, const void *dst_prep_info, size_t dst_num_elems)
{
(void)dst_prep_info;
float *restrict a = dst;
for (size_t i = 0; i < dst_num_elems; ++i)
a[i] = -1;
}
void
fill_array_long(void *dst, const void *dst_prep_info, size_t dst_num_elems)
{
(void)dst_prep_info;
long *restrict a = dst;
for (size_t i = 0; i < dst_num_elems; ++i)
a[i] = -1L;
}
void
fill_array_int(void *dst, const void *dst_prep_info, size_t dst_num_elems)
{
(void)dst_prep_info;
int *restrict a = dst;
for (size_t i = 0; i < dst_num_elems; ++i)
a[i] = -1;
}
void
fill_array_short(void *dst, const void *dst_prep_info, size_t dst_num_elems)
{
(void)dst_prep_info;
short *restrict a = dst;
for (size_t i = 0; i < dst_num_elems; ++i)
a[i] = (short)-1;
}
void
fill_array_long_long(void *dst, const void *dst_prep_info, size_t dst_num_elems)
{
(void)dst_prep_info;
long long *restrict a = dst;
for (size_t i = 0; i < dst_num_elems; ++i)
a[i] = -1;
}
void
fill_array_xt_int(void *dst, const void *dst_prep_info, size_t dst_num_elems)
{
(void)dst_prep_info;
for (size_t i = 0; i < dst_num_elems; ++i)
}
void
check_wait_request_(
Xt_request *request,
const char *file,
int line)
{
#ifndef VERBOSE
(void)file;
(void)line;
#endif
PUT_ERR("request == XT_REQUEST_NULL before xt_request_wait: %s, line %d\n",
file, line);
PUT_ERR("request != XT_REQUEST_NULL after xt_request_wait: %s, line %d\n",
file, line);
}
void
wrap_a_exchange(
Xt_redist redist,
int num_data_p,
const void *src_data_p[],
void *dst_data_p[])
{
check_wait_request(&request);
}
void
wrap_a_exchange1(
Xt_redist redist,
const void *src_data_p,
void *dst_data_p)
{
check_wait_request(&request);
}
redist_exchanger_option(int *argc, char ***argv)
{
int opt;
while ((opt = getopt(*argc, *argv, "m:")) != -1)
switch (opt) {
case 'm':
{
if (exchanger_id != -1)
else {
fprintf(stderr, "error: unexpected command-line argument for "
"option -m: %s\n", optarg);
return NULL;
}
}
break;
}
return config;
}
add versions of standard API functions not returning on error
int xt_exchanger_id_by_name(const char *name)
void xt_config_delete(Xt_config config)
void xt_config_set_exchange_method(Xt_config config, int method)
Xt_config xt_config_new(void)
void xt_idxlist_delete(Xt_idxlist idxlist)
Xt_idxlist xt_idxvec_new(const Xt_int *idxlist, int num_indices)
#define xt_mpi_call(call, comm)
void xt_redist_a_exchange1(Xt_redist redist, const void *src_data, void *dst_data, Xt_request *request)
MPI_Comm xt_redist_get_MPI_Comm(Xt_redist redist)
void xt_redist_a_exchange(Xt_redist redist, int num_arrays, const void **src_data, void **dst_data, Xt_request *request)
void xt_redist_s_exchange(Xt_redist redist, int num_arrays, const void **src_data, void **dst_data)
void xt_request_wait(Xt_request *request)
Xt_xmap xt_xmap_all2all_new(Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)