|
Packit Service |
c5cf8c |
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
|
|
Packit Service |
c5cf8c |
/*
|
|
Packit Service |
c5cf8c |
*
|
|
Packit Service |
c5cf8c |
* (C) 2018 by Argonne National Laboratory.
|
|
Packit Service |
c5cf8c |
* See COPYRIGHT in top-level directory.
|
|
Packit Service |
c5cf8c |
*/
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#include <sys/types.h>
|
|
Packit Service |
c5cf8c |
#include <stdint.h>
|
|
Packit Service |
c5cf8c |
#include "dtpools_internal.h"
|
|
Packit Service |
c5cf8c |
#include "dtpoolsconf.h"
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#define TYPE_NAME_MAXLEN (256)
|
|
Packit Service |
c5cf8c |
#define BASIC_TYPE_NAME_MAXLEN (64)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#define DTPI_OBJ_INIT_BUF(c_type, type_ptr) \
|
|
Packit Service |
c5cf8c |
do { \
|
|
Packit Service |
c5cf8c |
type_ptr = (c_type *) buf_ptr; \
|
|
Packit Service |
c5cf8c |
k = par->user.val_start; \
|
|
Packit Service |
c5cf8c |
for (i = 0; i < par->core.type_totlen; i += par->core.type_stride) { \
|
|
Packit Service |
c5cf8c |
for (j = 0; j < par->core.type_blklen; j++) { \
|
|
Packit Service |
c5cf8c |
type_ptr[i+j] = (c_type) k; \
|
|
Packit Service |
c5cf8c |
k += par->user.val_stride; \
|
|
Packit Service |
c5cf8c |
if (--count == 0) { \
|
|
Packit Service |
c5cf8c |
return; \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
} while (0)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#define DTPI_OBJ_INIT_COMP_BUF(c_type, a_type, b_type, type_ptr) \
|
|
Packit Service |
c5cf8c |
do { \
|
|
Packit Service |
c5cf8c |
type_ptr = (c_type *) buf_ptr; \
|
|
Packit Service |
c5cf8c |
k = par->user.val_start; \
|
|
Packit Service |
c5cf8c |
for (i = 0; i < par->core.type_totlen; i += par->core.type_stride) { \
|
|
Packit Service |
c5cf8c |
for (j = 0; j < par->core.type_blklen; j++) { \
|
|
Packit Service |
c5cf8c |
type_ptr[i+j].a = (a_type) k; \
|
|
Packit Service |
c5cf8c |
type_ptr[i+j].b = (b_type) k; \
|
|
Packit Service |
c5cf8c |
k += par->user.val_stride; \
|
|
Packit Service |
c5cf8c |
if (--count == 0) { \
|
|
Packit Service |
c5cf8c |
return; \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
} while (0)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#define DTPI_OBJ_CHECK_BUF_AND_JUMP(c_type, type_ptr) \
|
|
Packit Service |
c5cf8c |
do { \
|
|
Packit Service |
c5cf8c |
type_ptr = (c_type *) buf_ptr; \
|
|
Packit Service |
c5cf8c |
k = par->user.val_start; \
|
|
Packit Service |
c5cf8c |
for (i = 0; i < par->core.type_totlen; i += par->core.type_stride) { \
|
|
Packit Service |
c5cf8c |
for (j = 0; j < par->core.type_blklen; j++) { \
|
|
Packit Service |
c5cf8c |
if (type_ptr[i+j] != (c_type) k) { \
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "recv buf[%d]=%d != %d\n", \
|
|
Packit Service |
c5cf8c |
i+j, (int) type_ptr[i+j], k); \
|
|
Packit Service |
c5cf8c |
goto fn_fail; \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
k += par->user.val_stride; \
|
|
Packit Service |
c5cf8c |
if (--count == 0) { \
|
|
Packit Service |
c5cf8c |
goto fn_exit; \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
} while (0)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#define DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(c_type, a_type, b_type, type_ptr) \
|
|
Packit Service |
c5cf8c |
do { \
|
|
Packit Service |
c5cf8c |
type_ptr = (c_type *) buf_ptr; \
|
|
Packit Service |
c5cf8c |
k = par->user.val_start; \
|
|
Packit Service |
c5cf8c |
for (i = 0; i < par->core.type_totlen; i += par->core.type_stride) { \
|
|
Packit Service |
c5cf8c |
for (j = 0; j < par->core.type_blklen; j++) { \
|
|
Packit Service |
c5cf8c |
if (type_ptr[i+j].a != (a_type) k || \
|
|
Packit Service |
c5cf8c |
type_ptr[i+j].b != (b_type) k) { \
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "recv buf[%d].{a=%d,b=%d} != %d\n", i+j, \
|
|
Packit Service |
c5cf8c |
(int) type_ptr[i+j].a, (int) type_ptr[i+j].b, k);\
|
|
Packit Service |
c5cf8c |
goto fn_fail; \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
k += par->user.val_stride; \
|
|
Packit Service |
c5cf8c |
if (--count == 0) { \
|
|
Packit Service |
c5cf8c |
goto fn_exit; \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
} \
|
|
Packit Service |
c5cf8c |
} while (0)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/*
|
|
Packit Service |
c5cf8c |
* Composite types
|
|
Packit Service |
c5cf8c |
*/
|
|
Packit Service |
c5cf8c |
typedef struct {
|
|
Packit Service |
c5cf8c |
float a;
|
|
Packit Service |
c5cf8c |
float b;
|
|
Packit Service |
c5cf8c |
} dtp_c_complex;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
typedef dtp_c_complex dtp_c_float_complex;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
typedef struct {
|
|
Packit Service |
c5cf8c |
double a;
|
|
Packit Service |
c5cf8c |
double b;
|
|
Packit Service |
c5cf8c |
} dtp_c_double_complex;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
typedef struct {
|
|
Packit Service |
c5cf8c |
long double a;
|
|
Packit Service |
c5cf8c |
long double b;
|
|
Packit Service |
c5cf8c |
} dtp_c_long_double_complex;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
typedef struct {
|
|
Packit Service |
c5cf8c |
float a;
|
|
Packit Service |
c5cf8c |
int b;
|
|
Packit Service |
c5cf8c |
} dtp_float_int;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
typedef struct {
|
|
Packit Service |
c5cf8c |
double a;
|
|
Packit Service |
c5cf8c |
int b;
|
|
Packit Service |
c5cf8c |
} dtp_double_int;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
typedef struct {
|
|
Packit Service |
c5cf8c |
long a;
|
|
Packit Service |
c5cf8c |
int b;
|
|
Packit Service |
c5cf8c |
} dtp_long_int;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
typedef struct {
|
|
Packit Service |
c5cf8c |
int a;
|
|
Packit Service |
c5cf8c |
int b;
|
|
Packit Service |
c5cf8c |
} dtp_2int;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
typedef struct {
|
|
Packit Service |
c5cf8c |
short a;
|
|
Packit Service |
c5cf8c |
int b;
|
|
Packit Service |
c5cf8c |
} dtp_short_int;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
typedef struct {
|
|
Packit Service |
c5cf8c |
long double a;
|
|
Packit Service |
c5cf8c |
int b;
|
|
Packit Service |
c5cf8c |
} dtp_long_double_int;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/*
|
|
Packit Service |
c5cf8c |
* Casting pointers
|
|
Packit Service |
c5cf8c |
*/
|
|
Packit Service |
c5cf8c |
union DTPI_Cast_ptr {
|
|
Packit Service |
c5cf8c |
char *char_ptr;
|
|
Packit Service |
c5cf8c |
wchar_t *wchar_ptr;
|
|
Packit Service |
c5cf8c |
short int *short_ptr;
|
|
Packit Service |
c5cf8c |
int *int_ptr;
|
|
Packit Service |
c5cf8c |
long int *long_ptr;
|
|
Packit Service |
c5cf8c |
long long int *long_long_ptr;
|
|
Packit Service |
c5cf8c |
unsigned char *uchar_ptr;
|
|
Packit Service |
c5cf8c |
unsigned short int *ushort_ptr;
|
|
Packit Service |
c5cf8c |
unsigned int *uint_ptr;
|
|
Packit Service |
c5cf8c |
unsigned long int *ulong_ptr;
|
|
Packit Service |
c5cf8c |
unsigned long long int *ulong_long_ptr;
|
|
Packit Service |
c5cf8c |
float *float_ptr;
|
|
Packit Service |
c5cf8c |
double *double_ptr;
|
|
Packit Service |
c5cf8c |
long double *long_double_ptr;
|
|
Packit Service |
c5cf8c |
int8_t *int8_ptr;
|
|
Packit Service |
c5cf8c |
int16_t *int16_ptr;
|
|
Packit Service |
c5cf8c |
int32_t *int32_ptr;
|
|
Packit Service |
c5cf8c |
int64_t *int64_ptr;
|
|
Packit Service |
c5cf8c |
uint8_t *uint8_ptr;
|
|
Packit Service |
c5cf8c |
uint16_t *uint16_ptr;
|
|
Packit Service |
c5cf8c |
uint32_t *uint32_ptr;
|
|
Packit Service |
c5cf8c |
uint64_t *uint64_ptr;
|
|
Packit Service |
c5cf8c |
/* composite types */
|
|
Packit Service |
c5cf8c |
dtp_c_complex *c_complex_ptr;
|
|
Packit Service |
c5cf8c |
dtp_c_float_complex *c_float_complex_ptr;
|
|
Packit Service |
c5cf8c |
dtp_c_double_complex *c_double_complex_ptr;
|
|
Packit Service |
c5cf8c |
dtp_c_long_double_complex *c_long_double_complex_ptr;
|
|
Packit Service |
c5cf8c |
dtp_float_int *float_int_ptr;
|
|
Packit Service |
c5cf8c |
dtp_double_int *double_int_ptr;
|
|
Packit Service |
c5cf8c |
dtp_long_int *long_int_ptr;
|
|
Packit Service |
c5cf8c |
dtp_2int *int_int_ptr;
|
|
Packit Service |
c5cf8c |
dtp_short_int *short_int_ptr;
|
|
Packit Service |
c5cf8c |
dtp_long_double_int *long_double_int_ptr;
|
|
Packit Service |
c5cf8c |
/* TODO: add remaining types */
|
|
Packit Service |
c5cf8c |
};
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* --------------------------------------------------------- */
|
|
Packit Service |
c5cf8c |
/* Utility Functions */
|
|
Packit Service |
c5cf8c |
/* --------------------------------------------------------- */
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
void DTPI_Print_error(int errcode)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int errclass, slen;
|
|
Packit Service |
c5cf8c |
char string[ERR_STRING_MAX_LEN];
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPI_Error_class(errcode, &errclass);
|
|
Packit Service |
c5cf8c |
MPI_Error_string(errcode, string, &slen);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fprintf(stdout, "Error class %d (%s)\n", errclass, string);
|
|
Packit Service |
c5cf8c |
fflush(stdout);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
void DTPI_Init_creators(DTPI_Creator * creators)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
memset(creators, 0, sizeof(*creators));
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_SIMPLE__BASIC] = DTPI_Basic_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_SIMPLE__CONTIG] = DTPI_Contig_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_SIMPLE__VECTOR] = DTPI_Vector_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_SIMPLE__HVECTOR] = DTPI_Hvector_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_SIMPLE__INDEXED] = DTPI_Indexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_SIMPLE__HINDEXED] = DTPI_Hindexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_SIMPLE__BLOCK_INDEXED] = DTPI_Block_indexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_SIMPLE__BLOCK_HINDEXED] = DTPI_Block_hindexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK__VECTOR] = DTPI_Vector_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK__HVECTOR] = DTPI_Hvector_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK__INDEXED] = DTPI_Indexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK__HINDEXED] = DTPI_Hindexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK__BLOCK_INDEXED] = DTPI_Block_indexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK__BLOCK_HINDEXED] = DTPI_Block_hindexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK__SUBARRAY_C] = DTPI_Subarray_c_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK__SUBARRAY_F] = DTPI_Subarray_f_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT__VECTOR] = DTPI_Vector_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT__HVECTOR] = DTPI_Hvector_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT__INDEXED] = DTPI_Indexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT__HINDEXED] = DTPI_Hindexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT__BLOCK_INDEXED] = DTPI_Block_indexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT__BLOCK_HINDEXED] = DTPI_Block_hindexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT__SUBARRAY_C] = DTPI_Subarray_c_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT__SUBARRAY_F] = DTPI_Subarray_f_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__VECTOR] = DTPI_Vector_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__HVECTOR] = DTPI_Hvector_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__INDEXED] = DTPI_Indexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__HINDEXED] = DTPI_Hindexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__BLOCK_INDEXED] = DTPI_Block_indexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__BLOCK_HINDEXED] = DTPI_Block_hindexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__SUBARRAY_C] = DTPI_Subarray_c_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_BLK_STRD__SUBARRAY_F] = DTPI_Subarray_f_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__VECTOR] = DTPI_Vector_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__HVECTOR] = DTPI_Hvector_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__INDEXED] = DTPI_Indexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__HINDEXED] = DTPI_Hindexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__BLOCK_INDEXED] = DTPI_Block_indexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__BLOCK_HINDEXED] = DTPI_Block_hindexed_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__SUBARRAY_C] = DTPI_Subarray_c_create;
|
|
Packit Service |
c5cf8c |
creators[DTPI_OBJ_LAYOUT_LARGE_CNT_STRD__SUBARRAY_F] = DTPI_Subarray_f_create;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
static void DTPI_Type_init_buf(struct DTPI_Par *par, MPI_Datatype basic_type, void *buf)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int i, j, k;
|
|
Packit Service |
c5cf8c |
int count;
|
|
Packit Service |
c5cf8c |
char *buf_ptr;
|
|
Packit Service |
c5cf8c |
union DTPI_Cast_ptr ptrs;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "init type_displ=%li\n", par->core.type_displ);
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "init type_totlen=%li\n", par->core.type_totlen);
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "init type_stride=%li\n", par->core.type_stride);
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "init type_blklen=%li\n", par->core.type_blklen);
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "init user count=%d\n", par->user.val_count);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (par->user.val_count <= 0) {
|
|
Packit Service |
c5cf8c |
return;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
count = par->user.val_count;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
buf_ptr = (char *) buf + par->core.type_displ;
|
|
Packit Service |
c5cf8c |
if (basic_type == MPI_CHAR || basic_type == MPI_BYTE) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(char, ptrs.char_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_WCHAR) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(wchar_t, ptrs.wchar_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_SHORT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(short int, ptrs.short_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(int, ptrs.int_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_LONG) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(long int, ptrs.long_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_LONG_LONG_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(long long int, ptrs.long_long_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UNSIGNED_CHAR) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(unsigned char, ptrs.uchar_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UNSIGNED_SHORT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(unsigned short int, ptrs.ushort_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UNSIGNED) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(unsigned int, ptrs.uint_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UNSIGNED_LONG) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(unsigned long int, ptrs.ulong_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UNSIGNED_LONG_LONG) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(unsigned long long int, ptrs.ulong_long_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_FLOAT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(float, ptrs.float_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_DOUBLE) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(double, ptrs.double_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_LONG_DOUBLE) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(long double, ptrs.long_double_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_INT8_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(int8_t, ptrs.int8_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_INT16_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(int16_t, ptrs.int16_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_INT32_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(int32_t, ptrs.int32_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_INT64_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(int64_t, ptrs.int64_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UINT8_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(uint8_t, ptrs.uint8_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UINT16_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(uint16_t, ptrs.uint16_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UINT32_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(uint32_t, ptrs.uint32_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UINT64_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_BUF(uint64_t, ptrs.uint64_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_C_COMPLEX) { /* composite types */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_COMP_BUF(dtp_c_complex, float, float, ptrs.c_complex_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_C_FLOAT_COMPLEX) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_COMP_BUF(dtp_c_float_complex, float, float, ptrs.c_float_complex_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_C_DOUBLE_COMPLEX) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_COMP_BUF(dtp_c_double_complex, double, double, ptrs.c_double_complex_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_C_LONG_DOUBLE_COMPLEX) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_COMP_BUF(dtp_c_long_double_complex, long double, long double,
|
|
Packit Service |
c5cf8c |
ptrs.c_long_double_complex_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_FLOAT_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_COMP_BUF(dtp_float_int, float, int, ptrs.float_int_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_DOUBLE_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_COMP_BUF(dtp_double_int, double, int, ptrs.double_int_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_LONG_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_COMP_BUF(dtp_long_int, long, int, ptrs.long_int_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_2INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_COMP_BUF(dtp_2int, int, int, ptrs.int_int_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_SHORT_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_COMP_BUF(dtp_short_int, short, int, ptrs.short_int_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_LONG_DOUBLE_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_INIT_COMP_BUF(dtp_long_double_int, long double, int, ptrs.long_double_int_ptr);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
static int DTPI_Type_check_buf(struct DTPI_Par *par, MPI_Datatype basic_type, void *buf)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int i, j, k, err = DTP_SUCCESS;
|
|
Packit Service |
c5cf8c |
int count;
|
|
Packit Service |
c5cf8c |
char *buf_ptr;
|
|
Packit Service |
c5cf8c |
union DTPI_Cast_ptr ptrs;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "check type_displ=%li\n", par->core.type_displ);
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "check type_totlen=%li\n", par->core.type_totlen);
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "check type_stride=%li\n", par->core.type_stride);
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "check type_blklen=%li\n", par->core.type_blklen);
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "check user count=%d\n", par->user.val_count);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
count = par->user.val_count;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
buf_ptr = (char *) buf + par->core.type_displ;
|
|
Packit Service |
c5cf8c |
if (basic_type == MPI_CHAR || basic_type == MPI_BYTE) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(char, ptrs.char_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_WCHAR) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(wchar_t, ptrs.wchar_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_SHORT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(short int, ptrs.short_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(int, ptrs.int_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_LONG) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(long int, ptrs.long_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_LONG_LONG_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(long long int, ptrs.long_long_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UNSIGNED_CHAR) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(unsigned char, ptrs.uchar_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UNSIGNED_SHORT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(unsigned short int, ptrs.ushort_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UNSIGNED) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(unsigned int, ptrs.uint_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UNSIGNED_LONG) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(unsigned long int, ptrs.ulong_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UNSIGNED_LONG_LONG) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(unsigned long long int, ptrs.ulong_long_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_FLOAT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(float, ptrs.float_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_DOUBLE) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(double, ptrs.double_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_LONG_DOUBLE) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(long double, ptrs.long_double_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_INT8_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(int8_t, ptrs.int8_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_INT16_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(int16_t, ptrs.int16_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_INT32_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(int32_t, ptrs.int32_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_INT64_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(int64_t, ptrs.int64_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UINT8_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(uint8_t, ptrs.uint8_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UINT16_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(uint16_t, ptrs.uint16_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UINT32_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(uint32_t, ptrs.uint32_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_UINT64_T) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_BUF_AND_JUMP(uint64_t, ptrs.uint64_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_C_COMPLEX) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_c_complex, float, float, ptrs.c_complex_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_C_FLOAT_COMPLEX) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_c_float_complex, float, float,
|
|
Packit Service |
c5cf8c |
ptrs.c_float_complex_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_C_DOUBLE_COMPLEX) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_c_double_complex, double, double,
|
|
Packit Service |
c5cf8c |
ptrs.c_double_complex_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_C_LONG_DOUBLE_COMPLEX) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_c_long_double_complex, long double, long double,
|
|
Packit Service |
c5cf8c |
ptrs.c_long_double_complex_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_FLOAT_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_float_int, float, int, ptrs.float_int_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_DOUBLE_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_double_int, double, int, ptrs.double_int_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_LONG_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_long_int, long, int, ptrs.long_int_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_2INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_2int, int, int, ptrs.int_int_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_SHORT_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_short_int, short, int, ptrs.short_int_ptr);
|
|
Packit Service |
c5cf8c |
} else if (basic_type == MPI_LONG_DOUBLE_INT) {
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_CHECK_COMP_BUF_AND_JUMP(dtp_long_double_int, long double, int,
|
|
Packit Service |
c5cf8c |
ptrs.long_double_int_ptr);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
return err;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
err = DTP_ERR_OTHER;
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* --------------------------------------------------------- */
|
|
Packit Service |
c5cf8c |
/* Datatype Pool Object Create Functions */
|
|
Packit Service |
c5cf8c |
/* --------------------------------------------------------- */
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Struct_create(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int i;
|
|
Packit Service |
c5cf8c |
int err = DTP_SUCCESS;
|
|
Packit Service |
c5cf8c |
int num_types = 0;
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
int *basic_type_counts;
|
|
Packit Service |
c5cf8c |
MPI_Aint *basic_type_sizes = NULL;
|
|
Packit Service |
c5cf8c |
MPI_Aint lb, extent;
|
|
Packit Service |
c5cf8c |
MPI_Aint displs = 0;
|
|
Packit Service |
c5cf8c |
MPI_Aint *basic_type_displs = NULL;
|
|
Packit Service |
c5cf8c |
MPI_Datatype *basic_types;
|
|
Packit Service |
c5cf8c |
void *buf = NULL;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi = NULL;
|
|
Packit Service |
c5cf8c |
char type_name[TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get object index */
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
num_types = dtp->DTP_type_signature.DTP_pool_struct.DTP_num_types;
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(basic_type_sizes, sizeof(*basic_type_sizes) * num_types);
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(basic_type_displs, sizeof(*basic_type_displs) * num_types);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* compute struct size */
|
|
Packit Service |
c5cf8c |
basic_types = dtp->DTP_type_signature.DTP_pool_struct.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
basic_type_counts = dtp->DTP_type_signature.DTP_pool_struct.DTP_basic_type_count;
|
|
Packit Service |
c5cf8c |
for (i = 0; i < num_types; i++) {
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(basic_types[i], &lb, &basic_type_sizes[i]);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
basic_type_displs[i] = displs;
|
|
Packit Service |
c5cf8c |
displs += (basic_type_sizes[i] * basic_type_counts[i]);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* create struct datatype */
|
|
Packit Service |
c5cf8c |
err =
|
|
Packit Service |
c5cf8c |
MPI_Type_create_struct(num_types, basic_type_counts, basic_type_displs, basic_types,
|
|
Packit Service |
c5cf8c |
&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get type extent */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate buffer */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize every elem in struct separately */
|
|
Packit Service |
c5cf8c |
for (i = 0; i < num_types; i++) {
|
|
Packit Service |
c5cf8c |
/* user count is ignored */
|
|
Packit Service |
c5cf8c |
par->user.val_count = basic_type_counts[i];
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* contiguous arrays */
|
|
Packit Service |
c5cf8c |
par->core.type_stride = 1;
|
|
Packit Service |
c5cf8c |
par->core.type_blklen = 1;
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = (MPI_Aint) basic_type_counts[i];
|
|
Packit Service |
c5cf8c |
par->core.type_displ = basic_type_displs[i];
|
|
Packit Service |
c5cf8c |
DTPI_Type_init_buf(par, basic_types[i], buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate space for private datatype info */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize private datatype info data */
|
|
Packit Service |
c5cf8c |
dtpi->obj_type = DTPI_OBJ_TYPE__STRUCT;
|
|
Packit Service |
c5cf8c |
dtpi->type_extent = extent;
|
|
Packit Service |
c5cf8c |
dtpi->type_lb = lb;
|
|
Packit Service |
c5cf8c |
dtpi->type_ub = lb + extent;
|
|
Packit Service |
c5cf8c |
dtpi->u.structure.displs = basic_type_displs; /* freed in DTP_obj_free() */
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].private_info = dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* set type name for debug information */
|
|
Packit Service |
c5cf8c |
memset(type_name, 0, sizeof(type_name));
|
|
Packit Service |
c5cf8c |
sprintf(type_name, "%s (%d elements)", "struct", num_types);
|
|
Packit Service |
c5cf8c |
err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
if (basic_type_sizes) {
|
|
Packit Service |
c5cf8c |
free(basic_type_sizes);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return err;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
/* cleanup datatype */
|
|
Packit Service |
c5cf8c |
if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
|
|
Packit Service |
c5cf8c |
MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* cleanup buffers */
|
|
Packit Service |
c5cf8c |
if (basic_type_displs) {
|
|
Packit Service |
c5cf8c |
free(basic_type_displs);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (dtpi) {
|
|
Packit Service |
c5cf8c |
free(dtpi);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (buf) {
|
|
Packit Service |
c5cf8c |
free(buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Basic_create(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int err = DTP_SUCCESS;
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
int len;
|
|
Packit Service |
c5cf8c |
MPI_Aint lb, basic_type_size, basic_type_count;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf = NULL;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi = NULL;
|
|
Packit Service |
c5cf8c |
char type_name[TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get type signature for pool */
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
basic_type_count = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type_count;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get object index in the pool */
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* make a copy of the basic datatype passed by the user */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_dup(basic_type, &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_count = basic_type_count;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate buffer */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(buf, basic_type_size * basic_type_count);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize totlen and displ for buf init */
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = basic_type_count;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize buffer with requested DTPI_Par */
|
|
Packit Service |
c5cf8c |
DTPI_Type_init_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate space for private datatype info */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize private datatype info data */
|
|
Packit Service |
c5cf8c |
dtpi->obj_type = DTPI_OBJ_TYPE__BASIC;
|
|
Packit Service |
c5cf8c |
dtpi->type_basic_size = basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->type_extent = basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->type_lb = 0;
|
|
Packit Service |
c5cf8c |
dtpi->type_ub = basic_type_size;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].private_info = dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* set type name for debug information */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
sprintf(type_name, "%s (%s basic_type %li count)", "basic", basic_type_name, basic_type_count);
|
|
Packit Service |
c5cf8c |
err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
return err;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
/* cleanup datatype */
|
|
Packit Service |
c5cf8c |
if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
|
|
Packit Service |
c5cf8c |
MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* cleanup buffers */
|
|
Packit Service |
c5cf8c |
if (dtpi) {
|
|
Packit Service |
c5cf8c |
free(dtpi);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (buf) {
|
|
Packit Service |
c5cf8c |
free(buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Contig_create(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int err = DTP_SUCCESS;
|
|
Packit Service |
c5cf8c |
int len;
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Aint basic_type_count;
|
|
Packit Service |
c5cf8c |
MPI_Aint lb, extent, basic_type_size;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf = NULL;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi = NULL;
|
|
Packit Service |
c5cf8c |
char type_name[TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get type signature for pool */
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
basic_type_count = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type_count;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get object index in the pool */
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* create contiguous datatype */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_contiguous(basic_type_count, basic_type,
|
|
Packit Service |
c5cf8c |
&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate buffer */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize totlen and displ for buf init */
|
|
Packit Service |
c5cf8c |
/* NOTE: rounding to ceiling is needed for composed types */
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize buffer with requested DTPI_Par */
|
|
Packit Service |
c5cf8c |
DTPI_Type_init_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate space for private datatype info */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize private datatype info data */
|
|
Packit Service |
c5cf8c |
dtpi->obj_type = DTPI_OBJ_TYPE__CONTIG;
|
|
Packit Service |
c5cf8c |
dtpi->type_basic_size = basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->type_extent = extent;
|
|
Packit Service |
c5cf8c |
dtpi->type_lb = lb;
|
|
Packit Service |
c5cf8c |
dtpi->type_ub = lb + extent;
|
|
Packit Service |
c5cf8c |
dtpi->u.contig.stride = par->core.type_stride;
|
|
Packit Service |
c5cf8c |
dtpi->u.contig.blklen = par->core.type_blklen;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].private_info = dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* set type name for debug information */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
sprintf(type_name, "%s (%s basic_type %li count)", "contig", basic_type_name, basic_type_count);
|
|
Packit Service |
c5cf8c |
err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
return err;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
/* cleanup datatype */
|
|
Packit Service |
c5cf8c |
if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
|
|
Packit Service |
c5cf8c |
MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* cleanup buffers */
|
|
Packit Service |
c5cf8c |
if (dtpi) {
|
|
Packit Service |
c5cf8c |
free(dtpi);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (buf) {
|
|
Packit Service |
c5cf8c |
free(buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Vector_create(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int err = DTP_SUCCESS;
|
|
Packit Service |
c5cf8c |
int len;
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Aint lb, extent, basic_type_size;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf = NULL;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi = NULL;
|
|
Packit Service |
c5cf8c |
char type_name[TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get basic type for pool */
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get object index in the pool */
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* create vector datatype */
|
|
Packit Service |
c5cf8c |
err =
|
|
Packit Service |
c5cf8c |
MPI_Type_vector(par->core.type_count, par->core.type_blklen,
|
|
Packit Service |
c5cf8c |
par->core.type_stride, basic_type,
|
|
Packit Service |
c5cf8c |
&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate buffer */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize totlen and displ for buf init */
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize buffer with requested DTPI_Par */
|
|
Packit Service |
c5cf8c |
DTPI_Type_init_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate space for private datatype info */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize private datatype info data */
|
|
Packit Service |
c5cf8c |
dtpi->obj_type = DTPI_OBJ_TYPE__VECTOR;
|
|
Packit Service |
c5cf8c |
dtpi->type_basic_size = basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->type_extent = extent;
|
|
Packit Service |
c5cf8c |
dtpi->type_lb = lb;
|
|
Packit Service |
c5cf8c |
dtpi->type_ub = lb + extent;
|
|
Packit Service |
c5cf8c |
dtpi->u.vector.stride = par->core.type_stride;
|
|
Packit Service |
c5cf8c |
dtpi->u.vector.blklen = par->core.type_blklen;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].private_info = dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* set type name for debug information */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
sprintf(type_name, "%s (%s basic_type %li count %li blocklen %li stride)", "vector",
|
|
Packit Service |
c5cf8c |
basic_type_name, par->core.type_count, par->core.type_blklen, par->core.type_stride);
|
|
Packit Service |
c5cf8c |
err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
return err;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
/* cleanup datatype */
|
|
Packit Service |
c5cf8c |
if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
|
|
Packit Service |
c5cf8c |
MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* clean up buffers */
|
|
Packit Service |
c5cf8c |
if (dtpi) {
|
|
Packit Service |
c5cf8c |
free(dtpi);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (buf) {
|
|
Packit Service |
c5cf8c |
free(buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Hvector_create(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int err = DTP_SUCCESS;
|
|
Packit Service |
c5cf8c |
int len;
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Aint lb, extent, basic_type_size;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf = NULL;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi = NULL;
|
|
Packit Service |
c5cf8c |
char type_name[TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get basic type for pool */
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get object index in the pool */
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* create hvector datatype */
|
|
Packit Service |
c5cf8c |
err =
|
|
Packit Service |
c5cf8c |
MPI_Type_create_hvector(par->core.type_count, par->core.type_blklen,
|
|
Packit Service |
c5cf8c |
par->core.type_stride * basic_type_size, basic_type,
|
|
Packit Service |
c5cf8c |
&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get type true extent */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_true_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate buffer */
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "hvector basic type size = %ld", basic_type_size);
|
|
Packit Service |
c5cf8c |
FPRINTF(stdout, "hvector extent = %ld\n", extent);
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize totlen and displ for buf init */
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize buffer with requested DTPI_Par */
|
|
Packit Service |
c5cf8c |
DTPI_Type_init_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate space for private datatype info */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize private datatype info data */
|
|
Packit Service |
c5cf8c |
dtpi->obj_type = DTPI_OBJ_TYPE__HVECTOR;
|
|
Packit Service |
c5cf8c |
dtpi->type_basic_size = basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->type_extent = extent;
|
|
Packit Service |
c5cf8c |
dtpi->type_lb = lb;
|
|
Packit Service |
c5cf8c |
dtpi->type_ub = lb + extent;
|
|
Packit Service |
c5cf8c |
dtpi->u.hvector.stride = par->core.type_stride * basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->u.hvector.blklen = par->core.type_blklen;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].private_info = dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* set type name for debug information */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
sprintf(type_name, "%s (%s basic_type %li count %li blocklen %li stride)", "hvector",
|
|
Packit Service |
c5cf8c |
basic_type_name, par->core.type_count, par->core.type_blklen, par->core.type_stride);
|
|
Packit Service |
c5cf8c |
err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
return err;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
/* cleanup datatype */
|
|
Packit Service |
c5cf8c |
if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
|
|
Packit Service |
c5cf8c |
MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* clean up buffers */
|
|
Packit Service |
c5cf8c |
if (dtpi) {
|
|
Packit Service |
c5cf8c |
free(dtpi);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (buf) {
|
|
Packit Service |
c5cf8c |
free(buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Indexed_create(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int i;
|
|
Packit Service |
c5cf8c |
int err = DTP_SUCCESS;
|
|
Packit Service |
c5cf8c |
int len;
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
int *type_displs = NULL, *type_blklens = NULL;
|
|
Packit Service |
c5cf8c |
MPI_Aint lb, extent, basic_type_size;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf = NULL;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi = NULL;
|
|
Packit Service |
c5cf8c |
char type_name[TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get basic type for pool */
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get object index in the pool */
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(type_displs, sizeof(*type_displs) * par->core.type_count);
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(type_blklens, sizeof(*type_blklens) * par->core.type_count);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
for (i = 0; i < par->core.type_count; i++) {
|
|
Packit Service |
c5cf8c |
type_blklens[i] = par->core.type_blklen;
|
|
Packit Service |
c5cf8c |
type_displs[i] = par->core.type_stride * i;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* create indexed datatype */
|
|
Packit Service |
c5cf8c |
err =
|
|
Packit Service |
c5cf8c |
MPI_Type_indexed(par->core.type_count, type_blklens, type_displs, basic_type,
|
|
Packit Service |
c5cf8c |
&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get type extent */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate buffer */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize totlen and displ for buf init */
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize buffer with requested DTPI_Par */
|
|
Packit Service |
c5cf8c |
DTPI_Type_init_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate space for private datatype info */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize private datatype info data */
|
|
Packit Service |
c5cf8c |
dtpi->obj_type = DTPI_OBJ_TYPE__INDEXED;
|
|
Packit Service |
c5cf8c |
dtpi->type_basic_size = basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->type_extent = extent;
|
|
Packit Service |
c5cf8c |
dtpi->type_lb = lb;
|
|
Packit Service |
c5cf8c |
dtpi->type_ub = lb + extent;
|
|
Packit Service |
c5cf8c |
dtpi->u.indexed.stride = par->core.type_stride;
|
|
Packit Service |
c5cf8c |
dtpi->u.indexed.blklen = par->core.type_blklen;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].private_info = dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* set type name for debug information */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
sprintf(type_name, "%s (%s basic_type %li count %li blocklen %li stride)", "indexed",
|
|
Packit Service |
c5cf8c |
basic_type_name, par->core.type_count, par->core.type_blklen, par->core.type_stride);
|
|
Packit Service |
c5cf8c |
err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
if (type_displs) {
|
|
Packit Service |
c5cf8c |
free(type_displs);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (type_blklens) {
|
|
Packit Service |
c5cf8c |
free(type_blklens);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return err;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
/* cleanup datatype */
|
|
Packit Service |
c5cf8c |
if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
|
|
Packit Service |
c5cf8c |
MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* cleanup buffers */
|
|
Packit Service |
c5cf8c |
if (dtpi) {
|
|
Packit Service |
c5cf8c |
free(dtpi);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (buf) {
|
|
Packit Service |
c5cf8c |
free(buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Hindexed_create(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int i;
|
|
Packit Service |
c5cf8c |
int err = DTP_SUCCESS;
|
|
Packit Service |
c5cf8c |
int len;
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
int *type_blklens = NULL;
|
|
Packit Service |
c5cf8c |
MPI_Aint *type_displs = NULL;
|
|
Packit Service |
c5cf8c |
MPI_Aint lb, extent, basic_type_size;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf = NULL;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi = NULL;
|
|
Packit Service |
c5cf8c |
char type_name[TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get basic type for pool */
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get object index in the pool */
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(type_displs, sizeof(*type_displs) * par->core.type_count);
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(type_blklens, sizeof(*type_blklens) * par->core.type_count);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
for (i = 0; i < par->core.type_count; i++) {
|
|
Packit Service |
c5cf8c |
type_blklens[i] = par->core.type_blklen;
|
|
Packit Service |
c5cf8c |
type_displs[i] = par->core.type_stride * basic_type_size * i;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* create indexed datatype */
|
|
Packit Service |
c5cf8c |
err =
|
|
Packit Service |
c5cf8c |
MPI_Type_create_hindexed(par->core.type_count, type_blklens, type_displs,
|
|
Packit Service |
c5cf8c |
basic_type, &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get type extent */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate buffer */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize totlen and displ for buf init */
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize buffer with requested DTPI_Par */
|
|
Packit Service |
c5cf8c |
DTPI_Type_init_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate space for private datatype info */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize private datatype info data */
|
|
Packit Service |
c5cf8c |
dtpi->obj_type = DTPI_OBJ_TYPE__HINDEXED;
|
|
Packit Service |
c5cf8c |
dtpi->type_basic_size = basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->type_extent = extent;
|
|
Packit Service |
c5cf8c |
dtpi->type_lb = lb;
|
|
Packit Service |
c5cf8c |
dtpi->type_ub = lb + extent;
|
|
Packit Service |
c5cf8c |
dtpi->u.hindexed.stride = par->core.type_stride * basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->u.hindexed.blklen = par->core.type_blklen;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].private_info = dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* set type name for debug information */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
sprintf(type_name, "%s (%s basic_type %li count %li blocklen %li stride)", "hindexed",
|
|
Packit Service |
c5cf8c |
basic_type_name, par->core.type_count, par->core.type_blklen, par->core.type_stride);
|
|
Packit Service |
c5cf8c |
err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
if (type_displs) {
|
|
Packit Service |
c5cf8c |
free(type_displs);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (type_blklens) {
|
|
Packit Service |
c5cf8c |
free(type_blklens);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return err;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
/* cleanup datatype */
|
|
Packit Service |
c5cf8c |
if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
|
|
Packit Service |
c5cf8c |
MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* cleanup buffers */
|
|
Packit Service |
c5cf8c |
if (dtpi) {
|
|
Packit Service |
c5cf8c |
free(dtpi);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (buf) {
|
|
Packit Service |
c5cf8c |
free(buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Block_indexed_create(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int i;
|
|
Packit Service |
c5cf8c |
int err = DTP_SUCCESS;
|
|
Packit Service |
c5cf8c |
int len;
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
int *type_displs = NULL;
|
|
Packit Service |
c5cf8c |
MPI_Aint lb, extent, basic_type_size;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf = NULL;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi = NULL;
|
|
Packit Service |
c5cf8c |
char type_name[TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get type signature for pool */
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get object index in the pool */
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(type_displs, sizeof(*type_displs) * par->core.type_count);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
for (i = 0; i < par->core.type_count; i++) {
|
|
Packit Service |
c5cf8c |
type_displs[i] = par->core.type_stride * i;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* create block indexed datatype */
|
|
Packit Service |
c5cf8c |
err =
|
|
Packit Service |
c5cf8c |
MPI_Type_create_indexed_block(par->core.type_count, par->core.type_blklen, type_displs,
|
|
Packit Service |
c5cf8c |
basic_type, &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get type extent */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate buffer */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize totlen and displ for buf init */
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize buffer with requested DTPI_Par */
|
|
Packit Service |
c5cf8c |
DTPI_Type_init_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate space for private datatype info */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize private datatype info data */
|
|
Packit Service |
c5cf8c |
dtpi->obj_type = DTPI_OBJ_TYPE__BLOCK_INDEXED;
|
|
Packit Service |
c5cf8c |
dtpi->type_basic_size = basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->type_extent = extent;
|
|
Packit Service |
c5cf8c |
dtpi->type_lb = lb;
|
|
Packit Service |
c5cf8c |
dtpi->type_ub = lb + extent;
|
|
Packit Service |
c5cf8c |
dtpi->u.block_indexed.stride = par->core.type_stride;
|
|
Packit Service |
c5cf8c |
dtpi->u.block_indexed.blklen = par->core.type_blklen;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].private_info = dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* set type name for debug information */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
sprintf(type_name, "%s (%s basic_type %li count %li blocklen %li stride)",
|
|
Packit Service |
c5cf8c |
"block_indexed", basic_type_name, par->core.type_count,
|
|
Packit Service |
c5cf8c |
par->core.type_blklen, par->core.type_stride);
|
|
Packit Service |
c5cf8c |
err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
if (type_displs) {
|
|
Packit Service |
c5cf8c |
free(type_displs);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return err;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
/* cleanup datatype */
|
|
Packit Service |
c5cf8c |
if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
|
|
Packit Service |
c5cf8c |
MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* cleanup buffers */
|
|
Packit Service |
c5cf8c |
if (dtpi) {
|
|
Packit Service |
c5cf8c |
free(dtpi);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (buf) {
|
|
Packit Service |
c5cf8c |
free(buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Block_hindexed_create(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int i;
|
|
Packit Service |
c5cf8c |
int err = DTP_SUCCESS;
|
|
Packit Service |
c5cf8c |
int len;
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Aint *type_displs = NULL;
|
|
Packit Service |
c5cf8c |
MPI_Aint lb, extent, basic_type_size;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf = NULL;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi = NULL;
|
|
Packit Service |
c5cf8c |
char type_name[TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get type signature for pool */
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get object index in the pool */
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(type_displs, sizeof(*type_displs) * par->core.type_count);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
for (i = 0; i < par->core.type_count; i++) {
|
|
Packit Service |
c5cf8c |
type_displs[i] = par->core.type_stride * basic_type_size * i;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* create block indexed datatype */
|
|
Packit Service |
c5cf8c |
err =
|
|
Packit Service |
c5cf8c |
MPI_Type_create_hindexed_block(par->core.type_count, par->core.type_blklen, type_displs,
|
|
Packit Service |
c5cf8c |
basic_type, &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get type extent */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate buffer */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize totlen and displ for buf init */
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = (extent + basic_type_size - 1) / basic_type_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize buffer with requested DTPI_Par */
|
|
Packit Service |
c5cf8c |
DTPI_Type_init_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate space for private datatype info */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize private datatype info data */
|
|
Packit Service |
c5cf8c |
dtpi->obj_type = DTPI_OBJ_TYPE__BLOCK_HINDEXED;
|
|
Packit Service |
c5cf8c |
dtpi->type_basic_size = basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->type_extent = extent;
|
|
Packit Service |
c5cf8c |
dtpi->type_lb = lb;
|
|
Packit Service |
c5cf8c |
dtpi->type_ub = lb + extent;
|
|
Packit Service |
c5cf8c |
dtpi->u.block_hindexed.stride = par->core.type_stride * basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->u.block_hindexed.blklen = par->core.type_blklen;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].private_info = dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* set type name for debug information */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
sprintf(type_name, "%s (%s basic_type %li count %li blocklen %li stride)",
|
|
Packit Service |
c5cf8c |
"block_hindexed", basic_type_name, par->core.type_count,
|
|
Packit Service |
c5cf8c |
par->core.type_blklen, par->core.type_stride);
|
|
Packit Service |
c5cf8c |
err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
if (type_displs) {
|
|
Packit Service |
c5cf8c |
free(type_displs);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return err;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
/* cleanup datatype */
|
|
Packit Service |
c5cf8c |
if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
|
|
Packit Service |
c5cf8c |
MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* cleanup buffers */
|
|
Packit Service |
c5cf8c |
if (dtpi) {
|
|
Packit Service |
c5cf8c |
free(dtpi);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (buf) {
|
|
Packit Service |
c5cf8c |
free(buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Subarray_c_create(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int err = DTP_SUCCESS;
|
|
Packit Service |
c5cf8c |
int len;
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Aint lb, extent, basic_type_size;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf = NULL;
|
|
Packit Service |
c5cf8c |
char type_name[TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi = NULL;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get type signature for pool */
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get object index in the pool */
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate space for private datatype info */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_starts[0] = par->core.type_count / 8; /* use fix offset along x */
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_starts[1] = par->core.type_stride - par->core.type_blklen;
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_sizes[0] = par->core.type_count + dtpi->u.subarray.arr_starts[0];
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_sizes[1] = par->core.type_stride;
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_subsizes[0] = par->core.type_count;
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_subsizes[1] = par->core.type_blklen;
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.order = MPI_ORDER_C;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_create_subarray(2,
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_sizes,
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_subsizes,
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_starts,
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.order,
|
|
Packit Service |
c5cf8c |
basic_type, &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate buffer */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* recompute stride and displacement info for buffer initialization */
|
|
Packit Service |
c5cf8c |
par->core.type_displ =
|
|
Packit Service |
c5cf8c |
((dtpi->u.subarray.arr_sizes[1] * dtpi->u.subarray.arr_starts[0]) +
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_starts[1]) * basic_type_size;
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = (extent - par->core.type_displ) / basic_type_size;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize buffer with requested DTPI_Par */
|
|
Packit Service |
c5cf8c |
DTPI_Type_init_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize private datatype info data */
|
|
Packit Service |
c5cf8c |
dtpi->obj_type = DTPI_OBJ_TYPE__SUBARRAY_C;
|
|
Packit Service |
c5cf8c |
dtpi->type_basic_size = basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->type_extent = extent;
|
|
Packit Service |
c5cf8c |
dtpi->type_lb = lb;
|
|
Packit Service |
c5cf8c |
dtpi->type_ub = lb + extent;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].private_info = dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* set type name for debug information */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
sprintf(type_name, "%s (%s basic_type full{%d,%d} sub{%d,%d} start{%d,%d})",
|
|
Packit Service |
c5cf8c |
"subarray-c", basic_type_name, dtpi->u.subarray.arr_sizes[0],
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_sizes[1], dtpi->u.subarray.arr_subsizes[0],
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_subsizes[1], dtpi->u.subarray.arr_starts[0],
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_starts[1]);
|
|
Packit Service |
c5cf8c |
err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
return err;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
/* cleanup datatype */
|
|
Packit Service |
c5cf8c |
if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
|
|
Packit Service |
c5cf8c |
MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* cleanup buffers */
|
|
Packit Service |
c5cf8c |
if (dtpi) {
|
|
Packit Service |
c5cf8c |
free(dtpi);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (buf) {
|
|
Packit Service |
c5cf8c |
free(buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Subarray_f_create(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int err = DTP_SUCCESS;
|
|
Packit Service |
c5cf8c |
int len;
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Aint lb, extent, basic_type_size;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf = NULL;
|
|
Packit Service |
c5cf8c |
char type_name[TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
char basic_type_name[BASIC_TYPE_NAME_MAXLEN] = { 0 };
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi = NULL;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get type signature for pool */
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* get object index in the pool */
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(basic_type, &lb, &basic_type_size);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate space for private datatype info */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(dtpi, sizeof(*dtpi));
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_starts[0] = par->core.type_count / 8; /* use fix offset along x */
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_starts[1] = par->core.type_stride - par->core.type_blklen;
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_sizes[0] = par->core.type_count + dtpi->u.subarray.arr_starts[0];
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_sizes[1] = par->core.type_stride;
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_subsizes[0] = par->core.type_count;
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_subsizes[1] = par->core.type_blklen;
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.order = MPI_ORDER_FORTRAN;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_create_subarray(2,
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_sizes,
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_subsizes,
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_starts,
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.order,
|
|
Packit Service |
c5cf8c |
basic_type, &dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_commit(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_count = 1;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_extent(dtp->DTP_obj_array[obj_idx].DTP_obj_type, &lb, &extent);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* allocate buffer */
|
|
Packit Service |
c5cf8c |
DTPI_OBJ_ALLOC_OR_FAIL(buf, lb + extent);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* recompute stride and displacement info for buffer initialization */
|
|
Packit Service |
c5cf8c |
par->core.type_displ =
|
|
Packit Service |
c5cf8c |
((dtpi->u.subarray.arr_sizes[0] * dtpi->u.subarray.arr_starts[1]) +
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_starts[0]) * basic_type_size;
|
|
Packit Service |
c5cf8c |
par->core.type_stride = dtpi->u.subarray.arr_sizes[0];
|
|
Packit Service |
c5cf8c |
par->core.type_blklen = dtpi->u.subarray.arr_subsizes[0];
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = (extent - par->core.type_displ) / basic_type_size;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize buffer with requested DTPI_Par */
|
|
Packit Service |
c5cf8c |
DTPI_Type_init_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* initialize private datatype info data */
|
|
Packit Service |
c5cf8c |
dtpi->obj_type = DTPI_OBJ_TYPE__SUBARRAY_F;
|
|
Packit Service |
c5cf8c |
dtpi->type_basic_size = basic_type_size;
|
|
Packit Service |
c5cf8c |
dtpi->type_extent = extent;
|
|
Packit Service |
c5cf8c |
dtpi->type_lb = lb;
|
|
Packit Service |
c5cf8c |
dtpi->type_ub = lb + extent;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].DTP_obj_buf = buf;
|
|
Packit Service |
c5cf8c |
dtp->DTP_obj_array[obj_idx].private_info = dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* set type name for debug information */
|
|
Packit Service |
c5cf8c |
err = MPI_Type_get_name(basic_type, basic_type_name, &len;;
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
sprintf(type_name, "%s (%s basic_type full{%d,%d} sub{%d,%d} start{%d,%d})",
|
|
Packit Service |
c5cf8c |
"subarray-f", basic_type_name, dtpi->u.subarray.arr_sizes[0],
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_sizes[1], dtpi->u.subarray.arr_subsizes[0],
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_subsizes[1], dtpi->u.subarray.arr_starts[0],
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_starts[1]);
|
|
Packit Service |
c5cf8c |
err = MPI_Type_set_name(dtp->DTP_obj_array[obj_idx].DTP_obj_type, (char *) type_name);
|
|
Packit Service |
c5cf8c |
if (err) {
|
|
Packit Service |
c5cf8c |
DTPI_Print_error(err);
|
|
Packit Service |
c5cf8c |
goto fn_fail;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_exit:
|
|
Packit Service |
c5cf8c |
return err;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fn_fail:
|
|
Packit Service |
c5cf8c |
/* cleanup datatype */
|
|
Packit Service |
c5cf8c |
if (dtp->DTP_obj_array[obj_idx].DTP_obj_type != MPI_DATATYPE_NULL) {
|
|
Packit Service |
c5cf8c |
MPI_Type_free(&dtp->DTP_obj_array[obj_idx].DTP_obj_type);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* cleanup buffers */
|
|
Packit Service |
c5cf8c |
if (dtpi) {
|
|
Packit Service |
c5cf8c |
free(dtpi);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (buf) {
|
|
Packit Service |
c5cf8c |
free(buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
goto fn_exit;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* --------------------------------------------------------- */
|
|
Packit Service |
c5cf8c |
/* Datatype Pool Buffer Check Functions */
|
|
Packit Service |
c5cf8c |
/* --------------------------------------------------------- */
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Struct_check_buf(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int i, err = DTP_SUCCESS;
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
int num_types;
|
|
Packit Service |
c5cf8c |
int *basic_type_counts;
|
|
Packit Service |
c5cf8c |
MPI_Aint *basic_type_displs;
|
|
Packit Service |
c5cf8c |
MPI_Datatype *basic_types;
|
|
Packit Service |
c5cf8c |
void *buf;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
|
|
Packit Service |
c5cf8c |
num_types = dtp->DTP_type_signature.DTP_pool_struct.DTP_num_types;
|
|
Packit Service |
c5cf8c |
basic_types = dtp->DTP_type_signature.DTP_pool_struct.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
basic_type_counts = dtp->DTP_type_signature.DTP_pool_struct.DTP_basic_type_count;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
|
|
Packit Service |
c5cf8c |
basic_type_displs = dtpi->u.structure.displs;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* check every elem in struct separately */
|
|
Packit Service |
c5cf8c |
for (i = 0; i < num_types; i++) {
|
|
Packit Service |
c5cf8c |
/* user count is ignored */
|
|
Packit Service |
c5cf8c |
par->user.val_count = basic_type_counts[i];
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* contiguous arrays */
|
|
Packit Service |
c5cf8c |
par->core.type_stride = 1;
|
|
Packit Service |
c5cf8c |
par->core.type_blklen = 1;
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = (MPI_Aint) basic_type_counts[i];
|
|
Packit Service |
c5cf8c |
par->core.type_displ = basic_type_displs[i];
|
|
Packit Service |
c5cf8c |
err = DTPI_Type_check_buf(par, basic_types[i], buf);
|
|
Packit Service |
c5cf8c |
if (err != DTP_SUCCESS) {
|
|
Packit Service |
c5cf8c |
break;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return err;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Basic_check_buf(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
int basic_type_count;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
basic_type_count = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type_count;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
par->core.type_stride = 1;
|
|
Packit Service |
c5cf8c |
par->core.type_blklen = 1;
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = basic_type_count;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return DTPI_Type_check_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Contig_check_buf(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
|
|
Packit Service |
c5cf8c |
par->core.type_stride = dtpi->u.contig.stride;
|
|
Packit Service |
c5cf8c |
par->core.type_blklen = dtpi->u.contig.blklen;
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return DTPI_Type_check_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Vector_check_buf(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
|
|
Packit Service |
c5cf8c |
par->core.type_stride = dtpi->u.vector.stride;
|
|
Packit Service |
c5cf8c |
par->core.type_blklen = dtpi->u.vector.blklen;
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return DTPI_Type_check_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Hvector_check_buf(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
|
|
Packit Service |
c5cf8c |
par->core.type_stride = dtpi->u.hvector.stride / dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_blklen = dtpi->u.hvector.blklen;
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return DTPI_Type_check_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Indexed_check_buf(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
|
|
Packit Service |
c5cf8c |
par->core.type_stride = dtpi->u.indexed.stride;
|
|
Packit Service |
c5cf8c |
par->core.type_blklen = dtpi->u.indexed.blklen;
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return DTPI_Type_check_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Hindexed_check_buf(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
|
|
Packit Service |
c5cf8c |
par->core.type_stride = dtpi->u.hindexed.stride / dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_blklen = dtpi->u.hindexed.blklen;
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return DTPI_Type_check_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Block_indexed_check_buf(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
|
|
Packit Service |
c5cf8c |
par->core.type_stride = dtpi->u.block_indexed.stride;
|
|
Packit Service |
c5cf8c |
par->core.type_blklen = dtpi->u.block_indexed.blklen;
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return DTPI_Type_check_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Block_hindexed_check_buf(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
|
|
Packit Service |
c5cf8c |
par->core.type_stride = dtpi->u.block_hindexed.stride / dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_blklen = dtpi->u.block_hindexed.blklen;
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = dtpi->type_extent / dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_displ = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return DTPI_Type_check_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Subarray_c_check_buf(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
|
|
Packit Service |
c5cf8c |
par->core.type_displ =
|
|
Packit Service |
c5cf8c |
((dtpi->u.subarray.arr_sizes[1] * dtpi->u.subarray.arr_starts[0]) +
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_starts[1]) * dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = (dtpi->type_extent - par->core.type_displ) / dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_stride = dtpi->u.subarray.arr_sizes[1];
|
|
Packit Service |
c5cf8c |
par->core.type_blklen = dtpi->u.subarray.arr_subsizes[1];
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return DTPI_Type_check_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int DTPI_Subarray_f_check_buf(struct DTPI_Par *par, DTP_t dtp)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
int obj_idx;
|
|
Packit Service |
c5cf8c |
MPI_Datatype basic_type;
|
|
Packit Service |
c5cf8c |
void *buf;
|
|
Packit Service |
c5cf8c |
DTPI_t *dtpi;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
obj_idx = par->user.obj_idx;
|
|
Packit Service |
c5cf8c |
buf = dtp->DTP_obj_array[obj_idx].DTP_obj_buf;
|
|
Packit Service |
c5cf8c |
basic_type = dtp->DTP_type_signature.DTP_pool_basic.DTP_basic_type;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
dtpi = (DTPI_t *) dtp->DTP_obj_array[obj_idx].private_info;
|
|
Packit Service |
c5cf8c |
par->core.type_displ =
|
|
Packit Service |
c5cf8c |
((dtpi->u.subarray.arr_sizes[0] * dtpi->u.subarray.arr_starts[1]) +
|
|
Packit Service |
c5cf8c |
dtpi->u.subarray.arr_starts[0]) * dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_totlen = (dtpi->type_extent - par->core.type_displ) / dtpi->type_basic_size;
|
|
Packit Service |
c5cf8c |
par->core.type_stride = dtpi->u.subarray.arr_sizes[0];
|
|
Packit Service |
c5cf8c |
par->core.type_blklen = dtpi->u.subarray.arr_subsizes[0];
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return DTPI_Type_check_buf(par, basic_type, buf);
|
|
Packit Service |
c5cf8c |
}
|