25
25
26
26
#include < algorithm>
27
27
#include < functional>
28
+ #include < limits>
28
29
#include < memory>
29
30
#include < type_traits>
30
31
@@ -128,6 +129,39 @@ struct check_fn_signature<F, RetT(Args...)> {
128
129
129
130
__SYCL_EXPORT device getDeviceFromHandler (handler &);
130
131
132
+ #if defined(__SYCL_ID_QUERIES_FIT_IN_INT__)
133
+ template <typename T> struct NotIntMsg ;
134
+
135
+ // TODO reword for "`fsycl-id-queries-fit-in-int' optimization flag." when
136
+ // implemented
137
+ template <int Dims> struct NotIntMsg <range<Dims>> {
138
+ constexpr static char *Msg = " Provided range is out of integer limits. "
139
+ " Pass `-U__SYCL_ID_QUERIES_FIT_IN_INT__' to "
140
+ " disable range check." ;
141
+ };
142
+
143
+ template <int Dims> struct NotIntMsg <id<Dims>> {
144
+ constexpr static char *Msg = " Provided offset is out of integer limits. "
145
+ " Pass `-U__SYCL_ID_QUERIES_FIT_IN_INT__' to "
146
+ " disable offset check." ;
147
+ };
148
+ #endif
149
+
150
+ template <int Dims, typename T>
151
+ typename std::enable_if<std::is_same<T, range<Dims>>::value ||
152
+ std::is_same<T, id<Dims>>::value>::type
153
+ checkValueRange (const T &V) {
154
+ #if defined(__SYCL_ID_QUERIES_FIT_IN_INT__)
155
+ static constexpr size_t Limit =
156
+ static_cast <size_t >((std::numeric_limits<int >::max)());
157
+ for (size_t Dim = 0 ; Dim < Dims; ++Dim)
158
+ if (V[Dim] > Limit)
159
+ throw runtime_error (NotIntMsg<T>::Msg, PI_INVALID_VALUE);
160
+ #else
161
+ (void )V;
162
+ #endif
163
+ }
164
+
131
165
} // namespace detail
132
166
133
167
namespace intel {
@@ -770,6 +804,8 @@ class __SYCL_EXPORT handler {
770
804
#ifdef __SYCL_DEVICE_ONLY__
771
805
kernel_single_task<NameT>(KernelFunc);
772
806
#else
807
+ // No need to check if range is out of INT_MAX limits as it's compile-time
808
+ // known constant.
773
809
MNDRDesc.set (range<1 >{1 });
774
810
775
811
StoreLambda<NameT, KernelType, /* Dims*/ 0 , void >(KernelFunc);
@@ -798,6 +834,7 @@ class __SYCL_EXPORT handler {
798
834
(void )NumWorkItems;
799
835
kernel_parallel_for<NameT, KernelType, Dims>(KernelFunc);
800
836
#else
837
+ detail::checkValueRange<Dims>(NumWorkItems);
801
838
MNDRDesc.set (std::move (NumWorkItems));
802
839
StoreLambda<NameT, KernelType, Dims>(std::move (KernelFunc));
803
840
MCGType = detail::CG::KERNEL;
@@ -810,6 +847,8 @@ class __SYCL_EXPORT handler {
810
847
// / named function object type.
811
848
template <typename FuncT> void run_on_host_intel (FuncT Func) {
812
849
throwIfActionIsCreated ();
850
+ // No need to check if range is out of INT_MAX limits as it's compile-time
851
+ // known constant
813
852
MNDRDesc.set (range<1 >{1 });
814
853
815
854
MArgs = std::move (MAssociatedAccesors);
@@ -856,6 +895,8 @@ class __SYCL_EXPORT handler {
856
895
(void )WorkItemOffset;
857
896
kernel_parallel_for<NameT, KernelType, Dims>(KernelFunc);
858
897
#else
898
+ detail::checkValueRange<Dims>(NumWorkItems);
899
+ detail::checkValueRange<Dims>(WorkItemOffset);
859
900
MNDRDesc.set (std::move (NumWorkItems), std::move (WorkItemOffset));
860
901
StoreLambda<NameT, KernelType, Dims>(std::move (KernelFunc));
861
902
MCGType = detail::CG::KERNEL;
@@ -884,6 +925,9 @@ class __SYCL_EXPORT handler {
884
925
(void )ExecutionRange;
885
926
kernel_parallel_for_nd_range<NameT, KernelType, Dims>(KernelFunc);
886
927
#else
928
+ detail::checkValueRange<Dims>(ExecutionRange.get_global_range ());
929
+ detail::checkValueRange<Dims>(ExecutionRange.get_local_range ());
930
+ detail::checkValueRange<Dims>(ExecutionRange.get_offset ());
887
931
MNDRDesc.set (std::move (ExecutionRange));
888
932
StoreLambda<NameT, KernelType, Dims>(std::move (KernelFunc));
889
933
MCGType = detail::CG::KERNEL;
@@ -1053,6 +1097,7 @@ class __SYCL_EXPORT handler {
1053
1097
(void )NumWorkGroups;
1054
1098
kernel_parallel_for_work_group<NameT, KernelType, Dims>(KernelFunc);
1055
1099
#else
1100
+ detail::checkValueRange<Dims>(NumWorkGroups);
1056
1101
MNDRDesc.setNumWorkGroups (NumWorkGroups);
1057
1102
StoreLambda<NameT, KernelType, Dims>(std::move (KernelFunc));
1058
1103
MCGType = detail::CG::KERNEL;
@@ -1084,7 +1129,12 @@ class __SYCL_EXPORT handler {
1084
1129
(void )WorkGroupSize;
1085
1130
kernel_parallel_for_work_group<NameT, KernelType, Dims>(KernelFunc);
1086
1131
#else
1087
- MNDRDesc.set (nd_range<Dims>(NumWorkGroups * WorkGroupSize, WorkGroupSize));
1132
+ nd_range<Dims> ExecRange =
1133
+ nd_range<Dims>(NumWorkGroups * WorkGroupSize, WorkGroupSize);
1134
+ detail::checkValueRange<Dims>(ExecRange.get_global_range ());
1135
+ detail::checkValueRange<Dims>(ExecRange.get_local_range ());
1136
+ detail::checkValueRange<Dims>(ExecRange.get_offset ());
1137
+ MNDRDesc.set (std::move (ExecRange));
1088
1138
StoreLambda<NameT, KernelType, Dims>(std::move (KernelFunc));
1089
1139
MCGType = detail::CG::KERNEL;
1090
1140
#endif // __SYCL_DEVICE_ONLY__
@@ -1099,6 +1149,8 @@ class __SYCL_EXPORT handler {
1099
1149
void single_task (kernel Kernel) {
1100
1150
throwIfActionIsCreated ();
1101
1151
verifyKernelInvoc (Kernel);
1152
+ // No need to check if range is out of INT_MAX limits as it's compile-time
1153
+ // known constant
1102
1154
MNDRDesc.set (range<1 >{1 });
1103
1155
MKernel = detail::getSyclObjImpl (std::move (Kernel));
1104
1156
MCGType = detail::CG::KERNEL;
@@ -1117,6 +1169,7 @@ class __SYCL_EXPORT handler {
1117
1169
throwIfActionIsCreated ();
1118
1170
verifyKernelInvoc (Kenrel);
1119
1171
MKernel = detail::getSyclObjImpl (std::move (Kenrel));
1172
+ detail::checkValueRange<Dims>(NumWorkItems);
1120
1173
MNDRDesc.set (std::move (NumWorkItems));
1121
1174
MCGType = detail::CG::KERNEL;
1122
1175
extractArgsAndReqs ();
@@ -1136,6 +1189,8 @@ class __SYCL_EXPORT handler {
1136
1189
throwIfActionIsCreated ();
1137
1190
verifyKernelInvoc (Kernel);
1138
1191
MKernel = detail::getSyclObjImpl (std::move (Kernel));
1192
+ detail::checkValueRange<Dims>(NumWorkItems);
1193
+ detail::checkValueRange<Dims>(WorkItemOffset);
1139
1194
MNDRDesc.set (std::move (NumWorkItems), std::move (WorkItemOffset));
1140
1195
MCGType = detail::CG::KERNEL;
1141
1196
extractArgsAndReqs ();
@@ -1153,6 +1208,9 @@ class __SYCL_EXPORT handler {
1153
1208
throwIfActionIsCreated ();
1154
1209
verifyKernelInvoc (Kernel);
1155
1210
MKernel = detail::getSyclObjImpl (std::move (Kernel));
1211
+ detail::checkValueRange<Dims>(NDRange.get_global_range ());
1212
+ detail::checkValueRange<Dims>(NDRange.get_local_range ());
1213
+ detail::checkValueRange<Dims>(NDRange.get_offset ());
1156
1214
MNDRDesc.set (std::move (NDRange));
1157
1215
MCGType = detail::CG::KERNEL;
1158
1216
extractArgsAndReqs ();
@@ -1173,6 +1231,8 @@ class __SYCL_EXPORT handler {
1173
1231
(void )Kernel;
1174
1232
kernel_single_task<NameT>(KernelFunc);
1175
1233
#else
1234
+ // No need to check if range is out of INT_MAX limits as it's compile-time
1235
+ // known constant
1176
1236
MNDRDesc.set (range<1 >{1 });
1177
1237
MKernel = detail::getSyclObjImpl (std::move (Kernel));
1178
1238
MCGType = detail::CG::KERNEL;
@@ -1211,6 +1271,7 @@ class __SYCL_EXPORT handler {
1211
1271
(void )NumWorkItems;
1212
1272
kernel_parallel_for<NameT, KernelType, Dims>(KernelFunc);
1213
1273
#else
1274
+ detail::checkValueRange<Dims>(NumWorkItems);
1214
1275
MNDRDesc.set (std::move (NumWorkItems));
1215
1276
MKernel = detail::getSyclObjImpl (std::move (Kernel));
1216
1277
MCGType = detail::CG::KERNEL;
@@ -1243,6 +1304,8 @@ class __SYCL_EXPORT handler {
1243
1304
(void )WorkItemOffset;
1244
1305
kernel_parallel_for<NameT, KernelType, Dims>(KernelFunc);
1245
1306
#else
1307
+ detail::checkValueRange<Dims>(NumWorkItems);
1308
+ detail::checkValueRange<Dims>(WorkItemOffset);
1246
1309
MNDRDesc.set (std::move (NumWorkItems), std::move (WorkItemOffset));
1247
1310
MKernel = detail::getSyclObjImpl (std::move (Kernel));
1248
1311
MCGType = detail::CG::KERNEL;
@@ -1274,6 +1337,9 @@ class __SYCL_EXPORT handler {
1274
1337
(void )NDRange;
1275
1338
kernel_parallel_for_nd_range<NameT, KernelType, Dims>(KernelFunc);
1276
1339
#else
1340
+ detail::checkValueRange<Dims>(NDRange.get_global_range ());
1341
+ detail::checkValueRange<Dims>(NDRange.get_local_range ());
1342
+ detail::checkValueRange<Dims>(NDRange.get_offset ());
1277
1343
MNDRDesc.set (std::move (NDRange));
1278
1344
MKernel = detail::getSyclObjImpl (std::move (Kernel));
1279
1345
MCGType = detail::CG::KERNEL;
@@ -1309,6 +1375,7 @@ class __SYCL_EXPORT handler {
1309
1375
(void )NumWorkGroups;
1310
1376
kernel_parallel_for_work_group<NameT, KernelType, Dims>(KernelFunc);
1311
1377
#else
1378
+ detail::checkValueRange<Dims>(NumWorkGroups);
1312
1379
MNDRDesc.setNumWorkGroups (NumWorkGroups);
1313
1380
MKernel = detail::getSyclObjImpl (std::move (Kernel));
1314
1381
StoreLambda<NameT, KernelType, Dims>(std::move (KernelFunc));
@@ -1345,7 +1412,12 @@ class __SYCL_EXPORT handler {
1345
1412
(void )WorkGroupSize;
1346
1413
kernel_parallel_for_work_group<NameT, KernelType, Dims>(KernelFunc);
1347
1414
#else
1348
- MNDRDesc.set (nd_range<Dims>(NumWorkGroups * WorkGroupSize, WorkGroupSize));
1415
+ nd_range<Dims> ExecRange =
1416
+ nd_range<Dims>(NumWorkGroups * WorkGroupSize, WorkGroupSize);
1417
+ detail::checkValueRange<Dims>(ExecRange.get_global_range ());
1418
+ detail::checkValueRange<Dims>(ExecRange.get_local_range ());
1419
+ detail::checkValueRange<Dims>(ExecRange.get_offset ());
1420
+ MNDRDesc.set (std::move (ExecRange));
1349
1421
MKernel = detail::getSyclObjImpl (std::move (Kernel));
1350
1422
StoreLambda<NameT, KernelType, Dims>(std::move (KernelFunc));
1351
1423
MCGType = detail::CG::KERNEL;
0 commit comments