From: Alexey Bataev Date: Tue, 21 Jan 2020 18:01:23 +0000 (-0500) Subject: [OpenMP][Offloading] Fix the issue that omp_get_num_devices returns wrong number... X-Git-Tag: llvmorg-12-init~17333 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9148b8b734e7279c86a7a75883efdfdf48e8d148;p=platform%2Fupstream%2Fllvm.git [OpenMP][Offloading] Fix the issue that omp_get_num_devices returns wrong number of devices, by Shiley Tian. Summary: This patch is to fix issue in the following simple case: #include #include int main(int argc, char *argv[]) { int num = omp_get_num_devices(); printf("%d\n", num); return 0; } Currently it returns 0 even devices exist. Since this file doesn't contain any target region, the host entry is empty so further actions like initialization will not be proceeded, leading to wrong device number returned by runtime function call. Reviewers: jdoerfert, ABataev, protze.joachim Reviewed By: ABataev Subscribers: protze.joachim Tags: #openmp Differential Revision: https://reviews.llvm.org/D72576 --- diff --git a/openmp/libomptarget/src/omptarget.cpp b/openmp/libomptarget/src/omptarget.cpp index fed7dcc..54ed2f8 100644 --- a/openmp/libomptarget/src/omptarget.cpp +++ b/openmp/libomptarget/src/omptarget.cpp @@ -72,6 +72,11 @@ static int InitLibrary(DeviceTy& Device) { ii = HostEntriesBeginToTransTable.begin(); ii != HostEntriesBeginToTransTable.end(); ++ii) { TranslationTable *TransTable = &ii->second; + if (TransTable->HostTable.EntriesBegin == + TransTable->HostTable.EntriesEnd) { + // No host entry so no need to proceed + continue; + } if (TransTable->TargetsTable[device_id] != 0) { // Library entries have already been processed continue; diff --git a/openmp/libomptarget/src/rtl.cpp b/openmp/libomptarget/src/rtl.cpp index 749f12c..35470f5 100644 --- a/openmp/libomptarget/src/rtl.cpp +++ b/openmp/libomptarget/src/rtl.cpp @@ -234,8 +234,6 @@ void RTLsTy::RegisterLib(__tgt_bin_desc *desc) { // Attempt to load all plugins available in the system. std::call_once(initFlag, &RTLsTy::LoadRTLs, this); - if (desc->HostEntriesBegin == desc->HostEntriesEnd) - return; RTLsMtx.lock(); // Register the images with the RTLs that understand them, if any. for (int32_t i = 0; i < desc->NumDeviceImages; ++i) { @@ -322,8 +320,6 @@ void RTLsTy::RegisterLib(__tgt_bin_desc *desc) { void RTLsTy::UnregisterLib(__tgt_bin_desc *desc) { DP("Unloading target library!\n"); - if (desc->HostEntriesBegin == desc->HostEntriesEnd) - return; RTLsMtx.lock(); // Find which RTL understands each image, if any. for (int32_t i = 0; i < desc->NumDeviceImages; ++i) { diff --git a/openmp/libomptarget/test/api/omp_get_num_devices_with_empty_target.c b/openmp/libomptarget/test/api/omp_get_num_devices_with_empty_target.c new file mode 100644 index 0000000..85dcb73 --- /dev/null +++ b/openmp/libomptarget/test/api/omp_get_num_devices_with_empty_target.c @@ -0,0 +1,30 @@ +// RUN: %libomptarget-compile-run-and-check-aarch64-unknown-linux-gnu +// RUN: %libomptarget-compile-run-and-check-powerpc64-ibm-linux-gnu +// RUN: %libomptarget-compile-run-and-check-powerpc64le-ibm-linux-gnu +// RUN: %libomptarget-compile-run-and-check-x86_64-pc-linux-gnu + +#include +#include + +static int test_omp_get_num_devices_with_empty_target() { + /* checks that omp_get_num_devices() > 0 */ + return omp_get_num_devices() > 0; +} + +int main() { + int failed = 0; + + if (!test_omp_get_num_devices_with_empty_target()) { + ++failed; + } + + if (failed) { + printf("FAIL\n"); + } else { + printf("PASS\n"); + } + + return failed; +} + +// CHECK: PASS