From: Ahmed Sayed Mousse <ahmedsayedmousse@gmail.com>
To: gcc-patches@gcc.gnu.org
Subject: [patch] libgompd: Add thread handles
Date: Tue, 7 Jun 2022 00:21:25 +0200 [thread overview]
Message-ID: <CAG6G2yttLo5a+yUcMXLxRFdr5aLz5FhH6OfMEWAcA1c-mxJsVw@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 528 bytes --]
This patch is the initial implementation of OpenMP-API specs book section
20.5.5 with title "Thread Handles"
libgomp/ChangeLog
2022-05-06 Ahmed Sayed <ahmedsayedmousse@gmail.com>
* Makefile.am (libgompd_la_SOURCES): Add ompd-threads.c.
* Makefile.in: Regenerate.
* ompd-support.h ( gompd_thread_initial_tls_bias ): New Variable.
* ompd-support.c ( gompd_thread_initial_tls_bias ): New Variable.
( gompd_load ): ( gompd_thread_initial_tls_bias ): Initialized with
&gomp_tls_data - pthread_self ().
* ompd-threads.c: New.
[-- Attachment #2: diff.txt --]
[-- Type: text/plain, Size: 13937 bytes --]
diff --git a/libgomp/Makefile.am b/libgomp/Makefile.am
index 6d913a93e7f..23f5bede1bf 100644
--- a/libgomp/Makefile.am
+++ b/libgomp/Makefile.am
@@ -94,7 +94,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 ompd-icv.c
+libgompd_la_SOURCES = ompd-init.c ompd-helper.c ompd-icv.c ompd-threads.c
include $(top_srcdir)/plugin/Makefrag.am
diff --git a/libgomp/Makefile.in b/libgomp/Makefile.in
index 40f896b5f03..7acdcbf31d5 100644
--- a/libgomp/Makefile.in
+++ b/libgomp/Makefile.in
@@ -233,7 +233,8 @@ am_libgomp_la_OBJECTS = alloc.lo atomic.lo barrier.lo critical.lo \
affinity-fmt.lo teams.lo allocator.lo oacc-profiling.lo \
oacc-target.lo ompd-support.lo $(am__objects_1)
libgomp_la_OBJECTS = $(am_libgomp_la_OBJECTS)
-am_libgompd_la_OBJECTS = ompd-init.lo ompd-helper.lo ompd-icv.lo
+am_libgompd_la_OBJECTS = ompd-init.lo ompd-helper.lo ompd-icv.lo \
+ ompd-threads.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@)
@@ -583,7 +584,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_7)
-libgompd_la_SOURCES = ompd-init.c ompd-helper.c ompd-icv.c
+libgompd_la_SOURCES = ompd-init.c ompd-helper.c ompd-icv.c ompd-threads.c
# Nvidia PTX OpenACC plugin.
@PLUGIN_NVPTX_TRUE@libgomp_plugin_nvptx_version_info = -version-info $(libtool_VERSION)
@@ -801,6 +802,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ompd-icv.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ompd-init.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ompd-support.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ompd-threads.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ordered.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/priority_queue.Plo@am__quote@
diff --git a/libgomp/ompd-support.c b/libgomp/ompd-support.c
index d8a7174b2f3..c7da3ef98a6 100644
--- a/libgomp/ompd-support.c
+++ b/libgomp/ompd-support.c
@@ -36,6 +36,10 @@
const char **ompd_dll_locations = NULL;
__UINT64_TYPE__ gompd_state;
+#if (defined HAVE_TLS || defined USE_EMUTLS)
+__UINT64_TYPE__ gompd_thread_initial_tls_bias;
+#endif
+
void
gompd_load (void)
{
@@ -61,7 +65,11 @@ gompd_load (void)
= (__UINT64_TYPE__) & (((struct gomp_thread *) NULL)->handle);
__UINT64_TYPE__ gompd_sizeof_gomp_thread_handle
= sizeof (((struct gomp_thread *) NULL)->handle);
+ #elif (defined HAVE_TLS || defined USE_EMUTLS)
+ gompd_thread_initial_tls_bias = (__UINT64_TYPE__) \
+ (&gomp_tls_data - pthread_self ());
#endif
+
gomp_debug (2, "OMP OMPD active\n");
static const char *ompd_dll_locations_array[2]
= {"libgompd" SONAME_SUFFIX (1) , NULL};
diff --git a/libgomp/ompd-support.h b/libgomp/ompd-support.h
index 39d55161132..2dd88af2d73 100644
--- a/libgomp/ompd-support.h
+++ b/libgomp/ompd-support.h
@@ -69,6 +69,10 @@
void gompd_load (void);
extern __UINT64_TYPE__ gompd_state;
+#if (defined HAVE_TLS || defined USE_EMUTLS)
+extern __UINT64_TYPE__ gompd_thread_initial_tls_bias;
+#endif
+
#define OMPD_ENABLED 0x1
#define GOMPD_FOREACH_ACCESS(gompd_access) \
diff --git a/libgomp/ompd-support.h.gch b/libgomp/ompd-support.h.gch
new file mode 100644
index 00000000000..ee98f7091c0
Binary files /dev/null and b/libgomp/ompd-support.h.gch differ
diff --git a/libgomp/ompd-threads.c b/libgomp/ompd-threads.c
new file mode 100644
index 00000000000..bc370e1af9c
--- /dev/null
+++ b/libgomp/ompd-threads.c
@@ -0,0 +1,310 @@
+/* Copyright (C) The GNU Toolchain Authors.
+ Contributed by Ahmed Sayed <ahmedsayedmousse@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 the implementation of functions defined in
+ Section 5.5 ThreadHandles. */
+
+
+#include "ompd-helper.h"
+
+ompd_rc_t
+ompd_get_thread_in_parallel (ompd_parallel_handle_t *parallel_handle, int
+ thread_num, ompd_thread_handle_t **thread_handle)
+{
+
+ if (parallel_handle == NULL)
+ return ompd_rc_stale_handle;
+ if (parallel_handle->ah == NULL)
+ return ompd_rc_stale_handle;
+
+ ompd_address_space_context_t *context = parallel_handle->ah->context;
+ ompd_rc_t ret;
+
+ if (!context)
+ return ompd_rc_stale_handle;
+
+ if (!callbacks)
+ return ompd_rc_callback_error;
+
+ ompd_word_t team_size_var;
+ ret = ompd_get_icv_from_scope ((void *) parallel_handle, ompd_scope_parallel,
+ gompd_icv_team_size_var, &team_size_var);
+ if (ret != ompd_rc_ok)
+ return ret;
+ if (thread_num < 0 || thread_num >= team_size_var)
+ return ompd_rc_bad_input;
+
+ ompd_size_t temp_offset, field_offset;
+ ompd_address_t temp_symbol_addr, symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
+
+ const char *symbol_name = "gompd_access_gomp_thread_pool_threads";
+ ret = callbacks->symbol_addr_lookup (context, NULL, symbol_name, &symbol_addr,
+ NULL);
+ ret = callbacks->read_memory (context, NULL, &symbol_addr,
+ target_sizes.sizeof_long_long, &temp_offset);
+
+ ret = callbacks->device_to_host (context, &temp_offset,
+ target_sizes.sizeof_long_long, 1,
+ &field_offset);
+ if (ret != ompd_rc_ok)
+ return ret;
+
+ symbol_addr.address += field_offset;
+
+ ret = callbacks->read_memory (context, NULL, &symbol_addr,
+ target_sizes.sizeof_pointer,
+ &temp_symbol_addr.address);
+ ret = callbacks->device_to_host (context, &temp_symbol_addr.address,
+ target_sizes.sizeof_pointer, 1,
+ &symbol_addr.address);
+
+ if (ret != ompd_rc_ok)
+ return ret;
+
+ symbol_addr.address += thread_num * target_sizes.sizeof_pointer;
+
+ ret = callbacks->read_memory (context, NULL, &symbol_addr,
+ target_sizes.sizeof_pointer,
+ &temp_symbol_addr.address);
+ ret = callbacks->device_to_host (context, &temp_symbol_addr.address,
+ target_sizes.sizeof_pointer, 1,
+ &symbol_addr.address);
+
+ if (ret != ompd_rc_ok)
+ return ret;
+
+ ret = callbacks->alloc_memory (sizeof (ompd_thread_handle_t),
+ (void **) thread_handle);
+
+ if (ret != ompd_rc_ok)
+ return ret;
+
+ if (symbol_addr.address == 0)
+ return ompd_rc_unsupported;
+
+ (*thread_handle)->th = symbol_addr;
+ (*thread_handle)->ah = parallel_handle->ah;
+ return ret;
+}
+
+/* The ompd_get_thread_handle function that maps a native thread to an
+ OMPD thread handle. */
+
+ompd_rc_t
+ompd_get_thread_handle (ompd_address_space_handle_t *handle,
+ ompd_thread_id_t kind, ompd_size_t sizeof_thread_id,
+ const void *thread_id,
+ ompd_thread_handle_t **thread_handle)
+{
+ if (!handle)
+ return ompd_rc_stale_handle;
+
+ if (kind != OMPD_THREAD_ID_PTHREAD)
+ return ompd_rc_unsupported;
+
+ ompd_address_space_context_t *context = handle->context;
+ ompd_thread_context_t *tcontext;
+ ompd_rc_t ret;
+
+ if (!context)
+ return ompd_rc_stale_handle;
+
+ ret = callbacks->get_thread_context_for_thread_id (context, kind,
+ sizeof_thread_id,
+ thread_id, &tcontext);
+ if (ret != ompd_rc_ok)
+ return ret;
+
+ ompd_size_t temp_symbol_size, symbol_size;
+ ompd_address_t temp_symbol_addr, symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
+
+ const char *symbol_name = "gompd_sizeof_gomp_thread";
+ ret = callbacks->symbol_addr_lookup(context, NULL, symbol_name, &symbol_addr,
+ NULL);
+ ret = callbacks->read_memory(context, NULL, &symbol_addr,
+ target_sizes.sizeof_long_long,
+ &temp_symbol_size);
+ ret = callbacks->device_to_host(context, &temp_symbol_size,
+ target_sizes.sizeof_long_long, 1,
+ &symbol_size);
+ if (ret != ompd_rc_ok)
+ return ret;
+
+ ret = callbacks->symbol_addr_lookup (context, tcontext,"gomp_tls_data",
+ &symbol_addr, NULL);
+
+ /* if libgomp is offloading or using pthread_key_t then lookup can't
+ find the symbol "gomp_tls_data". */
+ if (ret == ompd_rc_error)
+ return ompd_rc_unsupported;
+
+ ret = callbacks->read_memory (context, tcontext, &symbol_addr, symbol_size,
+ &temp_symbol_addr.address);
+ ret = callbacks->device_to_host (context, &temp_symbol_addr.address,
+ symbol_size, 1, &symbol_addr.address);
+ if (ret != ompd_rc_ok)
+ return ret;
+
+ ret = callbacks->alloc_memory (sizeof(ompd_thread_handle_t), (void **)
+ (thread_handle));
+
+ if (ret != ompd_rc_ok)
+ return ret;
+
+ (*thread_handle)->ah = handle;
+ (*thread_handle)->th = symbol_addr;
+ (*thread_handle)->thread_context = tcontext;
+ return ret;
+}
+
+
+ompd_rc_t
+ompd_rel_thread_handle (ompd_thread_handle_t *thread_handle)
+{
+ if (thread_handle == NULL)
+ return ompd_rc_stale_handle;
+
+ ompd_rc_t ret;
+ ret = callbacks->free_memory ((void *) thread_handle);
+ if (ret != ompd_rc_ok)
+ return ret;
+
+ return ompd_rc_ok;
+}
+
+
+/* return -1, 0 or 1 for thread_handle_1 <, == or > thread_handle_2. */
+ompd_rc_t
+ompd_thread_handle_compare (ompd_thread_handle_t *thread_handle_1,
+ ompd_thread_handle_t *thread_handle_2,
+ int *cmp_value )
+{
+
+ if (thread_handle_1 == NULL)
+ return ompd_rc_stale_handle;
+ if (thread_handle_2 == NULL)
+ return ompd_rc_stale_handle;
+ if (cmp_value == NULL)
+ return ompd_rc_bad_input;
+ if (thread_handle_1->ah->kind != thread_handle_2->ah->kind)
+ return ompd_rc_bad_input;
+ *cmp_value = thread_handle_1->th.address - thread_handle_2->th.address;
+
+ return ompd_rc_ok;
+}
+
+
+ompd_rc_t
+ompd_get_thread_id (ompd_thread_handle_t *thread_handle, ompd_thread_id_t kind,
+ ompd_size_t sizeof_thread_id, void *thread_id)
+{
+ if (kind != OMPD_THREAD_ID_PTHREAD)
+ return ompd_rc_unsupported;
+ if (thread_id == NULL)
+ return ompd_rc_bad_input;
+ if (!thread_handle || !thread_handle->ah)
+ return ompd_rc_stale_handle;
+
+ ompd_address_space_context_t *context = thread_handle->ah->context;
+ if (context == NULL)
+ return ompd_rc_stale_handle;
+
+ ompd_rc_t ret;
+ ompd_address_t taddr = thread_handle->th;
+ ompd_address_t temp_symbol_addr, symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
+ ompd_size_t temp_symbol_size, symbol_size;
+ ompd_size_t temp_offset, offset;
+
+
+ char *symbol_name = "gompd_sizeof_gomp_thread_handle";
+ ret = callbacks->symbol_addr_lookup (context, NULL, symbol_name, &symbol_addr,
+ NULL);
+ /* If symbol isn't found we check for the optimized version. */
+ if (ret == ompd_rc_error)
+ goto try_bias;
+ ret = callbacks->read_memory (context, NULL, &symbol_addr,
+ target_sizes.sizeof_long_long,
+ &temp_symbol_size);
+ ret = callbacks->device_to_host (context, &temp_symbol_size,
+ target_sizes.sizeof_long_long, 1,
+ &symbol_size);
+ if (ret != ompd_rc_ok)
+ return ret;
+ if (sizeof_thread_id != symbol_size)
+ return ompd_rc_bad_input;
+
+ symbol_name = "gompd_access_gomp_thread_handle";
+ ret = callbacks->symbol_addr_lookup (context, NULL, symbol_name, &symbol_addr,
+ NULL);
+ ret = callbacks->read_memory (context, NULL, &symbol_addr, symbol_size,
+ &temp_offset);
+ ret = callbacks->device_to_host (context, &temp_offset, symbol_size, 1,
+ &offset);
+
+ if (ret != ompd_rc_ok)
+ return ret;
+
+ taddr.address += offset;
+ ret = callbacks->read_memory (context, NULL, &taddr,
+ target_sizes.sizeof_long_long, thread_id);
+ return ret;
+
+try_bias:
+ symbol_name = "gompd_thread_initial_tls_bias";
+ ret = callbacks->symbol_addr_lookup (context, NULL, symbol_name, &symbol_addr,
+ NULL);
+ if (ret == ompd_rc_error)
+ return ompd_rc_unsupported;
+
+ ret = callbacks->read_memory (context, NULL, &symbol_addr,
+ target_sizes.sizeof_long_long, &temp_offset);
+ ret = callbacks->device_to_host (context, &temp_offset,
+ target_sizes.sizeof_long_long, 1, &offset);
+
+ if (ret != ompd_rc_ok)
+ return ret;
+
+ ret = callbacks->symbol_addr_lookup (context, NULL,"gomp_tls_data",
+ &symbol_addr, NULL);
+ ret = callbacks->device_to_host (context, &temp_symbol_addr.address,
+ target_sizes.sizeof_long_long, 1,
+ &symbol_addr.address);
+ if (ret != ompd_rc_ok)
+ return ret;
+
+ taddr.address = symbol_addr.address + offset;
+ ret = callbacks->read_memory (context, NULL, &taddr,
+ target_sizes.sizeof_long_long, thread_id);
+ return ret;
+}
+
+
+/* OMPD doesn't support GPUs for now. */
+ompd_rc_t ompd_get_device_from_thread (ompd_thread_handle_t *thread_handle,
+ ompd_address_space_handle_t **device)
+{
+ if (thread_handle == NULL)
+ return ompd_rc_stale_handle;
+ return ompd_rc_unsupported;
+}
next reply other threads:[~2022-06-06 22:21 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-06 22:21 Ahmed Sayed Mousse [this message]
2022-06-07 9:56 ` Jakub Jelinek
2022-07-01 0:00 Ahmed Sayed Mousse
2022-07-04 20:34 Ahmed Sayed Mousse
2022-07-27 12:11 ` Mohamed Atef
2022-07-29 11:22 ` Jakub Jelinek
2022-09-27 1:12 Ahmed Sayed Mousse
2022-09-27 1:20 ` Ahmed Sayed Mousse
2022-09-27 6:40 ` Bernhard Reutner-Fischer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAG6G2yttLo5a+yUcMXLxRFdr5aLz5FhH6OfMEWAcA1c-mxJsVw@mail.gmail.com \
--to=ahmedsayedmousse@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).