226 lines
8.5 KiB
C
226 lines
8.5 KiB
C
/* 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 */
|