16 #include "../utils/endrun.h"
17 #include "../utils/mymalloc.h"
18 #include "../utils/mpsort.h"
27 static void radix_int(
const void * ptr,
void * radix,
void * arg) {
28 *(uint64_t*)radix = *(
const int64_t*) ptr + INT64_MIN;
32 checksum(int64_t * data,
size_t localsize, MPI_Comm comm)
36 for(i = 0; i < localsize; i ++) {
40 MPI_Allreduce(MPI_IN_PLACE, &sum, 1, MPI_LONG, MPI_SUM, comm);
44 generate(int64_t * data,
size_t localsize,
int bits,
int seed)
50 unsigned shift = 64u - bits;
51 for(i = 0; i < localsize; i ++) {
52 uint64_t value = (int64_t) random() * (int64_t) random() * random() * random();
53 data[i] = (signed) ((value << shift));
58 check_sorted(
void * data,
int elsize,
size_t localsize,
int compar(
void * d1,
void * d2), MPI_Comm comm)
63 MPI_Comm_size(comm, &
NTask);
65 const int TAG = 0xbeef;
67 for(i = 1; i < localsize; i ++) {
68 if(compar(data + i*elsize, data + (i - 1)*elsize) < 0) {
72 endrun(12,
"Ordering of local array is broken i=%ld, d=%ld d-1=%ld. \n", i, ((int64_t *)data)[i], ((int64_t *)data)[i-1]);
74 assert_true(compar(data + i*elsize, data + (i - 1)*elsize) >=0);
77 if(
NTask == 1)
return;
79 char * prev =
ta_malloc(
"prev",
char, elsize);
80 memset(prev, -1000000, elsize);
86 ptr = data + elsize * (localsize - 1);
88 MPI_Send(ptr, elsize, MPI_BYTE,
ThisTask + 1, TAG, comm);
92 MPI_Recv(prev, elsize, MPI_BYTE,
93 ThisTask - 1, TAG, comm, MPI_STATUS_IGNORE);
99 MPI_Recv(prev, elsize, MPI_BYTE,
ThisTask - 1, TAG, comm, MPI_STATUS_IGNORE);
100 MPI_Send(prev, elsize, MPI_BYTE,
ThisTask + 1, TAG, comm);
106 data+(localsize - 1)*elsize, elsize, MPI_BYTE,
108 prev, elsize, MPI_BYTE,
109 ThisTask - 1, TAG, comm, MPI_STATUS_IGNORE);
117 if(compar(prev, data) > 0) {
118 endrun(12,
"Ordering of global array is broken prev=%ld d=%ld (comp: %d). \n", prev, *(int64_t *)data, compar(prev, data));
120 assert_true(compar(prev, data) <= 0);
143 MPI_Comm_size(MPI_COMM_WORLD, &
NTask);
144 MPI_Comm_rank(MPI_COMM_WORLD, &
ThisTask);
154 if(staggered && (
ThisTask % 2 == 0)) srcsize = 0;
158 MPI_Allreduce(&srcsize, &csize, 1, MPI_LONG, MPI_SUM, MPI_COMM_WORLD);
162 message(0,
"dest size = %ld\n", destsize);
165 int64_t * src =
mymalloc(
"src", srcsize *
sizeof(int64_t));
166 int64_t * dest =
mymalloc(
"dest", destsize *
sizeof(int64_t));
171 int64_t srcsum =
checksum(src, srcsize, MPI_COMM_WORLD);
175 double start = MPI_Wtime();
184 MPI_Barrier(MPI_COMM_WORLD);
185 double end = MPI_Wtime();
187 int64_t destsum =
checksum(dest, destsize, MPI_COMM_WORLD);
189 if(destsum != srcsum) {
190 endrun(5,
"MPSort checksum is inconsistent.\n");
191 MPI_Abort(MPI_COMM_WORLD, -1);
196 message(0,
"MPSort total time: %g\n", end - start);
209 uint64_t * u = (uint64_t *) radix;
213 u[2] = UINT64_MAX - (f->
Length);
231 else if(dist1 < dist2)
233 else if(dist1 > dist2)
243 for(i = 0; i < localsize; i ++) {
244 sum += data[i].
MinID;
247 MPI_Allreduce(MPI_IN_PLACE, &sum, 1, MPI_LONG, MPI_SUM, comm);
258 MPI_Comm_size(MPI_COMM_WORLD, &
NTask);
259 MPI_Comm_rank(MPI_COMM_WORLD, &
ThisTask);
264 for(i = 0; i < srcsize; i++)
268 base[i].
MinID = random();
274 double start = MPI_Wtime();
282 MPI_Barrier(MPI_COMM_WORLD);
283 double end = MPI_Wtime();
287 if(destsum != srcsum) {
288 endrun(5,
"MPSort checksum is inconsistent.\n");
289 MPI_Abort(MPI_COMM_WORLD, -1);
294 message(0,
"MPSort total time: %g\n", end - start);
339 const struct CMUnitTest tests[] = {
345 return cmocka_run_group_tests_mpi(tests, NULL, NULL);
void message(int where, const char *fmt,...)
void endrun(int where, const char *fmt,...)
void mpsort_mpi_unset_options(int options)
void mpsort_mpi_set_options(int options)
void mpsort_setup_timers(int ntimers)
#define mpsort_mpi_newarray(base, nmemb, out, outnmemb, elsize, radix, rsize, arg, comm)
#define MPSORT_REQUIRE_GATHER_SORT
#define MPSORT_DISABLE_GATHER_SORT
#define mymalloc(name, size)
#define ta_malloc(name, type, nele)
static uint64_t checksum_minid(struct BaseGroup *data, size_t localsize, MPI_Comm comm)
static void do_long_radix_test(int srcsize)
static void test_basegroup(void **state)
int compar_bg(void *d1, void *d2)
static void radix_int(const void *ptr, void *radix, void *arg)
static void test_mpsort_gather(void **state)
static int64_t checksum(int64_t *data, size_t localsize, MPI_Comm comm)
static void test_mpsort_stagger(void **state)
static void fof_radix_Group_TotalCountTaskDiffMinID(const void *a, void *radix, void *arg)
static void do_mpsort_test(int64_t srcsize, int bits, int staggered, int gather)
static void generate(int64_t *data, size_t localsize, int bits, int seed)
int compar_int(void *d1, void *d2)
static void check_sorted(void *data, int elsize, size_t localsize, int compar(void *d1, void *d2), MPI_Comm comm)
static void test_mpsort_bits(void **state)