55 lines · c
1// RUN: %libomptarget-compileopt-run-and-check-generic2//3// REQUIRES: gpu4 5#include <math.h>6#include <omp.h>7#include <ompx.h>8#include <stdio.h>9#include <stdlib.h>10 11int main(int argc, char **argv) {12 int N = 1 << 29;13 if (argc > 1)14 N = atoi(argv[1]);15 float a = 2.f;16 17 float *X = (float *)malloc(sizeof(*X) * N);18 float *Y = (float *)malloc(sizeof(*X) * N);19 20 for (int i = 0; i < N; i++) {21 X[i] = 1.0f;22 Y[i] = 2.0f;23 }24 25 int TL = 256;26 int NT = (N + TL - 1) / TL;27 28#pragma omp target data map(to : X [0:N]) map(Y [0:N])29#pragma omp target teams num_teams(NT) thread_limit(TL)30 {31#pragma omp parallel32 {33 int tid = ompx_thread_id_x();34 int bid = ompx_block_id_x();35 int tdim = ompx_block_dim_x();36 int gid = tid + bid * tdim;37 if (gid < N)38 Y[gid] = a * X[gid] + Y[gid];39 }40 }41 42 float maxError = 0.0f;43 for (int i = 0; i < N; i++) {44 maxError = fmax(maxError, fabs(Y[i] - 4.0f));45 if (maxError) {46 printf("%i %f %f\n", i, maxError, Y[i]);47 break;48 }49 }50 // CHECK: Max error: 0.0051 printf("Max error: %f\n", maxError);52 53 return 0;54}55