xref: /netbsd-src/external/gpl3/gcc/dist/libgomp/config/accel/openacc.f90 (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1!  OpenACC Runtime Library Definitions.
2
3!  Copyright (C) 2014-2022 Free Software Foundation, Inc.
4
5!  Contributed by Tobias Burnus <burnus@net-b.de>
6!              and Mentor Embedded.
7
8!  This file is part of the GNU Offloading and Multi Processing Library
9!  (libgomp).
10
11!  Libgomp is free software; you can redistribute it and/or modify it
12!  under the terms of the GNU General Public License as published by
13!  the Free Software Foundation; either version 3, or (at your option)
14!  any later version.
15
16!  Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
17!  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18!  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
19!  more details.
20
21!  Under Section 7 of GPL version 3, you are granted additional
22!  permissions described in the GCC Runtime Library Exception, version
23!  3.1, as published by the Free Software Foundation.
24
25!  You should have received a copy of the GNU General Public License and
26!  a copy of the GCC Runtime Library Exception along with this program;
27!  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
28!  <http://www.gnu.org/licenses/>.
29
30! Wrapper functions will be built from openacc.f90.  We use a separate file
31! here, because for using ../../openacc.f90, implementations are required for
32! all the functions that it wraps, which we currently don't provide, so linking
33! would fail.
34
35module openacc_kinds
36  use iso_fortran_env, only: int32
37  implicit none
38
39  public
40  private :: int32
41
42  ! When adding items, also update 'public' setting in 'module openacc' below.
43
44  integer, parameter :: acc_device_kind = int32
45
46  ! Keep in sync with include/gomp-constants.h.
47  integer (acc_device_kind), parameter :: acc_device_current = -1
48  integer (acc_device_kind), parameter :: acc_device_none = 0
49  integer (acc_device_kind), parameter :: acc_device_default = 1
50  integer (acc_device_kind), parameter :: acc_device_host = 2
51  ! integer (acc_device_kind), parameter :: acc_device_host_nonshm = 3 removed.
52  integer (acc_device_kind), parameter :: acc_device_not_host = 4
53  integer (acc_device_kind), parameter :: acc_device_nvidia = 5
54  integer (acc_device_kind), parameter :: acc_device_radeon = 8
55
56end module openacc_kinds
57
58module openacc_internal
59  use openacc_kinds
60  implicit none
61
62  interface
63    function acc_on_device_h (devicetype)
64      import
65      integer (acc_device_kind) devicetype
66      logical acc_on_device_h
67    end function
68  end interface
69
70  interface
71    function acc_on_device_l (devicetype) &
72        bind (C, name = "acc_on_device")
73      use iso_c_binding, only: c_int
74      integer (c_int) :: acc_on_device_l
75      integer (c_int), value :: devicetype
76    end function
77  end interface
78end module openacc_internal
79
80module openacc
81  use openacc_kinds
82  use openacc_internal
83  implicit none
84
85  private
86
87  ! From openacc_kinds
88  public :: acc_device_kind
89  public :: acc_device_none, acc_device_default, acc_device_host
90  public :: acc_device_not_host, acc_device_nvidia, acc_device_radeon
91
92  public :: acc_on_device
93
94  interface acc_on_device
95    procedure :: acc_on_device_h
96  end interface
97
98end module openacc
99
100function acc_on_device_h (devicetype)
101  use openacc_internal, only: acc_on_device_l
102  use openacc_kinds
103  integer (acc_device_kind) devicetype
104  logical acc_on_device_h
105  acc_on_device_h = acc_on_device_l (devicetype) /= 0
106end function
107