|
| 1 | +// Copyright (C) 2025 Intel Corporation |
| 2 | +// Part of the Unified-Runtime Project, under the Apache License v2.0 with LLVM |
| 3 | +// Exceptions. See LICENSE.TXT |
| 4 | +// |
| 5 | +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | + |
| 7 | +#include "fixtures.h" |
| 8 | + |
| 9 | +struct testParametersMemcpy { |
| 10 | + size_t size; |
| 11 | + size_t offset_src; |
| 12 | + size_t offset_dst; |
| 13 | + size_t copy_size; |
| 14 | +}; |
| 15 | + |
| 16 | +struct urCommandBufferMemcpyCommandsTest |
| 17 | + : uur::command_buffer::urCommandBufferExpTestWithParam< |
| 18 | + testParametersMemcpy> { |
| 19 | + void SetUp() override { |
| 20 | + UUR_RETURN_ON_FATAL_FAILURE( |
| 21 | + uur::command_buffer::urCommandBufferExpTestWithParam< |
| 22 | + testParametersMemcpy>::SetUp()); |
| 23 | + |
| 24 | + size = std::get<1>(GetParam()).size; |
| 25 | + offset_src = std::get<1>(GetParam()).offset_src; |
| 26 | + offset_dst = std::get<1>(GetParam()).offset_dst; |
| 27 | + copy_size = std::get<1>(GetParam()).copy_size; |
| 28 | + assert(size <= offset_src + copy_size); |
| 29 | + assert(size <= offset_dst + copy_size); |
| 30 | + // Allocate USM pointers |
| 31 | + ASSERT_SUCCESS( |
| 32 | + urUSMDeviceAlloc(context, device, nullptr, nullptr, size, &device_ptr)); |
| 33 | + ASSERT_NE(device_ptr, nullptr); |
| 34 | + |
| 35 | + ASSERT_SUCCESS(urMemBufferCreate(context, UR_MEM_FLAG_READ_WRITE, size, |
| 36 | + nullptr, &buffer)); |
| 37 | + |
| 38 | + ASSERT_SUCCESS(urMemBufferCreate(context, UR_MEM_FLAG_READ_WRITE, size, |
| 39 | + nullptr, &buffer_base)); |
| 40 | + |
| 41 | + ASSERT_NE(buffer, nullptr); |
| 42 | + ASSERT_NE(buffer_base, nullptr); |
| 43 | + } |
| 44 | + |
| 45 | + void TearDown() override { |
| 46 | + if (device_ptr) { |
| 47 | + EXPECT_SUCCESS(urUSMFree(context, device_ptr)); |
| 48 | + } |
| 49 | + |
| 50 | + if (buffer) { |
| 51 | + EXPECT_SUCCESS(urMemRelease(buffer)); |
| 52 | + } |
| 53 | + |
| 54 | + if (buffer_base) { |
| 55 | + EXPECT_SUCCESS(urMemRelease(buffer_base)); |
| 56 | + } |
| 57 | + |
| 58 | + UUR_RETURN_ON_FATAL_FAILURE( |
| 59 | + uur::command_buffer::urCommandBufferExpTestWithParam< |
| 60 | + testParametersMemcpy>::TearDown()); |
| 61 | + } |
| 62 | + |
| 63 | + void verifyData(const std::vector<uint8_t> &output, |
| 64 | + const std::vector<uint8_t> &input) { |
| 65 | + for (size_t i = 0; i < copy_size; ++i) { |
| 66 | + ASSERT_EQ(output[i + offset_dst], input[i + offset_src]) |
| 67 | + << "Result mismatch at index: " << i; |
| 68 | + } |
| 69 | + for (size_t i = 0; i < offset_dst; ++i) { |
| 70 | + ASSERT_EQ(output[i], BASE_VALUE) << "Result mismatch at index: " << i; |
| 71 | + } |
| 72 | + for (size_t i = offset_dst + copy_size; i < size; ++i) { |
| 73 | + ASSERT_EQ(output[i], BASE_VALUE) << "Result mismatch at index: " << i; |
| 74 | + } |
| 75 | + } |
| 76 | + const uint8_t BASE_VALUE = 1; |
| 77 | + size_t size, copy_size, offset_src, offset_dst; |
| 78 | + |
| 79 | + ur_exp_command_buffer_sync_point_t sync_point, sync_point2; |
| 80 | + void *device_ptr = nullptr; |
| 81 | + ur_mem_handle_t buffer = nullptr; |
| 82 | + ur_mem_handle_t buffer_base = nullptr; |
| 83 | +}; |
| 84 | + |
| 85 | +static std::vector<testParametersMemcpy> test_cases{ |
| 86 | + // copy whole buffer |
| 87 | + {1, 0, 0, 1}, |
| 88 | + {256, 0, 0, 256}, |
| 89 | + {1024, 0, 0, 1024}, |
| 90 | + // copy part of buffer |
| 91 | + {256, 127, 127, 128}, |
| 92 | + {1024, 256, 256, 256}, |
| 93 | + // copy to different offset |
| 94 | + {256, 127, 196, 25}, |
| 95 | + {1024, 756, 256, 256}, |
| 96 | + |
| 97 | +}; |
| 98 | + |
| 99 | +template <typename T> |
| 100 | +static std::string printMemcpyTestString( |
| 101 | + const testing::TestParamInfo<typename T::ParamType> &info) { |
| 102 | + const auto device_handle = std::get<0>(info.param).device; |
| 103 | + const auto platform_device_name = |
| 104 | + uur::GetPlatformAndDeviceName(device_handle); |
| 105 | + std::stringstream test_name; |
| 106 | + test_name << platform_device_name << "__size__" |
| 107 | + << std::get<1>(info.param).size << "__offset_src__" |
| 108 | + << std::get<1>(info.param).offset_src << "__offset_src__" |
| 109 | + << std::get<1>(info.param).offset_dst << "__copy_size__" |
| 110 | + << std::get<1>(info.param).copy_size; |
| 111 | + return test_name.str(); |
| 112 | +} |
| 113 | + |
| 114 | +UUR_DEVICE_TEST_SUITE_WITH_PARAM( |
| 115 | + urCommandBufferMemcpyCommandsTest, testing::ValuesIn(test_cases), |
| 116 | + printMemcpyTestString<urCommandBufferMemcpyCommandsTest>); |
| 117 | + |
| 118 | +TEST_P(urCommandBufferMemcpyCommandsTest, Buffer) { |
| 119 | + std::vector<uint8_t> input(size); |
| 120 | + std::iota(input.begin(), input.end(), 1); |
| 121 | + |
| 122 | + ASSERT_SUCCESS(urCommandBufferAppendMemBufferWriteExp( |
| 123 | + cmd_buf_handle, buffer_base, 0, size, input.data(), 0, nullptr, 0, |
| 124 | + nullptr, &sync_point, nullptr, nullptr)); |
| 125 | + |
| 126 | + ASSERT_SUCCESS(urCommandBufferAppendMemBufferCopyExp( |
| 127 | + cmd_buf_handle, buffer_base, buffer, offset_src, offset_dst, copy_size, 1, |
| 128 | + &sync_point, 0, nullptr, &sync_point2, nullptr, nullptr)); |
| 129 | + std::vector<uint8_t> output(size, BASE_VALUE); |
| 130 | + ASSERT_SUCCESS(urCommandBufferAppendMemBufferReadExp( |
| 131 | + cmd_buf_handle, buffer, 0, size, output.data(), 1, &sync_point2, 0, |
| 132 | + nullptr, nullptr, nullptr, nullptr)); |
| 133 | + ASSERT_SUCCESS(urCommandBufferFinalizeExp(cmd_buf_handle)); |
| 134 | + |
| 135 | + ASSERT_SUCCESS(urEnqueueMemBufferWrite(queue, buffer, true, 0, size, |
| 136 | + output.data(), 0, nullptr, nullptr)); |
| 137 | + |
| 138 | + ASSERT_SUCCESS( |
| 139 | + urEnqueueCommandBufferExp(queue, cmd_buf_handle, 0, nullptr, nullptr)); |
| 140 | + ASSERT_SUCCESS(urQueueFinish(queue)); |
| 141 | + |
| 142 | + verifyData(output, input); |
| 143 | +} |
| 144 | + |
| 145 | +TEST_P(urCommandBufferMemcpyCommandsTest, USM) { |
| 146 | + std::vector<uint8_t> input(size); |
| 147 | + std::iota(input.begin(), input.end(), 1); |
| 148 | + ASSERT_SUCCESS(urCommandBufferAppendUSMMemcpyExp( |
| 149 | + cmd_buf_handle, ((uint8_t *)device_ptr) + offset_dst, |
| 150 | + input.data() + offset_src, copy_size, 0, nullptr, 0, nullptr, &sync_point, |
| 151 | + nullptr, nullptr)); |
| 152 | + |
| 153 | + std::vector<uint8_t> output(size, BASE_VALUE); |
| 154 | + ASSERT_SUCCESS(urCommandBufferAppendUSMMemcpyExp( |
| 155 | + cmd_buf_handle, output.data(), device_ptr, size, 1, &sync_point, 0, |
| 156 | + nullptr, nullptr, nullptr, nullptr)); |
| 157 | + |
| 158 | + ASSERT_SUCCESS(urCommandBufferFinalizeExp(cmd_buf_handle)); |
| 159 | + |
| 160 | + ASSERT_SUCCESS(urEnqueueUSMMemcpy(queue, true, device_ptr, output.data(), |
| 161 | + size, 0, nullptr, nullptr)); |
| 162 | + |
| 163 | + ASSERT_SUCCESS( |
| 164 | + urEnqueueCommandBufferExp(queue, cmd_buf_handle, 0, nullptr, nullptr)); |
| 165 | + ASSERT_SUCCESS(urQueueFinish(queue)); |
| 166 | + |
| 167 | + verifyData(output, input); |
| 168 | +} |
0 commit comments