forked from OSchip/llvm-project
[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
This commit is contained in:
parent
68122b5826
commit
9148b8b734
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue