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