51#define XT_TOKEN_PASTE2_(a,b) a##b
52#define XT_TOKEN_PASTE2(a,b) XT_TOKEN_PASTE2_(a,b)
53#define XT_TOKEN_PASTE3_(a,b,c) a##b##c
54#define XT_TOKEN_PASTE3(a,b,c) XT_TOKEN_PASTE3_(a,b,c)
56#define XT_MPI_OFFSET_EXT \
57 struct XT_TOKEN_PASTE3(Xt_,XT_MPI_STRP_PRS_PREFIX,offset_ext)
58#define XT_MPI_STRP_PRS_MATCH_BLOCK_VEC \
59 XT_TOKEN_PASTE2(XT_MPI_STRP_PRS_PREFIX,match_block_vec)
60#define XT_MPI_STRP_PRS_MATCH_INDEXED \
61 XT_TOKEN_PASTE2(XT_MPI_STRP_PRS_PREFIX,match_indexed)
62#define XT_MPI_STRP_PRS_MATCH_SIMPLE_VEC \
63 XT_TOKEN_PASTE2(XT_MPI_STRP_PRS_PREFIX,match_simple_vec)
64#define XT_MPI_STRP_PRS_MATCH_CONTIGUOUS \
65 XT_TOKEN_PASTE2(XT_MPI_STRP_PRS_PREFIX,match_contiguous)
66#define XT_MPI_STRP_PRS_GEN_FALLBACK_TYPE \
67 XT_TOKEN_PASTE2(XT_MPI_STRP_PRS_PREFIX,gen_fallback_type)
68#define XT_MPI_STRP_PRS_ENTRY \
69 XT_TOKEN_PASTE3(parse_,XT_MPI_STRP_PRS_PREFIX,stripe)
70#define XT_MPI_STRP_PRS_ENTRY_LIBINTERNAL \
71 XT_TOKEN_PASTE3(xt_mpi_parse_,XT_MPI_STRP_PRS_PREFIX,stripe)
72#define XT_MPI_STRP_PRS_DRIVER \
73 XT_TOKEN_PASTE3(xt_mpi_generate_datatype_,XT_MPI_STRP_PRS_PREFIX,stripe)
83 MPI_Aint *disp, MPI_Datatype *dt,
86 size_t p = *pstart_, pstart = p;
91 if (v[p+1].size != bl)
return false;
97 && v[p].size == bl && v[p].start - v[p-1].start == vstride ) {
100 size_t n = p - pstart;
101 if (n<3)
return false;
113 MPI_Datatype dt1 = *dt;
129 MPI_Aint *disp, MPI_Datatype *dt,
132 size_t p = *pstart_, pstart = p;
140 size_t n = p - pstart;
142 if (n < 2)
return false;
148 =
xmalloc(n *
sizeof (
int) + n *
sizeof (*d));
149 int *restrict bl = (
int * restrict)(d + n);
151 d[0] = v[pstart].start - start;
152 int bl0 = bl[0] = v[pstart].size;
153 for (
size_t i = 1; i < n; i++) {
154 size_t iv = pstart + i;
155 d[i] = v[iv].start - start;
157 hom_bl &= (bl[i] == bl0);
177 MPI_Aint *disp, MPI_Datatype *dt,
182 if (p >= vlen)
return false;
183 int nstrides = v[p].size;
197 MPI_Datatype dt1 = *dt;
206 return nstrides != 0;
214 MPI_Aint *restrict disp, MPI_Datatype *dt,
237 size_t set_start,
size_t set_end,
242 size_t ia = set_start;
244 if (ib <= ia || ib > vlen)
return;
247 for (
size_t i=ia; i < ib; i++)
264 bool found_np =
false;
267 for (
size_t i=ia; i < ib; i++) {
269 found_np |= v[i].size <= 0;
271 size_t v_i_size = (size_t)(v[i].size > 0 ? v[i].size : 0);
272 for (
size_t k=0; k < v_i_size; k++) {
279 if (n==1 && d[0] == 0) {
311 size_t set_start = 0, set_end = 0;
312 MPI_Aint *restrict wdisp
313 =
xmalloc(
sizeof(MPI_Datatype) * vlen +
sizeof (MPI_Aint) * vlen);
314 MPI_Datatype *restrict wdt = (MPI_Datatype *)(wdisp + vlen);
323 size_t mm = m + (set_start < set_end);
326 wdisp+mm, wdt+mm, params))
329 wdisp+mm, wdt+mm, params))
332 wdisp+mm, wdt+mm, params))
335 wdisp+mm, wdt+mm, params)) ) {
338 if (set_start < set_end) {
340 set_start, set_end, v, vlen,
341 wdisp+m, wdt+m, params);
351 if (set_start < set_end) {
353 set_start, set_end, v, vlen,
354 wdisp+m, wdt+m, params);
358 MPI_Datatype result_dt, old_type = params->
old_type;
360 assert(wdisp[0] == 0);
361 if (wdt[0] == old_type)
365 int *restrict wblocklength
366 = wlen *
sizeof (int) <= (vlen - wlen) *
sizeof (*wdt)
367 ? (
void *)(wdt + wlen) :
xmalloc(wlen *
sizeof (*wblocklength));
368 for(
size_t i=0; i<wlen; i++)
371 ¶ms->
ddt_list, (
int)wlen, wblocklength, wdisp, wdt, params->
comm);
372 if (wlen *
sizeof (
int) > (vlen - wlen) *
sizeof (*wdt))
374 for (
size_t i = 0; i < wlen; i++)
375 if (wdt[i] != old_type)
385 int count, MPI_Datatype old_type,
388 size_t count_ = (size_t)0;
389 for (
int i=0; i<count; ++i)
390 count_ += (
size_t)(v[i].size > 0);
391 if (count_ < 1)
return MPI_DATATYPE_NULL;
394 if ((
size_t)count != count_) {
395 v_comp = v_comp_ =
xmalloc(count_ *
sizeof (*v_comp));
396 for (
size_t i=0, j=0; i<(size_t)count; ++i) {
407 if ((
size_t)count != count_)
413#undef XT_MPI_STRP_PRS_ENTRY
414#undef XT_MPI_STRP_PRS_GEN_FALLBACK_TYPE
415#undef XT_MPI_STRP_PRS_MATCH_CONTIGUOUS
416#undef XT_MPI_STRP_PRS_MATCH_SIMPLE_VEC
417#undef XT_MPI_STRP_PRS_MATCH_INDEXED
418#undef XT_MPI_STRP_PRS_MATCH_BLOCK_VEC
419#undef XT_MPI_OFFSET_EXT
421#undef XT_TOKEN_PASTE2
422#undef XT_TOKEN_PASTE2_
423#undef XT_TOKEN_PASTE3
424#undef XT_TOKEN_PASTE3_
struct Xt_mpiddt_list ddt_list
int MPI_Type_create_hindexed(int count, XT_MPI2_CONST int array_of_blocklengths[], XT_MPI2_CONST MPI_Aint array_of_displacements[], MPI_Datatype oldtype, MPI_Datatype *newtype)
int MPI_Type_dup(MPI_Datatype oldtype, MPI_Datatype *newtype)
int MPI_Type_commit(MPI_Datatype *datatype)
#define xt_mpi_call(call, comm)
MPI_Datatype Xt_mpi_ddt_cache_acquire_contiguous(struct Xt_mpiddt_list *ddt_list, int count, MPI_Datatype oldtype, MPI_Comm comm)
MPI_Datatype Xt_mpi_ddt_cache_acquire_struct(struct Xt_mpiddt_list *ddt_list, int count, const int blocklength[count], const MPI_Aint disp[count], const MPI_Datatype oldtype[count], MPI_Comm comm)
void Xt_mpi_ddt_cache_entry_release(struct Xt_mpiddt_list *ddt_list, MPI_Datatype *dt, MPI_Comm comm)
#define XT_MPI_STRP_PRS_UNITSTRIDE
#define XT_MPI_STRP_PRS_BLOCK_VEC_CREATE
#define XT_MPI_STRP_PRS_DISP_ADJUST(val)
#define XT_MPI_STRP_PRS_INDEXED_BLOCK_CREATE
#define XT_MPI_STRP_PRS_AOFS_TYPE
#define XT_MPI_STRP_PRS_INDEXED_CREATE
static void xt_init_mpi_strp_prs_params(struct Xt_mpi_strp_prs_params *params, MPI_Datatype old_type, MPI_Comm comm)
#define XT_MPI_OFFSET_EXT
#define XT_MPI_STRP_PRS_DRIVER
#define XT_MPI_STRP_PRS_ENTRY
#define XT_MPI_STRP_PRS_GEN_FALLBACK_TYPE
#define XT_MPI_STRP_PRS_ENTRY_LIBINTERNAL
#define XT_MPI_STRP_PRS_MATCH_CONTIGUOUS
#define XT_MPI_STRP_PRS_MATCH_INDEXED
#define XT_MPI_STRP_PRS_MATCH_SIMPLE_VEC
#define XT_MPI_STRP_PRS_MATCH_BLOCK_VEC