|
13 | 13 | using olMemcpyTest = OffloadQueueTest; |
14 | 14 | OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olMemcpyTest); |
15 | 15 |
|
| 16 | +struct olMemcpyGlobalTest : OffloadGlobalTest { |
| 17 | + void SetUp() override { |
| 18 | + RETURN_ON_FATAL_FAILURE(OffloadGlobalTest::SetUp()); |
| 19 | + ASSERT_SUCCESS( |
| 20 | + olGetSymbol(Program, "read", OL_SYMBOL_KIND_KERNEL, &ReadKernel)); |
| 21 | + ASSERT_SUCCESS( |
| 22 | + olGetSymbol(Program, "write", OL_SYMBOL_KIND_KERNEL, &WriteKernel)); |
| 23 | + ASSERT_SUCCESS(olCreateQueue(Device, &Queue)); |
| 24 | + ASSERT_SUCCESS(olGetSymbolInfo( |
| 25 | + Global, OL_SYMBOL_INFO_GLOBAL_VARIABLE_ADDRESS, sizeof(Addr), &Addr)); |
| 26 | + |
| 27 | + LaunchArgs.Dimensions = 1; |
| 28 | + LaunchArgs.GroupSize = {64, 1, 1}; |
| 29 | + LaunchArgs.NumGroups = {1, 1, 1}; |
| 30 | + |
| 31 | + LaunchArgs.DynSharedMemory = 0; |
| 32 | + } |
| 33 | + |
| 34 | + ol_kernel_launch_size_args_t LaunchArgs{}; |
| 35 | + void *Addr; |
| 36 | + ol_symbol_handle_t ReadKernel; |
| 37 | + ol_symbol_handle_t WriteKernel; |
| 38 | + ol_queue_handle_t Queue; |
| 39 | +}; |
| 40 | +OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olMemcpyGlobalTest); |
| 41 | + |
16 | 42 | TEST_P(olMemcpyTest, SuccessHtoD) { |
17 | 43 | constexpr size_t Size = 1024; |
18 | 44 | void *Alloc; |
@@ -105,3 +131,82 @@ TEST_P(olMemcpyTest, SuccessSizeZero) { |
105 | 131 | ASSERT_SUCCESS( |
106 | 132 | olMemcpy(nullptr, Output.data(), Host, Input.data(), Host, 0, nullptr)); |
107 | 133 | } |
| 134 | + |
| 135 | +TEST_P(olMemcpyGlobalTest, SuccessRoundTrip) { |
| 136 | + void *SourceMem; |
| 137 | + ASSERT_SUCCESS(olMemAlloc(Device, OL_ALLOC_TYPE_MANAGED, |
| 138 | + 64 * sizeof(uint32_t), &SourceMem)); |
| 139 | + uint32_t *SourceData = (uint32_t *)SourceMem; |
| 140 | + for (auto I = 0; I < 64; I++) |
| 141 | + SourceData[I] = I; |
| 142 | + |
| 143 | + void *DestMem; |
| 144 | + ASSERT_SUCCESS(olMemAlloc(Device, OL_ALLOC_TYPE_MANAGED, |
| 145 | + 64 * sizeof(uint32_t), &DestMem)); |
| 146 | + |
| 147 | + ASSERT_SUCCESS(olMemcpy(Queue, Addr, Device, SourceMem, Host, |
| 148 | + 64 * sizeof(uint32_t), nullptr)); |
| 149 | + ASSERT_SUCCESS(olWaitQueue(Queue)); |
| 150 | + ASSERT_SUCCESS(olMemcpy(Queue, DestMem, Host, Addr, Device, |
| 151 | + 64 * sizeof(uint32_t), nullptr)); |
| 152 | + ASSERT_SUCCESS(olWaitQueue(Queue)); |
| 153 | + |
| 154 | + uint32_t *DestData = (uint32_t *)DestMem; |
| 155 | + for (uint32_t I = 0; I < 64; I++) |
| 156 | + ASSERT_EQ(DestData[I], I); |
| 157 | + |
| 158 | + ASSERT_SUCCESS(olMemFree(DestMem)); |
| 159 | + ASSERT_SUCCESS(olMemFree(SourceMem)); |
| 160 | +} |
| 161 | + |
| 162 | +TEST_P(olMemcpyGlobalTest, SuccessWrite) { |
| 163 | + void *SourceMem; |
| 164 | + ASSERT_SUCCESS(olMemAlloc(Device, OL_ALLOC_TYPE_MANAGED, |
| 165 | + LaunchArgs.GroupSize.x * sizeof(uint32_t), |
| 166 | + &SourceMem)); |
| 167 | + uint32_t *SourceData = (uint32_t *)SourceMem; |
| 168 | + for (auto I = 0; I < 64; I++) |
| 169 | + SourceData[I] = I; |
| 170 | + |
| 171 | + void *DestMem; |
| 172 | + ASSERT_SUCCESS(olMemAlloc(Device, OL_ALLOC_TYPE_MANAGED, |
| 173 | + LaunchArgs.GroupSize.x * sizeof(uint32_t), |
| 174 | + &DestMem)); |
| 175 | + struct { |
| 176 | + void *Mem; |
| 177 | + } Args{DestMem}; |
| 178 | + |
| 179 | + ASSERT_SUCCESS(olMemcpy(Queue, Addr, Device, SourceMem, Host, |
| 180 | + 64 * sizeof(uint32_t), nullptr)); |
| 181 | + ASSERT_SUCCESS(olWaitQueue(Queue)); |
| 182 | + ASSERT_SUCCESS(olLaunchKernel(Queue, Device, ReadKernel, &Args, sizeof(Args), |
| 183 | + &LaunchArgs, nullptr)); |
| 184 | + ASSERT_SUCCESS(olWaitQueue(Queue)); |
| 185 | + |
| 186 | + uint32_t *DestData = (uint32_t *)DestMem; |
| 187 | + for (uint32_t I = 0; I < 64; I++) |
| 188 | + ASSERT_EQ(DestData[I], I); |
| 189 | + |
| 190 | + ASSERT_SUCCESS(olMemFree(DestMem)); |
| 191 | + ASSERT_SUCCESS(olMemFree(SourceMem)); |
| 192 | +} |
| 193 | + |
| 194 | +TEST_P(olMemcpyGlobalTest, SuccessRead) { |
| 195 | + void *DestMem; |
| 196 | + ASSERT_SUCCESS(olMemAlloc(Device, OL_ALLOC_TYPE_MANAGED, |
| 197 | + LaunchArgs.GroupSize.x * sizeof(uint32_t), |
| 198 | + &DestMem)); |
| 199 | + |
| 200 | + ASSERT_SUCCESS(olLaunchKernel(Queue, Device, WriteKernel, nullptr, 0, |
| 201 | + &LaunchArgs, nullptr)); |
| 202 | + ASSERT_SUCCESS(olWaitQueue(Queue)); |
| 203 | + ASSERT_SUCCESS(olMemcpy(Queue, DestMem, Host, Addr, Device, |
| 204 | + 64 * sizeof(uint32_t), nullptr)); |
| 205 | + ASSERT_SUCCESS(olWaitQueue(Queue)); |
| 206 | + |
| 207 | + uint32_t *DestData = (uint32_t *)DestMem; |
| 208 | + for (uint32_t I = 0; I < 64; I++) |
| 209 | + ASSERT_EQ(DestData[I], I * 2); |
| 210 | + |
| 211 | + ASSERT_SUCCESS(olMemFree(DestMem)); |
| 212 | +} |
0 commit comments