75static const char filename[] =
"xt_idxlist_collection.c";
105 size_t num_stripes_alloc);
117 int * position,
int offset);
139 .get_indices_at_positions = NULL,
141 .get_positions_of_indices = NULL,
143 .get_positions_of_indices_off = NULL,
147 .get_bounding_box = NULL,
172 size_t num_non_empty_idxlists = 0, first_non_empty_idxlist = (size_t)-1;
173 for (
int i = 0; i < num_idxlists; ++i) {
175 if (first_non_empty_idxlist == (
size_t)-1 && num_indices_of_list > 0)
176 first_non_empty_idxlist = (size_t)i;
177 num_non_empty_idxlists +=
180 : (size_t)(num_indices_of_list > 0);
182 if (num_non_empty_idxlists > 1)
189 unsigned ntrans_dn = 0, ntrans_up = 0,
190 nsort_asc = 0, nsort_dsc = 0;
199 for (
int i = (
int)first_non_empty_idxlist+1; i < num_idxlists; ++i) {
201 if (num_indices_of_list > 0) {
207 ntrans_dn += (tmp_min < prev_max);
208 ntrans_up += (tmp_min > prev_max);
225 =
xmalloc(
sizeof (*collectionlist)
226 + num_non_empty_idxlists
227 *
sizeof (collectionlist->
idxlists[0]));
229 collectionlist->
num_idxlists = (int)num_non_empty_idxlists;
232 for (
size_t i = first_non_empty_idxlist, j = 0;
233 i < (size_t)num_idxlists; ++i) {
237 size_t num_comp_idxlists
240 for (
size_t k = 0; k < num_comp_idxlists; ++k)
242 j += num_comp_idxlists;
254 .start = min, .stride = 0, .nstrides = (int)
num_indices }, 1);
257 else if (num_non_empty_idxlists == 1)
270 for (
int i = 0; i < num_lists; ++i)
274 free(collectionlist);
282 int size_header, num_lists = collectionlist->
num_idxlists;
283 size_t size_idxlists = 0;
285 xt_mpi_call(MPI_Pack_size(2, MPI_INT, comm, &size_header), comm);
287 for (
int i = 0; i < num_lists; ++i)
291 return (
size_t)size_header + size_idxlists;
303 buffer_size, position, comm), comm);
305 for (
int i = 0; i < num_lists; ++i)
315 xt_mpi_call(MPI_Unpack(buffer, buffer_size, position,
316 &num_lists, 1, MPI_INT, comm), comm);
319 =
xmalloc(
sizeof (*collectionlist)
320 + (
size_t)num_lists *
sizeof (collectionlist->
idxlists[0]));
326 for (
int i = 0; i < num_lists; ++i) {
366 if (ra->
min != rb->min) {
367 ret = (ra->
min > rb->min) - (ra->
min < rb->min);
369 ret = (ra->
max > rb->max) - (ra->
max < rb->max);
386 size_t stripes_accum_array_size = 0;
387 size_t num_accum_stripes;
390 int num_accum_stripes_;
392 &num_accum_stripes_);
393 num_accum_stripes = (size_t)num_accum_stripes_;
395 size_t num_idxlists = (size_t)collectionlist->
num_idxlists;
396 struct Xt_stripe *stripe_buf = NULL;
size_t stripe_buf_size = 0;
398 for (
size_t i = 1; i < num_idxlists; ++i) {
400 = unsorted_idxlists[list_sorter[i].
pos];
401 Xt_int *sorted_indices = NULL;
406 Xt_abort(Xt_default_comm,
"internal error",
filename, __LINE__);
411 component_list = unsorted_list;
424 indices = sorted_indices
425 =
xmalloc(num_indices *
sizeof (*sorted_indices));
426 for (
size_t j = 0; j < num_indices; ++j)
427 sorted_indices[j] = vector[j];
440 if (num_stripes > stripe_buf_size) {
441 stripe_buf =
xrealloc(stripe_buf, num_stripes *
sizeof (stripe_buf[0]));
442 stripe_buf_size = num_stripes;
445 stripe_buf, stripe_buf_size);
446 if (component_list != unsorted_list) {
448 free(sorted_indices);
451 num_accum_stripes + (
size_t)stripe_buf_size);
455 stripes_accum + num_accum_stripes,
457 num_accum_stripes > 0);
473 size_t num_idxlists = (size_t)collectionlist->
num_idxlists;
478 =
xmalloc(
sizeof (*sorted_collection)
479 + num_idxlists *
sizeof(sorted_collection->
idxlists[0])
486 bool component_overlap =
false;
487 for (
size_t i = 0; i < num_idxlists; ++i) {
489 component_overlap |= (
min < prev_max);
491 list_sorter[i].
pos = (int)i;
493 if (component_overlap) {
496 qsort(list_sorter, num_idxlists,
sizeof (*list_sorter),
500 component_overlap =
false;
501 for (
size_t i = 0; i < num_idxlists; ++i) {
503 component_overlap |= (
min < prev_max);
504 prev_max = list_sorter[i].
max;
507 if (!component_overlap) {
512 for (
size_t i = 0; i < num_idxlists; ++i)
519 =
xrealloc(sorted_collection,
sizeof (*sorted_collection)
520 + num_idxlists *
sizeof(sorted_collection->
idxlists[0]));
528 free(sorted_collection);
538 int offlist = 0, num_lists = collectionlist->
num_idxlists;
540 for (
int i = 0; i < num_lists; ++i) {
571 size_t num_stripes = 0;
572 for (
int i = 0; i < num_lists; ++i)
575 assert(num_stripes <= INT_MAX);
576 return (
int)num_stripes;
582 size_t num_stripes_alloc) {
586 size_t num_stripes = 0;
588 size_t num_lists = (size_t)(collectionlist->
num_idxlists);
590 for (
size_t i = 0; i < num_lists; ++i) {
591 size_t num_stripes_of_list
593 assert(num_stripes_alloc - num_stripes >= num_stripes_of_list);
595 num_stripes_alloc - num_stripes);
596 num_stripes += num_stripes_of_list;
607 for (
int i = 0; i < num_lists; ++i) {
622 int * position,
int offset) {
626 int curr_num_indices = 0;
628 int idxlist_offsets = 0;
635 idxlist_offsets += curr_num_indices;
637 }
while (idxlist_offsets + curr_num_indices <= offset && ++i < num_lists);
639 offset -= idxlist_offsets;
641 for (;i < num_lists; ++i)
643 index, position, offset)) {
644 *position += idxlist_offsets;
668 size_t num_lists = (size_t)collectionlist->
num_idxlists;
673 for (
size_t i = 0; i < num_lists; ++i)
685 size_t num_lists = (size_t)collectionlist->
num_idxlists;
690 for (
size_t i = 0; i < num_lists; ++i)
701 return (
int)sort_flags-(sort_flags < 3);
#define ENSURE_ARRAY_SIZE(arrayp, curr_array_size, req_size)
add versions of standard API functions not returning on error
#define xrealloc(ptr, size)
const struct Xt_sort_algo_funcptr * sort_funcs
const struct xt_idxlist_vtable * vtable
Xt_int * index_array_cache
struct Xt_idxlist_ parent
void(* sort_xt_int)(Xt_int *a, size_t n)
struct Xt_stripe * stripes
void(* delete)(Xt_idxlist)
opaque configuration object for settings where the default needs to be overridden
implementation of configuration object
base definitions header file
struct Xt_idxlist_ * Xt_idxlist
static struct xt_gpu_vtable vtable
Xt_idxlist xt_idxempty_new(void)
void xt_idxlist_get_index_stripes_keep_buf(Xt_idxlist idxlist, struct Xt_stripe *stripes, size_t num_stripes_alloc)
Xt_idxlist xt_idxlist_unpack(void *buffer, int buffer_size, int *position, MPI_Comm comm)
Xt_int xt_idxlist_get_min_index(Xt_idxlist idxlist)
const Xt_int * xt_idxlist_get_indices_const(Xt_idxlist idxlist)
int xt_idxlist_get_index_at_position(Xt_idxlist idxlist, int position, Xt_int *index)
Xt_int xt_idxlist_get_max_index(Xt_idxlist idxlist)
void xt_idxlist_get_indices(Xt_idxlist idxlist, Xt_int *indices)
int xt_idxlist_get_num_index_stripes(Xt_idxlist idxlist)
int xt_idxlist_get_position_of_index_off(Xt_idxlist idxlist, Xt_int index, int *position, int offset)
Xt_idxlist xt_idxlist_sorted_copy_custom(Xt_idxlist idxlist, Xt_config config)
void xt_idxlist_pack(Xt_idxlist idxlist, void *buffer, int buffer_size, int *position, MPI_Comm comm)
size_t xt_idxlist_get_pack_size(Xt_idxlist idxlist, MPI_Comm comm)
void xt_idxlist_get_index_stripes(Xt_idxlist idxlist, struct Xt_stripe **stripes, int *num_stripes)
Xt_idxlist xt_idxlist_copy(Xt_idxlist idxlist)
int xt_idxlist_get_sorting(Xt_idxlist idxlist)
void xt_idxlist_delete(Xt_idxlist idxlist)
Xt_idxlist xt_idxlist_collection_unpack(void *buffer, int buffer_size, int *position, MPI_Comm comm)
static void idxlist_collection_get_indices(Xt_idxlist idxlist, Xt_int *indices)
static const char filename[]
static int idxlist_collection_get_position_of_index_off(Xt_idxlist idxlist, Xt_int index, int *position, int offset)
static int idxlist_collection_get_position_of_index(Xt_idxlist idxlist, Xt_int index, int *position)
static void idxlist_collection_delete(Xt_idxlist data)
static Xt_idxlist idxlist_collection_sorted_copy(Xt_idxlist idxlist, Xt_config config)
struct Xt_idxlist_collection_ * Xt_idxlist_collection
static Xt_idxlist idxlist_collection_copy(Xt_idxlist idxlist)
static int idxlist_collection_get_num_index_stripes(Xt_idxlist idxlist)
static int idxlist_collection_get_sorting(Xt_idxlist idxlist)
static Xt_int idxlist_collection_get_max_index(Xt_idxlist idxlist)
static int range_list_cmp(const void *a, const void *b)
static size_t idxlist_collection_get_pack_size(Xt_idxlist data, MPI_Comm comm)
static Xt_int idxlist_collection_get_min_index(Xt_idxlist idxlist)
static const struct xt_idxlist_vtable idxlist_collection_vtable
static Xt_idxlist coll_get_sorted_stripes(Xt_idxlist_collection collectionlist, struct range_list_sort *list_sorter, Xt_config config)
static int idxlist_collection_get_index_at_position(Xt_idxlist idxlist, int position, Xt_int *index)
static void idxlist_collection_pack(Xt_idxlist data, void *buffer, int buffer_size, int *position, MPI_Comm comm)
Xt_idxlist xt_idxlist_collection_get_intersection(Xt_idxlist XT_UNUSED(idxlist_src), Xt_idxlist XT_UNUSED(idxlist_dst), Xt_config XT_UNUSED(config))
static void idxlist_collection_get_index_stripes(Xt_idxlist idxlist, struct Xt_stripe *restrict stripes, size_t num_stripes_alloc)
static const Xt_int * idxlist_collection_get_indices_const(Xt_idxlist idxlist)
Xt_idxlist xt_idxlist_collection_new(Xt_idxlist *idxlists, int num_idxlists)
Provide non-public declarations common to all index lists.
#define xt_idxlist_get_num_indices(idxlist)
static void Xt_idxlist_init(Xt_idxlist idxlist, const struct xt_idxlist_vtable *vtable, int num_indices)
Xt_idxlist xt_idxstripes_sort_new(size_t num_src_stripes, const struct Xt_stripe src_stripes[], Xt_config config)
Xt_idxlist xt_idxstripes_new(struct Xt_stripe const *stripes, int num_stripes)
Xt_idxlist xt_idxvec_prealloc_new(const Xt_int *idxvec, int num_indices)
PPM_DSO_INTERNAL const Xt_int * xt_idxvec_get_sorted_vector(Xt_idxlist idxvec, Xt_config config)
#define xt_mpi_call(call, comm)
size_t xt_stripes_merge_copy(size_t num_stripes, struct Xt_stripe *stripes_dst, const struct Xt_stripe *stripes_src, bool lookback)
#define XT_SORT_FLAGS(ntrans_up, ntrans_dn)