diff --git a/openmp/libomptarget/DeviceRTL/include/Configuration.h b/openmp/libomptarget/DeviceRTL/include/Configuration.h --- a/openmp/libomptarget/DeviceRTL/include/Configuration.h +++ b/openmp/libomptarget/DeviceRTL/include/Configuration.h @@ -28,8 +28,7 @@ /// 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 --- a/openmp/libomptarget/DeviceRTL/include/Interface.h +++ b/openmp/libomptarget/DeviceRTL/include/Interface.h @@ -126,6 +126,8 @@ 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 --- a/openmp/libomptarget/DeviceRTL/src/State.cpp +++ b/openmp/libomptarget/DeviceRTL/src/State.cpp @@ -504,6 +504,8 @@ 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 --- a/openmp/libomptarget/include/omptarget.h +++ b/openmp/libomptarget/include/omptarget.h @@ -202,6 +202,7 @@ #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 --- a/openmp/libomptarget/src/api.cpp +++ b/openmp/libomptarget/src/api.cpp @@ -30,6 +30,15 @@ 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 --- a/openmp/libomptarget/src/exports +++ b/openmp/libomptarget/src/exports @@ -29,6 +29,7 @@ __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 --- /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 --- /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; +}