/**********************************************************************/ /* */ /* Licensed Materials - Property of IBM. */ /* IBM XL C/C++ for Linux, V16.1.1 (RC 3) */ /* IBM XL Fortran for Linux, V16.1.1 (RC 3) */ /* Copyright IBM Corp. 2012, 2013. */ /* US Government Users Restricted Rights - */ /* Use, duplication or disclosure restricted by */ /* GSA ADP Schedule Contract with IBM Corp. */ /* */ /**********************************************************************/ /***************************************************************************** * IBM Light OpenMP C++ Implementation *****************************************************************************/ #ifndef _OMP_H_ #define _OMP_H_ 1 #include #include #include #include /***************************************************************************** * Defines *****************************************************************************/ /* identify LOMP runtime, and provide its version number */ #define _LOMP 1.1 /* local defines (undef at end) */ #ifdef __cplusplus #define _OMP_EXTERN extern "C" #define _OMP_INLINE static inline #else #define _OMP_EXTERN extern #define _OMP_INLINE static __inline #endif /***************************************************************************** * OpenMP types *****************************************************************************/ typedef uint32_t omp_lock_t; /* arbitrary type of the right length */ typedef uint64_t omp_nest_lock_t; /* arbitrary type of the right length */ typedef enum omp_sched_t { omp_sched_static = 1, /* chunkSize >0 */ omp_sched_dynamic = 2, /* chunkSize >0 */ omp_sched_guided = 3, /* chunkSize >0 */ omp_sched_auto = 4, /* no chunkSize */ ibm_sched_affinity = 1000 /* deprecated IBM extension, use guided */ } omp_sched_t; typedef enum omp_proc_bind_t { omp_proc_bind_false = 0, omp_proc_bind_true = 1, omp_proc_bind_master = 2, omp_proc_bind_close = 3, omp_proc_bind_spread = 4 } omp_proc_bind_t; typedef enum omp_lock_hint_t { omp_lock_hint_none = 0, omp_lock_hint_uncontended = 1, omp_lock_hint_contended = 2, omp_lock_hint_nonspeculative = 4, omp_lock_hint_speculative = 8 } omp_lock_hint_t; typedef enum omp_pause_resource_t { omp_pause_soft = 1, omp_pause_hard = 2 } omp_pause_resource_t; /***************************************************************************** * Has OpenMP *****************************************************************************/ #if defined(_OPENMP) _OMP_EXTERN double omp_get_wtick(void); _OMP_EXTERN double omp_get_wtime(void); _OMP_EXTERN void omp_set_num_threads(int num); _OMP_EXTERN int omp_get_num_threads(void); _OMP_EXTERN int omp_get_max_threads(void); _OMP_EXTERN int omp_get_thread_limit(void); _OMP_EXTERN int omp_get_thread_num(void); _OMP_EXTERN int omp_get_num_procs(void); _OMP_EXTERN int omp_in_parallel(void); _OMP_EXTERN int omp_in_final(void); _OMP_EXTERN void omp_set_dynamic(int flag); _OMP_EXTERN int omp_get_dynamic(void); _OMP_EXTERN void omp_set_nested(int flag); _OMP_EXTERN int omp_get_nested(void); _OMP_EXTERN void omp_set_max_active_levels(int level); _OMP_EXTERN int omp_get_max_active_levels(void); _OMP_EXTERN int omp_get_level(void); _OMP_EXTERN int omp_get_active_level(void); _OMP_EXTERN int omp_get_ancestor_thread_num(int level); _OMP_EXTERN int omp_get_team_size(int level); #if ! defined(LOMP_API) _OMP_EXTERN void omp_init_lock(omp_lock_t *lock); _OMP_EXTERN void omp_init_lock_with_hint(omp_lock_t *lock, omp_lock_hint_t hint); _OMP_EXTERN void omp_init_nest_lock(omp_nest_lock_t *lock); _OMP_EXTERN void omp_init_nest_lock_with_hint(omp_nest_lock_t *lock, omp_lock_hint_t hint); _OMP_EXTERN void omp_destroy_lock(omp_lock_t *lock); _OMP_EXTERN void omp_destroy_nest_lock(omp_nest_lock_t *lock); _OMP_EXTERN void omp_set_lock(omp_lock_t *lock); _OMP_EXTERN void omp_set_nest_lock(omp_nest_lock_t *lock); _OMP_EXTERN void omp_unset_lock(omp_lock_t *lock); _OMP_EXTERN void omp_unset_nest_lock(omp_nest_lock_t *lock); _OMP_EXTERN int omp_test_lock(omp_lock_t *lock); _OMP_EXTERN int omp_test_nest_lock(omp_nest_lock_t *lock); #endif _OMP_EXTERN void omp_get_schedule(omp_sched_t * kind, int * modifier); _OMP_EXTERN void omp_set_schedule(omp_sched_t kind, int modifier); _OMP_EXTERN omp_proc_bind_t omp_get_proc_bind(void); _OMP_EXTERN int omp_get_cancellation(void); _OMP_EXTERN void omp_set_default_device(int deviceId); _OMP_EXTERN int omp_get_default_device(void); _OMP_EXTERN int omp_get_num_devices(void); _OMP_EXTERN int omp_get_num_teams(void); _OMP_EXTERN int omp_get_team_num(void); _OMP_EXTERN int omp_is_initial_device(void); _OMP_EXTERN int omp_get_initial_device(); _OMP_EXTERN void *omp_target_alloc(size_t size, int deviceId); _OMP_EXTERN void omp_target_free(void *devicePtr, int deviceId); _OMP_EXTERN int omp_target_is_present(void *hostAddr, int deviceId); _OMP_EXTERN int omp_target_associate_ptr(void *hostAddr, void *deviceAddr, size_t size, size_t deviceOffset, int deviceId); _OMP_EXTERN int omp_target_disassociate_ptr(void *hostAddr, int deviceId); _OMP_EXTERN int omp_target_memcpy(void *dstAddr, void *srcAddr, size_t length, size_t dstOffset, size_t srcOffset, int dstDeviceId, int srcDeviceId); _OMP_EXTERN int omp_target_memcpy_rect(void *dstAddr, void *srcAddr, size_t elementSize, int numDim, const size_t *volume, const size_t *dstOffset, const size_t *srcOffset, const size_t *dstDim, const size_t *srcDim, int dstDeviceId, int srcDeviceId); _OMP_EXTERN int omp_get_num_places(); _OMP_EXTERN int omp_get_place_num_procs(int place_num); _OMP_EXTERN void omp_get_place_proc_ids(int place_num, int *ids); _OMP_EXTERN int omp_get_place_num(); _OMP_EXTERN int omp_get_partition_num_places(); _OMP_EXTERN void omp_get_partition_place_nums(int *place_nums); _OMP_EXTERN int omp_get_max_task_priority(); _OMP_EXTERN int omp_pause_resource(omp_pause_resource_t kind, int device_num); _OMP_EXTERN int omp_pause_resource_all(omp_pause_resource_t kind); _OMP_EXTERN void omp_display_affinity(char const *format); _OMP_EXTERN size_t omp_capture_affinity(char *buffer, size_t size, char const *format); _OMP_EXTERN void omp_set_affinity_format(char const *format); _OMP_EXTERN size_t omp_get_affinity_format(char *buffer, size_t size); /* non standard */ _OMP_EXTERN void omp_set_proc_bind(omp_proc_bind_t kind); /* ibm specific */ _OMP_EXTERN int _xl_thread_binding(); _OMP_EXTERN int _xl_thread_place(); _OMP_EXTERN int _xlsmp_get_place_num(); _OMP_EXTERN unsigned int *_xlsmp_omp_places(); #else /***************************************************************************** * Does not have OpenMP *****************************************************************************/ _OMP_INLINE double omp_get_wtick(void) { return 0.0; } _OMP_INLINE double omp_get_wtime(void) { return 0.0; } _OMP_INLINE void omp_set_schedule(omp_sched_t kind, int modifier) { } _OMP_INLINE int omp_get_schedule(omp_sched_t * kind, int * modifier) { return omp_sched_static; } _OMP_INLINE void omp_set_num_threads(int num) { } _OMP_INLINE int omp_get_num_threads(void) { return 1; } _OMP_INLINE int omp_get_max_threads(void) { return 1; } _OMP_INLINE int omp_get_thread_limit(void) { return 1; } _OMP_INLINE int omp_get_thread_num(void) { return 0; } _OMP_INLINE int omp_get_num_procs(void) { return 1; } _OMP_INLINE int omp_in_parallel(void) { return 0; } _OMP_INLINE int omp_in_final(void) { return 0; } _OMP_INLINE void omp_set_dynamic(int flag) { } _OMP_INLINE int omp_get_dynamic(void) { return 0; } _OMP_INLINE void omp_set_nested(int flag) { } _OMP_INLINE int omp_get_nested(void) { return 0; } _OMP_INLINE void omp_set_max_active_levels(int level) { } _OMP_INLINE int omp_get_max_active_levels(int level) { return 1; } _OMP_INLINE int omp_get_level(void) { return 0; } _OMP_INLINE int omp_get_active_level(void) { return 0; } _OMP_INLINE int omp_get_ancestor_thread_num(int level) { return 0; } _OMP_INLINE int omp_get_team_size(int level) { return 1; } _OMP_INLINE void omp_init_lock(omp_lock_t *lock) { } _OMP_INLINE void omp_init_lock_with_hint(omp_lock_t *lock, omp_lock_hint_t hint) { } _OMP_INLINE void omp_destroy_lock(omp_lock_t *lock) { } _OMP_INLINE void omp_set_lock(omp_lock_t *lock) { } _OMP_INLINE void omp_unset_lock(omp_lock_t *lock) { } _OMP_INLINE int omp_test_lock(omp_lock_t *lock) { return 1; } _OMP_INLINE void omp_init_nest_lock(omp_nest_lock_t *lock) { *lock = 0; } _OMP_INLINE void omp_init_nest_lock_with_hint( omp_nest_lock_t *lock, omp_lock_hint_t hint) { *lock = 0; } _OMP_INLINE void omp_destroy_nest_lock(omp_nest_lock_t *lock) { } _OMP_INLINE void omp_set_nest_lock(omp_nest_lock_t *lock) { (*lock)++; } _OMP_INLINE void omp_unset_nest_lock(omp_nest_lock_t *lock) { (*lock)--; } _OMP_INLINE int omp_test_nest_lock(omp_nest_lock_t *lock) { (*lock)++; return *lock; } _OMP_INLINE omp_proc_bind_t omp_get_proc_bind(void) { return omp_proc_bind_false ;} _OMP_INLINE int omp_get_cancellation(void) { return 0; } _OMP_INLINE void omp_set_default_device(int deviceId) { } _OMP_INLINE int omp_get_default_device(void) { return 0; } _OMP_INLINE int omp_get_num_devices(void) { return 0; } _OMP_INLINE int omp_get_num_teams(void) { return 1; } _OMP_INLINE int omp_get_team_num(void) { return 0; } _OMP_INLINE int omp_is_initial_device(void) { return 1; } _OMP_INLINE int omp_get_initial_device() { return -10; } _OMP_INLINE void *omp_target_alloc(size_t size, int deviceId) { if (deviceId != -10) return 0; return malloc(size); } _OMP_INLINE void omp_target_free(void *devicePtr, int deviceId) { if (deviceId != -10) return; free(devicePtr); } _OMP_INLINE int omp_target_is_present(void *hostAddr, int deviceId) { return 1; } _OMP_INLINE int omp_target_associate_ptr(void *hostAddr, void *deviceAddr, size_t size, size_t deviceOffset, int deviceId) { return 1; /* error value */ } _OMP_INLINE int omp_target_disassociate_ptr(void *hostAddr, int deviceId) { return 1; /* error value */ } _OMP_INLINE int omp_target_memcpy(void *dstAddr, void *srcAddr, size_t length, size_t dstOffset, size_t srcOffset, int dstDeviceId, int srcDeviceId) { if (dstDeviceId != -10 || srcDeviceId != -10 || ! dstAddr || ! srcAddr) { return 1; /* error value */ } memcpy((void *)((char*) dstAddr+dstOffset), (const void *)((const char*) srcAddr+srcOffset), (size_t) length); return 0; } _OMP_INLINE int omp_target_memcpy_rect(void *dstAddr, void *srcAddr, size_t elementSize, int numDim, const size_t *volume, const size_t *dstOffset, const size_t *srcOffset, const size_t *dstDim, const size_t *srcDim, int dstDeviceId, int srcDeviceId) { /* request max dim supported, infinite */ if (!dstAddr && !srcAddr) return 0x7FFFFFFF; if (!volume || !dstOffset || !srcOffset || !dstDim || !srcDim || numDim<1) return 1; if (numDim == 1) { return omp_target_memcpy(dstAddr, srcAddr, elementSize*volume[0], elementSize*dstOffset[0], elementSize*srcOffset[0], dstDeviceId, srcDeviceId); } else { int i, rc; size_t dstSliceSize, srcSliceSize, dstOff, srcOff, s; dstSliceSize = elementSize; srcSliceSize = elementSize; for(i=1; i