Unrestricted size flag support in clSvmAlloc
Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
This commit is contained in:
parent
6f2a8e8a1c
commit
469c929b7f
|
@ -4387,27 +4387,36 @@ void *CL_API_CALL clSVMAlloc(cl_context context,
|
|||
return pAlloc;
|
||||
}
|
||||
|
||||
if (flags == 0) {
|
||||
flags = CL_MEM_READ_WRITE;
|
||||
}
|
||||
{
|
||||
// allow CL_MEM_ALLOW_UNRESTRICTED_SIZE_INTEL with every combination
|
||||
cl_svm_mem_flags tempFlags = flags & (~CL_MEM_ALLOW_UNRESTRICTED_SIZE_INTEL);
|
||||
|
||||
if (!((flags == CL_MEM_READ_WRITE) ||
|
||||
(flags == CL_MEM_WRITE_ONLY) ||
|
||||
(flags == CL_MEM_READ_ONLY) ||
|
||||
(flags == CL_MEM_SVM_FINE_GRAIN_BUFFER) ||
|
||||
(flags == (CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)) ||
|
||||
(flags == (CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER)) ||
|
||||
(flags == (CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)) ||
|
||||
(flags == (CL_MEM_WRITE_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER)) ||
|
||||
(flags == (CL_MEM_WRITE_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)) ||
|
||||
(flags == (CL_MEM_READ_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER)) ||
|
||||
(flags == (CL_MEM_READ_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)))) {
|
||||
TRACING_EXIT(clSVMAlloc, &pAlloc);
|
||||
return pAlloc;
|
||||
if (tempFlags == 0) {
|
||||
tempFlags = CL_MEM_READ_WRITE;
|
||||
}
|
||||
|
||||
if (!((tempFlags == CL_MEM_READ_WRITE) ||
|
||||
(tempFlags == CL_MEM_WRITE_ONLY) ||
|
||||
(tempFlags == CL_MEM_READ_ONLY) ||
|
||||
(tempFlags == CL_MEM_SVM_FINE_GRAIN_BUFFER) ||
|
||||
(tempFlags == (CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)) ||
|
||||
(tempFlags == (CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER)) ||
|
||||
(tempFlags == (CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)) ||
|
||||
(tempFlags == (CL_MEM_WRITE_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER)) ||
|
||||
(tempFlags == (CL_MEM_WRITE_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)) ||
|
||||
(tempFlags == (CL_MEM_READ_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER)) ||
|
||||
(tempFlags == (CL_MEM_READ_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)))) {
|
||||
|
||||
TRACING_EXIT(clSVMAlloc, &pAlloc);
|
||||
return pAlloc;
|
||||
}
|
||||
}
|
||||
|
||||
auto pDevice = pContext->getDevice(0);
|
||||
if ((size == 0) || (size > pDevice->getSharedDeviceInfo().maxMemAllocSize)) {
|
||||
bool allowUnrestrictedSize = (flags & CL_MEM_ALLOW_UNRESTRICTED_SIZE_INTEL);
|
||||
|
||||
if ((size == 0) ||
|
||||
(!allowUnrestrictedSize && (size > pDevice->getSharedDeviceInfo().maxMemAllocSize))) {
|
||||
TRACING_EXIT(clSVMAlloc, &pAlloc);
|
||||
return pAlloc;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2017-2020 Intel Corporation
|
||||
* Copyright (C) 2017-2021 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
|
@ -194,6 +194,42 @@ TEST_F(clSVMAllocTests, GivenZeroAlignmentWhenAllocatingSvmThenSvmIsAllocated) {
|
|||
}
|
||||
}
|
||||
|
||||
TEST_F(clSVMAllocTests, givenUnrestrictedFlagWhenCreatingSvmAllocThenAllowSizeBiggerThanMaxMemAllocSize) {
|
||||
REQUIRE_SVM_OR_SKIP(pDevice);
|
||||
|
||||
const size_t maxMemAllocSize = 128;
|
||||
|
||||
static_cast<MockDevice &>(pDevice->getDevice()).deviceInfo.maxMemAllocSize = maxMemAllocSize;
|
||||
|
||||
size_t allowedSize = maxMemAllocSize;
|
||||
size_t notAllowedSize = maxMemAllocSize + 1;
|
||||
|
||||
cl_mem_flags flags = 0;
|
||||
void *svmPtr = nullptr;
|
||||
|
||||
{
|
||||
// no flag + not allowed size
|
||||
svmPtr = clSVMAlloc(pContext, flags, notAllowedSize, 0);
|
||||
EXPECT_EQ(nullptr, svmPtr);
|
||||
}
|
||||
|
||||
flags = CL_MEM_ALLOW_UNRESTRICTED_SIZE_INTEL;
|
||||
|
||||
{
|
||||
// unrestricted size flag + not allowed size
|
||||
svmPtr = clSVMAlloc(pContext, flags, notAllowedSize, 0);
|
||||
EXPECT_NE(nullptr, svmPtr);
|
||||
clSVMFree(pContext, svmPtr);
|
||||
}
|
||||
|
||||
{
|
||||
// unrestricted size flag + allowed size
|
||||
svmPtr = clSVMAlloc(pContext, flags, allowedSize, 0);
|
||||
EXPECT_NE(nullptr, svmPtr);
|
||||
clSVMFree(pContext, svmPtr);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(clSVMAllocTests, GivenUnalignedSizeAndDefaultAlignmentWhenAllocatingSvmThenSvmIsAllocated) {
|
||||
const ClDeviceInfo &devInfo = pDevice->getDeviceInfo();
|
||||
if (devInfo.svmCapabilities != 0) {
|
||||
|
|
Loading…
Reference in New Issue