//===----------------------------------------------------------------------===// // // Part of CUDA Experimental in CUDA C++ Core Libraries, // under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. // //===----------------------------------------------------------------------===// #include "common.cuh" C2H_TEST("Fill", "[data_manipulation]") { cuda::stream _stream{cuda::device_ref{0}}; SECTION("Host resource") { cuda::mr::legacy_pinned_memory_resource host_resource; cudax::uninitialized_buffer buffer(host_resource, buffer_size); cuda::fill_bytes(_stream, buffer, fill_byte); check_result_and_erase(_stream, cuda::std::span(buffer)); } SECTION("Device resource") { cuda::device_memory_pool_ref device_resource = cuda::device_default_memory_pool(cuda::device_ref{0}); cudax::uninitialized_buffer buffer(device_resource, buffer_size); cuda::fill_bytes(_stream, buffer, fill_byte); std::vector host_vector(42); REQUIRE_CUDART(cudaMemcpyAsync( host_vector.data(), buffer.data(), buffer.size() * sizeof(int), cudaMemcpyDefault, _stream.get())); check_result_and_erase(_stream, host_vector); } SECTION("Launch transform") { cuda::mr::legacy_pinned_memory_resource host_resource; cudax::weird_buffer buffer(host_resource, buffer_size); cuda::fill_bytes(_stream, buffer, fill_byte); check_result_and_erase(_stream, cuda::std::span(buffer.data, buffer.size)); } } C2H_TEST("Mdspan Fill", "[data_manipulation]") { cuda::stream stream{cuda::device_ref{0}}; { cuda::std::dextents dynamic_extents{1, 2, 3}; auto buffer = make_buffer_for_mdspan(dynamic_extents, 0); cuda::std::mdspan dynamic_mdspan(buffer.data(), dynamic_extents); cuda::fill_bytes(stream, dynamic_mdspan, fill_byte); check_result_and_erase(stream, cuda::std::span(buffer.data(), buffer.size())); } { cuda::std::extents mixed_extents{1}; auto buffer = make_buffer_for_mdspan(mixed_extents, 0); cuda::std::mdspan mixed_mdspan(buffer.data(), mixed_extents); cuda::fill_bytes(stream, cuda::std::move(mixed_mdspan), fill_byte); check_result_and_erase(stream, cuda::std::span(buffer.data(), buffer.size())); } { cuda::mr::legacy_pinned_memory_resource host_resource; using static_extents = cuda::std::extents; auto size = cuda::std::layout_left::mapping().required_span_size(); cudax::weird_buffer> buffer(host_resource, size); cuda::fill_bytes(stream, buffer, fill_byte); check_result_and_erase(stream, cuda::std::span(buffer.data, buffer.size)); } } C2H_TEST("Non exhaustive mdspan fill_bytes", "[data_manipulation]") { cuda::stream stream{cuda::device_ref{0}}; { auto fake_strided_mdspan = create_fake_strided_mdspan(); try { cuda::fill_bytes(stream, fake_strided_mdspan, fill_byte); } catch (const ::std::invalid_argument& e) { CHECK(e.what() == ::std::string("fill_bytes supports only exhaustive mdspans")); } } }