summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Huber <jhuber6@vols.utk.edu>2023-02-16 14:50:56 -0600
committerTobias Hieta <tobias@hieta.se>2023-02-20 09:33:18 +0100
commitf57f59e5aebed3965019e884cc1d60bde97df192 (patch)
treeeb45de058259906c8086a15b5fe80e8dbbc50580
parent2e6db258a28b5955d6c885da9c36c4e0a1a17048 (diff)
downloadllvm-f57f59e5aebed3965019e884cc1d60bde97df192.tar.gz
[Libomptarget] Check errors when synchronizing the async queue
Summary: Currently when we synchronize the asynchronous queue for the plugins, we ignore the return value. This is problematic because we will continue on like nothing happened if the kernel fails. Fixes https://github.com/llvm/llvm-project/issues/60814 Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D144191 (cherry picked from commit 5172877bbddc4e718e4bee57369c820d82f9a784)
-rw-r--r--openmp/libomptarget/include/omptarget.h5
-rw-r--r--openmp/libomptarget/src/interface.cpp5
-rw-r--r--openmp/libomptarget/src/omptarget.cpp6
-rw-r--r--openmp/libomptarget/src/private.h6
4 files changed, 16 insertions, 6 deletions
diff --git a/openmp/libomptarget/include/omptarget.h b/openmp/libomptarget/include/omptarget.h
index 9df9e2298236..dd577e4051e2 100644
--- a/openmp/libomptarget/include/omptarget.h
+++ b/openmp/libomptarget/include/omptarget.h
@@ -17,6 +17,7 @@
#include <cstdint>
#include <deque>
#include <functional>
+#include <optional>
#include <stddef.h>
#include <stdint.h>
#include <type_traits>
@@ -247,8 +248,8 @@ public:
/// functions will be executed once and unregistered afterwards.
///
/// \returns true if there is no pending asynchronous operations, false
- /// otherwise.
- bool isDone();
+ /// otherwise. We return a null value in the case of an error from the plugin.
+ std::optional<bool> isDone();
/// Add a new post-processing function to be executed after synchronization.
///
diff --git a/openmp/libomptarget/src/interface.cpp b/openmp/libomptarget/src/interface.cpp
index beea0c26210b..45f499962e4d 100644
--- a/openmp/libomptarget/src/interface.cpp
+++ b/openmp/libomptarget/src/interface.cpp
@@ -412,9 +412,12 @@ EXTERN void __tgt_target_nowait_query(void **AsyncHandle) {
if (QueryCounter.isAboveThreshold())
AsyncInfo->SyncType = AsyncInfoTy::SyncTy::BLOCKING;
+ auto DoneOrErr = AsyncInfo->isDone();
+ if (!DoneOrErr)
+ FATAL_MESSAGE0(1, "Error while querying the async queue for completion.\n");
// If there are device operations still pending, return immediately without
// deallocating the handle and increase the current thread query count.
- if (!AsyncInfo->isDone()) {
+ if (!*DoneOrErr) {
QueryCounter.increment();
return;
}
diff --git a/openmp/libomptarget/src/omptarget.cpp b/openmp/libomptarget/src/omptarget.cpp
index f3a570f89692..221ba949b8eb 100644
--- a/openmp/libomptarget/src/omptarget.cpp
+++ b/openmp/libomptarget/src/omptarget.cpp
@@ -51,8 +51,10 @@ void *&AsyncInfoTy::getVoidPtrLocation() {
return BufferLocations.back();
}
-bool AsyncInfoTy::isDone() {
- synchronize();
+std::optional<bool> AsyncInfoTy::isDone() {
+ if (synchronize() == OFFLOAD_FAIL)
+ return std::nullopt;
+
// The async info operations are completed when the internal queue is empty.
return isQueueEmpty();
}
diff --git a/openmp/libomptarget/src/private.h b/openmp/libomptarget/src/private.h
index 9f156192e103..fe55355e6218 100644
--- a/openmp/libomptarget/src/private.h
+++ b/openmp/libomptarget/src/private.h
@@ -250,9 +250,13 @@ public:
if (AsyncInfo == &LocalAsyncInfo)
return;
+ auto DoneOrErr = AsyncInfo->isDone();
+ if (!DoneOrErr)
+ FATAL_MESSAGE0(1,
+ "Error while querying the async queue for completion.\n");
// If the are device operations still pending, return immediately without
// deallocating the handle.
- if (!AsyncInfo->isDone())
+ if (!*DoneOrErr)
return;
// Delete the handle and unset it from the OpenMP task data.