brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 9838562 Raw
152 lines · cpp
1//===------- Offload API tests - olWaitEvents -----------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "../common/Fixtures.hpp"10#include <OffloadAPI.h>11#include <gtest/gtest.h>12 13struct olWaitEventsTest : OffloadProgramTest {14  void SetUp() override {15    RETURN_ON_FATAL_FAILURE(OffloadProgramTest::SetUpWith("sequence"));16    ASSERT_SUCCESS(17        olGetSymbol(Program, "sequence", OL_SYMBOL_KIND_KERNEL, &Kernel));18    LaunchArgs.Dimensions = 1;19    LaunchArgs.GroupSize = {1, 1, 1};20    LaunchArgs.NumGroups = {1, 1, 1};21    LaunchArgs.DynSharedMemory = 0;22  }23 24  void TearDown() override {25    RETURN_ON_FATAL_FAILURE(OffloadProgramTest::TearDown());26  }27 28  ol_symbol_handle_t Kernel = nullptr;29  ol_kernel_launch_size_args_t LaunchArgs{};30};31OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olWaitEventsTest);32 33TEST_P(olWaitEventsTest, Success) {34  constexpr size_t NUM_KERNELS = 16;35  ol_queue_handle_t Queues[NUM_KERNELS];36  ol_event_handle_t Events[NUM_KERNELS];37 38  void *Mem;39  ASSERT_SUCCESS(olMemAlloc(Device, OL_ALLOC_TYPE_MANAGED,40                            NUM_KERNELS * sizeof(uint32_t), &Mem));41  struct {42    uint32_t Idx;43    void *Mem;44  } Args{0, Mem};45 46  for (size_t I = 0; I < NUM_KERNELS; I++) {47    Args.Idx = I;48 49    ASSERT_SUCCESS(olCreateQueue(Device, &Queues[I]));50 51    if (I > 0)52      ASSERT_SUCCESS(olWaitEvents(Queues[I], &Events[I - 1], 1));53 54    ASSERT_SUCCESS(olLaunchKernel(Queues[I], Device, Kernel, &Args,55                                  sizeof(Args), &LaunchArgs));56    ASSERT_SUCCESS(olCreateEvent(Queues[I], &Events[I]));57  }58 59  ASSERT_SUCCESS(olSyncEvent(Events[NUM_KERNELS - 1]));60 61  uint32_t *Data = (uint32_t *)Mem;62  for (uint32_t i = 2; i < NUM_KERNELS; i++) {63    ASSERT_EQ(Data[i], Data[i - 1] + Data[i - 2]);64  }65}66 67TEST_P(olWaitEventsTest, SuccessSingleQueue) {68  constexpr size_t NUM_KERNELS = 16;69  ol_queue_handle_t Queue;70  ol_event_handle_t Events[NUM_KERNELS];71 72  ASSERT_SUCCESS(olCreateQueue(Device, &Queue));73 74  void *Mem;75  ASSERT_SUCCESS(olMemAlloc(Device, OL_ALLOC_TYPE_MANAGED,76                            NUM_KERNELS * sizeof(uint32_t), &Mem));77  struct {78    uint32_t Idx;79    void *Mem;80  } Args{0, Mem};81 82  for (size_t I = 0; I < NUM_KERNELS; I++) {83    Args.Idx = I;84 85    if (I > 0)86      ASSERT_SUCCESS(olWaitEvents(Queue, &Events[I - 1], 1));87 88    ASSERT_SUCCESS(olLaunchKernel(Queue, Device, Kernel, &Args, sizeof(Args),89                                  &LaunchArgs));90    ASSERT_SUCCESS(olCreateEvent(Queue, &Events[I]));91  }92 93  ASSERT_SUCCESS(olSyncEvent(Events[NUM_KERNELS - 1]));94 95  uint32_t *Data = (uint32_t *)Mem;96  for (uint32_t i = 2; i < NUM_KERNELS; i++) {97    ASSERT_EQ(Data[i], Data[i - 1] + Data[i - 2]);98  }99}100 101TEST_P(olWaitEventsTest, SuccessMultipleEvents) {102  constexpr size_t NUM_KERNELS = 16;103  ol_queue_handle_t Queues[NUM_KERNELS];104  ol_event_handle_t Events[NUM_KERNELS];105 106  void *Mem;107  ASSERT_SUCCESS(olMemAlloc(Device, OL_ALLOC_TYPE_MANAGED,108                            NUM_KERNELS * sizeof(uint32_t), &Mem));109  struct {110    uint32_t Idx;111    void *Mem;112  } Args{0, Mem};113 114  for (size_t I = 0; I < NUM_KERNELS; I++) {115    Args.Idx = I;116 117    ASSERT_SUCCESS(olCreateQueue(Device, &Queues[I]));118 119    if (I > 0)120      ASSERT_SUCCESS(olWaitEvents(Queues[I], Events, I));121 122    ASSERT_SUCCESS(olLaunchKernel(Queues[I], Device, Kernel, &Args,123                                  sizeof(Args), &LaunchArgs));124    ASSERT_SUCCESS(olCreateEvent(Queues[I], &Events[I]));125  }126 127  ASSERT_SUCCESS(olSyncEvent(Events[NUM_KERNELS - 1]));128 129  uint32_t *Data = (uint32_t *)Mem;130  for (uint32_t i = 2; i < NUM_KERNELS; i++) {131    ASSERT_EQ(Data[i], Data[i - 1] + Data[i - 2]);132  }133}134 135TEST_P(olWaitEventsTest, InvalidNullQueue) {136  ol_event_handle_t Event;137  ASSERT_ERROR(OL_ERRC_INVALID_NULL_HANDLE, olWaitEvents(nullptr, &Event, 1));138}139 140TEST_P(olWaitEventsTest, InvalidNullEvent) {141  ol_queue_handle_t Queue;142  ASSERT_SUCCESS(olCreateQueue(Device, &Queue));143  ASSERT_ERROR(OL_ERRC_INVALID_NULL_POINTER, olWaitEvents(Queue, nullptr, 1));144}145 146TEST_P(olWaitEventsTest, InvalidNullInnerEvent) {147  ol_queue_handle_t Queue;148  ASSERT_SUCCESS(olCreateQueue(Device, &Queue));149  ol_event_handle_t Event = nullptr;150  ASSERT_ERROR(OL_ERRC_INVALID_NULL_HANDLE, olWaitEvents(Queue, &Event, 1));151}152