[1/3] Create GCN-specific gthreads

Message ID e12103b3-9dbd-0f84-c758-b325cd7cd562@codesourcery.com
State New
Headers show
Series
  • Enable full libgfortran for AMD GCN
Related show

Commit Message

Andrew Stubbs June 7, 2019, 2:39 p.m.
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

Comments

Andrew Stubbs June 19, 2019, 8:57 a.m. | #1
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?

>
Jeff Law June 19, 2019, 4:04 p.m. | #2
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
Andrew Stubbs June 19, 2019, 4:56 p.m. | #3
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
Jeff Law June 19, 2019, 4:59 p.m. | #4
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

Patch

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 ;;