1
1
openmpi/ompi/mca/coll/fca/coll_fca_convertor.h
2016-11-22 15:03:20 -08:00

87 строки
2.8 KiB
C

#ifndef MCA_COLL_FCA_CONVERTOR_H
#define MCA_COLL_FCA_CONVERTOR_H
enum {
MCA_COLL_CONVERTOR_NULL = 0,
MCA_COLL_FCA_CONV_SEND,
MCA_COLL_FCA_CONV_RECV
};
struct mca_coll_fca_convertor {
int type;
FCA_CONVERTOR_T ompic;
size_t size;
void *buf;
};
#define MCA_COLL_FCA_DECLARE_CONVERTOR(__name) \
struct mca_coll_fca_convertor __name = {MCA_COLL_CONVERTOR_NULL}
static inline void mca_coll_fca_convertor_set(struct mca_coll_fca_convertor *conv,
struct ompi_datatype_t *datatype,
void *buffer, int count)
{
if (conv->type == MCA_COLL_FCA_CONV_SEND) {
FCA_CONVERTOR_COPY_AND_PREPARE_FOR_SEND(ompi_mpi_local_convertor,
&datatype->super, count,
buffer, 0, &conv->ompic);
} else if (conv->type == MCA_COLL_FCA_CONV_RECV) {
FCA_CONVERTOR_COPY_AND_PREPARE_FOR_RECV(ompi_mpi_local_convertor,
&datatype->super, count,
buffer, 0, &conv->ompic);
}
}
static inline void mca_coll_fca_convertor_create(struct mca_coll_fca_convertor *conv,
struct ompi_datatype_t *datatype,
int count, void *buffer, int type,
void **tmpbuf, size_t *size)
{
OBJ_CONSTRUCT(&conv->ompic, FCA_CONVERTOR_T);
conv->type = type;
mca_coll_fca_convertor_set(conv, datatype, buffer, count);
FCA_CONVERTOR_CONVERTOR_GET_PACKED_SIZE(&conv->ompic, &conv->size);
conv->buf = malloc(conv->size);
*tmpbuf = conv->buf;
*size = conv->size;
}
static inline int mca_coll_fca_convertor_valid(struct mca_coll_fca_convertor *conv)
{
return conv->type != MCA_COLL_CONVERTOR_NULL;
}
static inline void mca_coll_fca_convertor_destroy(struct mca_coll_fca_convertor *conv)
{
if (mca_coll_fca_convertor_valid(conv)) {
free(conv->buf);
OBJ_DESTRUCT(&conv->ompic);
}
}
static inline int32_t mca_coll_fca_convertor_process(struct mca_coll_fca_convertor *conv,
size_t offset)
{
struct iovec invec;
unsigned iov_count;
size_t size;
iov_count = 1;
invec.iov_base = (char*)conv->buf + offset;
invec.iov_len = conv->size;
size = conv->size;
if (conv->type == MCA_COLL_FCA_CONV_SEND) {
return FCA_CONVERTOR_CONVERTOR_PACK(&conv->ompic, &invec, &iov_count, &size);
} else if (conv->type == MCA_COLL_FCA_CONV_RECV) {
return FCA_CONVERTOR_CONVERTOR_UNPACK(&conv->ompic, &invec, &iov_count, &size);
}
return 0;
}
#endif