78 lines · c
1// RUN: %libomp-compile-and-run 2>&1 | FileCheck %s2// Linking fails for icc 183// UNSUPPORTED: icc-184 5#include <omp_testsuite.h>6#include <string.h>7 8int test_omp_device_uid(int device_num) {9 const char *device_uid = omp_get_uid_from_device(device_num);10 if (device_uid == NULL) {11 printf("FAIL for device %d: omp_get_uid_from_device returned NULL\n",12 device_num);13 return 0;14 }15 16 int device_num_from_uid = omp_get_device_from_uid(device_uid);17 if (device_num_from_uid != device_num) {18 printf(19 "FAIL for device %d: omp_get_device_from_uid returned %d (UID: %s)\n",20 device_num, device_num_from_uid, device_uid);21 return 0;22 }23 24 if (device_num == omp_get_initial_device())25 return 1;26 27 int success = 1;28 29// Note that the following code may be executed on the host if the host is the30// device31#pragma omp target map(tofrom : success) device(device_num)32 {33 int device_num = omp_get_device_num();34 35 // omp_get_uid_from_device() in the device runtime is a dummy function36 // returning NULL37 const char *device_uid = omp_get_uid_from_device(device_num);38 39 // omp_get_device_from_uid() in the device runtime is a dummy function40 // returning omp_invalid_device.41 int device_num_from_uid = omp_get_device_from_uid(device_uid);42 43 // Depending on whether we're executing on the device or the host, we either44 // got NULL as the device UID or the correct device UID. Consequently,45 // omp_get_device_from_uid() either returned omp_invalid_device or the46 // correct device number (aka omp_get_initial_device()).47 if (device_uid ? device_num_from_uid != device_num48 : device_num_from_uid != omp_invalid_device) {49 printf("FAIL for device %d (target): omp_get_device_from_uid returned %d "50 "(UID: %s)\n",51 device_num, device_num_from_uid, device_uid);52 success = 0;53 }54 }55 56 return success;57}58 59int main() {60 int num_devices = omp_get_num_devices();61 int num_failed = 0;62 // (also test initial device aka num_devices)63 for (int i = 0; i < num_devices + 1; i++) {64 if (!test_omp_device_uid(i)) {65 printf("FAIL for device %d\n", i);66 num_failed++;67 }68 }69 if (num_failed) {70 printf("FAIL\n");71 return 1;72 }73 printf("PASS\n");74 return 0;75}76 77// CHECK: PASS78