Skip to content

Commit 36a5d9b

Browse files
committed
add checks for empty vectors
1 parent 86ef409 commit 36a5d9b

2 files changed

Lines changed: 85 additions & 49 deletions

File tree

include/CL/opencl.hpp

Lines changed: 70 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3393,8 +3393,9 @@ class Context
33933393
}
33943394

33953395
object_ = CL_(clCreateContext)(
3396-
properties, (cl_uint) numDevices,
3397-
deviceIDs.data(),
3396+
properties,
3397+
(cl_uint)deviceIDs.size(),
3398+
deviceIDs.empty() ? nullptr : deviceIDs.data(),
33983399
notifyFptr, data, &error);
33993400

34003401
detail::errHandler(error, __CREATE_CONTEXT_ERR);
@@ -6463,10 +6464,11 @@ class Kernel : public detail::Wrapper<cl_kernel>
64636464
/*! \brief setArg overload taking a vector type.
64646465
*/
64656466
template<typename T, class Alloc>
6466-
cl_int setArg(cl_uint index, const cl::vector<T, Alloc> &argPtr)
6467+
cl_int setArg(cl_uint index, const cl::vector<T, Alloc> &arg)
64676468
{
64686469
return detail::errHandler(
6469-
CL_(clSetKernelArgSVMPointer)(object_, index, argPtr.data()),
6470+
CL_(clSetKernelArgSVMPointer)(object_, index,
6471+
arg.empty() ? nullptr : arg.data()),
64706472
__SET_KERNEL_ARGS_ERR);
64716473
}
64726474

@@ -6515,8 +6517,8 @@ class Kernel : public detail::Wrapper<cl_kernel>
65156517
CL_(clSetKernelExecInfo)(
65166518
object_,
65176519
CL_KERNEL_EXEC_INFO_SVM_PTRS,
6518-
sizeof(void*)*pointerList.size(),
6519-
pointerList.data()));
6520+
sizeof(void*) * pointerList.size(),
6521+
pointerList.empty() ? nullptr : pointerList.data()));
65206522
}
65216523

65226524
/*!
@@ -6530,8 +6532,8 @@ class Kernel : public detail::Wrapper<cl_kernel>
65306532
CL_(clSetKernelExecInfo)(
65316533
object_,
65326534
CL_KERNEL_EXEC_INFO_SVM_PTRS,
6533-
sizeof(void*)*pointerList.size(),
6534-
pointerList.data()));
6535+
sizeof(void*) * pointerList.size(),
6536+
pointerList.empty() ? nullptr : pointerList.data()));
65356537
}
65366538

65376539
/*! \brief Enable fine-grained system SVM.
@@ -6597,7 +6599,7 @@ class Kernel : public detail::Wrapper<cl_kernel>
65976599
CL_(clSetKernelExecInfo)(
65986600
object_,
65996601
CL_KERNEL_EXEC_INFO_SVM_PTRS,
6600-
sizeof(void*)*(1 + sizeof...(Ts)),
6602+
sizeof(void*) * (1 + sizeof...(Ts)),
66016603
pointerList.data()));
66026604
}
66036605

@@ -6969,11 +6971,14 @@ class Program : public detail::Wrapper<cl_program>
69696971
}
69706972

69716973
object_ = CL_(clCreateProgramWithBinary)(
6972-
context(), (cl_uint) devices.size(),
6973-
deviceIDs.data(),
6974-
lengths.data(), images.data(), (binaryStatus != nullptr && numDevices > 0)
6974+
context(),
6975+
(cl_uint)deviceIDs.size(),
6976+
deviceIDs.empty() ? nullptr : deviceIDs.data(),
6977+
lengths.data(), images.data(),
6978+
(binaryStatus != nullptr && numDevices > 0)
69756979
? &binaryStatus->front()
6976-
: nullptr, &error);
6980+
: nullptr,
6981+
&error);
69776982

69786983
detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
69796984
if (err != nullptr) {
@@ -6995,7 +7000,6 @@ class Program : public detail::Wrapper<cl_program>
69957000
{
69967001
cl_int error;
69977002

6998-
69997003
size_type numDevices = devices.size();
70007004
vector<cl_device_id> deviceIDs(numDevices);
70017005
for( size_type deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
@@ -7004,8 +7008,8 @@ class Program : public detail::Wrapper<cl_program>
70047008

70057009
object_ = CL_(clCreateProgramWithBuiltInKernels)(
70067010
context(),
7007-
(cl_uint) devices.size(),
7008-
deviceIDs.data(),
7011+
(cl_uint)deviceIDs.size(),
7012+
deviceIDs.empty() ? nullptr : deviceIDs.data(),
70097013
kernelNames.c_str(),
70107014
&error);
70117015

@@ -7058,9 +7062,8 @@ class Program : public detail::Wrapper<cl_program>
70587062

70597063
cl_int buildError = CL_(clBuildProgram)(
70607064
object_,
7061-
(cl_uint)
7062-
devices.size(),
7063-
deviceIDs.data(),
7065+
(cl_uint)deviceIDs.size(),
7066+
deviceIDs.empty() ? nullptr : deviceIDs.data(),
70647067
options,
70657068
notifyFptr,
70667069
data);
@@ -7168,18 +7171,20 @@ class Program : public detail::Wrapper<cl_program>
71687171
{
71697172
static_assert(sizeof(cl::Program) == sizeof(cl_program),
71707173
"Size of cl::Program must be equal to size of cl_program");
7174+
71717175
vector<const char*> headerIncludeNamesCStr;
71727176
for(const string& name: headerIncludeNames) {
71737177
headerIncludeNamesCStr.push_back(name.c_str());
71747178
}
7179+
71757180
cl_int error = CL_(clCompileProgram)(
71767181
object_,
71777182
0,
71787183
nullptr,
71797184
options,
71807185
static_cast<cl_uint>(inputHeaders.size()),
7181-
reinterpret_cast<const cl_program*>(inputHeaders.data()),
7182-
reinterpret_cast<const char**>(headerIncludeNamesCStr.data()),
7186+
reinterpret_cast<const cl_program*>(inputHeaders.empty() ? nullptr : inputHeaders.data()),
7187+
reinterpret_cast<const char**>(headerIncludeNamesCStr.empty() ? nullptr : headerIncludeNamesCStr.data()),
71837188
notifyFptr,
71847189
data);
71857190
return detail::buildErrHandler(error, __COMPILE_PROGRAM_ERR, getBuildInfo<CL_PROGRAM_BUILD_LOG>());
@@ -7198,30 +7203,33 @@ class Program : public detail::Wrapper<cl_program>
71987203

71997204
cl_int compile(
72007205
const char* options,
7201-
const vector<Device>& deviceList,
7206+
const vector<Device>& devices,
72027207
const vector<Program>& inputHeaders = vector<Program>(),
72037208
const vector<string>& headerIncludeNames = vector<string>(),
72047209
void (CL_CALLBACK * notifyFptr)(cl_program, void *) = nullptr,
72057210
void* data = nullptr) const
72067211
{
72077212
static_assert(sizeof(cl::Program) == sizeof(cl_program),
72087213
"Size of cl::Program must be equal to size of cl_program");
7214+
7215+
vector<cl_device_id> deviceIDs;
7216+
for(const Device& device: devices) {
7217+
deviceIDs.push_back(device());
7218+
}
7219+
72097220
vector<const char*> headerIncludeNamesCStr;
72107221
for(const string& name: headerIncludeNames) {
72117222
headerIncludeNamesCStr.push_back(name.c_str());
72127223
}
7213-
vector<cl_device_id> deviceIDList;
7214-
for(const Device& device: deviceList) {
7215-
deviceIDList.push_back(device());
7216-
}
7224+
72177225
cl_int error = CL_(clCompileProgram)(
72187226
object_,
7219-
static_cast<cl_uint>(deviceList.size()),
7220-
reinterpret_cast<const cl_device_id*>(deviceIDList.data()),
7227+
static_cast<cl_uint>(deviceIDs.size()),
7228+
reinterpret_cast<const cl_device_id*>(deviceIDs.empty() ? nullptr : deviceIDs.data()),
72217229
options,
72227230
static_cast<cl_uint>(inputHeaders.size()),
7223-
reinterpret_cast<const cl_program*>(inputHeaders.data()),
7224-
reinterpret_cast<const char**>(headerIncludeNamesCStr.data()),
7231+
reinterpret_cast<const cl_program*>(inputHeaders.empty() ? nullptr : inputHeaders.data()),
7232+
reinterpret_cast<const char**>(headerIncludeNamesCStr.empty() ? nullptr : headerIncludeNamesCStr.data()),
72257233
notifyFptr,
72267234
data);
72277235
return detail::buildErrHandler(error, __COMPILE_PROGRAM_ERR, getBuildInfo<CL_PROGRAM_BUILD_LOG>());
@@ -7325,9 +7333,11 @@ class Program : public detail::Wrapper<cl_program>
73257333
}
73267334

73277335
vector<cl_kernel> value(numKernels);
7328-
73297336
err = CL_(clCreateKernelsInProgram)(
7330-
object_, numKernels, value.data(), nullptr);
7337+
object_,
7338+
numKernels,
7339+
value.empty() ? nullptr : value.data(),
7340+
nullptr);
73317341
if (err != CL_SUCCESS) {
73327342
return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);
73337343
}
@@ -7478,7 +7488,7 @@ inline Program linkProgram(
74787488
nullptr,
74797489
options,
74807490
static_cast<cl_uint>(inputPrograms.size()),
7481-
reinterpret_cast<const cl_program *>(inputPrograms.data()),
7491+
reinterpret_cast<const cl_program *>(inputPrograms.empty() ? nullptr : inputPrograms.data()),
74827492
notifyFptr,
74837493
data,
74847494
&error_local);
@@ -8921,12 +8931,13 @@ class CommandQueue : public detail::Wrapper<cl_command_queue>
89218931
return detail::errHandler(CL_INVALID_VALUE,__ENQUEUE_COPY_SVM_ERR);
89228932
}
89238933
cl_int err = detail::errHandler(CL_(clEnqueueSVMMemcpy)(
8924-
object_, blocking, static_cast<void *>(dst_container.data()),
8925-
static_cast<const void *>(src_container.data()),
8934+
object_, blocking,
8935+
dst_container.empty() ? nullptr : dst_container.data(),
8936+
src_container.empty() ? nullptr : src_container.data(),
89268937
dst_container.size() * sizeof(T),
89278938
(events != nullptr) ? (cl_uint) events->size() : 0,
89288939
(events != nullptr && events->size() > 0) ? (const cl_event *) &events->front() : nullptr,
8929-
(event != NULL) ? &tmp : nullptr), __ENQUEUE_COPY_SVM_ERR);
8940+
(event != nullptr) ? &tmp : nullptr), __ENQUEUE_COPY_SVM_ERR);
89308941

89318942
if (event != nullptr && err == CL_SUCCESS)
89328943
*event = tmp;
@@ -8997,8 +9008,11 @@ class CommandQueue : public detail::Wrapper<cl_command_queue>
89979008
{
89989009
cl_event tmp;
89999010
cl_int err = detail::errHandler(CL_(clEnqueueSVMMemFill)(
9000-
object_, static_cast<void *>(container.data()), static_cast<void *>(&pattern),
9001-
sizeof(PatternType), container.size() * sizeof(T),
9011+
object_,
9012+
container.empty() ? nullptr : container.data(),
9013+
&pattern,
9014+
sizeof(PatternType),
9015+
container.size() * sizeof(T),
90029016
(events != nullptr) ? (cl_uint) events->size() : 0,
90039017
(events != nullptr && events->size() > 0) ? (const cl_event *) &events->front() : nullptr,
90049018
(event != nullptr) ? &tmp : NULL), __ENQUEUE_FILL_SVM_ERR);
@@ -9078,7 +9092,9 @@ class CommandQueue : public detail::Wrapper<cl_command_queue>
90789092
{
90799093
cl_event tmp;
90809094
cl_int err = detail::errHandler(CL_(clEnqueueSVMMap)(
9081-
object_, blocking, flags, static_cast<void*>(container.data()), container.size()*sizeof(T),
9095+
object_, blocking, flags,
9096+
container.empty() ? nullptr : container.data(),
9097+
container.size() * sizeof(T),
90829098
(events != nullptr) ? (cl_uint)events->size() : 0,
90839099
(events != nullptr && events->size() > 0) ? (const cl_event*)&events->front() : nullptr,
90849100
(event != nullptr) ? &tmp : nullptr),
@@ -9177,7 +9193,8 @@ class CommandQueue : public detail::Wrapper<cl_command_queue>
91779193
cl_event tmp;
91789194
cl_int err = detail::errHandler(
91799195
CL_(clEnqueueSVMUnmap)(
9180-
object_, static_cast<void*>(container.data()),
9196+
object_,
9197+
container.empty() ? nullptr : container.data(),
91819198
(events != nullptr) ? (cl_uint)events->size() : 0,
91829199
(events != nullptr && events->size() > 0) ? (const cl_event*)&events->front() : nullptr,
91839200
(event != nullptr) ? &tmp : nullptr),
@@ -9274,7 +9291,7 @@ class CommandQueue : public detail::Wrapper<cl_command_queue>
92749291
CL_(clEnqueueMigrateMemObjects)(
92759292
object_,
92769293
(cl_uint)memObjects.size(),
9277-
localMemObjects.data(),
9294+
localMemObjects.empty() ? nullptr : localMemObjects.data(),
92789295
flags,
92799296
(events != nullptr) ? (cl_uint) events->size() : 0,
92809297
(events != nullptr && events->size() > 0) ? (const cl_event*) &events->front() : nullptr,
@@ -9306,8 +9323,9 @@ class CommandQueue : public detail::Wrapper<cl_command_queue>
93069323
cl_event tmp;
93079324
cl_int err = detail::errHandler(CL_(clEnqueueSVMMigrateMem)(
93089325
object_,
9309-
svmRawPointers.size(), static_cast<void**>(svmRawPointers.data()),
9310-
sizes.data(), // array of sizes not passed
9326+
svmRawPointers.size(),
9327+
svmRawPointers.empty() ? nullptr : svmRawPointers.data(),
9328+
sizes.empty() ? nullptr : sizes.data(),
93119329
flags,
93129330
(events != nullptr) ? (cl_uint)events->size() : 0,
93139331
(events != nullptr && events->size() > 0) ? (const cl_event*)&events->front() : nullptr,
@@ -9676,7 +9694,7 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(
96769694
err = pfn_clEnqueueAcquireExternalMemObjectsKHR(
96779695
object_,
96789696
static_cast<cl_uint>(mem_objects.size()),
9679-
(mem_objects.size() > 0) ? reinterpret_cast<const cl_mem *>(mem_objects.data()) : nullptr,
9697+
reinterpret_cast<const cl_mem *>(mem_objects.empty() ? nullptr : mem_objects.data()),
96809698
(events_wait != nullptr) ? static_cast<cl_uint>(events_wait->size()) : 0,
96819699
(events_wait != nullptr && events_wait->size() > 0) ? reinterpret_cast<const cl_event*>(events_wait->data()) : nullptr,
96829700
&tmp);
@@ -9705,7 +9723,7 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(
97059723
err = pfn_clEnqueueReleaseExternalMemObjectsKHR(
97069724
object_,
97079725
static_cast<cl_uint>(mem_objects.size()),
9708-
(mem_objects.size() > 0) ? reinterpret_cast<const cl_mem *>(mem_objects.data()) : nullptr,
9726+
reinterpret_cast<const cl_mem *>(mem_objects.empty() ? nullptr : mem_objects.data()),
97099727
(events_wait != nullptr) ? static_cast<cl_uint>(events_wait->size()) : 0,
97109728
(events_wait != nullptr && events_wait->size() > 0) ? reinterpret_cast<const cl_event*>(events_wait->data()) : nullptr,
97119729
&tmp);
@@ -11337,7 +11355,7 @@ class Semaphore : public detail::Wrapper<cl_semaphore_khr>
1133711355
{
1133811356
object_ = pfn_clCreateSemaphoreWithPropertiesKHR(
1133911357
context(),
11340-
sema_props.data(),
11358+
sema_props.empty() ? nullptr : sema_props.data(),
1134111359
&error);
1134211360
}
1134311361

@@ -11931,7 +11949,7 @@ class CommandBufferKhr : public detail::Wrapper<cl_command_buffer_khr>
1193111949
nullptr, // Properties
1193211950
#endif
1193311951
image(),
11934-
static_cast<void*>(&fillColor),
11952+
&fillColor,
1193511953
origin.data(),
1193611954
region.data(),
1193711955
(sync_points_vec != nullptr) ? (cl_uint) sync_points_vec->size() : 0,
@@ -12010,8 +12028,11 @@ class CommandBufferKhr : public detail::Wrapper<cl_command_buffer_khr>
1201012028
__UPDATE_MUTABLE_COMMANDS_KHR_ERR);
1201112029
}
1201212030
return detail::errHandler(
12013-
pfn_clUpdateMutableCommandsKHR(object_, static_cast<cl_uint>(configs.size()),
12014-
config_types.data(), configs.data()),
12031+
pfn_clUpdateMutableCommandsKHR(
12032+
object_,
12033+
static_cast<cl_uint>(configs.size()),
12034+
config_types.empty() ? nullptr : config_types.data(),
12035+
configs.empty() ? nullptr : configs.data()),
1201512036
__UPDATE_MUTABLE_COMMANDS_KHR_ERR);
1201612037
}
1201712038
#endif /* CL_KHR_COMMAND_BUFFER_MUTABLE_DISPATCH_EXTENSION_VERSION */

tests/test_openclhpp.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2026,6 +2026,21 @@ void testKernelSetSVMPointers(void)
20262026
TEST_ASSERT_EQUAL_HEX(expected, ret);
20272027
#endif
20282028
}
2029+
2030+
void testKernelSetSVMPointersEmpty(void)
2031+
{
2032+
#if CL_HPP_TARGET_OPENCL_VERSION >= 200
2033+
clSetKernelExecInfo_ExpectAndReturn(make_kernel(0),
2034+
CL_KERNEL_EXEC_INFO_SVM_PTRS,
2035+
0, nullptr, CL_SUCCESS);
2036+
2037+
cl::vector<void *> vec;
2038+
cl_int ret = kernelPool[0].setSVMPointers(vec);
2039+
2040+
TEST_ASSERT_EQUAL_HEX(CL_SUCCESS, ret);
2041+
#endif
2042+
}
2043+
20292044
cl_int clSetKernelExecInfo_EnableFineGrainedSystemSVM(cl_kernel kernel,
20302045
cl_kernel_exec_info param_name,
20312046
size_t param_value_size,

0 commit comments

Comments
 (0)