public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] libgomp(OMPD PROJECT): add ICVs debugging information.
@ 2022-03-12  6:26 Mohamed Atef
  0 siblings, 0 replies; only message in thread
From: Mohamed Atef @ 2022-03-12  6:26 UTC (permalink / raw)
  To: gcc-patches, jakub, tobias

[-- Attachment #1: Type: text/plain, Size: 1796 bytes --]

Hi,
   This Patch contains the function that gets all global ICVs information,
and prototypes of local ICVs.

Notes:
1) gomp_affinity_format_len doesn't have a value so I assumed that
gomp_affinity_format has length 100 for now.

2) I didn't have any knowledge in OpenMP before this project,
so if any of the ICVs scopes is wrong please let me know.

I hope to hear from you soon, as we are running out of time.
Thanks



2022-03-12  Mohamed Atef  <mohamedatef1698@gmail.com>

        *Makefile.am: add ompd-icv to libgompd_la_SOURCES.
        *Makefile.in: Regenerate.
        *parallel.c: fixed the call of ompd_bp_parallel_begin, and
        ompd_bp_parallel_begin.
        *ompd-icv.c: New file.
        *omp-tools.h.in: fix soe writing formats.
        *ompd-helper.h: (struct ompd_thread_handle_t, struct
ompd_parallel_handle_t,
        struct ompd_task_handle_t, GET_VALUE macro, CHECK macro,
FOREACH_OMPD_ICV macro,
        enum ompd_icv,
        ): Defined
        (prototypes of ompd_get_nthread, ompd_get_thread_limit,
ompd_get_run_sched, ompd_get_run_sched_chunk_size,
        ompd_get_default_device, ompd_get_dynamic,
ompd_get_max_active_levels, ompd_get_proc_bind,
ompd_is_final,ompd_is_implicit,
        ompd_get_team_size, ompd_get_cancellation,
ompd_get_max_task_priority, ompd_get_stacksize, ompd_get_debug,
ompd_get_display_affinity,
        ompd_get_affinity_format, ompd_get_affinity_format_len,
ompd_get_wait_policy, ompd_get_num_teams, ompd_get_teams_thread_limit,
ompd_get_spin_count,
        ompd_get_available_cpus, ompd_get_throttled_spin_count, and
ompd_get_managed_threads): Added.
        *ompd-init.c: GET_VALUE is used instead of a ton of lines.
        *libgompd.map: (ompd_enumerate_icvs, ompd_get_icv_from_scope, and
ompd_get_icv_string_from_scope): exported.

[-- Attachment #2: diff.txt --]
[-- Type: text/plain, Size: 28537 bytes --]


 
diff --git a/libgomp/Makefile.am b/libgomp/Makefile.am
index 22a27df105e..20d0d62f473 100644
--- a/libgomp/Makefile.am
+++ b/libgomp/Makefile.am
@@ -93,7 +93,7 @@ libgomp_la_SOURCES = alloc.c atomic.c barrier.c critical.c env.c error.c \
 	priority_queue.c affinity-fmt.c teams.c allocator.c oacc-profiling.c \
 	oacc-target.c ompd-support.c
 
-libgompd_la_SOURCES = ompd-init.c ompd-helper.c
+libgompd_la_SOURCES = ompd-init.c ompd-helper.c ompd-icv.c
 include $(top_srcdir)/plugin/Makefrag.am
 
 if USE_FORTRAN
diff --git a/libgomp/Makefile.in b/libgomp/Makefile.in
index 8ecf6dcf192..df0986ee5c2 100644
--- a/libgomp/Makefile.in
+++ b/libgomp/Makefile.in
@@ -223,7 +223,7 @@ am_libgomp_la_OBJECTS = alloc.lo atomic.lo barrier.lo critical.lo \
 	oacc-target.lo ompd-support.lo $(am__objects_1)
 libgomp_la_OBJECTS = $(am_libgomp_la_OBJECTS)
 libgompd_la_LIBADD =
-am_libgompd_la_OBJECTS = ompd-init.lo ompd-helper.lo
+am_libgompd_la_OBJECTS = ompd-init.lo ompd-helper.lo ompd-icv.lo
 libgompd_la_OBJECTS = $(am_libgompd_la_OBJECTS)
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
@@ -258,15 +258,16 @@ am__depfiles_remade = ./$(DEPDIR)/affinity-fmt.Plo \
 	./$(DEPDIR)/oacc-mem.Plo ./$(DEPDIR)/oacc-parallel.Plo \
 	./$(DEPDIR)/oacc-plugin.Plo ./$(DEPDIR)/oacc-profiling.Plo \
 	./$(DEPDIR)/oacc-target.Plo ./$(DEPDIR)/ompd-helper.Plo \
-	./$(DEPDIR)/ompd-init.Plo ./$(DEPDIR)/ompd-support.Plo \
-	./$(DEPDIR)/ordered.Plo ./$(DEPDIR)/parallel.Plo \
-	./$(DEPDIR)/priority_queue.Plo ./$(DEPDIR)/proc.Plo \
-	./$(DEPDIR)/ptrlock.Plo ./$(DEPDIR)/scope.Plo \
-	./$(DEPDIR)/sections.Plo ./$(DEPDIR)/sem.Plo \
-	./$(DEPDIR)/single.Plo ./$(DEPDIR)/splay-tree.Plo \
-	./$(DEPDIR)/target.Plo ./$(DEPDIR)/task.Plo \
-	./$(DEPDIR)/team.Plo ./$(DEPDIR)/teams.Plo \
-	./$(DEPDIR)/time.Plo ./$(DEPDIR)/work.Plo
+	./$(DEPDIR)/ompd-icv.Plo ./$(DEPDIR)/ompd-init.Plo \
+	./$(DEPDIR)/ompd-support.Plo ./$(DEPDIR)/ordered.Plo \
+	./$(DEPDIR)/parallel.Plo ./$(DEPDIR)/priority_queue.Plo \
+	./$(DEPDIR)/proc.Plo ./$(DEPDIR)/ptrlock.Plo \
+	./$(DEPDIR)/scope.Plo ./$(DEPDIR)/sections.Plo \
+	./$(DEPDIR)/sem.Plo ./$(DEPDIR)/single.Plo \
+	./$(DEPDIR)/splay-tree.Plo ./$(DEPDIR)/target.Plo \
+	./$(DEPDIR)/task.Plo ./$(DEPDIR)/team.Plo \
+	./$(DEPDIR)/teams.Plo ./$(DEPDIR)/time.Plo \
+	./$(DEPDIR)/work.Plo
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -605,7 +606,7 @@ libgomp_la_SOURCES = alloc.c atomic.c barrier.c critical.c env.c \
 	oacc-async.c oacc-plugin.c oacc-cuda.c priority_queue.c \
 	affinity-fmt.c teams.c allocator.c oacc-profiling.c \
 	oacc-target.c ompd-support.c $(am__append_3)
-libgompd_la_SOURCES = ompd-init.c ompd-helper.c
+libgompd_la_SOURCES = ompd-init.c ompd-helper.c ompd-icv.c
 
 # Nvidia PTX OpenACC plugin.
 @PLUGIN_NVPTX_TRUE@libgomp_plugin_nvptx_version_info = -version-info $(libtool_VERSION)
@@ -818,6 +819,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oacc-profiling.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oacc-target.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ompd-helper.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ompd-icv.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ompd-init.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ompd-support.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ordered.Plo@am__quote@ # am--include-marker
@@ -1259,6 +1261,7 @@ distclean: distclean-recursive
 	-rm -f ./$(DEPDIR)/oacc-profiling.Plo
 	-rm -f ./$(DEPDIR)/oacc-target.Plo
 	-rm -f ./$(DEPDIR)/ompd-helper.Plo
+	-rm -f ./$(DEPDIR)/ompd-icv.Plo
 	-rm -f ./$(DEPDIR)/ompd-init.Plo
 	-rm -f ./$(DEPDIR)/ompd-support.Plo
 	-rm -f ./$(DEPDIR)/ordered.Plo
@@ -1449,6 +1452,7 @@ maintainer-clean: maintainer-clean-recursive
 	-rm -f ./$(DEPDIR)/oacc-profiling.Plo
 	-rm -f ./$(DEPDIR)/oacc-target.Plo
 	-rm -f ./$(DEPDIR)/ompd-helper.Plo
+	-rm -f ./$(DEPDIR)/ompd-icv.Plo
 	-rm -f ./$(DEPDIR)/ompd-init.Plo
 	-rm -f ./$(DEPDIR)/ompd-support.Plo
 	-rm -f ./$(DEPDIR)/ordered.Plo
diff --git a/libgomp/libgompd.map b/libgomp/libgompd.map
index ef29a0ea5a8..74dafcb097e 100644
--- a/libgomp/libgompd.map
+++ b/libgomp/libgompd.map
@@ -7,6 +7,9 @@ OMPD_5.1 {
 	ompd_device_initialize;
 	ompd_rel_address_space_handle;
 	ompd_finalize;
+	ompd_enumerate_icvs;
+	ompd_get_icv_from_scope;
+	ompd_get_icv_string_from_scope;
   local:
   	*;
 };
diff --git a/libgomp/omp-tools.h.in b/libgomp/omp-tools.h.in
index bfab48a0a63..1c0c69abb75 100644
--- a/libgomp/omp-tools.h.in
+++ b/libgomp/omp-tools.h.in
@@ -65,12 +65,12 @@ typedef struct _ompd_task_handle ompd_task_handle_t;
 
 typedef enum ompd_scope_t
 {
-	ompd_scope_global		    = 1,
-	ompd_scope_address_space = 2,
-	ompd_scope_thread		    = 3,
-	ompd_scope_parallel		 = 4,
-	ompd_scope_implicit_task = 5,
-	ompd_scope_task          = 6
+	ompd_scope_global		    	= 1,
+	ompd_scope_address_space 	= 2,
+	ompd_scope_thread		    	= 3,
+	ompd_scope_parallel		 		= 4,
+	ompd_scope_implicit_task 	= 5,
+	ompd_scope_task          	= 6
 } ompd_scope_t;
 
 typedef __UINT64_TYPE__ ompd_icv_id_t;
@@ -110,7 +110,7 @@ typedef struct ompd_device_type_sizes_t
 typedef ompd_rc_t (*ompd_callback_memory_alloc_fn_t) (ompd_size_t, void **);
 typedef ompd_rc_t (*ompd_callback_memory_free_fn_t) (void *);
 
-typedef ompd_rc_t (*ompd_callback_get_thread_context_for_thread_id_fn_t) 
+typedef ompd_rc_t (*ompd_callback_get_thread_context_for_thread_id_fn_t)
 	(ompd_address_space_context_t *, ompd_thread_id_t,
 	ompd_size_t, const void *, ompd_thread_context_t **);
 
@@ -119,7 +119,7 @@ typedef ompd_rc_t (*ompd_callback_sizeof_fn_t)
 	(ompd_address_space_context_t *, ompd_device_type_sizes_t *);
 
 
-typedef ompd_rc_t (*ompd_callback_symbol_addr_fn_t) 
+typedef ompd_rc_t (*ompd_callback_symbol_addr_fn_t)
 	(ompd_address_space_context_t *, ompd_thread_context_t *,
 	const char *, ompd_address_t *, const char *);
 
@@ -139,7 +139,7 @@ typedef ompd_rc_t (*ompd_callback_device_host_fn_t)
 
 typedef ompd_rc_t (*ompd_callback_print_string_fn_t) (const char *, int);
 
-typedef struct ompd_callbacks_t 
+typedef struct ompd_callbacks_t
 {
 	ompd_callback_memory_alloc_fn_t alloc_memory;
 	ompd_callback_memory_free_fn_t free_memory;
@@ -163,11 +163,11 @@ ompd_rc_t ompd_get_version_string(const char **);
 
 ompd_rc_t ompd_finalize(void);
 
-ompd_rc_t ompd_process_initialize 
+ompd_rc_t ompd_process_initialize
 	(ompd_address_space_context_t *, ompd_address_space_handle_t **);
 
 
-ompd_rc_t ompd_device_initialize 
+ompd_rc_t ompd_device_initialize
 	(ompd_address_space_handle_t *, ompd_address_space_context_t *,
 	ompd_device_t, ompd_size_t, void *, ompd_address_space_handle_t **);
 
@@ -175,7 +175,7 @@ ompd_rc_t ompd_rel_address_space_handle(ompd_address_space_handle_t *);
 
 ompd_rc_t ompd_get_omp_version (ompd_address_space_handle_t *, ompd_word_t *);
 
-ompd_rc_t ompd_get_omp_version_string (ompd_address_space_handle_t *, 
+ompd_rc_t ompd_get_omp_version_string (ompd_address_space_handle_t *,
 	const char **);
 
 
@@ -246,7 +246,7 @@ ompd_rc_t ompd_get_display_control_vars (ompd_address_space_handle_t *,
 ompd_rc_t ompd_rel_display_control_vars (const char * const **);
 
 ompd_rc_t ompd_enumerate_icvs (ompd_address_space_handle_t *, ompd_icv_id_t,
-	ompd_icv_id_t *, const char **, ompd_scope_t *,int *);
+	ompd_icv_id_t *, const char **, ompd_scope_t *, int *);
 
 ompd_rc_t ompd_get_icv_from_scope (void *, ompd_scope_t, ompd_icv_id_t,
 	ompd_word_t *);
@@ -279,4 +279,4 @@ void ompd_bp_device_end(void);
 }; // extern "C"
 #endif
 
-#endif /* _OMP_TOOLS_H */
\ No newline at end of file
+#endif /* _OMP_TOOLS_H */
diff --git a/libgomp/ompd-helper.c b/libgomp/ompd-helper.c
index 033990073a5..e6e80188bb9 100644
--- a/libgomp/ompd-helper.c
+++ b/libgomp/ompd-helper.c
@@ -19,13 +19,210 @@
    <http://www.gnu.org/licenses/>.  */
 
 
-
+/* This file contains the source code of functions
+	declared in ompd-helper.h.  */
 
 
 #include "ompd-helper.h"
 
 ompd_device_type_sizes_t target_sizes;
 
+
+/* Get global ICVs.  */
+ompd_rc_t
+ompd_get_cancellation(ompd_address_space_handle_t *ah, ompd_word_t *cancel_var)
+{
+	CHECK(ah);
+	ompd_word_t cancel = 0;
+	ompd_rc_t ret;
+	GET_VALUE(ah->context, NULL, "gomp_cancel_var", cancel, cancel,
+		target_sizes.sizeof_char, 1, ret);
+	*cancel_var = cancel;
+	return ret;
+}
+
+ompd_rc_t
+ompd_get_max_task_priority(ompd_address_space_handle_t *ah, ompd_word_t *task_p)
+{
+	CHECK(ah);
+	ompd_word_t task_priority = 0;
+	ompd_rc_t ret;
+	GET_VALUE(ah->context, NULL, "gomp_max_task_priority_var", task_priority,
+		task_priority, target_sizes.sizeof_int, 1, ret);
+	*task_p = task_priority;
+	return ret;
+}
+
+ompd_rc_t
+ompd_get_stacksize(ompd_address_space_handle_t *ah, ompd_word_t *stacksize)
+{
+	CHECK(ah);
+	ompd_word_t stack_var = 0;
+	ompd_rc_t ret;
+	GET_VALUE(ah->context, NULL, "stacksize", stack_var, stack_var,
+		target_sizes.sizeof_long, 1, ret);
+	*stacksize = stack_var;
+	return ret;
+}
+
+
+ompd_rc_t
+ompd_get_debug(ompd_address_space_handle_t *ah, ompd_word_t *debug_var)
+{
+	CHECK(ah);
+	ompd_word_t debug = 0;
+	ompd_rc_t ret;
+	GET_VALUE(ah->context, NULL, "gomp_debug_var", debug, debug,
+		target_sizes.sizeof_int, 1, ret);
+	*debug_var = debug;
+	return ret;
+}
+
+ompd_rc_t
+ompd_get_display_affinity(ompd_address_space_handle_t *ah, ompd_word_t *aff)
+{
+	CHECK(ah);
+	ompd_word_t affin = 0;
+	ompd_rc_t ret;
+	GET_VALUE(ah->context, NULL, "gomp_display_affinity_var", affin, affin,
+		target_sizes.sizeof_char, 1, ret);
+	*aff = affin;
+	return ret;
+}
+
+ompd_rc_t
+ompd_get_affinity_format_len(ompd_address_space_handle_t *ah, ompd_word_t *len)
+{
+	CHECK(ah);
+	ompd_word_t len_var = 0;
+	ompd_rc_t ret;
+	GET_VALUE(ah->context, NULL, "gomp_affinity_format_len", len_var, len_var,
+		target_sizes.sizeof_int, 1, ret);
+	*len = len_var;
+	return ret;
+}
+
+ompd_rc_t
+ompd_get_affinity_format(ompd_address_space_handle_t *ah, const char **string)
+{
+	CHECK(ah);
+	ompd_word_t len = 100;
+	ompd_rc_t ret;
+	char *temp_str;
+	ompd_word_t addr;
+	ret = callbacks->alloc_memory(len + 1, (void **)&temp_str);
+	temp_str[len] = '\0';
+	ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
+	ret = callbacks->symbol_addr_lookup(ah->context, NULL,
+		"gomp_affinity_format_var", &symbol_addr, NULL);
+	ret = callbacks->read_memory(ah->context, NULL, &symbol_addr,
+		target_sizes.sizeof_pointer, &addr);
+	symbol_addr.address = addr;
+	ret = callbacks->read_string(ah->context, NULL, &symbol_addr, len,
+		(void *)temp_str);
+	ret = callbacks->device_to_host(ah->context, &temp_str,
+		target_sizes.sizeof_char, len, &temp_str);
+	*string = temp_str;
+	return ret;
+}
+
+
+ompd_rc_t
+ompd_get_wait_policy(ompd_address_space_handle_t *ah, ompd_word_t *wait_policy)
+{
+	CHECK(ah);
+	ompd_word_t wait_p = 0;
+	ompd_rc_t ret;
+	GET_VALUE(ah->context, NULL, "wait_policy", wait_p, wait_p,
+		target_sizes.sizeof_int, 1, ret);
+	*wait_policy = wait_p;
+	return ret;
+}
+
+
+ompd_rc_t
+ompd_get_num_teams(ompd_address_space_handle_t *ah, ompd_word_t *num_teams)
+{
+	CHECK(ah);
+	ompd_word_t num_t = 0;
+	ompd_rc_t ret;
+	GET_VALUE(ah->context, NULL, "gomp_num_teams_var", num_t, num_t,
+		target_sizes.sizeof_int, 1, ret);
+	*num_teams = num_t;
+	return ret;
+}
+
+
+ompd_rc_t
+ompd_get_teams_thread_limit(ompd_address_space_handle_t *ah,
+	ompd_word_t *thread_limit)
+{
+	CHECK(ah);
+	ompd_word_t thr_lim = 0;
+	ompd_rc_t ret;
+	GET_VALUE(ah->context, NULL, "gomp_teams_thread_limit_var", thr_lim, thr_lim,
+		target_sizes.sizeof_int, 1, ret);
+	*thread_limit = thr_lim;
+	return ret;
+}
+
+ompd_rc_t
+ompd_get_spin_count(ompd_address_space_handle_t *ah, ompd_word_t *spin_count)
+{
+	CHECK(ah);
+	ompd_word_t spins = 0;
+	ompd_rc_t ret;
+	GET_VALUE(ah->context, NULL, "gomp_spin_count_var", spins, spins,
+		target_sizes.sizeof_long_long, 1, ret);
+	*spin_count = spins;
+	return ret;
+}
+
+ompd_rc_t
+ompd_get_available_cpus(ompd_address_space_handle_t *ah, ompd_word_t *procs)
+{
+	CHECK(ah);
+	ompd_word_t cpus = 0;
+	ompd_rc_t ret;
+	GET_VALUE(ah->context, NULL, "gomp_available_cpus", cpus, cpus,
+		target_sizes.sizeof_long, 1, ret);
+	*procs = cpus;
+	return ret;
+}
+
+
+ompd_rc_t
+ompd_get_throttled_spin_count(ompd_address_space_handle_t *ah,
+	ompd_word_t *throt)
+{
+	CHECK(ah);
+	ompd_word_t temp = 0;
+	ompd_rc_t ret;
+	GET_VALUE(ah->context, NULL, "gomp_throttled_spin_count_var", temp, temp,
+		target_sizes.sizeof_long_long, 1, ret);
+	*throt = temp;
+	return ret;
+}
+
+ompd_rc_t
+ompd_get_managed_threads(ompd_address_space_handle_t *ah, ompd_word_t *man_th)
+{
+	CHECK(ah);
+	ompd_word_t temp = 0;
+	ompd_rc_t ret;
+	GET_VALUE(ah->context, NULL, "gomp_managed_threads", temp, temp,
+		target_sizes.sizeof_long, 1, ret);
+	*man_th = temp;
+	return ret;
+}
+
+
+
+/* End of global ICVs functions.  */
+
+
+
+
 ompd_rc_t
 get_sizes(ompd_address_space_context_t *context)
 {
diff --git a/libgomp/ompd-helper.h b/libgomp/ompd-helper.h
index 427833e703a..14ab63d8c6b 100644
--- a/libgomp/ompd-helper.h
+++ b/libgomp/ompd-helper.h
@@ -20,7 +20,8 @@
 
 
 
-/*This file contains the helper functions for OMPD.  */
+/* 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
@@ -34,6 +35,7 @@ extern "C" {
 #include "ompd-types.h"
 #include <stdio.h>
 #include <stddef.h>
+#include <string.h>
 
 #define stringize(x)  stringize1(x)
 #define stringize1(x) #x
@@ -44,19 +46,139 @@ extern const ompd_callbacks_t *callbacks;
 extern __UINT64_TYPE__ ompd_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;
 
-ompd_rc_t get_sizes(ompd_address_space_context_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;
 
-struct _ompd_aspace_handle
+typedef struct _ompd_task_handle
 {
-	ompd_address_space_context_t *context;
-	ompd_device_t kind;
+	ompd_address_space_handle_t *ah;
+	ompd_address_t *th;
+}ompd_task_handle_t;
+
+#define GET_VALUE(context, thread_context, name, output, in_buf, size, count,	\
+	 ret) 																																			\
+	do {																											 		  						\
+		ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};								\
+		ret = callbacks->symbol_addr_lookup(context, thread_context,	  					\
+			name, &symbol_addr, NULL);																							\
+		ret = callbacks->read_memory(context, thread_context, &symbol_addr,	size,	\
+			&in_buf);																																\
+		ret = callbacks->device_to_host(context, &in_buf, size, count, &output);	\
+	} 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(nthread_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(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
+{
+	ompd_icv_undefined_var = 0,
+	#define ompd_icv_iterator(var_name, string_name, scope) ompd_icv_##var_name,
+		FOREACH_OMPD_ICV(ompd_icv_iterator)
+	#undef ompd_icv_iterator
+	ompd_last_icv_var
 };
 
 
+ompd_rc_t get_sizes(ompd_address_space_context_t *);
+
 
+/* Get per task internal control variables.  */
+ompd_rc_t ompd_get_nthread(ompd_thread_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_thread_limit(ompd_task_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_run_sched(ompd_task_handle_t *,  ompd_word_t *);
+ompd_rc_t ompd_get_run_sched_chunk_size(ompd_task_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_default_device(ompd_thread_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_dynamic(ompd_thread_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_max_active_levels(ompd_task_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_proc_bind(ompd_task_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_is_final(ompd_task_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_is_implicit(ompd_task_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_team_size(ompd_parallel_handle_t *, ompd_word_t *);
+
+
+/* Get Global ICVs.  */
+ompd_rc_t ompd_get_cancellation(ompd_address_space_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_max_task_priority(ompd_address_space_handle_t *,
+	ompd_word_t *);
+ompd_rc_t ompd_get_stacksize(ompd_address_space_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_debug(ompd_address_space_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_display_affinity(ompd_address_space_handle_t *,
+	ompd_word_t *);
+ompd_rc_t ompd_get_affinity_format(ompd_address_space_handle_t *,
+	const char **);
+ompd_rc_t ompd_get_affinity_format_len(ompd_address_space_handle_t *,
+	ompd_word_t *);
+ompd_rc_t ompd_get_wait_policy(ompd_address_space_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_num_teams(ompd_address_space_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_teams_thread_limit(ompd_address_space_handle_t *,
+	ompd_word_t *);
+ompd_rc_t ompd_get_spin_count(ompd_address_space_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_available_cpus(ompd_address_space_handle_t *, ompd_word_t *);
+ompd_rc_t ompd_get_throttled_spin_count(ompd_address_space_handle_t *,
+	ompd_word_t *);
+ompd_rc_t ompd_get_managed_threads(ompd_address_space_handle_t *,
+	ompd_word_t *);
+/*End of Global ICVs.  */
 
 #ifdef __cplusplus
 } // extern C
diff --git a/libgomp/ompd-icv.c b/libgomp/ompd-icv.c
new file mode 100644
index 00000000000..8dd9bca8837
--- /dev/null
+++ b/libgomp/ompd-icv.c
@@ -0,0 +1,200 @@
+/* Copyright (C) 2021 Free Software Foundation, Inc.
+   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 implementation of functions defined in 5.5.8 and 5.5.9
+  in OpenMP Application Programming Interface v5.1. */
+
+#include "ompd-helper.h"
+
+
+static const char *ompd_icv_string[] = { "undefined",
+	#define ompd_icv_iterator(var_name, string_name, scope) string_name,
+		FOREACH_OMPD_ICV(ompd_icv_iterator)
+	#undef ompd_icv_iterator
+};
+
+static const ompd_scope_t ompd_icv_scope[] = {ompd_scope_global,
+	#define ompd_icv_iterator(var_name, string_name, scope) scope,
+		FOREACH_OMPD_ICV(ompd_icv_iterator)
+	#undef ompd_icv_iterator
+};
+
+
+ompd_rc_t
+ompd_enumerate_icvs(ompd_address_space_handle_t *ah,
+	ompd_icv_id_t current, ompd_icv_id_t *next_id, const char **next_icv_name,
+	ompd_scope_t *next_scope, int *more)
+{
+	if(ah == NULL)
+		return ompd_rc_stale_handle;
+	if(current + 1 >= ompd_last_icv_var || next_id == NULL
+		|| next_icv_name == NULL || next_scope == NULL || more == NULL)
+			return ompd_rc_bad_input;
+	if(callbacks == NULL)
+		return ompd_rc_callback_error;
+	*next_id = current + 1;
+	char *temp_name = NULL;
+	ompd_rc_t ret = callbacks->alloc_memory(strlen(ompd_icv_string[*next_id]) + 1,
+		(void **)&temp_name);
+	if(ret)
+		return ret;
+	strcpy(temp_name, ompd_icv_string[*next_id]);
+	*next_icv_name = temp_name;
+	*next_scope = ompd_icv_scope[*next_id];
+	if((*next_id) + 1 < ompd_last_icv_var)
+		*more = 1;
+	else
+		*more = 0;
+	return ompd_rc_ok;
+}
+
+
+ompd_rc_t
+ompd_get_icv_from_scope(void *handle, ompd_scope_t scope, ompd_icv_id_t icv_id,
+	ompd_word_t *icv_value)
+{
+	if(handle == NULL)
+		return ompd_rc_stale_handle;
+	if(icv_value == NULL || !icv_id || icv_id >= ompd_last_icv_var)
+		return ompd_rc_bad_input;
+	if(callbacks == NULL)
+		return ompd_rc_callback_error;
+	ompd_device_t device;
+	switch(scope)
+		{
+			case ompd_scope_address_space:
+				device = ((ompd_address_space_handle_t *)handle)->kind;
+				break;
+			case ompd_scope_thread:
+				device = ((ompd_thread_handle_t *)handle)->ah->kind;
+				break;
+			case ompd_scope_parallel:
+				device = ((ompd_parallel_handle_t *)handle)->ah->kind;
+				break;
+			case ompd_scope_task:
+				device = ((ompd_task_handle_t *)handle)->ah->kind;
+				break;
+			default:
+				return ompd_rc_bad_input;
+		}
+	/* NO cuda for now.  */
+	if(device == OMPD_DEVICE_KIND_HOST)
+		{
+			switch(icv_id)
+				{
+					case ompd_icv_cancellation_var:
+						return ompd_get_cancellation((ompd_address_space_handle_t *)handle,
+							icv_value);
+					case ompd_icv_max_task_priority_var:
+						return ompd_get_max_task_priority(
+							(ompd_address_space_handle_t *)handle, icv_value
+						);
+					case ompd_icv_stacksize_var:
+						return ompd_get_stacksize((ompd_address_space_handle_t *)handle,
+							icv_value);
+					case ompd_icv_debug_var:
+						return ompd_get_debug((ompd_address_space_handle_t *)handle,
+							icv_value);
+					case ompd_icv_display_affinity_var:
+						return ompd_get_display_affinity(
+							(ompd_address_space_handle_t *)handle, icv_value
+						);
+					case ompd_icv_affinity_format_var:
+						return ompd_rc_incompatible;
+					case ompd_icv_affinity_format_len_var:
+						return ompd_get_affinity_format_len(
+								(ompd_address_space_handle_t *)handle, icv_value
+						);
+					case ompd_icv_wait_policy_var:
+						return ompd_get_wait_policy((ompd_address_space_handle_t *)handle,
+							icv_value);
+					case ompd_icv_num_teams_var:
+						return ompd_get_num_teams((ompd_address_space_handle_t *)handle,
+							icv_value);
+					case ompd_icv_teams_thread_limit_var:
+						return ompd_get_teams_thread_limit(
+							(ompd_address_space_handle_t *)handle, icv_value
+						);
+					case ompd_icv_spin_count_var:
+						return ompd_get_spin_count((ompd_address_space_handle_t *)handle,
+							icv_value);
+					case ompd_icv_num_proc_var:
+						return ompd_get_available_cpus(
+							(ompd_address_space_handle_t *)handle, icv_value
+						);
+					case ompd_icv_throttled_spin_count_var:
+						return ompd_get_throttled_spin_count(
+							(ompd_address_space_handle_t *)handle, icv_value
+						);
+					case ompd_icv_managed_threads_var:
+						return ompd_get_managed_threads(
+							(ompd_address_space_handle_t *)handle, icv_value
+						);
+					default:
+						return ompd_rc_unsupported;
+				}
+		}
+		return ompd_rc_error;
+}
+
+ompd_rc_t
+ompd_get_icv_string_from_scope(void *handle, ompd_scope_t scope,
+	ompd_icv_id_t icv_id, const char **icv_value)
+{
+	if(handle == NULL)
+		return ompd_rc_stale_handle;
+	if(icv_value == NULL || !icv_id || icv_id >= ompd_last_icv_var)
+		return ompd_rc_bad_input;
+	if(callbacks == NULL)
+		return ompd_rc_callback_error;
+	ompd_device_t device;
+	switch(scope)
+		{
+			case ompd_scope_address_space:
+				device = ((ompd_address_space_handle_t *)handle)->kind;
+				break;
+			case ompd_scope_thread:
+				device = ((ompd_thread_handle_t *)handle)->ah->kind;
+				break;
+			case ompd_scope_parallel:
+				device = ((ompd_parallel_handle_t *)handle)->ah->kind;
+				break;
+			case ompd_scope_task:
+				device = ((ompd_task_handle_t *)handle)->ah->kind;
+				break;
+			default:
+				return ompd_rc_bad_input;
+		}
+	/* No cuda.  */
+	if(device == OMPD_DEVICE_KIND_HOST)
+		{
+			switch(icv_id)
+				{
+					case ompd_icv_affinity_format_var:
+						return ompd_get_affinity_format(
+							(ompd_address_space_handle_t *)handle, icv_value
+						);
+					default:
+						return ompd_rc_unsupported;
+				}
+		}
+	return ompd_rc_error;
+}
diff --git a/libgomp/ompd-init.c b/libgomp/ompd-init.c
index 80e8e5ce62a..e65f0c89e86 100644
--- a/libgomp/ompd-init.c
+++ b/libgomp/ompd-init.c
@@ -20,7 +20,7 @@
 
 
 
-/*This file contains the implementation of functions defined in
+/* This file contains the implementation of functions defined in
 	section 5.5.1, 5.5.2.  */
 
 
@@ -69,7 +69,7 @@ ompd_get_version_string(const char **string)
 {
 	if(string == NULL)
 		return ompd_rc_bad_input;
-	static const char tmp_string[] = 
+	static const char tmp_string[] =
 		"GNU OpenMP runtime implementing OMPD version "
 			stringize(VERSION) " Debugging library.";
 	*string = tmp_string;
@@ -99,22 +99,12 @@ ompd_process_initialize(ompd_address_space_context_t *context,
 	if(ret != ompd_rc_ok)
 		return ret;
 
-	ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
-
-
 	//naive way to read from memory
-	ret = callbacks->symbol_addr_lookup(context, NULL, "ompd_state",
-			&symbol_addr, NULL);
-
-	ret = callbacks->read_memory(context, NULL, &symbol_addr,
-			target_sizes.sizeof_long_long, &ompd_state);
-
-	ret = callbacks->device_to_host(context, &ompd_state,
-			target_sizes.sizeof_long_long, 1, &ompd_state);
-
+	GET_VALUE(context, NULL, "ompd_state", ompd_state, ompd_state,
+		target_sizes.sizeof_long_long, 1, ret);
+	
 	ret = callbacks->alloc_memory(sizeof(ompd_address_space_handle_t),
 			(void **)(handle));
-	
 
 	if(ret != ompd_rc_ok)
 		return ret;
diff --git a/libgomp/parallel.c b/libgomp/parallel.c
index f1c8a36868c..1701eda3938 100644
--- a/libgomp/parallel.c
+++ b/libgomp/parallel.c
@@ -173,9 +173,9 @@ void
 GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads,
 	       unsigned int flags)
 {
-  num_threads = gomp_resolve_num_threads (num_threads, 0);
   if(ompd_state)
     ompd_bp_parallel_begin();
+  num_threads = gomp_resolve_num_threads (num_threads, 0);
   gomp_team_start (fn, data, num_threads, flags, gomp_new_team (num_threads),
 		   NULL);
   fn (data);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-03-12  6:26 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-12  6:26 [PATCH] libgomp(OMPD PROJECT): add ICVs debugging information Mohamed Atef

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).