[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