/* Copyright 2026 Free Software Foundation, Inc. Copyright (C) 2026 Advanced Micro Devices, Inc. All rights reserved. This file is part of GDB. This program 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 of the License, or (at your option) any later version. This program 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. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* '#pragma omp target data' wraps two consecutive '#pragma omp target' regions, sharing the device data buffer. This is the natural way OpenMP applications stage data to the GPU and exercise multiple kernel launches against it. */ #include #define N 32 static void fill (int *p, int v) { for (int i = 0; i < N; i++) p[i] = v + i; } int main (void) { int a[N]; int b[N]; int c[N]; fill (a, 0); fill (b, 100); for (int i = 0; i < N; i++) c[i] = 0; #pragma omp target data map(to:a[0:N], b[0:N]) map(tofrom:c[0:N]) { /* First kernel: c = a + b. */ #pragma omp target { for (int i = 0; i < N; i++) c[i] = a[i] + b[i]; /* data-k1 */ } /* Second kernel: c *= 2 (data buffer reused, no host transfer). */ #pragma omp target { for (int i = 0; i < N; i++) c[i] = c[i] * 2; /* data-k2 */ } } printf ("c[0]=%d c[%d]=%d\n", c[0], N - 1, c[N - 1]); return 0; }