diff --git a/openmp/libomptarget/DeviceRTL/include/Configuration.h b/openmp/libomptarget/DeviceRTL/include/Configuration.h index 94f11b6066a20..368a7c35ac4a8 100644 --- a/openmp/libomptarget/DeviceRTL/include/Configuration.h +++ b/openmp/libomptarget/DeviceRTL/include/Configuration.h @@ -28,8 +28,7 @@ enum DebugKind : uint32_t { /// host by omp_get_num_devices. uint32_t getNumDevices(); -/// Return the number of devices in the system, same number as returned on the -/// host by omp_get_num_devices. +/// Return the device number in the system for omp_get_device_num. uint32_t getDeviceNum(); /// Return the user choosen debug level. diff --git a/openmp/libomptarget/DeviceRTL/include/Interface.h b/openmp/libomptarget/DeviceRTL/include/Interface.h index cb79fd44eee76..2ebe08e4084f5 100644 --- a/openmp/libomptarget/DeviceRTL/include/Interface.h +++ b/openmp/libomptarget/DeviceRTL/include/Interface.h @@ -126,6 +126,8 @@ int omp_get_default_device(void); int omp_get_num_devices(void); +int omp_get_device_num(void); + int omp_get_num_teams(void); int omp_get_team_num(); diff --git a/openmp/libomptarget/DeviceRTL/src/State.cpp b/openmp/libomptarget/DeviceRTL/src/State.cpp index c8910635278ff..312600062813a 100644 --- a/openmp/libomptarget/DeviceRTL/src/State.cpp +++ b/openmp/libomptarget/DeviceRTL/src/State.cpp @@ -504,6 +504,8 @@ int omp_get_default_device(void) { return -1; } int omp_get_num_devices(void) { return config::getNumDevices(); } +int omp_get_device_num(void) { return config::getDeviceNum(); } + int omp_get_num_teams(void) { return mapping::getNumberOfBlocks(); } int omp_get_team_num() { return mapping::getBlockId(); } diff --git a/openmp/libomptarget/include/omptarget.h b/openmp/libomptarget/include/omptarget.h index 5217f40a5eccf..f104c5671787b 100644 --- a/openmp/libomptarget/include/omptarget.h +++ b/openmp/libomptarget/include/omptarget.h @@ -202,6 +202,7 @@ extern "C" { #endif int omp_get_num_devices(void); +int omp_get_device_num(void); int omp_get_initial_device(void); void *omp_target_alloc(size_t size, int device_num); void omp_target_free(void *device_ptr, int device_num); diff --git a/openmp/libomptarget/src/api.cpp b/openmp/libomptarget/src/api.cpp index 29af0167e1f3d..8f6a32fe1540f 100644 --- a/openmp/libomptarget/src/api.cpp +++ b/openmp/libomptarget/src/api.cpp @@ -30,6 +30,15 @@ EXTERN int omp_get_num_devices(void) { return DevicesSize; } +EXTERN int omp_get_device_num(void) { + TIMESCOPE(); + int HostDevice = omp_get_initial_device(); + + DP("Call to omp_get_device_num returning %d\n", HostDevice); + + return HostDevice; +} + EXTERN int omp_get_initial_device(void) { TIMESCOPE(); int hostDevice = omp_get_num_devices(); diff --git a/openmp/libomptarget/src/exports b/openmp/libomptarget/src/exports index d4911addf3c81..fe27885dfb23e 100644 --- a/openmp/libomptarget/src/exports +++ b/openmp/libomptarget/src/exports @@ -29,6 +29,7 @@ VERS1.0 { __kmpc_push_target_tripcount; __kmpc_push_target_tripcount_mapper; omp_get_num_devices; + omp_get_device_num; omp_get_initial_device; omp_target_alloc; omp_target_free; diff --git a/openmp/libomptarget/test/api/omp_get_device_num.c b/openmp/libomptarget/test/api/omp_get_device_num.c new file mode 100644 index 0000000000000..a0a897a204793 --- /dev/null +++ b/openmp/libomptarget/test/api/omp_get_device_num.c @@ -0,0 +1,33 @@ +// RUN: %libomptarget-compile-run-and-check-generic + +#include +#include + +int test_omp_get_device_num() +{ + /* checks that omp_get_device_num() == omp_get_num_devices() in the host */ + int device_num = omp_get_device_num(); + printf("device_num = %d\n", device_num); + + #pragma omp target + {} + + return (device_num == omp_get_num_devices()); +} + +int main() +{ + int i; + int failed=0; + + if (!test_omp_get_device_num()) { + failed++; + } + if (failed) + printf("FAIL\n"); + else + printf("PASS\n"); + return failed; +} + +// CHECK: PASS diff --git a/openmp/runtime/test/api/omp_get_device_num.c b/openmp/runtime/test/api/omp_get_device_num.c new file mode 100644 index 0000000000000..3b511157e031e --- /dev/null +++ b/openmp/runtime/test/api/omp_get_device_num.c @@ -0,0 +1,27 @@ +// RUN: %libomp-compile-and-run +// Linking fails for icc 18 +// UNSUPPORTED: icc-18 + +#include +#include "omp_testsuite.h" + +int test_omp_get_device_num() +{ + /* checks that omp_get_device_num */ + int device_num = omp_get_device_num(); + + return (device_num == omp_get_num_devices()); +} + +int main() +{ + int i; + int num_failed=0; + + for(i = 0; i < REPETITIONS; i++) { + if(!test_omp_get_device_num()) { + num_failed++; + } + } + return num_failed; +}