blob: db3cad3db25040dd2ff13e5d66817129f8037b80 [file] [log] [blame]
/* Copyright (C) The GNU Toolchain Authors.
Contributed by Mohamed Atef <mohamedatef1698@gmail.com>.
This file is part of the GNU Offloading and Multi Processing Library
(libgomp).
Libgomp is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* This file contains data types and declarations of functions that are not
provided by the book but we find them necessary. */
#ifndef _OMPD_HELPER_H
#define _OMPD_HELPER_H
#ifdef __cplusplus
extern "C" {
#endif
#include "omp-tools.h"
#include "ompd-types.h"
#include "config.h"
#include <assert.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <stdbool.h>
#define stringize(x) stringize1(x)
#define stringize1(x) #x
#define OMPD_VERSION 202011
extern const ompd_callbacks_t *callbacks;
extern __UINT64_TYPE__ gompd_state;
extern ompd_device_type_sizes_t target_sizes;
typedef struct _ompd_aspace_handle
{
ompd_address_space_context_t *context;
ompd_device_t kind;
} ompd_address_space_handle_t;
typedef struct _ompd_thread_handle
{
ompd_address_space_handle_t *ah;
ompd_thread_context_t *thread_context;
ompd_address_t th;
} ompd_thread_handle_t;
typedef struct _ompd_parallel_handle
{
ompd_address_space_handle_t *ah;
ompd_address_t th;
} ompd_parallel_handle_t;
typedef struct _ompd_task_handle
{
ompd_address_space_handle_t *ah;
ompd_address_t th;
} ompd_task_handle_t;
#define CHECK_RET(ret) \
do { \
if (ret != ompd_rc_ok) \
return ret; \
} while (0)
#define GET_VALUE(context, thread_context, name, output, dist_buf, size, \
count, ret, symbol_addr) \
do { \
ret = callbacks->symbol_addr_lookup (context, thread_context, name, \
&symbol_addr, NULL); \
CHECK_RET (ret); \
ret = callbacks->read_memory (context, thread_context, &symbol_addr, size, \
&dist_buf); \
CHECK_RET (ret); \
ret = callbacks->device_to_host (context, &dist_buf, size, count, &output);\
CHECK_RET (ret); \
} while (0)
#define DEREFERENCE(context, thread_context, symbol_addr, size, count,\
buff, ret, is_ptr) \
do {\
ret = callbacks->read_memory (context, thread_context, &symbol_addr, \
size, &buff); \
CHECK_RET (ret); \
ret = callbacks->device_to_host (context, &buff, size, count, &buff); \
CHECK_RET (ret); \
if (is_ptr) \
symbol_addr.address = buff; \
} while (0);
#define ACCESS_VALUE(context, thread_context, name, temp_offset, \
access_pointer, ret, symbol_addr, temp_sym_addr, temp_addr) \
do { \
GET_VALUE (context, thread_context, name, temp_offset, temp_offset, \
target_sizes.sizeof_short, 1, ret, temp_sym_addr); \
symbol_addr.address += temp_offset; \
for (int i = 0; i < access_pointer; i++) \
DEREFERENCE (context, thread_context, symbol_addr, \
target_sizes.sizeof_pointer, 1, temp_addr, ret, 1); \
} while (0);
#define CHECK(ah) \
do { \
if (ah == NULL || ah->context == NULL) \
return ompd_rc_stale_handle; \
if (callbacks == NULL) \
return ompd_rc_callback_error; \
} while (0)
/* (var_name, string_name, scope). */
#define FOREACH_OMPD_ICV(ompd_icv) \
ompd_icv (nthreads_var, "nthread var", ompd_scope_thread) \
ompd_icv (thread_limit_var, "thread limit var", ompd_scope_task) \
ompd_icv (run_sched_var, "run sched limit var", ompd_scope_task) \
ompd_icv (run_sched_chunk_size, "run sched chunk size var", ompd_scope_task) \
ompd_icv (default_device_var, "default device var", ompd_scope_thread) \
ompd_icv (dyn_var, "dynamic var", ompd_scope_thread) \
ompd_icv (max_active_levels_var, "max active level var", ompd_scope_task) \
ompd_icv (bind_var, "proc bind var", ompd_scope_task) \
ompd_icv (cancellation_var, "cancel var", ompd_scope_address_space) \
ompd_icv (max_task_priority_var, "max task priority var", \
ompd_scope_address_space) \
ompd_icv (stacksize_var, "stack size var", ompd_scope_address_space) \
ompd_icv (debug_var, "debug var", ompd_scope_address_space) \
ompd_icv (ompd_state, "OMP_DEBUG", ompd_scope_address_space) \
ompd_icv (display_affinity_var, "display affinity var", \
ompd_scope_address_space) \
ompd_icv (affinity_format_var, "affinity format var", \
ompd_scope_address_space) \
ompd_icv (affinity_format_len_var, "affinity format len var", \
ompd_scope_address_space) \
ompd_icv (wait_policy_var, "wait policy var", ompd_scope_address_space) \
ompd_icv (num_teams_var, "num teams var", ompd_scope_address_space) \
ompd_icv (teams_thread_limit_var, "teams thread limit var", \
ompd_scope_address_space) \
ompd_icv (spin_count_var, "spin count var", ompd_scope_address_space) \
ompd_icv (num_proc_var, "num proc var", ompd_scope_address_space) \
ompd_icv (throttled_spin_count_var, "throttled spin count var", \
ompd_scope_address_space) \
ompd_icv (managed_threads_var, "managed threads var", \
ompd_scope_address_space) \
ompd_icv (thread_num_var, "thread num var", ompd_scope_thread) \
ompd_icv (final_task_var, "final task var", ompd_scope_task) \
ompd_icv (implicit_task_var, "implicit task var", ompd_scope_task) \
ompd_icv (team_size_var, "team size var", ompd_scope_parallel)
enum ompd_icv
{
gompd_icv_undefined_var = 0,
#define gompd_icv_iterator(var_name, string_name, scope) gompd_icv_##var_name,
FOREACH_OMPD_ICV (gompd_icv_iterator)
#undef gompd_icv_iterator
gompd_last_icv_var
};
#ifdef HAVE_ATTRIBUTE_VISIBILITY
#pragma GCC visibility push(hidden)
#endif
ompd_rc_t gompd_get_sizes (ompd_address_space_context_t *);
/* Get Local internal control variables. */
ompd_rc_t gompd_get_nthread (ompd_thread_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_thread_limit (ompd_task_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_run_sched (ompd_task_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_run_sched_chunk_size (ompd_task_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_default_device (ompd_thread_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_dynamic (ompd_thread_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_max_active_levels (ompd_task_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_proc_bind (ompd_task_handle_t *, const char **);
ompd_rc_t gompd_is_final (ompd_task_handle_t *, ompd_word_t *);
ompd_rc_t gompd_is_implicit (ompd_task_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_team_size (ompd_parallel_handle_t *, ompd_word_t *);
/* Get Global ICVs. */
ompd_rc_t gompd_get_cancellation (ompd_address_space_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_max_task_priority (ompd_address_space_handle_t *,
ompd_word_t *);
ompd_rc_t gompd_get_stacksize (ompd_address_space_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_debug (ompd_address_space_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_display_affinity (ompd_address_space_handle_t *,
ompd_word_t *);
ompd_rc_t gompd_get_affinity_format (ompd_address_space_handle_t *,
const char **);
ompd_rc_t gompd_get_affinity_format_len (ompd_address_space_handle_t *,
ompd_word_t *);
ompd_rc_t gompd_get_wait_policy (ompd_address_space_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_num_teams (ompd_address_space_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_teams_thread_limit (ompd_address_space_handle_t *,
ompd_word_t *);
ompd_rc_t gompd_get_spin_count (ompd_address_space_handle_t *, ompd_word_t *);
ompd_rc_t gompd_get_available_cpus (ompd_address_space_handle_t *,
ompd_word_t *);
ompd_rc_t gompd_get_throttled_spin_count (ompd_address_space_handle_t *,
ompd_word_t *);
ompd_rc_t gompd_get_managed_threads (ompd_address_space_handle_t *,
ompd_word_t *);
ompd_rc_t gompd_get_gompd_enabled (ompd_address_space_handle_t *,
const char **);
/*End of Global ICVs. */
#ifdef HAVE_ATTRIBUTE_VISIBILITY
#pragma GCC visibility pop
#endif
#ifdef __cplusplus
} // extern C
#endif
#endif /* _OMPD_HELPER_H */