brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.1 KiB · 02cb78b Raw
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