2017-12-21 07:45:38 +08:00
|
|
|
/*
|
2020-01-14 21:32:11 +08:00
|
|
|
* Copyright (C) 2017-2020 Intel Corporation
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
2018-09-18 15:11:08 +08:00
|
|
|
* SPDX-License-Identifier: MIT
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/device/device.h"
|
2020-02-24 08:01:38 +08:00
|
|
|
#include "shared/test/unit_test/utilities/base_object_utils.h"
|
2020-02-24 17:22:30 +08:00
|
|
|
|
2020-02-23 05:50:57 +08:00
|
|
|
#include "opencl/source/context/context.h"
|
2020-04-23 22:59:18 +08:00
|
|
|
#include "opencl/test/unit_test/mocks/mock_memory_manager.h"
|
2020-03-17 21:25:44 +08:00
|
|
|
#include "opencl/test/unit_test/mocks/mock_platform.h"
|
2020-04-23 01:26:27 +08:00
|
|
|
#include "opencl/test/unit_test/test_macros/test_checks_ocl.h"
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2019-02-27 18:39:32 +08:00
|
|
|
#include "cl_api_tests.h"
|
|
|
|
|
2019-03-26 18:59:46 +08:00
|
|
|
using namespace NEO;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
typedef api_tests clSVMAllocTests;
|
|
|
|
|
|
|
|
namespace ULT {
|
|
|
|
|
2020-02-12 18:27:28 +08:00
|
|
|
class clSVMAllocTemplateTests : public ApiFixture<>,
|
2017-12-21 07:45:38 +08:00
|
|
|
public testing::TestWithParam<uint64_t /*cl_mem_flags*/> {
|
|
|
|
public:
|
|
|
|
void SetUp() override {
|
2019-12-02 21:19:24 +08:00
|
|
|
ApiFixture::SetUp();
|
2020-04-24 18:58:39 +08:00
|
|
|
REQUIRE_SVM_OR_SKIP(pDevice);
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void TearDown() override {
|
2019-12-02 21:19:24 +08:00
|
|
|
ApiFixture::TearDown();
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct clSVMAllocValidFlagsTests : public clSVMAllocTemplateTests {
|
|
|
|
cl_uchar pHostPtr[64];
|
|
|
|
};
|
|
|
|
|
2019-12-04 20:08:04 +08:00
|
|
|
TEST(clSVMAllocTest, givenPlatformWithoutDevicesWhenClSVMAllocIsCalledThenDeviceIsTakenFromContext) {
|
|
|
|
auto executionEnvironment = platform()->peekExecutionEnvironment();
|
|
|
|
executionEnvironment->initializeMemoryManager();
|
|
|
|
executionEnvironment->prepareRootDeviceEnvironments(1);
|
2020-03-06 01:13:32 +08:00
|
|
|
auto clDevice = std::make_unique<ClDevice>(*Device::create<RootDevice>(executionEnvironment, 0u), platform());
|
|
|
|
const ClDeviceInfo &devInfo = clDevice->getDeviceInfo();
|
2019-12-04 20:08:04 +08:00
|
|
|
if (devInfo.svmCapabilities == 0) {
|
|
|
|
GTEST_SKIP();
|
|
|
|
}
|
2020-01-14 21:32:11 +08:00
|
|
|
cl_device_id deviceId = clDevice.get();
|
2019-12-04 20:08:04 +08:00
|
|
|
cl_int retVal;
|
2020-01-14 21:32:11 +08:00
|
|
|
auto context = ReleaseableObjectPtr<Context>(Context::create<Context>(nullptr, ClDeviceVector(&deviceId, 1), nullptr, nullptr, retVal));
|
2019-12-04 20:08:04 +08:00
|
|
|
EXPECT_EQ(CL_SUCCESS, retVal);
|
|
|
|
|
|
|
|
EXPECT_EQ(0u, platform()->getNumDevices());
|
|
|
|
auto SVMPtr = clSVMAlloc(context.get(), 0u, 4096, 128);
|
|
|
|
EXPECT_NE(nullptr, SVMPtr);
|
|
|
|
|
|
|
|
clSVMFree(context.get(), SVMPtr);
|
|
|
|
}
|
|
|
|
|
2019-08-07 02:11:28 +08:00
|
|
|
TEST_P(clSVMAllocValidFlagsTests, GivenSvmSupportWhenAllocatingSvmThenSvmIsAllocated) {
|
2017-12-21 07:45:38 +08:00
|
|
|
cl_mem_flags flags = GetParam();
|
2020-04-24 18:58:39 +08:00
|
|
|
const ClDeviceInfo &devInfo = pDevice->getDeviceInfo();
|
2017-12-21 07:45:38 +08:00
|
|
|
//check for svm support
|
|
|
|
if (devInfo.svmCapabilities != 0) {
|
|
|
|
//fg svm flag
|
|
|
|
if (flags & CL_MEM_SVM_FINE_GRAIN_BUFFER) {
|
|
|
|
//fg svm flag, fg svm support - expected success
|
|
|
|
if (devInfo.svmCapabilities & CL_DEVICE_SVM_FINE_GRAIN_BUFFER) {
|
|
|
|
auto SVMPtr = clSVMAlloc(pContext, flags, 4096 /* Size*/, 128 /* alignment */);
|
|
|
|
EXPECT_NE(nullptr, SVMPtr);
|
|
|
|
|
|
|
|
clSVMFree(pContext, SVMPtr);
|
|
|
|
}
|
|
|
|
//fg svm flag no fg svm support
|
|
|
|
else {
|
|
|
|
auto SVMPtr = clSVMAlloc(pContext, flags, 4096 /* Size*/, 128 /* alignment */);
|
|
|
|
EXPECT_EQ(nullptr, SVMPtr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//no fg svm flag, svm support - expected success
|
|
|
|
else {
|
|
|
|
auto SVMPtr = clSVMAlloc(pContext, flags, 4096 /* Size*/, 128 /* alignment */);
|
|
|
|
EXPECT_NE(nullptr, SVMPtr);
|
|
|
|
|
|
|
|
clSVMFree(pContext, SVMPtr);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
//no svm support -expected fail
|
|
|
|
auto SVMPtr = clSVMAlloc(pContext, flags, 4096 /* Size*/, 128 /* alignment */);
|
|
|
|
EXPECT_EQ(nullptr, SVMPtr);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
static cl_mem_flags SVMAllocValidFlags[] = {
|
|
|
|
0,
|
|
|
|
CL_MEM_READ_WRITE,
|
|
|
|
CL_MEM_WRITE_ONLY,
|
|
|
|
CL_MEM_READ_ONLY,
|
|
|
|
CL_MEM_SVM_FINE_GRAIN_BUFFER,
|
|
|
|
CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS,
|
|
|
|
CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER,
|
|
|
|
CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS,
|
|
|
|
CL_MEM_WRITE_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER,
|
|
|
|
CL_MEM_WRITE_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS,
|
|
|
|
CL_MEM_READ_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER,
|
|
|
|
CL_MEM_READ_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS};
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P(
|
|
|
|
SVMAllocCheckFlags,
|
|
|
|
clSVMAllocValidFlagsTests,
|
|
|
|
testing::ValuesIn(SVMAllocValidFlags));
|
|
|
|
|
2019-05-06 18:33:44 +08:00
|
|
|
using clSVMAllocFtrFlagsTests = clSVMAllocTemplateTests;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P(
|
|
|
|
SVMAllocCheckFlagsFtrFlags,
|
|
|
|
clSVMAllocFtrFlagsTests,
|
|
|
|
testing::ValuesIn(SVMAllocValidFlags));
|
|
|
|
|
2019-08-07 02:11:28 +08:00
|
|
|
TEST_P(clSVMAllocFtrFlagsTests, GivenCorrectFlagsWhenAllocatingSvmThenSvmIsAllocated) {
|
2020-04-24 18:58:39 +08:00
|
|
|
HardwareInfo *pHwInfo = pDevice->getExecutionEnvironment()->rootDeviceEnvironments[testedRootDeviceIndex]->getMutableHardwareInfo();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
cl_mem_flags flags = GetParam();
|
|
|
|
void *SVMPtr = nullptr;
|
|
|
|
|
|
|
|
//1: no svm - no flags supported
|
|
|
|
pHwInfo->capabilityTable.ftrSvm = false;
|
|
|
|
pHwInfo->capabilityTable.ftrSupportsCoherency = false;
|
|
|
|
|
|
|
|
SVMPtr = clSVMAlloc(pContext, flags, 4096, 128);
|
|
|
|
EXPECT_EQ(nullptr, SVMPtr);
|
|
|
|
|
|
|
|
//2: coarse svm - normal flags supported
|
|
|
|
pHwInfo->capabilityTable.ftrSvm = true;
|
|
|
|
SVMPtr = clSVMAlloc(pContext, flags, 4096, 128);
|
|
|
|
if (flags & CL_MEM_SVM_FINE_GRAIN_BUFFER) {
|
|
|
|
//fg svm flags not supported
|
|
|
|
EXPECT_EQ(nullptr, SVMPtr);
|
|
|
|
} else {
|
|
|
|
//no fg svm flags supported
|
|
|
|
EXPECT_NE(nullptr, SVMPtr);
|
|
|
|
clSVMFree(pContext, SVMPtr);
|
|
|
|
}
|
|
|
|
|
|
|
|
//3: fg svm - all flags supported
|
|
|
|
pHwInfo->capabilityTable.ftrSupportsCoherency = true;
|
|
|
|
SVMPtr = clSVMAlloc(pContext, flags, 4096, 128);
|
|
|
|
EXPECT_NE(nullptr, SVMPtr);
|
|
|
|
clSVMFree(pContext, SVMPtr);
|
|
|
|
};
|
|
|
|
|
2018-10-31 16:51:31 +08:00
|
|
|
struct clSVMAllocInvalidFlagsTests : public clSVMAllocTemplateTests {
|
2017-12-21 07:45:38 +08:00
|
|
|
};
|
|
|
|
|
2019-08-07 02:11:28 +08:00
|
|
|
TEST_P(clSVMAllocInvalidFlagsTests, GivenInvalidFlagsWhenAllocatingSvmThenSvmIsNotAllocated) {
|
2017-12-21 07:45:38 +08:00
|
|
|
cl_mem_flags flags = GetParam();
|
|
|
|
|
|
|
|
auto SVMPtr = clSVMAlloc(pContext, flags, 4096 /* Size*/, 128 /* alignment */);
|
|
|
|
EXPECT_EQ(nullptr, SVMPtr);
|
|
|
|
};
|
|
|
|
|
2018-10-31 16:51:31 +08:00
|
|
|
cl_mem_flags SVMAllocInvalidFlags[] = {
|
2017-12-21 07:45:38 +08:00
|
|
|
CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY,
|
|
|
|
CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY,
|
|
|
|
CL_MEM_SVM_ATOMICS,
|
|
|
|
0xffcc};
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P(
|
|
|
|
SVMAllocCheckFlags,
|
2018-10-31 16:51:31 +08:00
|
|
|
clSVMAllocInvalidFlagsTests,
|
|
|
|
testing::ValuesIn(SVMAllocInvalidFlags));
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2019-08-07 02:11:28 +08:00
|
|
|
TEST_F(clSVMAllocTests, GivenNullContextWhenAllocatingSvmThenSvmIsNotAllocated) {
|
2017-12-21 07:45:38 +08:00
|
|
|
cl_mem_flags flags = CL_MEM_READ_WRITE;
|
2019-08-07 02:11:28 +08:00
|
|
|
auto SVMPtr = clSVMAlloc(nullptr /* cl_context */, flags, 4096 /* Size*/, 128 /* alignment */);
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_EQ(nullptr, SVMPtr);
|
|
|
|
}
|
|
|
|
|
2019-08-07 02:11:28 +08:00
|
|
|
TEST_F(clSVMAllocTests, GivenZeroSizeWhenAllocatingSvmThenSvmIsNotAllocated) {
|
2017-12-21 07:45:38 +08:00
|
|
|
cl_mem_flags flags = CL_MEM_READ_WRITE;
|
|
|
|
auto SVMPtr = clSVMAlloc(pContext /* cl_context */, flags, 0 /* Size*/, 128 /* alignment */);
|
|
|
|
EXPECT_EQ(nullptr, SVMPtr);
|
|
|
|
}
|
|
|
|
|
2019-08-07 02:11:28 +08:00
|
|
|
TEST_F(clSVMAllocTests, GivenZeroAlignmentWhenAllocatingSvmThenSvmIsAllocated) {
|
2020-04-24 18:58:39 +08:00
|
|
|
const ClDeviceInfo &devInfo = pDevice->getDeviceInfo();
|
2017-12-21 07:45:38 +08:00
|
|
|
if (devInfo.svmCapabilities != 0) {
|
|
|
|
cl_mem_flags flags = CL_MEM_READ_WRITE;
|
|
|
|
auto SVMPtr = clSVMAlloc(pContext /* cl_context */, flags, 4096 /* Size*/, 0 /* alignment */);
|
|
|
|
EXPECT_NE(nullptr, SVMPtr);
|
|
|
|
clSVMFree(pContext, SVMPtr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-07 02:11:28 +08:00
|
|
|
TEST_F(clSVMAllocTests, GivenUnalignedSizeAndDefaultAlignmentWhenAllocatingSvmThenSvmIsAllocated) {
|
2020-04-24 18:58:39 +08:00
|
|
|
const ClDeviceInfo &devInfo = pDevice->getDeviceInfo();
|
2017-12-21 07:45:38 +08:00
|
|
|
if (devInfo.svmCapabilities != 0) {
|
|
|
|
cl_mem_flags flags = CL_MEM_READ_WRITE;
|
|
|
|
auto SVMPtr = clSVMAlloc(pContext /* cl_context */, flags, 4095 /* Size*/, 0 /* alignment */);
|
|
|
|
EXPECT_NE(nullptr, SVMPtr);
|
|
|
|
clSVMFree(pContext, SVMPtr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-07 02:11:28 +08:00
|
|
|
TEST_F(clSVMAllocTests, GivenAlignmentNotPowerOfTwoWhenAllocatingSvmThenSvmIsNotAllocated) {
|
2017-12-21 07:45:38 +08:00
|
|
|
cl_mem_flags flags = CL_MEM_READ_WRITE;
|
|
|
|
auto SVMPtr = clSVMAlloc(pContext /* cl_context */, flags, 4096 /* Size*/, 129 /* alignment */);
|
|
|
|
EXPECT_EQ(nullptr, SVMPtr);
|
|
|
|
}
|
|
|
|
|
2019-08-07 02:11:28 +08:00
|
|
|
TEST_F(clSVMAllocTests, GivenAlignmentTooLargeWhenAllocatingSvmThenSvmIsNotAllocated) {
|
2017-12-21 07:45:38 +08:00
|
|
|
auto SVMPtr = clSVMAlloc(pContext, CL_MEM_READ_WRITE, 4096 /* Size */, 4096 /* alignment */);
|
|
|
|
EXPECT_EQ(nullptr, SVMPtr);
|
|
|
|
};
|
2020-06-08 20:13:47 +08:00
|
|
|
|
|
|
|
TEST_F(clSVMAllocTests, GivenForcedFineGrainedSvmWhenCreatingSvmAllocThenAllocationIsCreated) {
|
|
|
|
REQUIRE_SVM_OR_SKIP(pDevice);
|
|
|
|
DebugManagerStateRestore restore{};
|
|
|
|
HardwareInfo *hwInfo = pDevice->getExecutionEnvironment()->rootDeviceEnvironments[testedRootDeviceIndex]->getMutableHardwareInfo();
|
|
|
|
hwInfo->capabilityTable.ftrSvm = true;
|
|
|
|
hwInfo->capabilityTable.ftrSupportsCoherency = false;
|
|
|
|
|
|
|
|
auto allocation = clSVMAlloc(pContext, CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER, 4096 /* Size */, 0 /* alignment */);
|
|
|
|
EXPECT_EQ(nullptr, allocation);
|
|
|
|
clSVMFree(pContext, allocation);
|
|
|
|
|
|
|
|
DebugManager.flags.ForceFineGrainedSVMSupport.set(1);
|
|
|
|
allocation = clSVMAlloc(pContext, CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER, 4096 /* Size */, 0 /* alignment */);
|
|
|
|
EXPECT_NE(nullptr, allocation);
|
|
|
|
clSVMFree(pContext, allocation);
|
|
|
|
}
|
|
|
|
|
2020-04-23 22:59:18 +08:00
|
|
|
TEST(clSvmAllocTest, givenSubDeviceWhenCreatingSvmAllocThenProperDeviceBitfieldIsPassed) {
|
|
|
|
REQUIRE_SVM_OR_SKIP(defaultHwInfo.get());
|
|
|
|
UltClDeviceFactory deviceFactory{1, 2};
|
|
|
|
auto device = deviceFactory.subDevices[1];
|
|
|
|
|
|
|
|
auto executionEnvironment = device->getExecutionEnvironment();
|
|
|
|
auto memoryManager = new MockMemoryManager(*executionEnvironment);
|
|
|
|
|
|
|
|
std::unique_ptr<MemoryManager> memoryManagerBackup(memoryManager);
|
|
|
|
std::swap(memoryManagerBackup, executionEnvironment->memoryManager);
|
|
|
|
|
|
|
|
MockContext context(device);
|
2020-04-28 17:33:39 +08:00
|
|
|
auto expectedDeviceBitfield = context.getDeviceBitfieldForAllocation();
|
2020-04-23 22:59:18 +08:00
|
|
|
EXPECT_NE(expectedDeviceBitfield, memoryManager->recentlyPassedDeviceBitfield);
|
|
|
|
auto svmPtr = clSVMAlloc(&context, CL_MEM_READ_WRITE, MemoryConstants::pageSize, MemoryConstants::cacheLineSize);
|
|
|
|
EXPECT_NE(nullptr, svmPtr);
|
|
|
|
EXPECT_EQ(expectedDeviceBitfield, memoryManager->recentlyPassedDeviceBitfield);
|
|
|
|
clSVMFree(&context, svmPtr);
|
|
|
|
|
|
|
|
std::swap(memoryManagerBackup, executionEnvironment->memoryManager);
|
|
|
|
}
|
2017-12-21 07:45:38 +08:00
|
|
|
} // namespace ULT
|