1*38fd1498Szrj /* OpenACC Runtime Library Definitions.
2*38fd1498Szrj
3*38fd1498Szrj Copyright (C) 2013-2018 Free Software Foundation, Inc.
4*38fd1498Szrj
5*38fd1498Szrj Contributed by Mentor Embedded.
6*38fd1498Szrj
7*38fd1498Szrj This file is part of the GNU Offloading and Multi Processing Library
8*38fd1498Szrj (libgomp).
9*38fd1498Szrj
10*38fd1498Szrj Libgomp is free software; you can redistribute it and/or modify it
11*38fd1498Szrj under the terms of the GNU General Public License as published by
12*38fd1498Szrj the Free Software Foundation; either version 3, or (at your option)
13*38fd1498Szrj any later version.
14*38fd1498Szrj
15*38fd1498Szrj Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
16*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17*38fd1498Szrj FOR A PARTICULAR PURPOSE. See the GNU General Public License for
18*38fd1498Szrj more details.
19*38fd1498Szrj
20*38fd1498Szrj Under Section 7 of GPL version 3, you are granted additional
21*38fd1498Szrj permissions described in the GCC Runtime Library Exception, version
22*38fd1498Szrj 3.1, as published by the Free Software Foundation.
23*38fd1498Szrj
24*38fd1498Szrj You should have received a copy of the GNU General Public License and
25*38fd1498Szrj a copy of the GCC Runtime Library Exception along with this program;
26*38fd1498Szrj see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
27*38fd1498Szrj <http://www.gnu.org/licenses/>. */
28*38fd1498Szrj
29*38fd1498Szrj #include <assert.h>
30*38fd1498Szrj #include "openacc.h"
31*38fd1498Szrj #include "libgomp.h"
32*38fd1498Szrj #include "oacc-int.h"
33*38fd1498Szrj
34*38fd1498Szrj int
acc_async_test(int async)35*38fd1498Szrj acc_async_test (int async)
36*38fd1498Szrj {
37*38fd1498Szrj if (async < acc_async_sync)
38*38fd1498Szrj gomp_fatal ("invalid async argument: %d", async);
39*38fd1498Szrj
40*38fd1498Szrj struct goacc_thread *thr = goacc_thread ();
41*38fd1498Szrj
42*38fd1498Szrj if (!thr || !thr->dev)
43*38fd1498Szrj gomp_fatal ("no device active");
44*38fd1498Szrj
45*38fd1498Szrj return thr->dev->openacc.async_test_func (async);
46*38fd1498Szrj }
47*38fd1498Szrj
48*38fd1498Szrj int
acc_async_test_all(void)49*38fd1498Szrj acc_async_test_all (void)
50*38fd1498Szrj {
51*38fd1498Szrj struct goacc_thread *thr = goacc_thread ();
52*38fd1498Szrj
53*38fd1498Szrj if (!thr || !thr->dev)
54*38fd1498Szrj gomp_fatal ("no device active");
55*38fd1498Szrj
56*38fd1498Szrj return thr->dev->openacc.async_test_all_func ();
57*38fd1498Szrj }
58*38fd1498Szrj
59*38fd1498Szrj void
acc_wait(int async)60*38fd1498Szrj acc_wait (int async)
61*38fd1498Szrj {
62*38fd1498Szrj if (async < acc_async_sync)
63*38fd1498Szrj gomp_fatal ("invalid async argument: %d", async);
64*38fd1498Szrj
65*38fd1498Szrj struct goacc_thread *thr = goacc_thread ();
66*38fd1498Szrj
67*38fd1498Szrj if (!thr || !thr->dev)
68*38fd1498Szrj gomp_fatal ("no device active");
69*38fd1498Szrj
70*38fd1498Szrj thr->dev->openacc.async_wait_func (async);
71*38fd1498Szrj }
72*38fd1498Szrj
73*38fd1498Szrj /* acc_async_wait is an OpenACC 1.0 compatibility name for acc_wait. */
74*38fd1498Szrj #ifdef HAVE_ATTRIBUTE_ALIAS
strong_alias(acc_wait,acc_async_wait)75*38fd1498Szrj strong_alias (acc_wait, acc_async_wait)
76*38fd1498Szrj #else
77*38fd1498Szrj void
78*38fd1498Szrj acc_async_wait (int async)
79*38fd1498Szrj {
80*38fd1498Szrj acc_wait (async);
81*38fd1498Szrj }
82*38fd1498Szrj #endif
83*38fd1498Szrj
84*38fd1498Szrj void
85*38fd1498Szrj acc_wait_async (int async1, int async2)
86*38fd1498Szrj {
87*38fd1498Szrj struct goacc_thread *thr = goacc_thread ();
88*38fd1498Szrj
89*38fd1498Szrj if (!thr || !thr->dev)
90*38fd1498Szrj gomp_fatal ("no device active");
91*38fd1498Szrj
92*38fd1498Szrj thr->dev->openacc.async_wait_async_func (async1, async2);
93*38fd1498Szrj }
94*38fd1498Szrj
95*38fd1498Szrj void
acc_wait_all(void)96*38fd1498Szrj acc_wait_all (void)
97*38fd1498Szrj {
98*38fd1498Szrj struct goacc_thread *thr = goacc_thread ();
99*38fd1498Szrj
100*38fd1498Szrj if (!thr || !thr->dev)
101*38fd1498Szrj gomp_fatal ("no device active");
102*38fd1498Szrj
103*38fd1498Szrj thr->dev->openacc.async_wait_all_func ();
104*38fd1498Szrj }
105*38fd1498Szrj
106*38fd1498Szrj /* acc_async_wait_all is an OpenACC 1.0 compatibility name for acc_wait_all. */
107*38fd1498Szrj #ifdef HAVE_ATTRIBUTE_ALIAS
strong_alias(acc_wait_all,acc_async_wait_all)108*38fd1498Szrj strong_alias (acc_wait_all, acc_async_wait_all)
109*38fd1498Szrj #else
110*38fd1498Szrj void
111*38fd1498Szrj acc_async_wait_all (void)
112*38fd1498Szrj {
113*38fd1498Szrj acc_wait_all ();
114*38fd1498Szrj }
115*38fd1498Szrj #endif
116*38fd1498Szrj
117*38fd1498Szrj void
118*38fd1498Szrj acc_wait_all_async (int async)
119*38fd1498Szrj {
120*38fd1498Szrj if (async < acc_async_sync)
121*38fd1498Szrj gomp_fatal ("invalid async argument: %d", async);
122*38fd1498Szrj
123*38fd1498Szrj struct goacc_thread *thr = goacc_thread ();
124*38fd1498Szrj
125*38fd1498Szrj if (!thr || !thr->dev)
126*38fd1498Szrj gomp_fatal ("no device active");
127*38fd1498Szrj
128*38fd1498Szrj thr->dev->openacc.async_wait_all_async_func (async);
129*38fd1498Szrj }
130