Program Listing for File omp.h

Program Listing for File omp.h#

Return to documentation for file (src/frontend/SageIII/omp.h)

#ifndef _OMP_H_DEF
#define _OMP_H_DEF

#include <stdlib.h> // support size_t

/*
Updated to support OpenMP 4.5, B.1 page 327

Liao 10/10/2016

From the specification 3.0, Chapter 3.1, page 108
What to put into this file:
* The prototypes of all the runtime library routines, with "C" linkage
* The type omp_lock_t
* The type omp_nest_lock_t
* The type omp_sched_t

Specification 3.0 page 302
D.1 Example of the omp.h Header File
 * */
// This is not correct. omp.h is not required to trigger _OPENMP macro
//#define _OPENMP 201511

typedef void *omp_lock_t;  /* represented as a pointer */
typedef void *omp_nest_lock_t; /* represented as a pointer */
typedef void *omp_depend_t;

/*
* define the lock hints
*/
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
    /* , Add vendor specific constants for lock hints here,
       starting from the most-significant bit. */
} omp_lock_hint_t;


/*
*  define the schedule kinds
*/

typedef enum omp_sched_t
{
  omp_sched_static = 1,
  omp_sched_dynamic = 2,
  omp_sched_guided = 3,
  omp_sched_auto = 4
} omp_sched_t;

/*
* define the proc bind values
*/
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;


#ifdef __cplusplus
extern "C" {
#endif

/*
 * Execution Environment Functions
 */
extern void omp_set_num_threads(int num);
extern int omp_get_num_threads(void);
extern int omp_get_max_threads(void);
extern int omp_get_thread_num(void);
extern int omp_get_num_procs(void);

int omp_in_parallel(void);
void omp_set_dynamic(int dynamic_thds);
int omp_get_dynamic(void);

int omp_get_cancellation(void);

void omp_set_nested(int n_nested);
int omp_get_nested(void);

/*
 * Other internal variables
 */

void omp_set_schedule (omp_sched_t, int);
void omp_get_schedule (omp_sched_t *, int *);
int omp_get_thread_limit (void);
void omp_set_max_active_levels (int);
int omp_get_max_active_levels (void);
int omp_get_level (void);
int omp_get_ancestor_thread_num (int);
int omp_get_team_size (int);
int omp_get_active_level (void);

int omp_in_final(void);
omp_proc_bind_t omp_get_proc_bind(void);
int omp_get_num_places(void);
int omp_get_place_num_procs(int place_num);
void omp_get_place_proc_ids(int place_num, int *ids);
int omp_get_place_num(void);
int omp_get_partition_num_places(void);
void omp_get_partition_place_nums(int *place_nums);

/*
 * Support accelerators as target devices
 */

void omp_set_default_device(int device_num);
int omp_get_default_device(void);

/*  find the max number of devices on the system */
int omp_get_max_devices(void);
/* set number of active devices to be used */
void omp_set_num_devices(int);

/* get number of available devices */
int omp_get_num_devices(void);
// GCC 4.0 provides omp_get_num_devices() already, but without supporting GPUs
// I have to use another function to bypass it
int xomp_get_num_devices(void);

int omp_get_num_teams(void);
int omp_get_team_num(void);

int omp_is_initial_device(void);
int omp_get_initial_device(void);
int omp_get_max_task_priority(void);

/*
 * Lock Functions
 */
void omp_init_lock(omp_lock_t *lock);
void omp_init_lock_with_hint(omp_lock_t *lock,
                                    omp_lock_hint_t hint);
void omp_destroy_lock(omp_lock_t *lock);
void omp_set_lock(omp_lock_t *lock);
void omp_unset_lock(omp_lock_t *lock);
int omp_test_lock(omp_lock_t *lock);
void omp_init_nest_lock(omp_nest_lock_t *lock);
void omp_init_nest_lock_with_hint(omp_nest_lock_t *lock,
                                         omp_lock_hint_t hint);
void omp_destroy_nest_lock(omp_nest_lock_t *lock);
void omp_set_nest_lock(omp_nest_lock_t *lock);
void omp_unset_nest_lock(omp_nest_lock_t *lock);
int omp_test_nest_lock(omp_nest_lock_t *lock);

/*
 * Timer routine
 */
double omp_get_wtime(void);
double omp_get_wtick(void);

void * omp_target_alloc(size_t _size, int _device_num);
void omp_target_free(void * device_ptr, int _device_num);
int omp_target_is_present(void * ptr, int _device_num);
int omp_target_memcpy(void *dst, void *src, size_t _length,
                      size_t dst_offset, size_t src_offset,
                      int dst_device_num, int src_device_num);

int omp_target_memcpy_rect(
                           void *dst, void *src,
                           size_t element_size,
                           int num_dims,
                           const size_t *volume,
                           const size_t *dst_offsets,
                           const size_t *src_offsets,
                           const size_t *dst_dimensions,
                           const size_t *src_dimensions,
                           int dst_device_num, int src_device_num);

int omp_target_associate_ptr(void * host_ptr,
                             void * device_ptr,
                             size_t _size,
                             size_t device_offset,
                             int device_num);

int omp_target_disassociate_ptr(void * ptr,
                                int device_num);


/*
 * FORTRAN Execution Environment Function Wrappers
 * Fortran stuff should be handled in omp_lib.h
void omp_set_num_threads_(int *num);
int omp_get_num_threads_(void);
int omp_get_max_threads_(void);
int omp_get_thread_num_(void);
int omp_get_num_procs_(void);
int omp_in_parallel_(void);
void omp_set_dynamic_(int *dynamic_thds);
int omp_get_dynamic_(void);
void omp_set_nested_(int *n_nested);
int omp_get_nested_(void);

 * FORTRAN Lock Function Wrappers
typedef unsigned int _omf77Lock_t;
void omp_init_lock_(_omf77Lock_t *lock);
void omp_init_nest_lock_(_omf77Lock_t *lock);
void omp_destroy_lock_(_omf77Lock_t *lock);
void omp_destroy_nest_lock_(_omf77Lock_t *lock);
void omp_set_lock_(_omf77Lock_t *lock);
void omp_set_nest_lock_(_omf77Lock_t *lock);
void omp_unset_lock_(_omf77Lock_t *lock);
void omp_unset_nest_lock_(_omf77Lock_t *lock);
int omp_test_lock_(_omf77Lock_t *lock);
int omp_test_nest_lock_(_omf77Lock_t *lock);

*/
#ifdef __cplusplus
} /* closing brace for extern "C" */
#endif

#endif /* _OMP_H_DEF */