#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <assert.h>
#include <limits.h>
#include <stdlib.h>
#include <mpi.h>
#include <yaxt.h>
#include "tests.h"
#include "test_idxlist_utils.h"
#include "test_redist_common.h"
static void
const Xt_int *index_vector_a,
const Xt_int *index_vector_b);
enum {
list_a = 0,
list_b = 1,
list_all = 2,
};
enum { num_redists = 4 };
static void
const Xt_int src_indices_[5],
const Xt_int dst_indices_[2][5]);
int main(void) {
if (size > 1) {
{
{
assert(size <=
XT_INT_MAX / size && size <= INT_MAX / size);
int local_size[2] = {
size, size };
local_start[0]);
local_start[1]);
}
{
}
{
&& 2 <= INT_MAX / size / size / size);
.nstrides = 2*size*size*size };
}
const int list_sizes[3]
= { 2*size*size, 2*size*size, 2 * size * size * size };
for (size_t i = 0; i < 2; ++i)
index_vector[i] =
xmalloc((
size_t)list_sizes[i] *
sizeof (
Xt_int));
for (size_t i = 0; i < num_redists; ++i)
PUT_ERR("error in xt_redist_get_MPI_Comm\n");
for (size_t i = 0; i < num_redists; ++i)
index_vector[list_a], index_vector[list_b]);
index_vector[list_a], index_vector[list_b]);
for (size_t i = 0; i < 2; ++i)
free(index_vector[i]);
}
{
Xt_int src_indices_[5], dst_indices_[2][5];
for (
Xt_int i = 0; i < 5; ++i) {
src_indices_[i] = (
Xt_int)(rank * 5 + i);
dst_indices_[0][i] = (
Xt_int)((src_indices_[i] + 1) % (size * 5));
dst_indices_[1][i] = (
Xt_int)((temp < 0)?(size * 5 - 1):temp);
}
PUT_ERR("error in xt_redist_get_MPI_Comm\n");
rr_exchange(redist, src_indices_, (
const Xt_int (*)[5])dst_indices_);
rr_exchange(redist_copy, src_indices_, (
const Xt_int (*)[5])dst_indices_);
}
}
MPI_Finalize();
return TEST_EXIT_CODE;
}
static void
check_4redist_result(int size, void *results[4],
const Xt_int *index_vector_b);
static void
{
int rank, size;
const size_t result_sizes[num_redists] =
{ 2 * (size_t)size * (size_t)size,
2 * (size_t)size * (size_t)size,
2 * (size_t)size * (size_t)size * (size_t)size,
2 * (size_t)size * (size_t)size * (size_t)size };
const size_t spacing[num_redists] = { 2, 14, 5, 8 };
size_t buf_size = 0;
for (size_t i = 0; i < num_redists; ++i)
buf_size += spacing[i] + result_sizes[i];
unsigned char *temp = buf;
void *results[num_redists];
results[0] = (
void *)(temp += spacing[0] *
sizeof (
Xt_int));
for (size_t i = 1; i < num_redists; ++i)
results[i] = (void *)(
temp += (result_sizes[i-1] + spacing[i]) *
sizeof (
Xt_int));
const void *input[num_redists]
= { index_vector_a, index_vector_b, index_vector_a, index_vector_b };
check_4redist_result(size, results, index_vector_a,
index_vector_b);
if (rank == 0)
results[0] = buf;
check_4redist_result(size, results, index_vector_a, index_vector_b);
free(buf);
}
static void
check_4redist_result(int size, void *results[4],
{
if (cmp_idx_arrays(2 * (size_t)size * (size_t)size,
(
Xt_int *)results[0], index_vector_b))
PUT_ERR("error on xt_redist_s_exchange\n");
if (cmp_idx_arrays(2 * (size_t)size * (size_t)size,
(
Xt_int *)results[1], index_vector_a))
PUT_ERR("error on xt_redist_s_exchange\n");
for (int i = 0; i < 2*size*size*size; ++i)
if (((
Xt_int *)results[2])[i] != i)
PUT_ERR("error on xt_redist_s_exchange\n");
for (int i = 0; i < 2*size*size*size; ++i)
if (((
Xt_int *)results[3])[i] != i)
PUT_ERR("error on xt_redist_s_exchange\n");
}
static void
const Xt_int src_indices_[5],
const Xt_int dst_indices_[2][5])
{
Xt_int results_[2][5] = { {-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1} };
void *results[2] = {results_[0], results_[1]};
const void *input[2] = {src_indices_, src_indices_};
for (int i = 0; i < 5; ++i) {
if (results_[0][i] != dst_indices_[0][i])
PUT_ERR("error on xt_redist_s_exchange\n");
if (results_[1][i] != dst_indices_[1][i])
PUT_ERR("error on xt_redist_s_exchange\n");
}
}