1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
/*
* Copyright (C) 2017-2020 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/indirect_heap/indirect_heap.h"
#include "shared/source/memory_manager/memory_manager.h"
#include "opencl/source/event/event.h"
#include "opencl/test/unit_test/command_queue/command_queue_fixture.h"
#include "opencl/test/unit_test/fixtures/cl_device_fixture.h"
#include "opencl/test/unit_test/mocks/mock_context.h"
#include "test.h"
using namespace NEO;
struct OOMSetting {
bool oomCS;
bool oomISH;
};
static OOMSetting oomSettings[] = {
{true, false},
{false, true},
{true, true}};
struct OOMCommandQueueTest : public ClDeviceFixture,
public CommandQueueFixture,
public ::testing::TestWithParam<OOMSetting> {
using CommandQueueFixture::SetUp;
OOMCommandQueueTest() {
}
void SetUp() override {
ClDeviceFixture::SetUp();
context = new MockContext(pClDevice);
CommandQueueFixture::SetUp(context, pClDevice, 0);
const auto &oomSetting = GetParam();
auto oomSize = 10u;
if (oomSetting.oomCS) {
auto &cs = pCmdQ->getCS(oomSize);
// CommandStream may be larger than requested so grab what wasnt requested
cs.getSpace(cs.getAvailableSpace() - oomSize);
ASSERT_EQ(oomSize, cs.getAvailableSpace());
}
if (oomSetting.oomISH) {
auto &ish = pCmdQ->getIndirectHeap(IndirectHeap::DYNAMIC_STATE, oomSize);
// IndirectHeap may be larger than requested so grab what wasnt requested
ish.getSpace(ish.getAvailableSpace() - oomSize);
ASSERT_EQ(oomSize, ish.getAvailableSpace());
}
}
void TearDown() override {
CommandQueueFixture::TearDown();
context->release();
ClDeviceFixture::TearDown();
}
MockContext *context;
};
HWTEST_P(OOMCommandQueueTest, WhenFinishingThenMaxAvailableSpaceIsNotExceeded) {
auto &commandStream = pCmdQ->getCS(1024);
auto &indirectHeap = pCmdQ->getIndirectHeap(IndirectHeap::DYNAMIC_STATE, 10);
auto usedBeforeCS = commandStream.getUsed();
auto usedBeforeISH = indirectHeap.getUsed();
auto retVal = pCmdQ->finish();
auto usedAfterCS = commandStream.getUsed();
auto usedAfterISH = indirectHeap.getUsed();
EXPECT_LE(usedAfterCS - usedBeforeCS, commandStream.getMaxAvailableSpace());
EXPECT_LE(usedAfterISH - usedBeforeISH, indirectHeap.getMaxAvailableSpace());
EXPECT_EQ(CL_SUCCESS, retVal);
}
HWTEST_P(OOMCommandQueueTest, WhenEnqueingMarkerThenMaxAvailableSpaceIsNotExceeded) {
auto &commandStream = pCmdQ->getCS(1024);
auto &indirectHeap = pCmdQ->getIndirectHeap(IndirectHeap::DYNAMIC_STATE, 10);
auto usedBeforeCS = commandStream.getUsed();
auto usedBeforeISH = indirectHeap.getUsed();
Event event1(pCmdQ, CL_COMMAND_NDRANGE_KERNEL, 5, 15);
cl_event eventBeingWaitedOn = &event1;
cl_event eventReturned = nullptr;
auto retVal = pCmdQ->enqueueMarkerWithWaitList(
1,
&eventBeingWaitedOn,
&eventReturned);
EXPECT_EQ(CL_SUCCESS, retVal);
auto usedAfterCS = commandStream.getUsed();
auto usedAfterISH = indirectHeap.getUsed();
EXPECT_LE(usedAfterCS - usedBeforeCS, commandStream.getMaxAvailableSpace());
EXPECT_LE(usedAfterISH - usedBeforeISH, indirectHeap.getMaxAvailableSpace());
delete (Event *)eventReturned;
}
HWTEST_P(OOMCommandQueueTest, WhenEnqueingBarrierThenMaxAvailableSpaceIsNotExceeded) {
auto &commandStream = pCmdQ->getCS(1024);
auto &indirectHeap = pCmdQ->getIndirectHeap(IndirectHeap::DYNAMIC_STATE, 10);
auto usedBeforeCS = commandStream.getUsed();
auto usedBeforeISH = indirectHeap.getUsed();
Event event1(pCmdQ, CL_COMMAND_NDRANGE_KERNEL, 5, 15);
cl_event eventBeingWaitedOn = &event1;
cl_event eventReturned = nullptr;
auto retVal = pCmdQ->enqueueBarrierWithWaitList(
1,
&eventBeingWaitedOn,
&eventReturned);
EXPECT_EQ(CL_SUCCESS, retVal);
auto usedAfterCS = commandStream.getUsed();
auto usedAfterISH = indirectHeap.getUsed();
EXPECT_LE(usedAfterCS - usedBeforeCS, commandStream.getMaxAvailableSpace());
EXPECT_LE(usedAfterISH - usedBeforeISH, indirectHeap.getMaxAvailableSpace());
delete (Event *)eventReturned;
}
INSTANTIATE_TEST_CASE_P(
OOM,
OOMCommandQueueTest,
testing::ValuesIn(oomSettings));
|