public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH 0/3] Enable full libgfortran for AMD GCN
@ 2019-06-07 14:38 Andrew Stubbs
  2019-06-07 14:39 ` [PATCH 1/3] Create GCN-specific gthreads Andrew Stubbs
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Andrew Stubbs @ 2019-06-07 14:38 UTC (permalink / raw)
  To: gcc-patches, Fortran List

This short patch series is intended to allow GCN kernels to print to 
stdout using Fortran "print" and "write" (C printf, write, etc. already 
work).

The first two patches implement dependencies that libgfortran needs. 
I'll also be posting a newlib patch shortly.

The third patch enables the rest of libgfortran.

-- 
Andrew Stubbs
Mentor Graphics / CodeSourcery

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 1/3] Create GCN-specific gthreads
  2019-06-07 14:38 [PATCH 0/3] Enable full libgfortran for AMD GCN Andrew Stubbs
@ 2019-06-07 14:39 ` Andrew Stubbs
  2019-06-19  8:57   ` Andrew Stubbs
  2023-11-03 14:54   ` GCN: Address undeclared 'NULL' usage in 'libgcc/config/gcn/gthr-gcn.h:__gthread_getspecific' (was: [PATCH 1/3] Create GCN-specific gthreads) Thomas Schwinge
  2019-06-07 14:40 ` [PATCH 2/3] Stub implementation of unwinding for AMD GCN Andrew Stubbs
  2019-06-07 14:41 ` [PATCH 3/3] Enable full libgfortran library " Andrew Stubbs
  2 siblings, 2 replies; 14+ messages in thread
From: Andrew Stubbs @ 2019-06-07 14:39 UTC (permalink / raw)
  To: gcc-patches, Fortran List

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

This patch creates a new gthread model for AMD GCN devices.

For now, there's just enough support for libgfortran to use mutexes in 
its I/O routines. The rest can be added at a later time, if at all.

Notes:

  * GCN GPUs do not support dynamic creation and deletion of threads, so
    there can be no implementation for those functions. (There may be
    many threads, of course, but they are hardware managed and must be
    launched all at once.)

  * It would be possible to implement support for EMUTLS, but I have no
    wish to do so at this time, and it isn't likely to be needed by
    OpenMP or OpenACC offload kernels, so those functions are also stub
    implementations.

OK to commit?

-- 
Andrew Stubbs
Mentor Graphics / CodeSourcery

[-- Attachment #2: 190607-gcn-gthreads.patch --]
[-- Type: text/x-patch, Size: 7169 bytes --]

Create GCN-specific gthreads

2019-06-05  Kwok Cheung Yeung  <kcy@codesourcery.com>
            Andrew Stubbs  <ams@codesourcery.com>

        gcc/
	* config.gcc (thread_file): Set to gcn for AMD GCN.
	* config/gcn/gcn.c (gcn_emutls_var_init): New function.
	(TARGET_EMUTLS_VAR_INIT): New hook.

	config/
	* gthr.m4 (GCC_AC_THREAD_HEADER): Add case for gcn.

	libgcc/
	* configure: Regenerate.
	* config/gcn/gthr-gcn.h: New.

diff --git a/config/gthr.m4 b/config/gthr.m4
index 7b29f1f3327..4b937306ad0 100644
--- a/config/gthr.m4
+++ b/config/gthr.m4
@@ -13,6 +13,7 @@ AC_DEFUN([GCC_AC_THREAD_HEADER],
 case $1 in
     aix)	thread_header=config/rs6000/gthr-aix.h ;;
     dce)	thread_header=config/pa/gthr-dce.h ;;
+    gcn)	thread_header=config/gcn/gthr-gcn.h ;;
     lynx)	thread_header=config/gthr-lynx.h ;;
     mipssde)	thread_header=config/mips/gthr-mipssde.h ;;
     posix)	thread_header=gthr-posix.h ;;
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 6b00c387247..b450098aa09 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1428,6 +1428,7 @@ amdgcn-*-amdhsa)
 	fi
 	# Force .init_array support.
 	gcc_cv_initfini_array=yes
+	thread_file=gcn
 	;;
 moxie-*-elf)
 	gas=yes
diff --git a/gcc/config/gcn/gcn.c b/gcc/config/gcn/gcn.c
index 71f4b4ce35a..e528b649cce 100644
--- a/gcc/config/gcn/gcn.c
+++ b/gcc/config/gcn/gcn.c
@@ -3163,6 +3163,16 @@ gcn_valid_cvt_p (machine_mode from, machine_mode to, enum gcn_cvt_t op)
 	  || (to == DFmode && (from == SImode || from == SFmode)));
 }
 
+/* Implement TARGET_EMUTLS_VAR_INIT.
+
+   Disable emutls (gthr-gcn.h does not support it, yet).  */
+
+tree
+gcn_emutls_var_init (tree, tree decl, tree)
+{
+  sorry_at (DECL_SOURCE_LOCATION (decl), "TLS is not implemented for GCN.");
+}
+
 /* }}}  */
 /* {{{ Costs.  */
 
@@ -6007,6 +6017,8 @@ print_operand (FILE *file, rtx x, int code)
 #define TARGET_CONSTANT_ALIGNMENT gcn_constant_alignment
 #undef  TARGET_DEBUG_UNWIND_INFO
 #define TARGET_DEBUG_UNWIND_INFO gcn_debug_unwind_info
+#undef  TARGET_EMUTLS_VAR_INIT
+#define TARGET_EMUTLS_VAR_INIT gcn_emutls_var_init
 #undef  TARGET_EXPAND_BUILTIN
 #define TARGET_EXPAND_BUILTIN gcn_expand_builtin
 #undef  TARGET_FUNCTION_ARG
diff --git a/libgcc/config/gcn/gthr-gcn.h b/libgcc/config/gcn/gthr-gcn.h
new file mode 100644
index 00000000000..4227b515f01
--- /dev/null
+++ b/libgcc/config/gcn/gthr-gcn.h
@@ -0,0 +1,163 @@
+/* Threads compatibility routines for libgcc2 and libobjc.  */
+/* Compile this one with gcc.  */
+/* Copyright (C) 2019 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC 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.
+
+GCC 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/>.  */
+
+/* AMD GCN does not support dynamic creation of threads.  There may be many
+   hardware threads, but they're all created simultaneously at launch time.
+
+   This implementation is intended to provide mutexes for libgfortran, etc.
+   It is not intended to provide a TLS implementation at this time,
+   although that may be added later if needed.
+
+   __gthread_active_p returns "1" to ensure that mutexes are used, and that
+   programs attempting to use emutls will fail with the appropriate abort.
+   It is expected that the TLS tests will fail.  */
+
+#ifndef GCC_GTHR_GCN_H
+#define GCC_GTHR_GCN_H
+
+#define __GTHREADS 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _LIBOBJC
+#error "Objective C is not supported on AMD GCN"
+#else
+
+static inline int
+__gthread_active_p (void)
+{
+  return 1;
+}
+
+typedef int __gthread_key_t;
+typedef int __gthread_once_t;
+typedef int __gthread_mutex_t;
+typedef int __gthread_recursive_mutex_t;
+
+#define __GTHREAD_ONCE_INIT 0
+#define __GTHREAD_MUTEX_INIT 0
+#define __GTHREAD_RECURSIVE_MUTEX_INIT 0
+
+static inline int
+__gthread_once (__gthread_once_t *__once __attribute__((unused)),
+		void (*__func) (void) __attribute__((unused)))
+{
+  return 0;
+}
+
+static inline int
+__gthread_key_create (__gthread_key_t *__key __attribute__((unused)),
+		      void (*__dtor) (void *) __attribute__((unused)))
+{
+  /* Operation is not supported.  */
+  return -1;
+}
+
+static inline int
+__gthread_key_delete (__gthread_key_t __key __attribute__ ((__unused__)))
+{
+  /* Operation is not supported.  */
+  return -1;
+}
+
+static inline void *
+__gthread_getspecific (__gthread_key_t __key __attribute__((unused)))
+{
+  return NULL;
+}
+
+static inline int
+__gthread_setspecific (__gthread_key_t __key __attribute__((unused)),
+		       const void *__ptr __attribute__((unused)))
+{
+  /* Operation is not supported.  */
+  return -1;
+}
+
+static inline int
+__gthread_mutex_destroy (__gthread_mutex_t *__mutex __attribute__((unused)))
+{
+  return 0;
+}
+
+static inline int
+__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
+{
+  return 0;
+}
+
+
+static inline int
+__gthread_mutex_lock (__gthread_mutex_t *__mutex)
+{
+  while (__sync_lock_test_and_set (__mutex, 1))
+    asm volatile ("s_sleep\t1" ::: "memory");
+
+  return 0;
+}
+
+static inline int
+__gthread_mutex_trylock (__gthread_mutex_t *__mutex)
+{
+  return __sync_lock_test_and_set (__mutex, 1);
+}
+
+static inline int
+__gthread_mutex_unlock (__gthread_mutex_t *__mutex)
+{
+  __sync_lock_release (__mutex);
+
+  return 0;
+}
+
+static inline int
+__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
+{
+  /* Operation is not supported.  */
+  return -1;
+}
+
+static inline int
+__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
+{
+  /* Operation is not supported.  */
+  return -1;
+}
+
+static inline int
+__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
+{
+  /* Operation is not supported.  */
+  return -1;
+}
+#endif /* _LIBOBJC */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! GCC_GTHR_GCN_H */
diff --git a/libgcc/configure b/libgcc/configure
index b2914de0629..af910b62931 100644
--- a/libgcc/configure
+++ b/libgcc/configure
@@ -5542,6 +5542,7 @@ tm_file="${tm_file_}"
 case $target_thread_file in
     aix)	thread_header=config/rs6000/gthr-aix.h ;;
     dce)	thread_header=config/pa/gthr-dce.h ;;
+    gcn)	thread_header=config/gcn/gthr-gcn.h ;;
     lynx)	thread_header=config/gthr-lynx.h ;;
     mipssde)	thread_header=config/mips/gthr-mipssde.h ;;
     posix)	thread_header=gthr-posix.h ;;

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 2/3] Stub implementation of unwinding for AMD GCN.
  2019-06-07 14:38 [PATCH 0/3] Enable full libgfortran for AMD GCN Andrew Stubbs
  2019-06-07 14:39 ` [PATCH 1/3] Create GCN-specific gthreads Andrew Stubbs
@ 2019-06-07 14:40 ` Andrew Stubbs
  2019-06-19  8:58   ` Andrew Stubbs
  2019-06-07 14:41 ` [PATCH 3/3] Enable full libgfortran library " Andrew Stubbs
  2 siblings, 1 reply; 14+ messages in thread
From: Andrew Stubbs @ 2019-06-07 14:40 UTC (permalink / raw)
  To: gcc-patches, Fortran List

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

This patch provides the "_Unwind_Backtrace" and "_Unwind_GetIPInfo" 
symbols required to link programs using libgfortran.

I do not wish to implement proper backtracing at this time (I have other 
things to work on), and IIUC none of the existing implementations will 
Just Work.

OK to commit?

-- 
Andrew Stubbs
Mentor Graphics / CodeSourcery

[-- Attachment #2: 190607-gcn-stub-unwinding.patch --]
[-- Type: text/x-patch, Size: 2105 bytes --]

Stub implementation of unwinding for AMD GCN.

2019-06-07  Andrew Stubbs  <ams@codesourcery.com>

	libgcc/
	* config/gcn/t-amdgcn (LIB2ADD): Add unwind-gcn.c.
	* config/gcn/unwind-gcn.c: New file.

diff --git a/libgcc/config/gcn/t-amdgcn b/libgcc/config/gcn/t-amdgcn
index 8687c9f3d9f..adbd866a1d9 100644
--- a/libgcc/config/gcn/t-amdgcn
+++ b/libgcc/config/gcn/t-amdgcn
@@ -1,5 +1,6 @@
 LIB2ADD += $(srcdir)/config/gcn/lib2-divmod.c \
-	   $(srcdir)/config/gcn/lib2-divmod-hi.c
+	   $(srcdir)/config/gcn/lib2-divmod-hi.c \
+	   $(srcdir)/config/gcn/unwind-gcn.c
 
 LIB2ADDEH=
 LIB2FUNCS_EXCLUDE=__main
diff --git a/libgcc/config/gcn/unwind-gcn.c b/libgcc/config/gcn/unwind-gcn.c
new file mode 100644
index 00000000000..8aa84d372c3
--- /dev/null
+++ b/libgcc/config/gcn/unwind-gcn.c
@@ -0,0 +1,37 @@
+/* Stub unwinding implementation.
+
+   Copyright (C) 2019 Free Software Foundation, Inc.
+   Contributed by Mentor Graphics
+
+   This file 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.
+
+   This file 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/>.  */
+
+#include "unwind.h"
+
+_Unwind_Reason_Code
+_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument)
+{
+  return 0;
+}
+
+_Unwind_Ptr
+_Unwind_GetIPInfo (struct _Unwind_Context *c, int *ip_before_insn)
+{
+  return 0;
+}

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 3/3] Enable full libgfortran library for AMD GCN
  2019-06-07 14:38 [PATCH 0/3] Enable full libgfortran for AMD GCN Andrew Stubbs
  2019-06-07 14:39 ` [PATCH 1/3] Create GCN-specific gthreads Andrew Stubbs
  2019-06-07 14:40 ` [PATCH 2/3] Stub implementation of unwinding for AMD GCN Andrew Stubbs
@ 2019-06-07 14:41 ` Andrew Stubbs
  2019-06-14 16:17   ` Janne Blomqvist
  2019-06-19 16:05   ` Jeff Law
  2 siblings, 2 replies; 14+ messages in thread
From: Andrew Stubbs @ 2019-06-07 14:41 UTC (permalink / raw)
  To: gcc-patches, Fortran List

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

This patch basically reverts the previous patch to put AMD GCN in 
"minimal" mode.

OK to commit?

-- 
Andrew Stubbs
Mentor Graphics / CodeSourcery

[-- Attachment #2: 190607-gcn-full-libgfortran.patch --]
[-- Type: text/x-patch, Size: 1380 bytes --]

Enable full GFortran library for AMD GCN

2019-06-07  Kwok Cheung Yeung  <kcy@codesourcery.com>
            Andrew Stubbs  <ams@codesourcery.com>

	libgfortran/
	* configure: Regenerate.
	* configure.ac (LIBGFOR_MINIMAL): Do not use on AMD GCN.

diff --git a/libgfortran/configure b/libgfortran/configure
index 60867b93d0e..15c9307f9d5 100755
--- a/libgfortran/configure
+++ b/libgfortran/configure
@@ -6179,8 +6179,7 @@ fi
 # * C library support for other features such as signal, environment
 #   variables, time functions
 
- if test "x${target_cpu}" = xnvptx \
-				 || test "x${target_cpu}" = xamdgcn; then
+ if test "x${target_cpu}" = xnvptx; then
   LIBGFOR_MINIMAL_TRUE=
   LIBGFOR_MINIMAL_FALSE='#'
 else
diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac
index 7cfce28ab69..8dcc8606bd4 100644
--- a/libgfortran/configure.ac
+++ b/libgfortran/configure.ac
@@ -205,8 +205,7 @@ AM_CONDITIONAL(LIBGFOR_USE_SYMVER_SUN, [test "x$gfortran_use_symver" = xsun])
 # * C library support for other features such as signal, environment
 #   variables, time functions
 
-AM_CONDITIONAL(LIBGFOR_MINIMAL, [test "x${target_cpu}" = xnvptx \
-				 || test "x${target_cpu}" = xamdgcn])
+AM_CONDITIONAL(LIBGFOR_MINIMAL, [test "x${target_cpu}" = xnvptx])
 
 # Figure out whether the compiler supports "-ffunction-sections -fdata-sections",
 # similarly to how libstdc++ does it

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/3] Enable full libgfortran library for AMD GCN
  2019-06-07 14:41 ` [PATCH 3/3] Enable full libgfortran library " Andrew Stubbs
@ 2019-06-14 16:17   ` Janne Blomqvist
  2019-06-19 16:05   ` Jeff Law
  1 sibling, 0 replies; 14+ messages in thread
From: Janne Blomqvist @ 2019-06-14 16:17 UTC (permalink / raw)
  To: Andrew Stubbs; +Cc: gcc-patches, Fortran List

On Fri, Jun 7, 2019 at 5:41 PM Andrew Stubbs <ams@codesourcery.com> wrote:
>
> This patch basically reverts the previous patch to put AMD GCN in
> "minimal" mode.

This is Ok, provided the maintainers for the areas touched by the
other 2 patches in this series Ok those.

Thanks for improving Fortran offloading (given the recent Frontier
supercomputer announcement, I hope we will receive more work in this
area in the future).


-- 
Janne Blomqvist

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] Create GCN-specific gthreads
  2019-06-07 14:39 ` [PATCH 1/3] Create GCN-specific gthreads Andrew Stubbs
@ 2019-06-19  8:57   ` Andrew Stubbs
  2019-06-19 16:04     ` Jeff Law
  2023-11-03 14:54   ` GCN: Address undeclared 'NULL' usage in 'libgcc/config/gcn/gthr-gcn.h:__gthread_getspecific' (was: [PATCH 1/3] Create GCN-specific gthreads) Thomas Schwinge
  1 sibling, 1 reply; 14+ messages in thread
From: Andrew Stubbs @ 2019-06-19  8:57 UTC (permalink / raw)
  To: gcc-patches, Fortran List

Ping.

I can probably approve this myself, as it only affects GCN, but I'd 
appreciate a second opinion.

Thanks

Andrew

On 07/06/2019 15:39, Andrew Stubbs wrote:
> This patch creates a new gthread model for AMD GCN devices.
> 
> For now, there's just enough support for libgfortran to use mutexes in 
> its I/O routines. The rest can be added at a later time, if at all.
> 
> Notes:
> 
>   * GCN GPUs do not support dynamic creation and deletion of threads, so
>     there can be no implementation for those functions. (There may be
>     many threads, of course, but they are hardware managed and must be
>     launched all at once.)
> 
>   * It would be possible to implement support for EMUTLS, but I have no
>     wish to do so at this time, and it isn't likely to be needed by
>     OpenMP or OpenACC offload kernels, so those functions are also stub
>     implementations.
> 
> OK to commit?
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/3] Stub implementation of unwinding for AMD GCN.
  2019-06-07 14:40 ` [PATCH 2/3] Stub implementation of unwinding for AMD GCN Andrew Stubbs
@ 2019-06-19  8:58   ` Andrew Stubbs
  2019-06-19 16:05     ` Jeff Law
  0 siblings, 1 reply; 14+ messages in thread
From: Andrew Stubbs @ 2019-06-19  8:58 UTC (permalink / raw)
  To: gcc-patches, Fortran List

Ping.

I can probably approve this myself, as it only affects GCN, but I'd 
appreciate a second opinion.

Thanks

Andrew

On 07/06/2019 15:40, Andrew Stubbs wrote:
> This patch provides the "_Unwind_Backtrace" and "_Unwind_GetIPInfo" 
> symbols required to link programs using libgfortran.
> 
> I do not wish to implement proper backtracing at this time (I have other 
> things to work on), and IIUC none of the existing implementations will 
> Just Work.
> 
> OK to commit?
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] Create GCN-specific gthreads
  2019-06-19  8:57   ` Andrew Stubbs
@ 2019-06-19 16:04     ` Jeff Law
  2019-06-19 16:56       ` Andrew Stubbs
  0 siblings, 1 reply; 14+ messages in thread
From: Jeff Law @ 2019-06-19 16:04 UTC (permalink / raw)
  To: Andrew Stubbs, gcc-patches, Fortran List

On 6/19/19 2:57 AM, Andrew Stubbs wrote:
> Ping.
> 
> I can probably approve this myself, as it only affects GCN, but I'd
> appreciate a second opinion.
Yes, this would fall under things you could approve yourself.  Thanks
for double-checking.

jeff

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/3] Enable full libgfortran library for AMD GCN
  2019-06-07 14:41 ` [PATCH 3/3] Enable full libgfortran library " Andrew Stubbs
  2019-06-14 16:17   ` Janne Blomqvist
@ 2019-06-19 16:05   ` Jeff Law
  1 sibling, 0 replies; 14+ messages in thread
From: Jeff Law @ 2019-06-19 16:05 UTC (permalink / raw)
  To: Andrew Stubbs, gcc-patches, Fortran List

On 6/7/19 8:40 AM, Andrew Stubbs wrote:
> This patch basically reverts the previous patch to put AMD GCN in
> "minimal" mode.
> 
> OK to commit?
OK
jeff

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/3] Stub implementation of unwinding for AMD GCN.
  2019-06-19  8:58   ` Andrew Stubbs
@ 2019-06-19 16:05     ` Jeff Law
  2019-06-19 16:57       ` Andrew Stubbs
  0 siblings, 1 reply; 14+ messages in thread
From: Jeff Law @ 2019-06-19 16:05 UTC (permalink / raw)
  To: Andrew Stubbs, gcc-patches, Fortran List

On 6/19/19 2:58 AM, Andrew Stubbs wrote:
> Ping.
> 
> I can probably approve this myself, as it only affects GCN, but I'd
> appreciate a second opinion.
Similarly this is fine to self-approve.  Thanks.

Jeff

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] Create GCN-specific gthreads
  2019-06-19 16:04     ` Jeff Law
@ 2019-06-19 16:56       ` Andrew Stubbs
  2019-06-19 16:59         ` Jeff Law
  0 siblings, 1 reply; 14+ messages in thread
From: Andrew Stubbs @ 2019-06-19 16:56 UTC (permalink / raw)
  To: Jeff Law, Andrew Stubbs, gcc-patches, Fortran List

On 19/06/2019 17:04, Jeff Law wrote:
> On 6/19/19 2:57 AM, Andrew Stubbs wrote:
>> Ping.
>>
>> I can probably approve this myself, as it only affects GCN, but I'd
>> appreciate a second opinion.
> Yes, this would fall under things you could approve yourself.  Thanks
> for double-checking.

Sorry, I meant I'd like another opinion on the patch contents. I'm not 
confident that I didn't miss something.

Andrew

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/3] Stub implementation of unwinding for AMD GCN.
  2019-06-19 16:05     ` Jeff Law
@ 2019-06-19 16:57       ` Andrew Stubbs
  0 siblings, 0 replies; 14+ messages in thread
From: Andrew Stubbs @ 2019-06-19 16:57 UTC (permalink / raw)
  To: Jeff Law, gcc-patches, Fortran List

On 19/06/2019 17:04, Jeff Law wrote:
> On 6/19/19 2:58 AM, Andrew Stubbs wrote:
>> Ping.
>>
>> I can probably approve this myself, as it only affects GCN, but I'd
>> appreciate a second opinion.
> Similarly this is fine to self-approve.  Thanks.

Sorry, same again, I meant I'd like another opinion on the patch contents.

Andrew

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/3] Create GCN-specific gthreads
  2019-06-19 16:56       ` Andrew Stubbs
@ 2019-06-19 16:59         ` Jeff Law
  0 siblings, 0 replies; 14+ messages in thread
From: Jeff Law @ 2019-06-19 16:59 UTC (permalink / raw)
  To: Andrew Stubbs, Andrew Stubbs, gcc-patches, Fortran List

On 6/19/19 10:56 AM, Andrew Stubbs wrote:
> On 19/06/2019 17:04, Jeff Law wrote:
>> On 6/19/19 2:57 AM, Andrew Stubbs wrote:
>>> Ping.
>>>
>>> I can probably approve this myself, as it only affects GCN, but I'd
>>> appreciate a second opinion.
>> Yes, this would fall under things you could approve yourself.  Thanks
>> for double-checking.
> 
> Sorry, I meant I'd like another opinion on the patch contents. I'm not
> confident that I didn't miss something.
The contents looked reasonable as well.   The changes aren't going to
affect any other targets, so you can flesh them out over time as needed.

jeff

^ permalink raw reply	[flat|nested] 14+ messages in thread

* GCN: Address undeclared 'NULL' usage in 'libgcc/config/gcn/gthr-gcn.h:__gthread_getspecific' (was: [PATCH 1/3] Create GCN-specific gthreads)
  2019-06-07 14:39 ` [PATCH 1/3] Create GCN-specific gthreads Andrew Stubbs
  2019-06-19  8:57   ` Andrew Stubbs
@ 2023-11-03 14:54   ` Thomas Schwinge
  1 sibling, 0 replies; 14+ messages in thread
From: Thomas Schwinge @ 2023-11-03 14:54 UTC (permalink / raw)
  To: Kwok Cheung Yeung, Andrew Stubbs, gcc-patches; +Cc: fortran, Julian Brown

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

Hi!

On 2019-06-07T15:39:36+0100, Andrew Stubbs <ams@codesourcery.com> wrote:
> This patch creates a new gthread model for AMD GCN devices.
>
> For now, there's just enough support for libgfortran to use mutexes in
> its I/O routines. The rest can be added at a later time, if at all.

Hmm, interestingly we don't have that for nvptx -- and I didn't run into
the need when early this year I was working on Fortran I/O support for
nvptx corresponding to that of GCN.  (That's the pending
"nvptx, libgfortran: Switch out of "minimal" mode" and prerequisite
patches.)

Anyway, not resolving that mystery today, but just a simple technicality:
pushed to master branch commit 5926f30a8dcee9142360fdae445ebfdee4a528f9
"GCN: Address undeclared 'NULL' usage in 'libgcc/config/gcn/gthr-gcn.h:__gthread_getspecific'",
see attached.


Grüße
 Thomas


> Notes:
>
>   * GCN GPUs do not support dynamic creation and deletion of threads, so
>     there can be no implementation for those functions. (There may be
>     many threads, of course, but they are hardware managed and must be
>     launched all at once.)
>
>   * It would be possible to implement support for EMUTLS, but I have no
>     wish to do so at this time, and it isn't likely to be needed by
>     OpenMP or OpenACC offload kernels, so those functions are also stub
>     implementations.
>
> OK to commit?
>
> --
> Andrew Stubbs
> Mentor Graphics / CodeSourcery
> Create GCN-specific gthreads
>
> 2019-06-05  Kwok Cheung Yeung  <kcy@codesourcery.com>
>             Andrew Stubbs  <ams@codesourcery.com>
>
>         gcc/
>       * config.gcc (thread_file): Set to gcn for AMD GCN.
>       * config/gcn/gcn.c (gcn_emutls_var_init): New function.
>       (TARGET_EMUTLS_VAR_INIT): New hook.
>
>       config/
>       * gthr.m4 (GCC_AC_THREAD_HEADER): Add case for gcn.
>
>       libgcc/
>       * configure: Regenerate.
>       * config/gcn/gthr-gcn.h: New.
>
> diff --git a/config/gthr.m4 b/config/gthr.m4
> index 7b29f1f3327..4b937306ad0 100644
> --- a/config/gthr.m4
> +++ b/config/gthr.m4
> @@ -13,6 +13,7 @@ AC_DEFUN([GCC_AC_THREAD_HEADER],
>  case $1 in
>      aix)     thread_header=config/rs6000/gthr-aix.h ;;
>      dce)     thread_header=config/pa/gthr-dce.h ;;
> +    gcn)     thread_header=config/gcn/gthr-gcn.h ;;
>      lynx)    thread_header=config/gthr-lynx.h ;;
>      mipssde) thread_header=config/mips/gthr-mipssde.h ;;
>      posix)   thread_header=gthr-posix.h ;;
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 6b00c387247..b450098aa09 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -1428,6 +1428,7 @@ amdgcn-*-amdhsa)
>       fi
>       # Force .init_array support.
>       gcc_cv_initfini_array=yes
> +     thread_file=gcn
>       ;;
>  moxie-*-elf)
>       gas=yes
> diff --git a/gcc/config/gcn/gcn.c b/gcc/config/gcn/gcn.c
> index 71f4b4ce35a..e528b649cce 100644
> --- a/gcc/config/gcn/gcn.c
> +++ b/gcc/config/gcn/gcn.c
> @@ -3163,6 +3163,16 @@ gcn_valid_cvt_p (machine_mode from, machine_mode to, enum gcn_cvt_t op)
>         || (to == DFmode && (from == SImode || from == SFmode)));
>  }
>
> +/* Implement TARGET_EMUTLS_VAR_INIT.
> +
> +   Disable emutls (gthr-gcn.h does not support it, yet).  */
> +
> +tree
> +gcn_emutls_var_init (tree, tree decl, tree)
> +{
> +  sorry_at (DECL_SOURCE_LOCATION (decl), "TLS is not implemented for GCN.");
> +}
> +
>  /* }}}  */
>  /* {{{ Costs.  */
>
> @@ -6007,6 +6017,8 @@ print_operand (FILE *file, rtx x, int code)
>  #define TARGET_CONSTANT_ALIGNMENT gcn_constant_alignment
>  #undef  TARGET_DEBUG_UNWIND_INFO
>  #define TARGET_DEBUG_UNWIND_INFO gcn_debug_unwind_info
> +#undef  TARGET_EMUTLS_VAR_INIT
> +#define TARGET_EMUTLS_VAR_INIT gcn_emutls_var_init
>  #undef  TARGET_EXPAND_BUILTIN
>  #define TARGET_EXPAND_BUILTIN gcn_expand_builtin
>  #undef  TARGET_FUNCTION_ARG
> diff --git a/libgcc/config/gcn/gthr-gcn.h b/libgcc/config/gcn/gthr-gcn.h
> new file mode 100644
> index 00000000000..4227b515f01
> --- /dev/null
> +++ b/libgcc/config/gcn/gthr-gcn.h
> @@ -0,0 +1,163 @@
> +/* Threads compatibility routines for libgcc2 and libobjc.  */
> +/* Compile this one with gcc.  */
> +/* Copyright (C) 2019 Free Software Foundation, Inc.
> +
> +This file is part of GCC.
> +
> +GCC 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.
> +
> +GCC 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/>.  */
> +
> +/* AMD GCN does not support dynamic creation of threads.  There may be many
> +   hardware threads, but they're all created simultaneously at launch time.
> +
> +   This implementation is intended to provide mutexes for libgfortran, etc.
> +   It is not intended to provide a TLS implementation at this time,
> +   although that may be added later if needed.
> +
> +   __gthread_active_p returns "1" to ensure that mutexes are used, and that
> +   programs attempting to use emutls will fail with the appropriate abort.
> +   It is expected that the TLS tests will fail.  */
> +
> +#ifndef GCC_GTHR_GCN_H
> +#define GCC_GTHR_GCN_H
> +
> +#define __GTHREADS 1
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#ifdef _LIBOBJC
> +#error "Objective C is not supported on AMD GCN"
> +#else
> +
> +static inline int
> +__gthread_active_p (void)
> +{
> +  return 1;
> +}
> +
> +typedef int __gthread_key_t;
> +typedef int __gthread_once_t;
> +typedef int __gthread_mutex_t;
> +typedef int __gthread_recursive_mutex_t;
> +
> +#define __GTHREAD_ONCE_INIT 0
> +#define __GTHREAD_MUTEX_INIT 0
> +#define __GTHREAD_RECURSIVE_MUTEX_INIT 0
> +
> +static inline int
> +__gthread_once (__gthread_once_t *__once __attribute__((unused)),
> +             void (*__func) (void) __attribute__((unused)))
> +{
> +  return 0;
> +}
> +
> +static inline int
> +__gthread_key_create (__gthread_key_t *__key __attribute__((unused)),
> +                   void (*__dtor) (void *) __attribute__((unused)))
> +{
> +  /* Operation is not supported.  */
> +  return -1;
> +}
> +
> +static inline int
> +__gthread_key_delete (__gthread_key_t __key __attribute__ ((__unused__)))
> +{
> +  /* Operation is not supported.  */
> +  return -1;
> +}
> +
> +static inline void *
> +__gthread_getspecific (__gthread_key_t __key __attribute__((unused)))
> +{
> +  return NULL;
> +}
> +
> +static inline int
> +__gthread_setspecific (__gthread_key_t __key __attribute__((unused)),
> +                    const void *__ptr __attribute__((unused)))
> +{
> +  /* Operation is not supported.  */
> +  return -1;
> +}
> +
> +static inline int
> +__gthread_mutex_destroy (__gthread_mutex_t *__mutex __attribute__((unused)))
> +{
> +  return 0;
> +}
> +
> +static inline int
> +__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
> +{
> +  return 0;
> +}
> +
> +
> +static inline int
> +__gthread_mutex_lock (__gthread_mutex_t *__mutex)
> +{
> +  while (__sync_lock_test_and_set (__mutex, 1))
> +    asm volatile ("s_sleep\t1" ::: "memory");
> +
> +  return 0;
> +}
> +
> +static inline int
> +__gthread_mutex_trylock (__gthread_mutex_t *__mutex)
> +{
> +  return __sync_lock_test_and_set (__mutex, 1);
> +}
> +
> +static inline int
> +__gthread_mutex_unlock (__gthread_mutex_t *__mutex)
> +{
> +  __sync_lock_release (__mutex);
> +
> +  return 0;
> +}
> +
> +static inline int
> +__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
> +{
> +  /* Operation is not supported.  */
> +  return -1;
> +}
> +
> +static inline int
> +__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
> +{
> +  /* Operation is not supported.  */
> +  return -1;
> +}
> +
> +static inline int
> +__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex __attribute__((unused)))
> +{
> +  /* Operation is not supported.  */
> +  return -1;
> +}
> +#endif /* _LIBOBJC */
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* ! GCC_GTHR_GCN_H */
> diff --git a/libgcc/configure b/libgcc/configure
> index b2914de0629..af910b62931 100644
> --- a/libgcc/configure
> +++ b/libgcc/configure
> @@ -5542,6 +5542,7 @@ tm_file="${tm_file_}"
>  case $target_thread_file in
>      aix)     thread_header=config/rs6000/gthr-aix.h ;;
>      dce)     thread_header=config/pa/gthr-dce.h ;;
> +    gcn)     thread_header=config/gcn/gthr-gcn.h ;;
>      lynx)    thread_header=config/gthr-lynx.h ;;
>      mipssde) thread_header=config/mips/gthr-mipssde.h ;;
>      posix)   thread_header=gthr-posix.h ;;


-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955

[-- Attachment #2: 0001-GCN-Address-undeclared-NULL-usage-in-libgcc-config-g.patch --]
[-- Type: text/x-diff, Size: 1670 bytes --]

From 5926f30a8dcee9142360fdae445ebfdee4a528f9 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>
Date: Wed, 13 Jul 2022 18:17:30 +0200
Subject: [PATCH] GCN: Address undeclared 'NULL' usage in
 'libgcc/config/gcn/gthr-gcn.h:__gthread_getspecific'
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

For 'libgcc/config/gcn/gthr-gcn.h' used in libstdc++ context (WIP), we have:

    [...]/build-gcc-offload-amdgcn-amdhsa/amdgcn-amdhsa/libstdc++-v3/include/amdgcn-amdhsa/bits/gthr-default.h: In function ‘void* __gthread_getspecific(__gthread_key_t)’:
    [...]/build-gcc-offload-amdgcn-amdhsa/amdgcn-amdhsa/libstdc++-v3/include/amdgcn-amdhsa/bits/gthr-default.h:90:10: error: ‘NULL’ was not declared in this scope
       90 |   return NULL;
          |          ^~~~

Resolve this with 's%NULL%0', as is used in
'libgcc/gthr-single.h:__gthread_getspecific', for example.

Follow-up to commit 76d463310787c8c7fd0c55cf88031b240311ab68
"Create GCN-specific gthreads".

	libgcc/
	* config/gcn/gthr-gcn.h (__gthread_getspecific): 's%NULL%0'.
---
 libgcc/config/gcn/gthr-gcn.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libgcc/config/gcn/gthr-gcn.h b/libgcc/config/gcn/gthr-gcn.h
index a0bfde2023a..d81b27db933 100644
--- a/libgcc/config/gcn/gthr-gcn.h
+++ b/libgcc/config/gcn/gthr-gcn.h
@@ -87,7 +87,7 @@ __gthread_key_delete (__gthread_key_t __key __attribute__ ((__unused__)))
 static inline void *
 __gthread_getspecific (__gthread_key_t __key __attribute__((unused)))
 {
-  return NULL;
+  return 0;
 }
 
 static inline int
-- 
2.34.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2023-11-03 14:55 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-07 14:38 [PATCH 0/3] Enable full libgfortran for AMD GCN Andrew Stubbs
2019-06-07 14:39 ` [PATCH 1/3] Create GCN-specific gthreads Andrew Stubbs
2019-06-19  8:57   ` Andrew Stubbs
2019-06-19 16:04     ` Jeff Law
2019-06-19 16:56       ` Andrew Stubbs
2019-06-19 16:59         ` Jeff Law
2023-11-03 14:54   ` GCN: Address undeclared 'NULL' usage in 'libgcc/config/gcn/gthr-gcn.h:__gthread_getspecific' (was: [PATCH 1/3] Create GCN-specific gthreads) Thomas Schwinge
2019-06-07 14:40 ` [PATCH 2/3] Stub implementation of unwinding for AMD GCN Andrew Stubbs
2019-06-19  8:58   ` Andrew Stubbs
2019-06-19 16:05     ` Jeff Law
2019-06-19 16:57       ` Andrew Stubbs
2019-06-07 14:41 ` [PATCH 3/3] Enable full libgfortran library " Andrew Stubbs
2019-06-14 16:17   ` Janne Blomqvist
2019-06-19 16:05   ` Jeff Law

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).