Skip to content
6 changes: 3 additions & 3 deletions .github/workflows/sycl-linux-run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -263,9 +263,9 @@ jobs:
- run: sycl-ls --verbose
- run: SYCL_PI_TRACE=-1 sycl-ls
- run: |
if [ -f /usr/local/lib/igc/IGCTAG.txt ]; then
cat /usr/local/lib/igc/IGCTAG.txt
fi
if [ -f /usr/local/lib/igc/IGCTAG.txt ]; then
cat /usr/local/lib/igc/IGCTAG.txt
fi

- name: Deduce E2E CMake options
if: inputs.tests_selector == 'e2e'
Expand Down
2 changes: 1 addition & 1 deletion sycl/source/detail/queue_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ event queue_impl::memcpy(const std::shared_ptr<detail::queue_impl> &Self,
xpti::addMetadata(TEvent, "queue_id", MQueueID);
});
xpti::framework::stash_tuple(XPTI_QUEUE_INSTANCE_ID_KEY, MQueueID);
// Notify XPTI about the memset submission
// Notify XPTI about the memcpy submission
PrepareNotify.notify();
// Emit a begin/end scope for this call
PrepareNotify.scopedNotify((uint16_t)xpti::trace_point_type_t::task_begin);
Expand Down
79 changes: 79 additions & 0 deletions sycl/test-e2e/Basic/out_of_order_queue_status_memset.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// RUN: %{build} -o %t.out
// RUN: %{run} %t.out

// Test checks that queue::ext_oneapi_empty() returns status of the out-of-order
// queue.

#include <chrono>
#include <sycl.hpp>
#include <thread>

static void CheckArray(int *x, size_t buffer_size, int expected) {
for (size_t i = 0; i < buffer_size; ++i) {
assert(x[i] == expected);
}
}

using namespace sycl;

void TestFunc(queue &Q) {
static constexpr int Size = 100;

assert(Q.ext_oneapi_empty() && "Queue is expected to be empty");

int *X = malloc_host<int>(Size, Q);
int *Y = malloc_host<int>(Size, Q);

auto FillEv = Q.memset(X, 0, Size);
auto HostEv = Q.submit([&](handler &CGH) {
CGH.depends_on(FillEv);
auto HostTask = [=] {
for (int I = 0; I < Size; I++)
X[I] += 1;
};
CGH.host_task(HostTask);
});
auto MemCpyEv = Q.copy(X, Y, Size, {HostEv});
constexpr int NumIter = 5;
for (int I = 0; I < NumIter; I++) {
Q.submit([&](handler &CGH) {
CGH.depends_on(MemCpyEv);
CGH.parallel_for<class Kernel1>(
sycl::range<1>(Size / NumIter),
[=](sycl::id<1> WI) { Y[WI + I * Size / NumIter] *= 2; });
});
}

// Wait a bit to give a chance for tasks to complete.
std::this_thread::sleep_for(std::chrono::milliseconds(500));

// We expect that all submitted tasks are finished if ext_oneapi_empty is
// true.
if (Q.ext_oneapi_empty())
CheckArray(Y, Size, 2);

Q.wait();

// After synchronization queue must be empty.
assert(Q.ext_oneapi_empty() && "Queue is expected to be empty");

free(X, Q);
free(Y, Q);
}

int main() {
queue Q;

bool ExceptionThrown = false;
try {
TestFunc(Q);
} catch (sycl::exception &E) {
ExceptionThrown = true;
}

// Feature is not supported for OpenCL, exception must be thrown.
if (Q.get_device().get_backend() == backend::opencl)
return ExceptionThrown ? 0 : -1;

return 0;
}