@@ -227,6 +227,22 @@ template <typename DataT, int Dimensions = 1,
227
227
class accessor ;
228
228
229
229
namespace detail {
230
+
231
+ // A helper structure which is shared between buffer accessor and accessor_impl
232
+ // TODO: Unify with AccessorImplDevice?
233
+ struct AccHostDataT {
234
+ AccHostDataT (const sycl::id<3 > &Offset, const sycl::range<3 > &Range,
235
+ const sycl::range<3 > &MemoryRange, void *Data = nullptr )
236
+ : MOffset(Offset), MAccessRange(Range), MMemoryRange(MemoryRange),
237
+ MData (Data) {}
238
+
239
+ sycl::id<3 > MOffset;
240
+ sycl::range<3 > MAccessRange;
241
+ sycl::range<3 > MMemoryRange;
242
+ void *MData = nullptr ;
243
+ void *Reserved = nullptr ;
244
+ };
245
+
230
246
// To ensure loop unrolling is done when processing dimensions.
231
247
template <size_t ... Inds, class F >
232
248
void dim_loop_impl (std::integer_sequence<size_t , Inds...>, F &&f) {
@@ -474,6 +490,8 @@ class __SYCL_EXPORT AccessorBaseHost {
474
490
const range<3 > &getMemoryRange () const ;
475
491
void *getPtr () const ;
476
492
493
+ detail::AccHostDataT &getAccData ();
494
+
477
495
const property_list &getPropList () const ;
478
496
479
497
void *getMemoryObject () const ;
@@ -1106,21 +1124,42 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1106
1124
detail::InitializedVal<AdjustedDim, range>::template get<0>()) {}
1107
1125
1108
1126
#else
1109
- id<3 > &getOffset () { return AccessorBaseHost::getOffset (); }
1127
+ id<3 > &getOffset () {
1128
+ if constexpr (IsHostBuf)
1129
+ return MAccData->MOffset ;
1130
+ else
1131
+ return AccessorBaseHost::getOffset ();
1132
+ }
1133
+
1110
1134
range<3 > &getAccessRange () { return AccessorBaseHost::getAccessRange (); }
1111
- range<3 > &getMemoryRange () { return AccessorBaseHost::getMemoryRange (); }
1135
+ range<3 > &getMemoryRange () {
1136
+ if constexpr (IsHostBuf)
1137
+ return MAccData->MMemoryRange ;
1138
+ else
1139
+ return AccessorBaseHost::getMemoryRange ();
1140
+ }
1112
1141
void *getPtr () { return AccessorBaseHost::getPtr (); }
1113
1142
1114
- const id<3 > &getOffset () const { return AccessorBaseHost::getOffset (); }
1143
+ const id<3 > &getOffset () const {
1144
+ if constexpr (IsHostBuf)
1145
+ return MAccData->MOffset ;
1146
+ else
1147
+ return AccessorBaseHost::getOffset ();
1148
+ }
1115
1149
const range<3 > &getAccessRange () const {
1116
1150
return AccessorBaseHost::getAccessRange ();
1117
1151
}
1118
1152
const range<3 > &getMemoryRange () const {
1119
- return AccessorBaseHost::getMemoryRange ();
1153
+ if constexpr (IsHostBuf)
1154
+ return MAccData->MMemoryRange ;
1155
+ else
1156
+ return AccessorBaseHost::getMemoryRange ();
1120
1157
}
1121
1158
1122
1159
void *getPtr () const { return AccessorBaseHost::getPtr (); }
1123
1160
1161
+ void initHostAcc () { MAccData = &getAccData (); }
1162
+
1124
1163
// The function references helper methods required by GDB pretty-printers
1125
1164
void GDBMethodsAnchor () {
1126
1165
#ifndef NDEBUG
@@ -1131,11 +1170,17 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1131
1170
#endif
1132
1171
}
1133
1172
1173
+ detail::AccHostDataT *MAccData = nullptr ;
1174
+
1134
1175
char padding[sizeof (detail::AccessorImplDevice<AdjustedDim>) +
1135
- sizeof (PtrType) - sizeof (detail::AccessorBaseHost)];
1176
+ sizeof (PtrType) - sizeof (detail::AccessorBaseHost) -
1177
+ sizeof (MAccData)];
1136
1178
1137
1179
PtrType getQualifiedPtr () const {
1138
- return reinterpret_cast <PtrType>(AccessorBaseHost::getPtr ());
1180
+ if constexpr (IsHostBuf)
1181
+ return reinterpret_cast <PtrType>(MAccData->MData );
1182
+ else
1183
+ return reinterpret_cast <PtrType>(AccessorBaseHost::getPtr ());
1139
1184
}
1140
1185
1141
1186
#endif // __SYCL_DEVICE_ONLY__
@@ -1197,9 +1242,11 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1197
1242
preScreenAccessor (BufferRef.size (), PropertyList);
1198
1243
if (!IsPlaceH)
1199
1244
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
1245
+ initHostAcc ();
1200
1246
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1201
1247
detail::AccessorBaseHost::impl.get (),
1202
1248
AccessTarget, AccessMode, CodeLoc);
1249
+ GDBMethodsAnchor ();
1203
1250
#endif
1204
1251
}
1205
1252
@@ -1228,9 +1275,11 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1228
1275
preScreenAccessor (BufferRef.size (), PropertyList);
1229
1276
if (!IsPlaceH)
1230
1277
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
1278
+ initHostAcc ();
1231
1279
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1232
1280
detail::AccessorBaseHost::impl.get (),
1233
1281
AccessTarget, AccessMode, CodeLoc);
1282
+ GDBMethodsAnchor ();
1234
1283
#endif
1235
1284
}
1236
1285
@@ -1257,9 +1306,11 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1257
1306
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1258
1307
preScreenAccessor (BufferRef.size (), PropertyList);
1259
1308
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1309
+ initHostAcc ();
1260
1310
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1261
1311
detail::AccessorBaseHost::impl.get (),
1262
1312
AccessTarget, AccessMode, CodeLoc);
1313
+ GDBMethodsAnchor ();
1263
1314
}
1264
1315
#endif
1265
1316
@@ -1288,9 +1339,11 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1288
1339
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1289
1340
preScreenAccessor (BufferRef.size (), PropertyList);
1290
1341
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1342
+ initHostAcc ();
1291
1343
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1292
1344
detail::AccessorBaseHost::impl.get (),
1293
1345
AccessTarget, AccessMode, CodeLoc);
1346
+ GDBMethodsAnchor ();
1294
1347
}
1295
1348
#endif
1296
1349
@@ -1316,13 +1369,14 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1316
1369
getAdjustedMode (PropertyList),
1317
1370
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1318
1371
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1319
- GDBMethodsAnchor ();
1320
1372
preScreenAccessor (BufferRef.size (), PropertyList);
1321
1373
if (!IsPlaceH)
1322
1374
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
1375
+ initHostAcc ();
1323
1376
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1324
1377
detail::AccessorBaseHost::impl.get (),
1325
1378
AccessTarget, AccessMode, CodeLoc);
1379
+ GDBMethodsAnchor ();
1326
1380
}
1327
1381
#endif
1328
1382
@@ -1350,13 +1404,14 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1350
1404
getAdjustedMode (PropertyList),
1351
1405
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1352
1406
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1353
- GDBMethodsAnchor ();
1354
1407
preScreenAccessor (BufferRef.size (), PropertyList);
1355
1408
if (!IsPlaceH)
1356
1409
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
1410
+ initHostAcc ();
1357
1411
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1358
1412
detail::AccessorBaseHost::impl.get (),
1359
1413
AccessTarget, AccessMode, CodeLoc);
1414
+ GDBMethodsAnchor ();
1360
1415
}
1361
1416
#endif
1362
1417
@@ -1414,12 +1469,13 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1414
1469
getAdjustedMode (PropertyList),
1415
1470
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1416
1471
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1417
- GDBMethodsAnchor ();
1418
1472
preScreenAccessor (BufferRef.size (), PropertyList);
1419
1473
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1474
+ initHostAcc ();
1420
1475
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1421
1476
detail::AccessorBaseHost::impl.get (),
1422
1477
AccessTarget, AccessMode, CodeLoc);
1478
+ GDBMethodsAnchor ();
1423
1479
}
1424
1480
#endif
1425
1481
@@ -1447,12 +1503,13 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1447
1503
getAdjustedMode (PropertyList),
1448
1504
detail::getSyclObjImpl (BufferRef).get (), Dimensions, sizeof (DataT),
1449
1505
BufferRef.OffsetInBytes , BufferRef.IsSubBuffer , PropertyList) {
1450
- GDBMethodsAnchor ();
1451
1506
preScreenAccessor (BufferRef.size (), PropertyList);
1507
+ initHostAcc ();
1452
1508
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1453
1509
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1454
1510
detail::AccessorBaseHost::impl.get (),
1455
1511
AccessTarget, AccessMode, CodeLoc);
1512
+ GDBMethodsAnchor ();
1456
1513
}
1457
1514
#endif
1458
1515
@@ -1634,7 +1691,6 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1634
1691
detail::getSyclObjImpl (BufferRef).get (), Dimensions,
1635
1692
sizeof (DataT), BufferRef.OffsetInBytes ,
1636
1693
BufferRef.IsSubBuffer , PropertyList) {
1637
- GDBMethodsAnchor ();
1638
1694
preScreenAccessor (BufferRef.size (), PropertyList);
1639
1695
if (BufferRef.isOutOfBounds (AccessOffset, AccessRange,
1640
1696
BufferRef.get_range ()))
@@ -1645,9 +1701,11 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1645
1701
1646
1702
if (!IsPlaceH)
1647
1703
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
1704
+ initHostAcc ();
1648
1705
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1649
1706
detail::AccessorBaseHost::impl.get (),
1650
1707
AccessTarget, AccessMode, CodeLoc);
1708
+ GDBMethodsAnchor ();
1651
1709
}
1652
1710
#endif
1653
1711
@@ -1676,7 +1734,6 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1676
1734
detail::getSyclObjImpl (BufferRef).get (), Dimensions,
1677
1735
sizeof (DataT), BufferRef.OffsetInBytes ,
1678
1736
BufferRef.IsSubBuffer , PropertyList) {
1679
- GDBMethodsAnchor ();
1680
1737
preScreenAccessor (BufferRef.size (), PropertyList);
1681
1738
if (BufferRef.isOutOfBounds (AccessOffset, AccessRange,
1682
1739
BufferRef.get_range ()))
@@ -1687,9 +1744,11 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1687
1744
1688
1745
if (!IsPlaceH)
1689
1746
addHostAccessorAndWait (AccessorBaseHost::impl.get ());
1747
+ initHostAcc ();
1690
1748
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1691
1749
detail::AccessorBaseHost::impl.get (),
1692
1750
AccessTarget, AccessMode, CodeLoc);
1751
+ GDBMethodsAnchor ();
1693
1752
}
1694
1753
#endif
1695
1754
@@ -1749,7 +1808,6 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1749
1808
detail::getSyclObjImpl (BufferRef).get (), Dimensions,
1750
1809
sizeof (DataT), BufferRef.OffsetInBytes ,
1751
1810
BufferRef.IsSubBuffer , PropertyList) {
1752
- GDBMethodsAnchor ();
1753
1811
preScreenAccessor (BufferRef.size (), PropertyList);
1754
1812
if (BufferRef.isOutOfBounds (AccessOffset, AccessRange,
1755
1813
BufferRef.get_range ()))
@@ -1758,10 +1816,12 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1758
1816
" the buffer" ,
1759
1817
PI_ERROR_INVALID_VALUE);
1760
1818
1819
+ initHostAcc ();
1761
1820
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1762
1821
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1763
1822
detail::AccessorBaseHost::impl.get (),
1764
1823
AccessTarget, AccessMode, CodeLoc);
1824
+ GDBMethodsAnchor ();
1765
1825
}
1766
1826
#endif
1767
1827
@@ -1790,7 +1850,6 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1790
1850
detail::getSyclObjImpl (BufferRef).get (), Dimensions,
1791
1851
sizeof (DataT), BufferRef.OffsetInBytes ,
1792
1852
BufferRef.IsSubBuffer , PropertyList) {
1793
- GDBMethodsAnchor ();
1794
1853
preScreenAccessor (BufferRef.size (), PropertyList);
1795
1854
if (BufferRef.isOutOfBounds (AccessOffset, AccessRange,
1796
1855
BufferRef.get_range ()))
@@ -1799,10 +1858,12 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1799
1858
" the buffer" ,
1800
1859
PI_ERROR_INVALID_VALUE);
1801
1860
1861
+ initHostAcc ();
1802
1862
detail::associateWithHandler (CommandGroupHandler, this , AccessTarget);
1803
1863
detail::constructorNotification (detail::getSyclObjImpl (BufferRef).get (),
1804
1864
detail::AccessorBaseHost::impl.get (),
1805
1865
AccessTarget, AccessMode, CodeLoc);
1866
+ GDBMethodsAnchor ();
1806
1867
}
1807
1868
#endif
1808
1869
0 commit comments