diff --git a/sycl/test-e2e/USM/fill_any_size.cpp b/sycl/test-e2e/USM/fill_any_size.cpp new file mode 100644 index 0000000000000..101802324c225 --- /dev/null +++ b/sycl/test-e2e/USM/fill_any_size.cpp @@ -0,0 +1,91 @@ +// RUN: %{build} -o %t1.out +// RUN: %{run} %t1.out +// clang-format off +// UNSUPPORTED: (opencl && cpu) +// UNSUPPORTED-TRACKER: https://github.com/oneapi-src/unified-runtime/issues/2440 +// clang-format on + +/** + * Test of the queue::fill interface with a range of pattern sizes and values. + * + * Loops over pattern sizes from 1 to MaxPatternSize bytes and calls queue::fill + * with std::array for the pattern. Two pattern values are tested, + * all zeros and value=index+42. The output is copied back to host and + * validated. + */ + +#include +#include +#include +#include + +constexpr size_t MaxPatternSize{32}; // Bytes. +constexpr size_t NumElements{10}; +constexpr bool verbose{false}; + +template +int test(sycl::queue &q, uint8_t firstValue = 0) { + using T = std::array; + T value{}; + + // Initialize the pattern value on host. + for (size_t i{0}; i < PatternSize; ++i) { + if constexpr (SameValue) { + value[i] = firstValue; + } else { + value[i] = firstValue + i; + } + } + + // Allocate memory on the device. + T *dptr{sycl::malloc_device(NumElements, q)}; + + // Fill the device memory with the pattern. + q.fill(dptr, value, NumElements).wait(); + + // Copy back the filled memory to host. + std::array host{}; + q.copy(dptr, host.data(), NumElements).wait(); + + // Validate whether the filled memory contains the expected values. + bool pass{true}; + for (size_t i{0}; i < NumElements; ++i) { + for (size_t j{0}; j < PatternSize; ++j) { + if (host[i][j] != value[j]) { + pass = false; + } + } + } + + // Release the device memory allocation. + sycl::free(dptr, q); + + // Print info on failure or in verbose mode. + if (!pass || verbose) { + printf("Pattern size %3zu bytes, %s values (initial %3u) %s\n", PatternSize, + (SameValue ? " equal" : "varied"), firstValue, + (pass ? "== PASS ==" : "== FAIL ==")); + } + + return !pass; +} + +template int testOneSize(sycl::queue &q) { + return test(q, 0) + test(q, 42); +} + +template +int testSizes(sycl::queue &q, std::index_sequence) { + return (testOneSize<1u + Sizes>(q) + ...); +} + +int main() { + sycl::queue q{}; + int failures = testSizes(q, std::make_index_sequence{}); + if (failures > 0) { + printf("%d / %zu tests failed\n", failures, 2u * MaxPatternSize); + } else { + printf("All %zu tests passed\n", 2u * MaxPatternSize); + } + return failures; +}