1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 #ifndef MCA_BTL_SMCUDA_SEND_FRAG_H
  28 #define MCA_BTL_SMCUDA_SEND_FRAG_H
  29 
  30 #include "opal_config.h"
  31 #include "btl_smcuda.h"
  32 
  33 #if OPAL_CUDA_SUPPORT
  34 #include "opal/mca/common/cuda/common_cuda.h"
  35 #endif
  36 
  37 #define MCA_BTL_SMCUDA_FRAG_TYPE_MASK ((uintptr_t)0x3)
  38 #define MCA_BTL_SMCUDA_FRAG_SEND ((uintptr_t)0x0)
  39 #define MCA_BTL_SMCUDA_FRAG_ACK ((uintptr_t)0x1)
  40 #define MCA_BTL_SMCUDA_FRAG_PUT ((uintptr_t)0x2)
  41 #define MCA_BTL_SMCUDA_FRAG_GET ((uintptr_t)0x3)
  42 
  43 #define MCA_BTL_SMCUDA_FRAG_STATUS_MASK ((uintptr_t)0x4)
  44 
  45 struct mca_btl_smcuda_frag_t;
  46 
  47 struct mca_btl_smcuda_hdr_t {
  48     struct mca_btl_smcuda_frag_t *frag;
  49     size_t len;
  50     int my_smp_rank;
  51     mca_btl_base_tag_t tag;
  52 };
  53 typedef struct mca_btl_smcuda_hdr_t mca_btl_smcuda_hdr_t;
  54 
  55 #if OPAL_CUDA_SUPPORT
  56 struct mca_btl_base_registration_handle_t {
  57     mca_rcache_common_cuda_reg_data_t reg_data;
  58 };
  59 #endif
  60 
  61 struct mca_btl_smcuda_segment_t {
  62     mca_btl_base_segment_t base;
  63 #if OPAL_CUDA_SUPPORT
  64     uint8_t key[128]; 
  65     
  66     opal_ptr_t memh_seg_addr;
  67      
  68     uint32_t memh_seg_len;
  69 #endif 
  70 };
  71 typedef struct mca_btl_smcuda_segment_t mca_btl_smcuda_segment_t;
  72 
  73 
  74 
  75 
  76 struct mca_btl_smcuda_frag_t {
  77     mca_btl_base_descriptor_t base;
  78     mca_btl_base_segment_t segment;
  79     struct mca_btl_base_endpoint_t *endpoint;
  80 #if OPAL_CUDA_SUPPORT
  81     struct mca_rcache_base_registration_t *registration;
  82     struct mca_btl_base_registration_handle_t *local_handle;
  83 #endif 
  84     size_t size;
  85     
  86     mca_btl_smcuda_hdr_t *hdr;
  87     opal_free_list_t* my_list;
  88 };
  89 typedef struct mca_btl_smcuda_frag_t mca_btl_smcuda_frag_t;
  90 typedef struct mca_btl_smcuda_frag_t mca_btl_smcuda_frag1_t;
  91 typedef struct mca_btl_smcuda_frag_t mca_btl_smcuda_frag2_t;
  92 typedef struct mca_btl_smcuda_frag_t mca_btl_smcuda_user_t;
  93 
  94 
  95 OBJ_CLASS_DECLARATION(mca_btl_smcuda_frag_t);
  96 OBJ_CLASS_DECLARATION(mca_btl_smcuda_frag1_t);
  97 OBJ_CLASS_DECLARATION(mca_btl_smcuda_frag2_t);
  98 OBJ_CLASS_DECLARATION(mca_btl_smcuda_user_t);
  99 
 100 #define MCA_BTL_SMCUDA_FRAG_ALLOC_EAGER(frag)                           \
 101 {                                                                       \
 102     frag = (mca_btl_smcuda_frag_t *)                                    \
 103         opal_free_list_get (&mca_btl_smcuda_component.sm_frags_eager);  \
 104 }
 105 
 106 #define MCA_BTL_SMCUDA_FRAG_ALLOC_MAX(frag)                             \
 107 {                                                                       \
 108     frag = (mca_btl_smcuda_frag_t *)                                    \
 109         opal_free_list_get (&mca_btl_smcuda_component.sm_frags_max);    \
 110 }
 111 
 112 #define MCA_BTL_SMCUDA_FRAG_ALLOC_USER(frag)                            \
 113 {                                                                       \
 114     frag = (mca_btl_smcuda_frag_t *)                                    \
 115         opal_free_list_get (&mca_btl_smcuda_component.sm_frags_user);   \
 116 }
 117 
 118 #define MCA_BTL_SMCUDA_FRAG_RETURN(frag)                                \
 119 {                                                                       \
 120     opal_free_list_return (frag->my_list, (opal_free_list_item_t*)(frag)); \
 121 }
 122 #endif