Skip to content

Commit baba643

Browse files
Added support for stateless enqueueSVMMemFill
Change-Id: Ieaef91def4097c7dce618e24917c4f55cb2b914c Signed-off-by: Kamil Kopryk <kamil.kopryk@intel.com> Related-To: NEO-3314
1 parent 232dc59 commit baba643

File tree

2 files changed

+76
-3
lines changed

2 files changed

+76
-3
lines changed

runtime/command_queue/enqueue_svm.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -474,10 +474,14 @@ cl_int CommandQueueHw<GfxFamily>::enqueueSVMMemFill(void *svmPtr,
474474
memcpy_s(patternAllocation->getUnderlyingBuffer(), patternSize, pattern, patternSize);
475475
}
476476

477-
MultiDispatchInfo dispatchInfo;
477+
auto builtInType = EBuiltInOps::FillBuffer;
478+
if (forceStateless(svmData->size)) {
479+
builtInType = EBuiltInOps::FillBufferStateless;
480+
}
478481

479-
auto &builder = getDevice().getExecutionEnvironment()->getBuiltIns()->getBuiltinDispatchInfoBuilder(EBuiltInOps::FillBuffer,
480-
this->getContext(), this->getDevice());
482+
auto &builder = getDevice().getExecutionEnvironment()->getBuiltIns()->getBuiltinDispatchInfoBuilder(builtInType,
483+
this->getContext(),
484+
this->getDevice());
481485

482486
BuiltInOwnershipWrapper builtInLock(builder, this->context);
483487

@@ -493,6 +497,8 @@ cl_int CommandQueueHw<GfxFamily>::enqueueSVMMemFill(void *svmPtr,
493497
operationParams.dstSvmAlloc = svmData->gpuAllocation;
494498
operationParams.dstOffset = {dstPtrOffset, 0, 0};
495499
operationParams.size = {size, 0, 0};
500+
501+
MultiDispatchInfo dispatchInfo;
496502
builder.buildDispatchInfos(dispatchInfo, operationParams);
497503

498504
GeneralSurface s1(svmData->gpuAllocation);

unit_tests/command_queue/enqueue_svm_mem_fill_tests.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "core/memory_manager/unified_memory_manager.h"
99
#include "runtime/built_ins/builtins_dispatch_builder.h"
1010
#include "test.h"
11+
#include "unit_tests/command_queue/command_enqueue_fixture.h"
1112
#include "unit_tests/command_queue/command_queue_fixture.h"
1213
#include "unit_tests/fixtures/device_fixture.h"
1314
#include "unit_tests/mocks/mock_builtin_dispatch_info_builder.h"
@@ -147,3 +148,69 @@ HWTEST_P(EnqueueSvmMemFillTest, givenEnqueueSVMMemFillWhenUsingFillBufferBuilder
147148
INSTANTIATE_TEST_CASE_P(size_t,
148149
EnqueueSvmMemFillTest,
149150
::testing::Values(1, 2, 4, 8, 16, 32, 64, 128));
151+
152+
struct EnqueueSvmMemFillHw : public ::testing::Test {
153+
154+
void SetUp() override {
155+
156+
device.reset(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
157+
if (is32bit || !device->isFullRangeSvm()) {
158+
GTEST_SKIP();
159+
}
160+
161+
context = std::make_unique<MockContext>(device.get());
162+
svmPtr = context->getSVMAllocsManager()->createSVMAlloc(device->getRootDeviceIndex(), 256, {});
163+
ASSERT_NE(nullptr, svmPtr);
164+
}
165+
166+
void TearDown() override {
167+
if (is32bit || !device->isFullRangeSvm()) {
168+
return;
169+
}
170+
context->getSVMAllocsManager()->freeSVMAlloc(svmPtr);
171+
}
172+
173+
std::unique_ptr<MockDevice> device;
174+
std::unique_ptr<MockContext> context;
175+
uint64_t bigSize = 5ull * MemoryConstants::gigaByte;
176+
uint64_t smallSize = 4ull * MemoryConstants::gigaByte - 1;
177+
void *svmPtr = nullptr;
178+
const uint64_t pattern[4] = {0x0011223344556677,
179+
0x8899AABBCCDDEEFF,
180+
0xFFEEDDCCBBAA9988,
181+
0x7766554433221100};
182+
size_t patternSize = 0;
183+
};
184+
185+
using EnqueueSvmMemFillHwTest = EnqueueSvmMemFillHw;
186+
187+
HWTEST_F(EnqueueSvmMemFillHwTest, givenEnqueueSVMMemFillWhenUsingCopyBufferToBufferStatelessBuilderThenSuccessIsReturned) {
188+
auto cmdQ = std::make_unique<CommandQueueStateless<FamilyType>>(context.get(), device.get());
189+
auto svmData = context->getSVMAllocsManager()->getSVMAlloc(svmPtr);
190+
svmData->size = static_cast<size_t>(bigSize);
191+
192+
auto retVal = cmdQ->enqueueSVMMemFill(
193+
svmPtr, // void *svm_ptr
194+
pattern, // const void *pattern
195+
patternSize, // size_t pattern_size
196+
static_cast<size_t>(bigSize), // size_t size
197+
0, // cl_uint num_events_in_wait_list
198+
nullptr, // cl_event *event_wait_list
199+
nullptr // cL_event *event
200+
);
201+
EXPECT_EQ(CL_SUCCESS, retVal);
202+
}
203+
204+
HWTEST_F(EnqueueSvmMemFillHwTest, givenEnqueueSVMMemFillWhenUsingCopyBufferToBufferStatefulBuilderThenSuccessIsReturned) {
205+
auto cmdQ = std::make_unique<CommandQueueStateful<FamilyType>>(context.get(), device.get());
206+
auto retVal = cmdQ->enqueueSVMMemFill(
207+
svmPtr, // void *svm_ptr
208+
pattern, // const void *pattern
209+
patternSize, // size_t pattern_size
210+
static_cast<size_t>(smallSize), // size_t size
211+
0, // cl_uint num_events_in_wait_list
212+
nullptr, // cl_event *event_wait_list
213+
nullptr // cL_event *event
214+
);
215+
EXPECT_EQ(CL_SUCCESS, retVal);
216+
}

0 commit comments

Comments
 (0)