COMPASS  5.4.4
End-to-end AO simulation tool using GPU acceleration
carma_ipcs.h
1 // -----------------------------------------------------------------------------
2 // This file is part of COMPASS <https://anr-compass.github.io/compass/>
3 //
4 // Copyright (C) 2011-2023 COMPASS Team <https://github.com/ANR-COMPASS>
5 // All rights reserved.
6 // -----------------------------------------------------------------------------
7 
15 
16 #ifndef CARMA_IPCS_H
17 #define CARMA_IPCS_H
18 // cuda
19 #include <cuda.h>
20 // shms
21 #include <fcntl.h> /* For O_* constants */
22 #include <semaphore.h>
23 #include <sys/mman.h>
24 #include <sys/stat.h> /* For mode constants */
25 // malloc
26 #include <stdlib.h>
27 // getpid
28 #include <errno.h>
29 #include <limits.h>
30 #include <stdio.h>
31 #include <string.h>
32 #include <sys/types.h>
33 #include <unistd.h>
34 
35 #include <iterator>
36 #include <map>
37 
38 #define STAMP(fmt, args...) \
39  fprintf(stderr, "[%s@%d]:" fmt, __FUNCTION__, __LINE__, ##args)
40 
41 // todo: CIPCS_CHECK macro
42 
43 // sizeof(CUipcMemHandle) == sizeof(CUipcEventHandle)
44 // interessant !!
45 // possibilité d'unifier le tout et de déclarer moins de struct
46 // a creuseer
47 
48 typedef struct sh_cu_dptr_st {
49  char name[NAME_MAX + 1];
50  pid_t owner;
51  CUipcMemHandle handle;
52  sem_t var_mutex;
53 } sh_dptr;
54 
55 typedef struct sh_cu_event_st {
56  char name[NAME_MAX + 1];
57  pid_t owner;
58  CUipcEventHandle handle;
59  sem_t var_mutex;
60 } sh_event;
61 
62 typedef struct sh_buffer_st {
63  char name[NAME_MAX + 1];
64  bool isBoard;
65  size_t size;
66  size_t data_size;
67  unsigned int nb_proc;
68  void *p_shm;
69  sem_t mutex;
70  sem_t wait_pub;
71 } sh_buffer;
72 
73 typedef struct sh_barrier_st {
74  char name[NAME_MAX + 1];
75  bool valid;
76  unsigned int nb_proc;
77  unsigned int waiters_cnt;
78  unsigned int val;
79  sem_t b_sem;
80  sem_t var_mutex;
81 } sh_barrier;
82 
83 class CarmaIPCS {
84  private:
85  /*
86  maps used to control the shms
87  */
88  std::map<unsigned int, sh_dptr *> dptrs;
89  std::map<unsigned int, sh_event *> events;
90  std::map<unsigned int, sh_barrier *> barriers;
91  std::map<unsigned int, sh_buffer *> buffers;
92 
93  /*
94  General purpose methods
95  */
96  void *create_shm(const char *name, size_t size);
97  void *get_shm(const char *name);
98  void free_shm(const char *name, void *p_shm, size_t size);
99  void close_shm(void *p_shm, size_t size);
100  void complete_clean();
101 
102  /*
103  Transfer via CPU memory private methods
104  */
105  sh_buffer *get_elem_tshm(unsigned int id);
106  int write_gpu(void *dst, CUdeviceptr src, size_t bsize);
107  int read_gpu(CUdeviceptr dst, void *src, size_t bsize);
108 
109  public:
110  /*
111  general purpose methods
112  */
115 
116  /*
117  Cuda handles methods
118  */
119  // register a device pointer, id must be a non nul argument
120  int register_cudptr(unsigned int id, CUdeviceptr dptr);
121  // register an event, id must be a non nul argument
122  int register_cuevent(unsigned int id, CUevent event);
123 
124  // get a memory handle
125  int get_memHandle(unsigned int id, CUipcMemHandle *phandle);
126  // get a event handle
127  int get_eventHandle(unsigned int id, CUipcEventHandle *phandle);
128 
129  // free a memory handle shared mem space
130  void free_memHandle(unsigned int id);
131  // free a event handle shared event space
132  void free_eventHandle(unsigned int id);
133 
134  /*
135  Transfer via CPU memory methods
136  */
137  // allocation of the shm for memory tranfers
138  int alloc_transfer_shm(unsigned int id, size_t bsize, bool isBoard = false);
139  // return size in bytes of the transfer shm in bsize
140  int get_size_transfer_shm(unsigned int id, size_t *bsize);
141  // return actual data size used in bytes of the transfer shm in bsize
142  int get_datasize_transfer_shm(unsigned int id, size_t *bsize);
143  // map the shm buffer to the cuda device
144  int map_transfer_shm(unsigned int id);
145  // write to a transfer shm referenced by id
146  int write_transfer_shm(unsigned int id, const void *src, size_t bsize,
147  bool gpuBuffer = false);
148  // reads from a transfer shm referenced by id
149  int read_transfer_shm(unsigned int id, void *dst, size_t bsize,
150  bool gpuBuffer = false);
151  // map the shm buffer to the cuda device
152  int unmap_transfer_shm(unsigned int id);
153  // free transfer shm ref by id
154  void free_transfer_shm(unsigned int id);
155 
156  /*
157  Barrier methods
158  */
159  // initialize a barrier with value the number of process who will call
160  // wait_barrier
161  int init_barrier(unsigned int id, unsigned int value);
162  // wait for the other process subscribed to the barrier
163  int wait_barrier(unsigned int id);
164  // free the barrier structure, all blocked process will be unlocked<
165  void free_barrier(unsigned int id);
166 };
167 
168 #endif // CARMA_IPCS_H
void free_transfer_shm(unsigned int id)
int read_transfer_shm(unsigned int id, void *dst, size_t bsize, bool gpuBuffer=false)
int get_datasize_transfer_shm(unsigned int id, size_t *bsize)
int register_cudptr(unsigned int id, CUdeviceptr dptr)
int get_memHandle(unsigned int id, CUipcMemHandle *phandle)
int init_barrier(unsigned int id, unsigned int value)
void free_eventHandle(unsigned int id)
int wait_barrier(unsigned int id)
int get_eventHandle(unsigned int id, CUipcEventHandle *phandle)
int register_cuevent(unsigned int id, CUevent event)
int write_transfer_shm(unsigned int id, const void *src, size_t bsize, bool gpuBuffer=false)
void free_memHandle(unsigned int id)
void free_barrier(unsigned int id)
int get_size_transfer_shm(unsigned int id, size_t *bsize)
int map_transfer_shm(unsigned int id)
int unmap_transfer_shm(unsigned int id)
int alloc_transfer_shm(unsigned int id, size_t bsize, bool isBoard=false)
char name[NAME_MAX+1]
Definition: carma_ipcs.h:74
unsigned int waiters_cnt
Definition: carma_ipcs.h:77
sem_t var_mutex
Definition: carma_ipcs.h:80
unsigned int nb_proc
Definition: carma_ipcs.h:76
unsigned int val
Definition: carma_ipcs.h:78
size_t size
Definition: carma_ipcs.h:65
bool isBoard
Definition: carma_ipcs.h:64
sem_t mutex
Definition: carma_ipcs.h:69
size_t data_size
Definition: carma_ipcs.h:66
sem_t wait_pub
Definition: carma_ipcs.h:70
void * p_shm
Definition: carma_ipcs.h:68
unsigned int nb_proc
Definition: carma_ipcs.h:67
char name[NAME_MAX+1]
Definition: carma_ipcs.h:63
CUipcMemHandle handle
Definition: carma_ipcs.h:51
sem_t var_mutex
Definition: carma_ipcs.h:52
char name[NAME_MAX+1]
Definition: carma_ipcs.h:49
sem_t var_mutex
Definition: carma_ipcs.h:59
CUipcEventHandle handle
Definition: carma_ipcs.h:58
char name[NAME_MAX+1]
Definition: carma_ipcs.h:56