Skip to content

Commit 469c929

Browse files
Unrestricted size flag support in clSvmAlloc
Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
1 parent 6f2a8e8 commit 469c929

File tree

2 files changed

+64
-19
lines changed

2 files changed

+64
-19
lines changed

opencl/source/api/api.cpp

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4387,27 +4387,36 @@ void *CL_API_CALL clSVMAlloc(cl_context context,
43874387
return pAlloc;
43884388
}
43894389

4390-
if (flags == 0) {
4391-
flags = CL_MEM_READ_WRITE;
4392-
}
4393-
4394-
if (!((flags == CL_MEM_READ_WRITE) ||
4395-
(flags == CL_MEM_WRITE_ONLY) ||
4396-
(flags == CL_MEM_READ_ONLY) ||
4397-
(flags == CL_MEM_SVM_FINE_GRAIN_BUFFER) ||
4398-
(flags == (CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)) ||
4399-
(flags == (CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER)) ||
4400-
(flags == (CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)) ||
4401-
(flags == (CL_MEM_WRITE_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER)) ||
4402-
(flags == (CL_MEM_WRITE_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)) ||
4403-
(flags == (CL_MEM_READ_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER)) ||
4404-
(flags == (CL_MEM_READ_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)))) {
4405-
TRACING_EXIT(clSVMAlloc, &pAlloc);
4406-
return pAlloc;
4390+
{
4391+
// allow CL_MEM_ALLOW_UNRESTRICTED_SIZE_INTEL with every combination
4392+
cl_svm_mem_flags tempFlags = flags & (~CL_MEM_ALLOW_UNRESTRICTED_SIZE_INTEL);
4393+
4394+
if (tempFlags == 0) {
4395+
tempFlags = CL_MEM_READ_WRITE;
4396+
}
4397+
4398+
if (!((tempFlags == CL_MEM_READ_WRITE) ||
4399+
(tempFlags == CL_MEM_WRITE_ONLY) ||
4400+
(tempFlags == CL_MEM_READ_ONLY) ||
4401+
(tempFlags == CL_MEM_SVM_FINE_GRAIN_BUFFER) ||
4402+
(tempFlags == (CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)) ||
4403+
(tempFlags == (CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER)) ||
4404+
(tempFlags == (CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)) ||
4405+
(tempFlags == (CL_MEM_WRITE_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER)) ||
4406+
(tempFlags == (CL_MEM_WRITE_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)) ||
4407+
(tempFlags == (CL_MEM_READ_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER)) ||
4408+
(tempFlags == (CL_MEM_READ_ONLY | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS)))) {
4409+
4410+
TRACING_EXIT(clSVMAlloc, &pAlloc);
4411+
return pAlloc;
4412+
}
44074413
}
44084414

44094415
auto pDevice = pContext->getDevice(0);
4410-
if ((size == 0) || (size > pDevice->getSharedDeviceInfo().maxMemAllocSize)) {
4416+
bool allowUnrestrictedSize = (flags & CL_MEM_ALLOW_UNRESTRICTED_SIZE_INTEL);
4417+
4418+
if ((size == 0) ||
4419+
(!allowUnrestrictedSize && (size > pDevice->getSharedDeviceInfo().maxMemAllocSize))) {
44114420
TRACING_EXIT(clSVMAlloc, &pAlloc);
44124421
return pAlloc;
44134422
}

opencl/test/unit_test/api/cl_svm_alloc_tests.inl

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2017-2020 Intel Corporation
2+
* Copyright (C) 2017-2021 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -194,6 +194,42 @@ TEST_F(clSVMAllocTests, GivenZeroAlignmentWhenAllocatingSvmThenSvmIsAllocated) {
194194
}
195195
}
196196

197+
TEST_F(clSVMAllocTests, givenUnrestrictedFlagWhenCreatingSvmAllocThenAllowSizeBiggerThanMaxMemAllocSize) {
198+
REQUIRE_SVM_OR_SKIP(pDevice);
199+
200+
const size_t maxMemAllocSize = 128;
201+
202+
static_cast<MockDevice &>(pDevice->getDevice()).deviceInfo.maxMemAllocSize = maxMemAllocSize;
203+
204+
size_t allowedSize = maxMemAllocSize;
205+
size_t notAllowedSize = maxMemAllocSize + 1;
206+
207+
cl_mem_flags flags = 0;
208+
void *svmPtr = nullptr;
209+
210+
{
211+
// no flag + not allowed size
212+
svmPtr = clSVMAlloc(pContext, flags, notAllowedSize, 0);
213+
EXPECT_EQ(nullptr, svmPtr);
214+
}
215+
216+
flags = CL_MEM_ALLOW_UNRESTRICTED_SIZE_INTEL;
217+
218+
{
219+
// unrestricted size flag + not allowed size
220+
svmPtr = clSVMAlloc(pContext, flags, notAllowedSize, 0);
221+
EXPECT_NE(nullptr, svmPtr);
222+
clSVMFree(pContext, svmPtr);
223+
}
224+
225+
{
226+
// unrestricted size flag + allowed size
227+
svmPtr = clSVMAlloc(pContext, flags, allowedSize, 0);
228+
EXPECT_NE(nullptr, svmPtr);
229+
clSVMFree(pContext, svmPtr);
230+
}
231+
}
232+
197233
TEST_F(clSVMAllocTests, GivenUnalignedSizeAndDefaultAlignmentWhenAllocatingSvmThenSvmIsAllocated) {
198234
const ClDeviceInfo &devInfo = pDevice->getDeviceInfo();
199235
if (devInfo.svmCapabilities != 0) {

0 commit comments

Comments
 (0)