[Openmp-commits] [openmp] 9148b8b - [OpenMP][Offloading] Fix the issue that omp_get_num_devices returns wrong number of devices, by Shiley Tian.

Alexey Bataev via Openmp-commits openmp-commits at lists.llvm.org
Tue Jan 21 10:30:00 PST 2020


Author: Alexey Bataev
Date: 2020-01-21T13:25:18-05:00
New Revision: 9148b8b734e7279c86a7a75883efdfdf48e8d148

URL: https://github.com/llvm/llvm-project/commit/9148b8b734e7279c86a7a75883efdfdf48e8d148
DIFF: https://github.com/llvm/llvm-project/commit/9148b8b734e7279c86a7a75883efdfdf48e8d148.diff

LOG: [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 <omp.h>
  #include <stdio.h>

  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

Added: 
    openmp/libomptarget/test/api/omp_get_num_devices_with_empty_target.c

Modified: 
    openmp/libomptarget/src/omptarget.cpp
    openmp/libomptarget/src/rtl.cpp

Removed: 
    


################################################################################
diff  --git a/openmp/libomptarget/src/omptarget.cpp b/openmp/libomptarget/src/omptarget.cpp
index fed7dcc189f0..54ed2f8913da 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 749f12c0773b..35470f587b96 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 000000000000..85dcb73f1149
--- /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 <omp.h>
+#include <stdio.h>
+
+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


        


More information about the Openmp-commits mailing list