Blame src/mpid/ch4/src/ch4_types.h

Packit Service c5cf8c
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit Service c5cf8c
/*
Packit Service c5cf8c
 *  (C) 2006 by Argonne National Laboratory.
Packit Service c5cf8c
 *      See COPYRIGHT in top-level directory.
Packit Service c5cf8c
 *
Packit Service c5cf8c
 *  Portions of this code were written by Intel Corporation.
Packit Service c5cf8c
 *  Copyright (C) 2011-2016 Intel Corporation.  Intel provides this material
Packit Service c5cf8c
 *  to Argonne National Laboratory subject to Software Grant and Corporate
Packit Service c5cf8c
 *  Contributor License Agreement dated February 8, 2012.
Packit Service c5cf8c
 */
Packit Service c5cf8c
#ifndef CH4_TYPES_H_INCLUDED
Packit Service c5cf8c
#define CH4_TYPES_H_INCLUDED
Packit Service c5cf8c
Packit Service c5cf8c
#include <mpidimpl.h>
Packit Service c5cf8c
#include <stdio.h>
Packit Service c5cf8c
#include "mpir_cvars.h"
Packit Service c5cf8c
#include "ch4i_workq_types.h"
Packit Service c5cf8c
Packit Service c5cf8c
/* Macros and inlines */
Packit Service c5cf8c
#define MPIDI_CH4U_MAP_NOT_FOUND      ((void*)(-1UL))
Packit Service c5cf8c
Packit Service c5cf8c
#define MAX_PROGRESS_HOOKS 4
Packit Service c5cf8c
Packit Service c5cf8c
/* VNI attributes */
Packit Service c5cf8c
enum {
Packit Service c5cf8c
    MPIDI_VNI_TX = 0x1,         /* Can send */
Packit Service c5cf8c
    MPIDI_VNI_RX = 0x2, /* Can receive */
Packit Service c5cf8c
};
Packit Service c5cf8c
Packit Service c5cf8c
#define MPIDI_CH4I_BUF_POOL_NUM (1024)
Packit Service c5cf8c
#define MPIDI_CH4I_BUF_POOL_SZ (256)
Packit Service c5cf8c
Packit Service c5cf8c
typedef int (*progress_func_ptr_t) (int *made_progress);
Packit Service c5cf8c
typedef struct progress_hook_slot {
Packit Service c5cf8c
    progress_func_ptr_t func_ptr;
Packit Service c5cf8c
    int active;
Packit Service c5cf8c
} progress_hook_slot_t;
Packit Service c5cf8c
Packit Service c5cf8c
/* Flags for MPIDI_Progress_test
Packit Service c5cf8c
 *
Packit Service c5cf8c
 * Flags argument allows to control execution of different parts of progress function,
Packit Service c5cf8c
 * for aims of prioritization of different transports and reentrant-safety of progress call.
Packit Service c5cf8c
 *
Packit Service c5cf8c
 * MPIDI_PROGRESS_HOOKS - enables progress on progress hooks. Hooks may invoke upper-level logic internaly,
Packit Service c5cf8c
 *      that's why MPIDI_Progress_test call with MPIDI_PROGRESS_HOOKS set isn't reentrant safe, and shouldn't be called from netmod's fallback logic.
Packit Service c5cf8c
 * MPIDI_PROGRESS_NM and MPIDI_PROGRESS_SHM enables progress on transports only, and guarantee reentrant-safety.
Packit Service c5cf8c
 */
Packit Service c5cf8c
#define MPIDI_PROGRESS_HOOKS  (1)
Packit Service c5cf8c
#define MPIDI_PROGRESS_NM     (1<<1)
Packit Service c5cf8c
#define MPIDI_PROGRESS_SHM    (1<<2)
Packit Service c5cf8c
Packit Service c5cf8c
#define MPIDI_PROGRESS_ALL (MPIDI_PROGRESS_HOOKS|MPIDI_PROGRESS_NM|MPIDI_PROGRESS_SHM)
Packit Service c5cf8c
Packit Service c5cf8c
enum {
Packit Service c5cf8c
    MPIDI_CH4U_SEND = 0,        /* Eager send */
Packit Service c5cf8c
Packit Service c5cf8c
    MPIDI_CH4U_SEND_LONG_REQ,   /* Rendezvous send RTS (request to send) */
Packit Service c5cf8c
    MPIDI_CH4U_SEND_LONG_ACK,   /* Rendezvous send CTS (clear to send) */
Packit Service c5cf8c
    MPIDI_CH4U_SEND_LONG_LMT,   /* Rendezvous send LMT */
Packit Service c5cf8c
Packit Service c5cf8c
    MPIDI_CH4U_SSEND_REQ,
Packit Service c5cf8c
    MPIDI_CH4U_SSEND_ACK,
Packit Service c5cf8c
Packit Service c5cf8c
    MPIDI_CH4U_PUT_REQ,
Packit Service c5cf8c
    MPIDI_CH4U_PUT_ACK,
Packit Service c5cf8c
    MPIDI_CH4U_PUT_IOV_REQ,
Packit Service c5cf8c
    MPIDI_CH4U_PUT_DAT_REQ,
Packit Service c5cf8c
    MPIDI_CH4U_PUT_IOV_ACK,
Packit Service c5cf8c
Packit Service c5cf8c
    MPIDI_CH4U_GET_REQ,
Packit Service c5cf8c
    MPIDI_CH4U_GET_ACK,
Packit Service c5cf8c
Packit Service c5cf8c
    MPIDI_CH4U_ACC_REQ,
Packit Service c5cf8c
    MPIDI_CH4U_ACC_ACK,
Packit Service c5cf8c
    MPIDI_CH4U_ACC_IOV_REQ,
Packit Service c5cf8c
    MPIDI_CH4U_ACC_DAT_REQ,
Packit Service c5cf8c
    MPIDI_CH4U_ACC_IOV_ACK,
Packit Service c5cf8c
Packit Service c5cf8c
    MPIDI_CH4U_GET_ACC_REQ,
Packit Service c5cf8c
    MPIDI_CH4U_GET_ACC_ACK,
Packit Service c5cf8c
    MPIDI_CH4U_GET_ACC_IOV_REQ,
Packit Service c5cf8c
    MPIDI_CH4U_GET_ACC_DAT_REQ,
Packit Service c5cf8c
    MPIDI_CH4U_GET_ACC_IOV_ACK,
Packit Service c5cf8c
Packit Service c5cf8c
    MPIDI_CH4U_CSWAP_REQ,
Packit Service c5cf8c
    MPIDI_CH4U_CSWAP_ACK,
Packit Service c5cf8c
    MPIDI_CH4U_FETCH_OP,
Packit Service c5cf8c
Packit Service c5cf8c
    MPIDI_CH4U_WIN_COMPLETE,
Packit Service c5cf8c
    MPIDI_CH4U_WIN_POST,
Packit Service c5cf8c
    MPIDI_CH4U_WIN_LOCK,
Packit Service c5cf8c
    MPIDI_CH4U_WIN_LOCK_ACK,
Packit Service c5cf8c
    MPIDI_CH4U_WIN_UNLOCK,
Packit Service c5cf8c
    MPIDI_CH4U_WIN_UNLOCK_ACK,
Packit Service c5cf8c
    MPIDI_CH4U_WIN_LOCKALL,
Packit Service c5cf8c
    MPIDI_CH4U_WIN_LOCKALL_ACK,
Packit Service c5cf8c
    MPIDI_CH4U_WIN_UNLOCKALL,
Packit Service c5cf8c
    MPIDI_CH4U_WIN_UNLOCKALL_ACK,
Packit Service c5cf8c
Packit Service c5cf8c
    MPIDI_CH4U_COMM_ABORT
Packit Service c5cf8c
};
Packit Service c5cf8c
Packit Service c5cf8c
enum {
Packit Service c5cf8c
    MPIDI_CH4U_EPOTYPE_NONE = 0,          /**< No epoch in affect */
Packit Service c5cf8c
    MPIDI_CH4U_EPOTYPE_LOCK = 1,          /**< MPI_Win_lock access epoch */
Packit Service c5cf8c
    MPIDI_CH4U_EPOTYPE_START = 2,         /**< MPI_Win_start access epoch */
Packit Service c5cf8c
    MPIDI_CH4U_EPOTYPE_POST = 3,          /**< MPI_Win_post exposure epoch */
Packit Service c5cf8c
    MPIDI_CH4U_EPOTYPE_FENCE = 4,         /**< MPI_Win_fence access/exposure epoch */
Packit Service c5cf8c
    MPIDI_CH4U_EPOTYPE_REFENCE = 5,       /**< MPI_Win_fence possible access/exposure epoch */
Packit Service c5cf8c
    MPIDI_CH4U_EPOTYPE_LOCK_ALL = 6       /**< MPI_Win_lock_all access epoch */
Packit Service c5cf8c
};
Packit Service c5cf8c
Packit Service c5cf8c
/* Enum for calling types between netmod and shm */
Packit Service c5cf8c
enum {
Packit Service c5cf8c
    MPIDI_CH4R_NETMOD = 0,
Packit Service c5cf8c
    MPIDI_CH4R_SHM = 1
Packit Service c5cf8c
};
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_hdr_t {
Packit Service c5cf8c
    int src_rank;
Packit Service c5cf8c
    int tag;
Packit Service c5cf8c
    MPIR_Context_id_t context_id;
Packit Service c5cf8c
} MPIDI_CH4U_hdr_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_send_long_req_msg_t {
Packit Service c5cf8c
    MPIDI_CH4U_hdr_t hdr;
Packit Service c5cf8c
    size_t data_sz;             /* Message size in bytes */
Packit Service c5cf8c
    uint64_t sreq_ptr;          /* Pointer value of the request object at the sender side */
Packit Service c5cf8c
} MPIDI_CH4U_send_long_req_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_send_long_ack_msg_t {
Packit Service c5cf8c
    uint64_t sreq_ptr;
Packit Service c5cf8c
    uint64_t rreq_ptr;
Packit Service c5cf8c
} MPIDI_CH4U_send_long_ack_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_send_long_lmt_msg_t {
Packit Service c5cf8c
    uint64_t rreq_ptr;
Packit Service c5cf8c
} MPIDI_CH4U_send_long_lmt_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_ssend_req_msg_t {
Packit Service c5cf8c
    MPIDI_CH4U_hdr_t hdr;
Packit Service c5cf8c
    uint64_t sreq_ptr;
Packit Service c5cf8c
} MPIDI_CH4U_ssend_req_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_ssend_ack_msg_t {
Packit Service c5cf8c
    uint64_t sreq_ptr;
Packit Service c5cf8c
} MPIDI_CH4U_ssend_ack_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_win_cntrl_msg_t {
Packit Service c5cf8c
    uint64_t win_id;
Packit Service c5cf8c
    uint32_t origin_rank;
Packit Service c5cf8c
    int16_t lock_type;
Packit Service c5cf8c
} MPIDI_CH4U_win_cntrl_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_put_msg_t {
Packit Service c5cf8c
    int src_rank;
Packit Service c5cf8c
    uint64_t win_id;
Packit Service c5cf8c
    uint64_t preq_ptr;
Packit Service c5cf8c
    MPI_Aint target_disp;
Packit Service c5cf8c
    uint64_t count;
Packit Service c5cf8c
    MPI_Datatype datatype;
Packit Service c5cf8c
    int n_iov;
Packit Service c5cf8c
} MPIDI_CH4U_put_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_put_iov_ack_msg_t {
Packit Service c5cf8c
    int src_rank;
Packit Service c5cf8c
    uint64_t target_preq_ptr;
Packit Service c5cf8c
    uint64_t origin_preq_ptr;
Packit Service c5cf8c
} MPIDI_CH4U_put_iov_ack_msg_t;
Packit Service c5cf8c
typedef MPIDI_CH4U_put_iov_ack_msg_t MPIDI_CH4U_acc_iov_ack_msg_t;
Packit Service c5cf8c
typedef MPIDI_CH4U_put_iov_ack_msg_t MPIDI_CH4U_get_acc_iov_ack_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_put_dat_msg_t {
Packit Service c5cf8c
    uint64_t preq_ptr;
Packit Service c5cf8c
} MPIDI_CH4U_put_dat_msg_t;
Packit Service c5cf8c
typedef MPIDI_CH4U_put_dat_msg_t MPIDI_CH4U_acc_dat_msg_t;
Packit Service c5cf8c
typedef MPIDI_CH4U_put_dat_msg_t MPIDI_CH4U_get_acc_dat_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_put_ack_msg_t {
Packit Service c5cf8c
    uint64_t preq_ptr;
Packit Service c5cf8c
} MPIDI_CH4U_put_ack_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_get_req_msg_t {
Packit Service c5cf8c
    int src_rank;
Packit Service c5cf8c
    uint64_t win_id;
Packit Service c5cf8c
    uint64_t greq_ptr;
Packit Service c5cf8c
    MPI_Aint target_disp;
Packit Service c5cf8c
    uint64_t count;
Packit Service c5cf8c
    MPI_Datatype datatype;
Packit Service c5cf8c
    int n_iov;
Packit Service c5cf8c
} MPIDI_CH4U_get_req_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_get_ack_msg_t {
Packit Service c5cf8c
    uint64_t greq_ptr;
Packit Service c5cf8c
} MPIDI_CH4U_get_ack_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_cswap_req_msg_t {
Packit Service c5cf8c
    int src_rank;
Packit Service c5cf8c
    uint64_t win_id;
Packit Service c5cf8c
    uint64_t req_ptr;
Packit Service c5cf8c
    MPI_Aint target_disp;
Packit Service c5cf8c
    MPI_Datatype datatype;
Packit Service c5cf8c
} MPIDI_CH4U_cswap_req_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_cswap_ack_msg_t {
Packit Service c5cf8c
    uint64_t req_ptr;
Packit Service c5cf8c
} MPIDI_CH4U_cswap_ack_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_acc_req_msg_t {
Packit Service c5cf8c
    int src_rank;
Packit Service c5cf8c
    uint64_t win_id;
Packit Service c5cf8c
    uint64_t req_ptr;
Packit Service c5cf8c
    int origin_count;
Packit Service c5cf8c
    MPI_Datatype origin_datatype;
Packit Service c5cf8c
    int target_count;
Packit Service c5cf8c
    MPI_Datatype target_datatype;
Packit Service c5cf8c
    MPI_Op op;
Packit Service c5cf8c
    MPI_Aint target_disp;
Packit Service c5cf8c
    uint64_t result_data_sz;
Packit Service c5cf8c
    int n_iov;
Packit Service c5cf8c
} MPIDI_CH4U_acc_req_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_acc_req_msg_t MPIDI_CH4U_get_acc_req_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_acc_ack_msg_t {
Packit Service c5cf8c
    uint64_t req_ptr;
Packit Service c5cf8c
} MPIDI_CH4U_acc_ack_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef MPIDI_CH4U_acc_ack_msg_t MPIDI_CH4U_get_acc_ack_msg_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_comm_req_list_t {
Packit Service c5cf8c
    MPIR_Comm *comm[2][4];
Packit Service c5cf8c
    MPIDI_CH4U_rreq_t *uelist[2][4];
Packit Service c5cf8c
} MPIDI_CH4U_comm_req_list_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIU_buf_pool_t {
Packit Service c5cf8c
    int size;
Packit Service c5cf8c
    int num;
Packit Service c5cf8c
    void *memory_region;
Packit Service c5cf8c
    struct MPIU_buf_pool_t *next;
Packit Service c5cf8c
    struct MPIU_buf_t *head;
Packit Service c5cf8c
    MPID_Thread_mutex_t lock;
Packit Service c5cf8c
} MPIU_buf_pool_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIU_buf_t {
Packit Service c5cf8c
    struct MPIU_buf_t *next;
Packit Service c5cf8c
    MPIU_buf_pool_t *pool;
Packit Service c5cf8c
    char data[];
Packit Service c5cf8c
} MPIU_buf_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct {
Packit Service c5cf8c
    int mmapped_size;
Packit Service c5cf8c
    int max_n_avts;
Packit Service c5cf8c
    int n_avts;
Packit Service c5cf8c
    int next_avtid;
Packit Service c5cf8c
    int *free_avtid;
Packit Service c5cf8c
} MPIDI_CH4_avt_manager;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct {
Packit Service c5cf8c
    uint64_t key;
Packit Service c5cf8c
    void *value;
Packit Service c5cf8c
    UT_hash_handle hh;          /* makes this structure hashable */
Packit Service c5cf8c
} MPIDI_CH4U_map_entry_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4U_map_t {
Packit Service c5cf8c
    MPIDI_CH4U_map_entry_t *head;
Packit Service c5cf8c
} MPIDI_CH4U_map_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct {
Packit Service c5cf8c
    unsigned mt_model;
Packit Service c5cf8c
} MPIDI_CH4_configurations_t;
Packit Service c5cf8c
Packit Service c5cf8c
typedef struct MPIDI_CH4_Global_t {
Packit Service c5cf8c
    MPIR_Request *request_test;
Packit Service c5cf8c
    MPIR_Comm *comm_test;
Packit Service c5cf8c
    int pname_set;
Packit Service c5cf8c
    int pname_len;
Packit Service c5cf8c
    char pname[MPI_MAX_PROCESSOR_NAME];
Packit Service c5cf8c
    int is_initialized;
Packit Service c5cf8c
    MPIDI_CH4_avt_manager avt_mgr;
Packit Service c5cf8c
    int is_ch4u_initialized;
Packit Service c5cf8c
    int **node_map, max_node_id;
Packit Service c5cf8c
    MPIDI_CH4U_comm_req_list_t *comm_req_lists;
Packit Service c5cf8c
    OPA_int_t active_progress_hooks;
Packit Service c5cf8c
    MPIR_Commops MPIR_Comm_fns_store;
Packit Service c5cf8c
    progress_hook_slot_t progress_hooks[MAX_PROGRESS_HOOKS];
Packit Service c5cf8c
    MPID_Thread_mutex_t m[3];
Packit Service c5cf8c
    MPIDI_CH4U_map_t *win_map;
Packit Service c5cf8c
    char *jobid;
Packit Service c5cf8c
#ifndef MPIDI_CH4U_USE_PER_COMM_QUEUE
Packit Service c5cf8c
    MPIDI_CH4U_rreq_t *posted_list;
Packit Service c5cf8c
    MPIDI_CH4U_rreq_t *unexp_list;
Packit Service c5cf8c
#endif
Packit Service c5cf8c
    MPIDI_CH4U_req_ext_t *cmpl_list;
Packit Service c5cf8c
    OPA_int_t exp_seq_no;
Packit Service c5cf8c
    OPA_int_t nxt_seq_no;
Packit Service c5cf8c
    MPIU_buf_pool_t *buf_pool;
Packit Service c5cf8c
#ifdef HAVE_SIGNAL
Packit Service c5cf8c
    void (*prev_sighandler) (int);
Packit Service c5cf8c
    volatile int sigusr1_count;
Packit Service c5cf8c
    int my_sigusr1_count;
Packit Service c5cf8c
#endif
Packit Service c5cf8c
    OPA_int_t progress_count;
Packit Service c5cf8c
Packit Service c5cf8c
    MPID_Thread_mutex_t vni_lock;
Packit Service c5cf8c
#if defined(MPIDI_CH4_USE_WORK_QUEUES)
Packit Service c5cf8c
    MPIDI_workq_t workqueue;
Packit Service c5cf8c
#endif
Packit Service c5cf8c
    MPIDI_CH4_configurations_t settings;
Packit Service c5cf8c
} MPIDI_CH4_Global_t;
Packit Service c5cf8c
extern MPIDI_CH4_Global_t MPIDI_CH4_Global;
Packit Service c5cf8c
#ifdef MPL_USE_DBG_LOGGING
Packit Service c5cf8c
extern MPL_dbg_class MPIDI_CH4_DBG_GENERAL;
Packit Service c5cf8c
extern MPL_dbg_class MPIDI_CH4_DBG_MAP;
Packit Service c5cf8c
extern MPL_dbg_class MPIDI_CH4_DBG_COMM;
Packit Service c5cf8c
extern MPL_dbg_class MPIDI_CH4_DBG_MEMORY;
Packit Service c5cf8c
#endif
Packit Service c5cf8c
#define MPIDI_CH4I_THREAD_PROGRESS_MUTEX  MPIDI_CH4_Global.m[0]
Packit Service c5cf8c
#define MPIDI_CH4I_THREAD_PROGRESS_HOOK_MUTEX  MPIDI_CH4_Global.m[1]
Packit Service c5cf8c
#define MPIDI_CH4I_THREAD_UTIL_MUTEX  MPIDI_CH4_Global.m[2]
Packit Service c5cf8c
Packit Service c5cf8c
#endif /* CH4_TYPES_H_INCLUDED */