Lightweight Parallel Foundations 1.0.1-alpha 2023-06-26T11:02:34Z
A high performance and model-compliant communication layer
bsp.h
Go to the documentation of this file.
1
2/*
3 * Copyright 2021 Huawei Technologies Co., Ltd.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#ifndef LPFLIB_BSPLIB_WRAPPER_H
19#define LPFLIB_BSPLIB_WRAPPER_H
20
60#include <stddef.h>
61
62// Symbol visibility macros
63// copied from https://gcc.gnu.org/wiki/Visibility
64//
65// Generic helper definitions for shared library support
66#if defined _WIN32 || defined __CYGWIN__
67 #define BSPLIB_HELPER_DLL_IMPORT __declspec(dllimport)
68 #define BSPLIB_HELPER_DLL_EXPORT __declspec(dllexport)
69 #define BSPLIB_HELPER_DLL_LOCAL
70#else
71 #if __GNUC__ >= 4
72 #define BSPLIB_HELPER_DLL_IMPORT __attribute__ ((visibility ("default")))
73 #define BSPLIB_HELPER_DLL_EXPORT __attribute__ ((visibility ("default")))
74 #define BSPLIB_HELPER_DLL_LOCAL __attribute__ ((visibility ("hidden")))
75 #else
76 #ifndef DOXYGEN
77 #define BSPLIB_HELPER_DLL_IMPORT
78 #define BSPLIB_HELPER_DLL_EXPORT
79 #define BSPLIB_HELPER_DLL_LOCAL
80 #endif
81 #endif
82#endif
83
84// Now we use the generic helper definitions above to define BSPLIB_API and
85// BSPLIB_LOCAL. BSPLIB_API is used for the public API symbols. It either DLL
86// imports or DLL exports (or does nothing for static build). BSPLIB_LOCAL is
87// used for non-api symbols.
88
89#ifdef BSPLIB_DLL // defined if BSPLIB is compiled as a DLL
90 #ifdef BSPLIB_DLL_EXPORTS // defined if we are building the BSPLIB DLL (instead of using it)
91 #define BSPLIB_API BSPLIB_HELPER_DLL_EXPORT
92 #else
93 #define BSPLIB_API BSPLIB_HELPER_DLL_IMPORT
94 #endif // BSPLIB_DLL_EXPORTS
95 #define BSPLIB_LOCAL BSPLIB_HELPER_DLL_LOCAL
96#else // BSPLIB_DLL is not defined: this means BSPLIB is a static lib.
97 #ifndef DOXYGEN
98 #define BSPLIB_API
99 #define BSPLIB_LOCAL
100 #endif
101#endif // BSPLIB_DLL
102
103
104# ifdef __cplusplus
105extern "C"
106{
107# endif
108
109
110# if LPF_USE_MCBSP_API
121 typedef unsigned int bsp_pid_t;
122
128 typedef unsigned int bsp_nprocs_t;
129
136 typedef size_t bsp_size_t;
137
143 static const bsp_size_t bsp_size_unavailable = (bsp_size_t) -1;
144
162# define mcbsp_disable_checkpointing() /* empty */
163
169# define mcbsp_enable_checkpointing() /* empty */
170
175#ifndef DOXYGEN
176#define bsp_init bsplibstd_init
177#define bsp_abort bsplibstd_abort
178#define bsp_time bsplibstd_time
179#define bsp_sync bsplibstd_sync
180#define bsp_nprocs mcbsp_nprocs
181#define bsp_pid mcbsp_pid
182#define bsp_push_reg mcbsp_push_reg
183#define bsp_pop_reg bsplibstd_pop_reg
184#define bsp_put mcbsp_put
185#define bsp_hpput mcbsp_hpput
186#define bsp_get mcbsp_get
187#define bsp_hpget mcbsp_hpget
188#define bsp_set_tagsize mcbsp_set_tagsize
189#define bsp_send mcbsp_send
190#define bsp_hpsend mcbsp_hpsend
191#define bsp_qsize mcbsp_qsize
192#define bsp_get_tag mcbsp_get_tag
193#define bsp_move mcbsp_move
194#define bsp_hpmove mcbsp_hpmove
195#endif
196
197#else
198
199#ifndef DOXYGEN
200#define bsp_init bsplibstd_init
201#define bsp_abort bsplibstd_abort
202#define bsp_time bsplibstd_time
203#define bsp_sync bsplibstd_sync
204#define bsp_nprocs bsplibstd_nprocs
205#define bsp_pid bsplibstd_pid
206#define bsp_push_reg bsplibstd_push_reg
207#define bsp_pop_reg bsplibstd_pop_reg
208#define bsp_put bsplibstd_put
209#define bsp_hpput bsplibstd_hpput
210#define bsp_get bsplibstd_get
211#define bsp_hpget bsplibstd_hpget
212#define bsp_set_tagsize bsplibstd_set_tagsize
213#define bsp_send bsplibstd_send
214#define bsp_hpsend bsplibstd_hpsend
215#define bsp_qsize bsplibstd_qsize
216#define bsp_get_tag bsplibstd_get_tag
217#define bsp_move bsplibstd_move
218#define bsp_hpmove bsplibstd_hpmove
219#endif
220
221
222#endif
223
224
314#ifdef DOXYGEN
315 void bsp_init( void ( *spmd_part ) ( void ), int argc, char *argv[] );
316#else
317 extern BSPLIB_API
318 void bsplibstd_init( void ( *spmd_part ) ( void ), int argc, char *argv[] );
319#endif
320
345#ifdef DOXYGEN
346 void bsp_begin( int maxprocs );
347#else
348
349 #define bsp_begin( maxprocs ) \
350 do { if ( bsplibstd_spawn( (unsigned int) maxprocs )) goto __bsplibstd_end_label ; } while(0)
351
352 extern BSPLIB_API
353 int bsplibstd_spawn( unsigned int maxprocs );
354#endif
355
376#ifdef DOXYGEN
377 void bsp_end( void );
378#else
379
380 #define bsp_end() bsplibstd_end(); __bsplibstd_end_label:
381
382 extern BSPLIB_API
383 void bsplibstd_end( void );
384#endif
385
386
398#ifdef DOXYGEN
399 void bsp_abort( const char *format, ... );
400#else
401 extern BSPLIB_API
402 void bsplibstd_abort( const char * format, ...);
403#endif
404
417#ifdef DOXYGEN
418 int bsp_nprocs( void );
419#else
420 extern BSPLIB_API
421 int bsplibstd_nprocs( void );
422
423 extern BSPLIB_API
424 unsigned int mcbsp_nprocs( void );
425#endif
426
439#ifdef DOXYGEN
440 int bsp_pid( void );
441#else
442 extern BSPLIB_API
443 int bsplibstd_pid( void );
444
445 extern BSPLIB_API
446 unsigned int mcbsp_pid( void );
447#endif
448
463#ifdef DOXYGEN
464 double bsp_time( void );
465#else
466 extern BSPLIB_API
467 double bsplibstd_time( void );
468#endif
469
502#ifdef DOXYGEN
503 void bsp_sync( void );
504#else
505 extern BSPLIB_API
506 void bsplibstd_sync( void );
507#endif
508
667#ifdef DOXYGEN
668 void bsp_push_reg( const void *ident, int size );
669#else
670 extern BSPLIB_API
671 void bsplibstd_push_reg( const void *ident, int size );
672
673 extern BSPLIB_API
674 void mcbsp_push_reg( const void *ident, size_t size );
675#endif
676
696#ifdef DOXYGEN
697 void bsp_pop_reg( const void *ident );
698#else
699 extern BSPLIB_API
700 void bsplibstd_pop_reg( const void * ident );
701#endif
702
745#ifdef DOXYGEN
746 void bsp_put( int pid, const void *src, void *dst,
747 int offset, int nbytes );
748#else
749 extern BSPLIB_API
750 void bsplibstd_put( int pid, const void *src, void *dst,
751 int offset, int nbytes );
752
753 extern BSPLIB_API
754 void mcbsp_put( unsigned int pid, const void *src, void *dst,
755 size_t offset, size_t nbytes );
756#endif
757
801#ifdef DOXYGEN
802 void bsp_hpput( int pid, const void *src, void *dst,
803 int offset, int nbytes );
804#else
805 extern BSPLIB_API
806 void bsplibstd_hpput( int pid, const void *src, void *dst,
807 int offset, int nbytes );
808
809 extern BSPLIB_API
810 void mcbsp_hpput( unsigned int pid, const void *src, void *dst,
811 size_t offset, size_t nbytes );
812#endif
813
855#ifdef DOXYGEN
856 void bsp_get( int pid, const void *src, int offset,
857 void *dst, int nbytes );
858#else
859 extern BSPLIB_API
860 void bsplibstd_get( int pid, const void *src, int offset,
861 void *dst, int nbytes );
862
863 extern BSPLIB_API
864 void mcbsp_get( unsigned int pid, const void *src, size_t offset,
865 void *dst, size_t nbytes );
866#endif
867
912#ifdef DOXYGEN
913 void bsp_hpget( int pid, const void *src, int offset,
914 void *dst, int nbytes );
915#else
916 extern BSPLIB_API
917 void bsplibstd_hpget( int pid, const void *src, int offset,
918 void *dst, int nbytes );
919
920 extern BSPLIB_API
921 void mcbsp_hpget( unsigned int pid, const void *src, size_t offset,
922 void *dst, size_t nbytes );
923#endif
924
1009#ifdef DOXYGEN
1010 void bsp_set_tagsize( int * tag_nbytes );
1011#else
1012 extern BSPLIB_API
1013 void bsplibstd_set_tagsize( int * tag_nbytes );
1014
1015 extern BSPLIB_API
1016 void mcbsp_set_tagsize( size_t * tag_nbytes );
1017#endif
1018
1019
1047#ifdef DOXYGEN
1048 void bsp_send( int pid, const void *tag, const void *payload,
1049 int payload_nbytes );
1050#else
1051 extern BSPLIB_API
1052 void bsplibstd_send( int pid, const void *tag, const void *payload,
1053 int payload_nbytes );
1054
1055 extern BSPLIB_API
1056 void mcbsp_send( unsigned int pid, const void *tag, const void *payload,
1057 size_t payload_nbytes );
1058#endif
1059
1060
1088#ifdef DOXYGEN
1089 void bsp_hpsend( int pid, const void *tag, const void *payload,
1090 int payload_nbytes );
1091#else
1092 extern BSPLIB_API
1093 void bsplibstd_hpsend( int pid, const void *tag, const void *payload,
1094 int payload_nbytes );
1095
1096 extern BSPLIB_API
1097 void mcbsp_hpsend( unsigned int pid, const void *tag, const void *payload,
1098 size_t payload_nbytes );
1099#endif
1100
1115#ifdef DOXYGEN
1116 void bsp_qsize( int * nmessages, int * accum_nbytes );
1117#else
1118 extern BSPLIB_API
1119 void bsplibstd_qsize( int * nmessages, int * accum_nbytes );
1120
1121 extern BSPLIB_API
1122 void mcbsp_qsize( unsigned int * nmessages, size_t * accum_nbytes );
1123#endif
1124
1125
1145#ifdef DOXYGEN
1146 void bsp_get_tag( int * status, void *tag );
1147#else
1148 extern BSPLIB_API
1149 void bsplibstd_get_tag( int * status, void *tag );
1150
1151 extern BSPLIB_API
1152 void mcbsp_get_tag( size_t * status, void *tag );
1153#endif
1154
1179#ifdef DOXYGEN
1180 void bsp_move( void *payload, int reception_bytes );
1181#else
1182 extern BSPLIB_API
1183 void bsplibstd_move( void *payload, int reception_bytes );
1184
1185 extern BSPLIB_API
1186 void mcbsp_move( void *payload, size_t reception_bytes );
1187#endif
1188
1189
1209#ifdef DOXYGEN
1210 int bsp_hpmove( const void **tag_ptr, const void **payload_ptr );
1211#else
1212 extern BSPLIB_API
1213 int bsplibstd_hpmove( const void **tag_ptr, const void **payload_ptr );
1214
1215 extern BSPLIB_API
1216 size_t mcbsp_hpmove( void **tag_ptr, void **payload_ptr );
1217#endif
1218
1224# ifdef __cplusplus
1225}
1226# endif
1227
1232#endif
int bsp_hpmove(const void **tag_ptr, const void **payload_ptr)
void bsp_send(int pid, const void *tag, const void *payload, int payload_nbytes)
void bsp_set_tagsize(int *tag_nbytes)
void bsp_hpsend(int pid, const void *tag, const void *payload, int payload_nbytes)
void bsp_move(void *payload, int reception_bytes)
void bsp_get_tag(int *status, void *tag)
void bsp_qsize(int *nmessages, int *accum_nbytes)
void bsp_hpput(int pid, const void *src, void *dst, int offset, int nbytes)
void bsp_get(int pid, const void *src, int offset, void *dst, int nbytes)
void bsp_push_reg(const void *ident, int size)
void bsp_put(int pid, const void *src, void *dst, int offset, int nbytes)
void bsp_pop_reg(const void *ident)
void bsp_hpget(int pid, const void *src, int offset, void *dst, int nbytes)
int bsp_nprocs(void)
int bsp_pid(void)
void bsp_sync(void)
void bsp_begin(int maxprocs)
void bsp_abort(const char *format,...)
void bsp_init(void(*spmd_part)(void), int argc, char *argv[])
double bsp_time(void)
void bsp_end(void)