[OpenMP][Offloading] Fix the issue that omp_get_num_devices returns wrong number...
authorAlexey Bataev <a.bataev@hotmail.com>
Tue, 21 Jan 2020 18:01:23 +0000 (13:01 -0500)
committerAlexey Bataev <a.bataev@hotmail.com>
Tue, 21 Jan 2020 18:25:18 +0000 (13:25 -0500)
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

openmp/libomptarget/src/omptarget.cpp
openmp/libomptarget/src/rtl.cpp
openmp/libomptarget/test/api/omp_get_num_devices_with_empty_target.c [new file with mode: 0644]

index fed7dcc..54ed2f8 100644 (file)
@@ -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;
index 749f12c..35470f5 100644 (file)
@@ -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 (file)
index 0000000..85dcb73
--- /dev/null
@@ -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