carray 3.0.4 → 3.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +205 -0
- data/carray.gemspec +1 -1
- data/ext/ca_array_pool.c +25 -1
- data/ext/ca_axis_dispatch.c +13 -20
- data/ext/ca_categorical_iterator.c +27 -20
- data/ext/ca_compare.c +4 -4
- data/ext/ca_composite_dispatch.c +9 -9
- data/ext/ca_kernel_iterator.c +6 -6
- data/ext/ca_kernel_iterator.h +112 -83
- data/ext/ca_obj_array.c +69 -19
- data/ext/ca_obj_bincmp.c +1 -0
- data/ext/ca_obj_binop.c +1 -0
- data/ext/ca_obj_bitarray.c +5 -1
- data/ext/ca_obj_bitfield.c +58 -43
- data/ext/ca_obj_byte_swap.c +2 -1
- data/ext/ca_obj_const_string.c +15 -3
- data/ext/ca_obj_face.c +42 -1
- data/ext/ca_obj_field.c +13 -3
- data/ext/ca_obj_grid.c +52 -5
- data/ext/ca_obj_monop.c +46 -10
- data/ext/ca_obj_object.c +64 -12
- data/ext/ca_obj_record.c +3 -0
- data/ext/ca_obj_reduce.c +4 -0
- data/ext/ca_obj_refer.c +18 -9
- data/ext/ca_obj_roll.c +26 -6
- data/ext/ca_obj_select.c +34 -5
- data/ext/ca_obj_shift.c +31 -7
- data/ext/ca_obj_stack.c +1 -0
- data/ext/ca_obj_stride.c +28 -19
- data/ext/ca_obj_string.c +11 -2
- data/ext/ca_obj_tile.c +27 -7
- data/ext/ca_obj_transpose.c +8 -4
- data/ext/ca_obj_triop.c +3 -0
- data/ext/ca_obj_window.c +79 -50
- data/ext/ca_op_ipower.c +4 -4
- data/ext/ca_sort_kernels.h +6 -3
- data/ext/carray.h +33 -0
- data/ext/carray_access.c +16 -3
- data/ext/carray_attribute.c +24 -0
- data/ext/carray_cast.c +243 -82
- data/ext/carray_cast_func.rb +56 -26
- data/ext/carray_conversion.c +2 -2
- data/ext/carray_core.c +3 -0
- data/ext/carray_count.c +6 -0
- data/ext/carray_element.c +9 -4
- data/ext/carray_factorize.c +20 -20
- data/ext/carray_generate.c +8 -2
- data/ext/carray_histogram.c +1 -1
- data/ext/carray_index_classifier.c +4 -4
- data/ext/carray_internal.h +12 -0
- data/ext/carray_kernels_bincmp.c +168 -168
- data/ext/carray_kernels_binop.c +900 -900
- data/ext/carray_kernels_init.c +4 -4
- data/ext/carray_kernels_moncmp.c +96 -96
- data/ext/carray_kernels_monop.c +1984 -1984
- data/ext/carray_kernels_reduce_aggregate.c +1733 -1733
- data/ext/carray_kernels_reduce_cumulative.c +642 -642
- data/ext/carray_kernels_reduce_extreme.c +1150 -1150
- data/ext/carray_kernels_reduce_variance.c +258 -258
- data/ext/carray_kernels_scan.c +128 -128
- data/ext/carray_kernels_search.c +340 -340
- data/ext/carray_kernels_sort.c +295 -304
- data/ext/carray_kernels_triop.c +114 -114
- data/ext/carray_key_windows.c +4 -0
- data/ext/carray_mask.c +45 -22
- data/ext/carray_memory_view.c +2 -2
- data/ext/carray_operator.c +5 -5
- data/ext/carray_order.c +227 -8
- data/ext/carray_random.c +18 -18
- data/ext/carray_scatter.c +24 -7
- data/ext/carray_slab.c +32 -9
- data/ext/carray_sort.c +224 -16
- data/ext/carray_sort_kernel.c +5 -7
- data/ext/carray_struct.c +35 -43
- data/ext/carray_time_text.c +4 -2
- data/ext/carray_utils.c +63 -21
- data/ext/mkkernel.rb +210 -115
- data/ext/version.h +4 -4
- data/lib/carray/attribute.rb +17 -4
- data/lib/carray/basics.rb +27 -7
- data/lib/carray/categorical.rb +30 -16
- data/lib/carray/categorical_iterator.rb +6 -6
- data/lib/carray/const_string.rb +10 -0
- data/lib/carray/data_type_extension.rb +8 -1
- data/lib/carray/fixlen_string.rb +41 -2
- data/lib/carray/frame/column_verbs.rb +4 -3
- data/lib/carray/frame/concat.rb +17 -3
- data/lib/carray/frame/frame.rb +6 -7
- data/lib/carray/frame/group.rb +100 -13
- data/lib/carray/frame/io.rb +3 -1
- data/lib/carray/fuse_source.rb +31 -2
- data/lib/carray/lazy.rb +35 -0
- data/lib/carray/methods/is_in.rb +8 -1
- data/lib/carray/segment_iterator.rb +12 -8
- data/lib/carray/serialize.rb +19 -2
- data/lib/carray/stack.rb +15 -12
- data/lib/carray/string.rb +8 -0
- data/lib/carray/string_operation_extension.rb +13 -5
- data/lib/carray/struct_builder.rb +5 -3
- data/lib/carray/time.rb +107 -68
- data/yard-stubs/ca_obj_transpose.rb +5 -4
- data/yard-stubs/carray_attribute.rb +3 -1
- data/yard-stubs/carray_cast.rb +2 -0
- data/yard-stubs/carray_conversion.rb +5 -1
- data/yard-stubs/carray_element.rb +7 -6
- data/yard-stubs/carray_mask.rb +8 -3
- data/yard-stubs/carray_math.rb +14 -4
- data/yard-stubs/carray_order.rb +100 -4
- data/yard-stubs/carray_scatter.rb +7 -5
- metadata +1 -1
data/ext/ca_kernel_iterator.h
CHANGED
|
@@ -88,7 +88,14 @@ typedef enum {
|
|
|
88
88
|
|
|
89
89
|
/* ---- kernel flags ------------------------------------------------------ */
|
|
90
90
|
#define CA_KERNEL_READ 0x0
|
|
91
|
-
#define CA_KERNEL_WRITE 0x1 /* the kernel writes the slab back
|
|
91
|
+
#define CA_KERNEL_WRITE 0x1 /* the kernel writes the slab back.
|
|
92
|
+
The slab is read first (so a
|
|
93
|
+
kernel may change only some cells),
|
|
94
|
+
and a view that cannot be read --
|
|
95
|
+
CAFake of an object array whose
|
|
96
|
+
cells do not convert -- raises
|
|
97
|
+
there, even for a kernel that
|
|
98
|
+
writes every cell */
|
|
92
99
|
#define CA_KERNEL_NO_MASK 0x2 /* the kernel cannot take a mask:
|
|
93
100
|
a masked source is refused */
|
|
94
101
|
#define CA_KERNEL_CHUNK_HINT 0x4 /* reserved: init refuses it
|
|
@@ -803,18 +810,19 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
803
810
|
Plain C99 (a do/while block with for-loop declarations). */
|
|
804
811
|
|
|
805
812
|
#define CA_L2_FOR_EACH(T, ptr, n, stride, p, body) do { \
|
|
813
|
+
typedef T __ca_u_T CA_UNALIGNED; \
|
|
806
814
|
ca_size_t _l2_n = (n); \
|
|
807
815
|
ca_size_t _l2_s = (stride); \
|
|
808
816
|
char *_l2_b = (char *)(ptr); \
|
|
809
817
|
if (_l2_s == sizeof(T)) { \
|
|
810
|
-
|
|
818
|
+
__ca_u_T *p = (__ca_u_T *)_l2_b; \
|
|
811
819
|
for (ca_size_t _l2_i = 0; _l2_i < _l2_n; _l2_i++) { \
|
|
812
820
|
body \
|
|
813
821
|
p++; \
|
|
814
822
|
} \
|
|
815
823
|
} else { \
|
|
816
824
|
for (ca_size_t _l2_i = 0; _l2_i < _l2_n; _l2_i++) { \
|
|
817
|
-
|
|
825
|
+
__ca_u_T *p = (__ca_u_T *)(_l2_b + _l2_i * _l2_s); \
|
|
818
826
|
body \
|
|
819
827
|
} \
|
|
820
828
|
} \
|
|
@@ -1150,6 +1158,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1150
1158
|
it dead-code-eliminated; the trailing `(void) idx;` silences any
|
|
1151
1159
|
set-but-not-used warnings. */
|
|
1152
1160
|
#define CA_SLAB_REDUCE_T_EX(T, st, p, m, acc, INIT, REDUCE, masked_cnt) do { \
|
|
1161
|
+
typedef T __ca_u_T CA_UNALIGNED; \
|
|
1153
1162
|
(acc) = (INIT); \
|
|
1154
1163
|
int8_t __srK = (st).slab_ndim; \
|
|
1155
1164
|
int8_t __srOuterK = __srK - 1; \
|
|
@@ -1194,7 +1203,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1194
1203
|
const char *__srQ = (const char *)(p) + __srDoff; \
|
|
1195
1204
|
if ( (m) == NULL ) { \
|
|
1196
1205
|
if ( __srContig ) { \
|
|
1197
|
-
const
|
|
1206
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1198
1207
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1199
1208
|
T v = __srSrc[__sj]; \
|
|
1200
1209
|
REDUCE; \
|
|
@@ -1202,7 +1211,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1202
1211
|
} \
|
|
1203
1212
|
} else { \
|
|
1204
1213
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1205
|
-
T v = *(const
|
|
1214
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
1206
1215
|
REDUCE; \
|
|
1207
1216
|
idx++; \
|
|
1208
1217
|
} \
|
|
@@ -1210,7 +1219,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1210
1219
|
} else { \
|
|
1211
1220
|
const boolean8_t *__srMM = (const boolean8_t *)(m) + __srMoff; \
|
|
1212
1221
|
if ( __srContig && __srMaskU ) { \
|
|
1213
|
-
const
|
|
1222
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1214
1223
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1215
1224
|
if ( ! __srMM[__sj] ) { \
|
|
1216
1225
|
T v = __srSrc[__sj]; \
|
|
@@ -1223,7 +1232,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1223
1232
|
} else { \
|
|
1224
1233
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1225
1234
|
if ( ! __srMM[__sj * __srInnerMS] ) { \
|
|
1226
|
-
T v = *(const
|
|
1235
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
1227
1236
|
REDUCE; \
|
|
1228
1237
|
} else { \
|
|
1229
1238
|
(masked_cnt)++; \
|
|
@@ -1289,6 +1298,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1289
1298
|
* by the compiler when their update is a simple ++ pattern.
|
|
1290
1299
|
*/
|
|
1291
1300
|
#define CA_SLAB_REDUCE_T_PLUS_EX(T, st, p, m, acc, INIT, REDUCE, masked_cnt) do { \
|
|
1301
|
+
typedef T __ca_u_T CA_UNALIGNED; \
|
|
1292
1302
|
(acc) = (INIT); \
|
|
1293
1303
|
int8_t __srK = (st).slab_ndim; \
|
|
1294
1304
|
int8_t __srOuterK = __srK - 1; \
|
|
@@ -1333,7 +1343,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1333
1343
|
const char *__srQ = (const char *)(p) + __srDoff; \
|
|
1334
1344
|
if ( (m) == NULL ) { \
|
|
1335
1345
|
if ( __srContig ) { \
|
|
1336
|
-
const
|
|
1346
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1337
1347
|
_CA_SIMD_PLUS(acc) \
|
|
1338
1348
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1339
1349
|
T v = __srSrc[__sj]; \
|
|
@@ -1342,7 +1352,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1342
1352
|
} \
|
|
1343
1353
|
} else { \
|
|
1344
1354
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1345
|
-
T v = *(const
|
|
1355
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
1346
1356
|
REDUCE; \
|
|
1347
1357
|
idx++; \
|
|
1348
1358
|
} \
|
|
@@ -1350,7 +1360,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1350
1360
|
} else { \
|
|
1351
1361
|
const boolean8_t *__srMM = (const boolean8_t *)(m) + __srMoff; \
|
|
1352
1362
|
if ( __srContig && __srMaskU ) { \
|
|
1353
|
-
const
|
|
1363
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1354
1364
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1355
1365
|
if ( ! __srMM[__sj] ) { \
|
|
1356
1366
|
T v = __srSrc[__sj]; \
|
|
@@ -1363,7 +1373,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1363
1373
|
} else { \
|
|
1364
1374
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1365
1375
|
if ( ! __srMM[__sj * __srInnerMS] ) { \
|
|
1366
|
-
T v = *(const
|
|
1376
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
1367
1377
|
REDUCE; \
|
|
1368
1378
|
} else { \
|
|
1369
1379
|
(masked_cnt)++; \
|
|
@@ -1409,6 +1419,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1409
1419
|
* both passes of variance / stddev).
|
|
1410
1420
|
*/
|
|
1411
1421
|
#define CA_SLAB_REDUCE_SUM8_EX(T, ACC_T, st, p, m, acc, INIT, EXPR, masked_cnt) do { \
|
|
1422
|
+
typedef T __ca_u_T CA_UNALIGNED; \
|
|
1412
1423
|
(acc) = (INIT); \
|
|
1413
1424
|
int8_t __srK = (st).slab_ndim; \
|
|
1414
1425
|
int8_t __srOuterK = __srK - 1; \
|
|
@@ -1445,7 +1456,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1445
1456
|
const char *__srQ = (const char *)(p) + __srDoff; \
|
|
1446
1457
|
if ( (m) == NULL ) { \
|
|
1447
1458
|
if ( __srContig ) { \
|
|
1448
|
-
const
|
|
1459
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1449
1460
|
ACC_T __a0=(ACC_T)0,__a1=(ACC_T)0,__a2=(ACC_T)0,__a3=(ACC_T)0; \
|
|
1450
1461
|
ACC_T __a4=(ACC_T)0,__a5=(ACC_T)0,__a6=(ACC_T)0,__a7=(ACC_T)0; \
|
|
1451
1462
|
ca_size_t __sj = 0, __sN = __srInnerN; \
|
|
@@ -1464,14 +1475,14 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1464
1475
|
+ ((__a4 + __a5) + (__a6 + __a7)); \
|
|
1465
1476
|
} else { \
|
|
1466
1477
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1467
|
-
T v = *(const
|
|
1478
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
1468
1479
|
(acc) += EXPR(v); \
|
|
1469
1480
|
} \
|
|
1470
1481
|
} \
|
|
1471
1482
|
} else { \
|
|
1472
1483
|
const boolean8_t *__srMM = (const boolean8_t *)(m) + __srMoff; \
|
|
1473
1484
|
if ( __srContig && __srMaskU ) { \
|
|
1474
|
-
const
|
|
1485
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1475
1486
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1476
1487
|
if ( ! __srMM[__sj] ) { T v = __srSrc[__sj]; (acc) += EXPR(v); } \
|
|
1477
1488
|
else { (masked_cnt)++; } \
|
|
@@ -1479,7 +1490,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1479
1490
|
} else { \
|
|
1480
1491
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1481
1492
|
if ( ! __srMM[__sj * __srInnerMS] ) { \
|
|
1482
|
-
T v = *(const
|
|
1493
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
1483
1494
|
(acc) += EXPR(v); \
|
|
1484
1495
|
} else { (masked_cnt)++; } \
|
|
1485
1496
|
} \
|
|
@@ -1515,6 +1526,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1515
1526
|
* single-accumulator case).
|
|
1516
1527
|
*/
|
|
1517
1528
|
#define CA_SLAB_REDUCE_MIN8_EX(T, ACC_T, st, p, m, acc, INIT, EXPR, masked_cnt) do { \
|
|
1529
|
+
typedef T __ca_u_T CA_UNALIGNED; \
|
|
1518
1530
|
(acc) = (INIT); \
|
|
1519
1531
|
int8_t __srK = (st).slab_ndim; \
|
|
1520
1532
|
int8_t __srOuterK = __srK - 1; \
|
|
@@ -1551,7 +1563,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1551
1563
|
const char *__srQ = (const char *)(p) + __srDoff; \
|
|
1552
1564
|
if ( (m) == NULL ) { \
|
|
1553
1565
|
if ( __srContig ) { \
|
|
1554
|
-
const
|
|
1566
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1555
1567
|
ACC_T __a0=(acc),__a1=(acc),__a2=(acc),__a3=(acc); \
|
|
1556
1568
|
ACC_T __a4=(acc),__a5=(acc),__a6=(acc),__a7=(acc); \
|
|
1557
1569
|
ca_size_t __sj = 0, __sN = __srInnerN; \
|
|
@@ -1577,14 +1589,14 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1577
1589
|
(acc) = (__c0 < __c1) ? __c0 : __c1; \
|
|
1578
1590
|
} else { \
|
|
1579
1591
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1580
|
-
ACC_T __v = EXPR(*(const
|
|
1592
|
+
ACC_T __v = EXPR(*(const __ca_u_T *)(__srQ + __sj * __srInnerS)); \
|
|
1581
1593
|
if (__v < (acc)) (acc) = __v; \
|
|
1582
1594
|
} \
|
|
1583
1595
|
} \
|
|
1584
1596
|
} else { \
|
|
1585
1597
|
const boolean8_t *__srMM = (const boolean8_t *)(m) + __srMoff; \
|
|
1586
1598
|
if ( __srContig && __srMaskU ) { \
|
|
1587
|
-
const
|
|
1599
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1588
1600
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1589
1601
|
if ( ! __srMM[__sj] ) { \
|
|
1590
1602
|
ACC_T __v = EXPR(__srSrc[__sj]); \
|
|
@@ -1594,7 +1606,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1594
1606
|
} else { \
|
|
1595
1607
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1596
1608
|
if ( ! __srMM[__sj * __srInnerMS] ) { \
|
|
1597
|
-
ACC_T __v = EXPR(*(const
|
|
1609
|
+
ACC_T __v = EXPR(*(const __ca_u_T *)(__srQ + __sj * __srInnerS)); \
|
|
1598
1610
|
if (__v < (acc)) (acc) = __v; \
|
|
1599
1611
|
} else { (masked_cnt)++; } \
|
|
1600
1612
|
} \
|
|
@@ -1608,6 +1620,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1608
1620
|
} while (0)
|
|
1609
1621
|
|
|
1610
1622
|
#define CA_SLAB_REDUCE_MAX8_EX(T, ACC_T, st, p, m, acc, INIT, EXPR, masked_cnt) do { \
|
|
1623
|
+
typedef T __ca_u_T CA_UNALIGNED; \
|
|
1611
1624
|
(acc) = (INIT); \
|
|
1612
1625
|
int8_t __srK = (st).slab_ndim; \
|
|
1613
1626
|
int8_t __srOuterK = __srK - 1; \
|
|
@@ -1644,7 +1657,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1644
1657
|
const char *__srQ = (const char *)(p) + __srDoff; \
|
|
1645
1658
|
if ( (m) == NULL ) { \
|
|
1646
1659
|
if ( __srContig ) { \
|
|
1647
|
-
const
|
|
1660
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1648
1661
|
ACC_T __a0=(acc),__a1=(acc),__a2=(acc),__a3=(acc); \
|
|
1649
1662
|
ACC_T __a4=(acc),__a5=(acc),__a6=(acc),__a7=(acc); \
|
|
1650
1663
|
ca_size_t __sj = 0, __sN = __srInnerN; \
|
|
@@ -1670,14 +1683,14 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1670
1683
|
(acc) = (__c0 > __c1) ? __c0 : __c1; \
|
|
1671
1684
|
} else { \
|
|
1672
1685
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1673
|
-
ACC_T __v = EXPR(*(const
|
|
1686
|
+
ACC_T __v = EXPR(*(const __ca_u_T *)(__srQ + __sj * __srInnerS)); \
|
|
1674
1687
|
if (__v > (acc)) (acc) = __v; \
|
|
1675
1688
|
} \
|
|
1676
1689
|
} \
|
|
1677
1690
|
} else { \
|
|
1678
1691
|
const boolean8_t *__srMM = (const boolean8_t *)(m) + __srMoff; \
|
|
1679
1692
|
if ( __srContig && __srMaskU ) { \
|
|
1680
|
-
const
|
|
1693
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1681
1694
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1682
1695
|
if ( ! __srMM[__sj] ) { \
|
|
1683
1696
|
ACC_T __v = EXPR(__srSrc[__sj]); \
|
|
@@ -1687,7 +1700,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1687
1700
|
} else { \
|
|
1688
1701
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1689
1702
|
if ( ! __srMM[__sj * __srInnerMS] ) { \
|
|
1690
|
-
ACC_T __v = EXPR(*(const
|
|
1703
|
+
ACC_T __v = EXPR(*(const __ca_u_T *)(__srQ + __sj * __srInnerS)); \
|
|
1691
1704
|
if (__v > (acc)) (acc) = __v; \
|
|
1692
1705
|
} else { (masked_cnt)++; } \
|
|
1693
1706
|
} \
|
|
@@ -1701,6 +1714,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1701
1714
|
} while (0)
|
|
1702
1715
|
|
|
1703
1716
|
#define CA_SLAB_REDUCE_STAR8_EX(T, ACC_T, st, p, m, acc, INIT, EXPR, masked_cnt) do { \
|
|
1717
|
+
typedef T __ca_u_T CA_UNALIGNED; \
|
|
1704
1718
|
(acc) = (INIT); \
|
|
1705
1719
|
int8_t __srK = (st).slab_ndim; \
|
|
1706
1720
|
int8_t __srOuterK = __srK - 1; \
|
|
@@ -1737,7 +1751,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1737
1751
|
const char *__srQ = (const char *)(p) + __srDoff; \
|
|
1738
1752
|
if ( (m) == NULL ) { \
|
|
1739
1753
|
if ( __srContig ) { \
|
|
1740
|
-
const
|
|
1754
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1741
1755
|
ACC_T __a0=(ACC_T)1,__a1=(ACC_T)1,__a2=(ACC_T)1,__a3=(ACC_T)1; \
|
|
1742
1756
|
ACC_T __a4=(ACC_T)1,__a5=(ACC_T)1,__a6=(ACC_T)1,__a7=(ACC_T)1; \
|
|
1743
1757
|
ca_size_t __sj = 0, __sN = __srInnerN; \
|
|
@@ -1756,14 +1770,14 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1756
1770
|
* ((__a4 * __a5) * (__a6 * __a7)); \
|
|
1757
1771
|
} else { \
|
|
1758
1772
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1759
|
-
T v = *(const
|
|
1773
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
1760
1774
|
(acc) *= EXPR(v); \
|
|
1761
1775
|
} \
|
|
1762
1776
|
} \
|
|
1763
1777
|
} else { \
|
|
1764
1778
|
const boolean8_t *__srMM = (const boolean8_t *)(m) + __srMoff; \
|
|
1765
1779
|
if ( __srContig && __srMaskU ) { \
|
|
1766
|
-
const
|
|
1780
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1767
1781
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1768
1782
|
if ( ! __srMM[__sj] ) { T v = __srSrc[__sj]; (acc) *= EXPR(v); } \
|
|
1769
1783
|
else { (masked_cnt)++; } \
|
|
@@ -1771,7 +1785,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1771
1785
|
} else { \
|
|
1772
1786
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1773
1787
|
if ( ! __srMM[__sj * __srInnerMS] ) { \
|
|
1774
|
-
T v = *(const
|
|
1788
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
1775
1789
|
(acc) *= EXPR(v); \
|
|
1776
1790
|
} else { (masked_cnt)++; } \
|
|
1777
1791
|
} \
|
|
@@ -1797,6 +1811,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1797
1811
|
* (T_LIMIT_HI), matching the pre-SIMD path byte-identically.
|
|
1798
1812
|
*/
|
|
1799
1813
|
#define CA_SLAB_REDUCE_T_MIN_EX(T, st, p, m, acc, INIT, REDUCE, masked_cnt) do { \
|
|
1814
|
+
typedef T __ca_u_T CA_UNALIGNED; \
|
|
1800
1815
|
(acc) = (INIT); \
|
|
1801
1816
|
int8_t __srK = (st).slab_ndim; \
|
|
1802
1817
|
int8_t __srOuterK = __srK - 1; \
|
|
@@ -1841,7 +1856,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1841
1856
|
const char *__srQ = (const char *)(p) + __srDoff; \
|
|
1842
1857
|
if ( (m) == NULL ) { \
|
|
1843
1858
|
if ( __srContig ) { \
|
|
1844
|
-
const
|
|
1859
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1845
1860
|
_CA_SIMD_MIN(acc) \
|
|
1846
1861
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1847
1862
|
T v = __srSrc[__sj]; \
|
|
@@ -1850,7 +1865,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1850
1865
|
} \
|
|
1851
1866
|
} else { \
|
|
1852
1867
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1853
|
-
T v = *(const
|
|
1868
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
1854
1869
|
REDUCE; \
|
|
1855
1870
|
idx++; \
|
|
1856
1871
|
} \
|
|
@@ -1858,7 +1873,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1858
1873
|
} else { \
|
|
1859
1874
|
const boolean8_t *__srMM = (const boolean8_t *)(m) + __srMoff; \
|
|
1860
1875
|
if ( __srContig && __srMaskU ) { \
|
|
1861
|
-
const
|
|
1876
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1862
1877
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1863
1878
|
if ( ! __srMM[__sj] ) { \
|
|
1864
1879
|
T v = __srSrc[__sj]; \
|
|
@@ -1871,7 +1886,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1871
1886
|
} else { \
|
|
1872
1887
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1873
1888
|
if ( ! __srMM[__sj * __srInnerMS] ) { \
|
|
1874
|
-
T v = *(const
|
|
1889
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
1875
1890
|
REDUCE; \
|
|
1876
1891
|
} else { \
|
|
1877
1892
|
(masked_cnt)++; \
|
|
@@ -1890,6 +1905,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1890
1905
|
|
|
1891
1906
|
/* CA_SLAB_REDUCE_T_MAX_EX (generator-only): same as MIN_EX with `_CA_SIMD_MAX`. */
|
|
1892
1907
|
#define CA_SLAB_REDUCE_T_MAX_EX(T, st, p, m, acc, INIT, REDUCE, masked_cnt) do { \
|
|
1908
|
+
typedef T __ca_u_T CA_UNALIGNED; \
|
|
1893
1909
|
(acc) = (INIT); \
|
|
1894
1910
|
int8_t __srK = (st).slab_ndim; \
|
|
1895
1911
|
int8_t __srOuterK = __srK - 1; \
|
|
@@ -1934,7 +1950,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1934
1950
|
const char *__srQ = (const char *)(p) + __srDoff; \
|
|
1935
1951
|
if ( (m) == NULL ) { \
|
|
1936
1952
|
if ( __srContig ) { \
|
|
1937
|
-
const
|
|
1953
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1938
1954
|
_CA_SIMD_MAX(acc) \
|
|
1939
1955
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1940
1956
|
T v = __srSrc[__sj]; \
|
|
@@ -1943,7 +1959,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1943
1959
|
} \
|
|
1944
1960
|
} else { \
|
|
1945
1961
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1946
|
-
T v = *(const
|
|
1962
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
1947
1963
|
REDUCE; \
|
|
1948
1964
|
idx++; \
|
|
1949
1965
|
} \
|
|
@@ -1951,7 +1967,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1951
1967
|
} else { \
|
|
1952
1968
|
const boolean8_t *__srMM = (const boolean8_t *)(m) + __srMoff; \
|
|
1953
1969
|
if ( __srContig && __srMaskU ) { \
|
|
1954
|
-
const
|
|
1970
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
1955
1971
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1956
1972
|
if ( ! __srMM[__sj] ) { \
|
|
1957
1973
|
T v = __srSrc[__sj]; \
|
|
@@ -1964,7 +1980,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1964
1980
|
} else { \
|
|
1965
1981
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
1966
1982
|
if ( ! __srMM[__sj * __srInnerMS] ) { \
|
|
1967
|
-
T v = *(const
|
|
1983
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
1968
1984
|
REDUCE; \
|
|
1969
1985
|
} else { \
|
|
1970
1986
|
(masked_cnt)++; \
|
|
@@ -1990,6 +2006,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
1990
2006
|
* integers).
|
|
1991
2007
|
*/
|
|
1992
2008
|
#define CA_SLAB_REDUCE_T_STAR_EX(T, st, p, m, acc, INIT, REDUCE, masked_cnt) do { \
|
|
2009
|
+
typedef T __ca_u_T CA_UNALIGNED; \
|
|
1993
2010
|
(acc) = (INIT); \
|
|
1994
2011
|
int8_t __srK = (st).slab_ndim; \
|
|
1995
2012
|
int8_t __srOuterK = __srK - 1; \
|
|
@@ -2034,7 +2051,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2034
2051
|
const char *__srQ = (const char *)(p) + __srDoff; \
|
|
2035
2052
|
if ( (m) == NULL ) { \
|
|
2036
2053
|
if ( __srContig ) { \
|
|
2037
|
-
const
|
|
2054
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
2038
2055
|
_CA_SIMD_STAR(acc) \
|
|
2039
2056
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
2040
2057
|
T v = __srSrc[__sj]; \
|
|
@@ -2043,7 +2060,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2043
2060
|
} \
|
|
2044
2061
|
} else { \
|
|
2045
2062
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
2046
|
-
T v = *(const
|
|
2063
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
2047
2064
|
REDUCE; \
|
|
2048
2065
|
idx++; \
|
|
2049
2066
|
} \
|
|
@@ -2051,7 +2068,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2051
2068
|
} else { \
|
|
2052
2069
|
const boolean8_t *__srMM = (const boolean8_t *)(m) + __srMoff; \
|
|
2053
2070
|
if ( __srContig && __srMaskU ) { \
|
|
2054
|
-
const
|
|
2071
|
+
const __ca_u_T *__srSrc = (const __ca_u_T *) __srQ; \
|
|
2055
2072
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
2056
2073
|
if ( ! __srMM[__sj] ) { \
|
|
2057
2074
|
T v = __srSrc[__sj]; \
|
|
@@ -2064,7 +2081,7 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2064
2081
|
} else { \
|
|
2065
2082
|
for ( ca_size_t __sj = 0; __sj < __srInnerN; __sj++ ) { \
|
|
2066
2083
|
if ( ! __srMM[__sj * __srInnerMS] ) { \
|
|
2067
|
-
T v = *(const
|
|
2084
|
+
T v = *(const __ca_u_T *)(__srQ + __sj * __srInnerS); \
|
|
2068
2085
|
REDUCE; \
|
|
2069
2086
|
} else { \
|
|
2070
2087
|
(masked_cnt)++; \
|
|
@@ -2129,6 +2146,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2129
2146
|
The mask `m` applies to the SOURCE only (weights mask is overlaid onto
|
|
2130
2147
|
source mask by the dispatcher). */
|
|
2131
2148
|
#define CA_SLAB_REDUCE_ARRAY_T_EX(T, T_W, st, p, m, st_w, p_w, acc, INIT, REDUCE, masked_cnt) do { \
|
|
2149
|
+
typedef T_W __ca_u_T_W CA_UNALIGNED; \
|
|
2150
|
+
typedef T __ca_u_T CA_UNALIGNED; \
|
|
2132
2151
|
(acc) = (INIT); \
|
|
2133
2152
|
int8_t __sraK = (st).slab_ndim; \
|
|
2134
2153
|
int8_t __sraOuterK = __sraK - 1; \
|
|
@@ -2182,8 +2201,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2182
2201
|
const char *__sraWQ = (const char *)(p_w) + __sraWoff; \
|
|
2183
2202
|
if ( (m) == NULL ) { \
|
|
2184
2203
|
if ( __sraContig && __sraContigW ) { \
|
|
2185
|
-
const
|
|
2186
|
-
const
|
|
2204
|
+
const __ca_u_T *__sraSrc = (const __ca_u_T *) __sraQ; \
|
|
2205
|
+
const __ca_u_T_W *__sraWgt = (const __ca_u_T_W *) __sraWQ; \
|
|
2187
2206
|
for ( ca_size_t __saj = 0; __saj < __sraInnerN; __saj++ ) { \
|
|
2188
2207
|
T v = __sraSrc[__saj]; \
|
|
2189
2208
|
T_W w = __sraWgt[__saj]; \
|
|
@@ -2192,8 +2211,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2192
2211
|
} \
|
|
2193
2212
|
} else { \
|
|
2194
2213
|
for ( ca_size_t __saj = 0; __saj < __sraInnerN; __saj++ ) { \
|
|
2195
|
-
T v = *(const
|
|
2196
|
-
T_W w = *(const
|
|
2214
|
+
T v = *(const __ca_u_T *)(__sraQ + __saj * __sraInnerS); \
|
|
2215
|
+
T_W w = *(const __ca_u_T_W *)(__sraWQ + __saj * __sraInnerWS); \
|
|
2197
2216
|
REDUCE; \
|
|
2198
2217
|
idx++; \
|
|
2199
2218
|
} \
|
|
@@ -2201,8 +2220,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2201
2220
|
} else { \
|
|
2202
2221
|
const boolean8_t *__sraMM = (const boolean8_t *)(m) + __sraMoff; \
|
|
2203
2222
|
if ( __sraContig && __sraContigW && __sraMaskU ) { \
|
|
2204
|
-
const
|
|
2205
|
-
const
|
|
2223
|
+
const __ca_u_T *__sraSrc = (const __ca_u_T *) __sraQ; \
|
|
2224
|
+
const __ca_u_T_W *__sraWgt = (const __ca_u_T_W *) __sraWQ; \
|
|
2206
2225
|
for ( ca_size_t __saj = 0; __saj < __sraInnerN; __saj++ ) { \
|
|
2207
2226
|
if ( ! __sraMM[__saj] ) { \
|
|
2208
2227
|
T v = __sraSrc[__saj]; \
|
|
@@ -2216,8 +2235,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2216
2235
|
} else { \
|
|
2217
2236
|
for ( ca_size_t __saj = 0; __saj < __sraInnerN; __saj++ ) { \
|
|
2218
2237
|
if ( ! __sraMM[__saj * __sraInnerMS] ) { \
|
|
2219
|
-
T v = *(const
|
|
2220
|
-
T_W w = *(const
|
|
2238
|
+
T v = *(const __ca_u_T *)(__sraQ + __saj * __sraInnerS); \
|
|
2239
|
+
T_W w = *(const __ca_u_T_W *)(__sraWQ + __saj * __sraInnerWS); \
|
|
2221
2240
|
REDUCE; \
|
|
2222
2241
|
} else { \
|
|
2223
2242
|
(masked_cnt)++; \
|
|
@@ -2249,6 +2268,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2249
2268
|
*/
|
|
2250
2269
|
#define CA_SLAB_REDUCE_ARRAY_T_PLUS_EX(T, T_W, st, p, m, st_w, p_w, acc, \
|
|
2251
2270
|
INIT, REDUCE, masked_cnt) do { \
|
|
2271
|
+
typedef T_W __ca_u_T_W CA_UNALIGNED; \
|
|
2272
|
+
typedef T __ca_u_T CA_UNALIGNED; \
|
|
2252
2273
|
(acc) = (INIT); \
|
|
2253
2274
|
int8_t __sraK = (st).slab_ndim; \
|
|
2254
2275
|
int8_t __sraOuterK = __sraK - 1; \
|
|
@@ -2302,8 +2323,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2302
2323
|
const char *__sraWQ = (const char *)(p_w) + __sraWoff; \
|
|
2303
2324
|
if ( (m) == NULL ) { \
|
|
2304
2325
|
if ( __sraContig && __sraContigW ) { \
|
|
2305
|
-
const
|
|
2306
|
-
const
|
|
2326
|
+
const __ca_u_T *__sraSrc = (const __ca_u_T *) __sraQ; \
|
|
2327
|
+
const __ca_u_T_W *__sraWgt = (const __ca_u_T_W *) __sraWQ; \
|
|
2307
2328
|
_CA_SIMD_PLUS(acc) \
|
|
2308
2329
|
for ( ca_size_t __saj = 0; __saj < __sraInnerN; __saj++ ) { \
|
|
2309
2330
|
T v = __sraSrc[__saj]; \
|
|
@@ -2313,8 +2334,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2313
2334
|
} \
|
|
2314
2335
|
} else { \
|
|
2315
2336
|
for ( ca_size_t __saj = 0; __saj < __sraInnerN; __saj++ ) { \
|
|
2316
|
-
T v = *(const
|
|
2317
|
-
T_W w = *(const
|
|
2337
|
+
T v = *(const __ca_u_T *)(__sraQ + __saj * __sraInnerS); \
|
|
2338
|
+
T_W w = *(const __ca_u_T_W *)(__sraWQ + __saj * __sraInnerWS); \
|
|
2318
2339
|
REDUCE; \
|
|
2319
2340
|
idx++; \
|
|
2320
2341
|
} \
|
|
@@ -2322,8 +2343,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2322
2343
|
} else { \
|
|
2323
2344
|
const boolean8_t *__sraMM = (const boolean8_t *)(m) + __sraMoff; \
|
|
2324
2345
|
if ( __sraContig && __sraContigW && __sraMaskU ) { \
|
|
2325
|
-
const
|
|
2326
|
-
const
|
|
2346
|
+
const __ca_u_T *__sraSrc = (const __ca_u_T *) __sraQ; \
|
|
2347
|
+
const __ca_u_T_W *__sraWgt = (const __ca_u_T_W *) __sraWQ; \
|
|
2327
2348
|
for ( ca_size_t __saj = 0; __saj < __sraInnerN; __saj++ ) { \
|
|
2328
2349
|
if ( ! __sraMM[__saj] ) { \
|
|
2329
2350
|
T v = __sraSrc[__saj]; \
|
|
@@ -2337,8 +2358,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2337
2358
|
} else { \
|
|
2338
2359
|
for ( ca_size_t __saj = 0; __saj < __sraInnerN; __saj++ ) { \
|
|
2339
2360
|
if ( ! __sraMM[__saj * __sraInnerMS] ) { \
|
|
2340
|
-
T v = *(const
|
|
2341
|
-
T_W w = *(const
|
|
2361
|
+
T v = *(const __ca_u_T *)(__sraQ + __saj * __sraInnerS); \
|
|
2362
|
+
T_W w = *(const __ca_u_T_W *)(__sraWQ + __saj * __sraInnerWS); \
|
|
2342
2363
|
REDUCE; \
|
|
2343
2364
|
} else { \
|
|
2344
2365
|
(masked_cnt)++; \
|
|
@@ -2378,6 +2399,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2378
2399
|
docs/authoring/HOW_TO_WRITE_KERNEL.md. Caller is responsible for invoking
|
|
2379
2400
|
ca_iter_state_sync_slab on the output state after each slab. */
|
|
2380
2401
|
#define CA_SLAB_MAP_T(T_IN, T_OUT, st_in, p_in, st_out, p_out, MAP_EXPR) do { \
|
|
2402
|
+
typedef T_OUT __ca_u_T_OUT CA_UNALIGNED; \
|
|
2403
|
+
typedef T_IN __ca_u_T_IN CA_UNALIGNED; \
|
|
2381
2404
|
int8_t __mK = (st_in).slab_ndim; \
|
|
2382
2405
|
int8_t __mOuterK = __mK - 1; \
|
|
2383
2406
|
ca_size_t __mInN = (st_in).slab_dims[__mK - 1]; \
|
|
@@ -2398,8 +2421,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2398
2421
|
const char *__mQi = (const char *)(p_in) + __mIOff; \
|
|
2399
2422
|
char *__mQo = (char *) (p_out) + __mOOff; \
|
|
2400
2423
|
if ( __mIContig && __mOContig ) { \
|
|
2401
|
-
const
|
|
2402
|
-
|
|
2424
|
+
const __ca_u_T_IN *__mSi = (const __ca_u_T_IN *) __mQi; \
|
|
2425
|
+
__ca_u_T_OUT *__mSo = (__ca_u_T_OUT *) __mQo; \
|
|
2403
2426
|
for ( ca_size_t __mj = 0; __mj < __mInN; __mj++ ) { \
|
|
2404
2427
|
T_IN v = __mSi[__mj]; \
|
|
2405
2428
|
T_OUT r; \
|
|
@@ -2408,10 +2431,10 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2408
2431
|
} \
|
|
2409
2432
|
} else { \
|
|
2410
2433
|
for ( ca_size_t __mj = 0; __mj < __mInN; __mj++ ) { \
|
|
2411
|
-
T_IN v = *(const
|
|
2434
|
+
T_IN v = *(const __ca_u_T_IN *)(__mQi + __mj * __mInS); \
|
|
2412
2435
|
T_OUT r; \
|
|
2413
2436
|
MAP_EXPR; \
|
|
2414
|
-
*(
|
|
2437
|
+
*(__ca_u_T_OUT *)(__mQo + __mj * __mOutS) = r; \
|
|
2415
2438
|
} \
|
|
2416
2439
|
} \
|
|
2417
2440
|
for ( int8_t __mk = __mOuterK - 1; __mk >= 0; __mk-- ) { \
|
|
@@ -2460,6 +2483,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2460
2483
|
CA_SLAB_REDUCE_T / CA_SLAB_MAP_T. */
|
|
2461
2484
|
#define CA_SLAB_SCAN_T(T_LOAD, T_OUT, st_in, p_in, m_in, \
|
|
2462
2485
|
st_out, p_out, INIT, STEP) do { \
|
|
2486
|
+
typedef T_LOAD __ca_u_T_LOAD CA_UNALIGNED; \
|
|
2487
|
+
typedef T_OUT __ca_u_T_OUT CA_UNALIGNED; \
|
|
2463
2488
|
T_OUT acc = (INIT); \
|
|
2464
2489
|
int8_t __ssK = (st_in).slab_ndim; \
|
|
2465
2490
|
int8_t __ssOuterK = __ssK - 1; \
|
|
@@ -2485,8 +2510,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2485
2510
|
char *__ssQo = (char *) (p_out) + __ssOOff; \
|
|
2486
2511
|
if ( (m_in) == NULL ) { \
|
|
2487
2512
|
if ( __ssIContig && __ssOContig ) { \
|
|
2488
|
-
const
|
|
2489
|
-
|
|
2513
|
+
const __ca_u_T_LOAD *__ssSi = (const __ca_u_T_LOAD *) __ssQi; \
|
|
2514
|
+
__ca_u_T_OUT *__ssSo = (__ca_u_T_OUT *) __ssQo; \
|
|
2490
2515
|
for ( ca_size_t __sj = 0; __sj < __ssInnerN; __sj++ ) { \
|
|
2491
2516
|
T_LOAD v = __ssSi[__sj]; \
|
|
2492
2517
|
T_OUT r; \
|
|
@@ -2495,10 +2520,10 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2495
2520
|
} \
|
|
2496
2521
|
} else { \
|
|
2497
2522
|
for ( ca_size_t __sj = 0; __sj < __ssInnerN; __sj++ ) { \
|
|
2498
|
-
T_LOAD v = *(const
|
|
2523
|
+
T_LOAD v = *(const __ca_u_T_LOAD *)(__ssQi + __sj * __ssInS); \
|
|
2499
2524
|
T_OUT r; \
|
|
2500
2525
|
STEP; \
|
|
2501
|
-
*(
|
|
2526
|
+
*(__ca_u_T_OUT *)(__ssQo + __sj * __ssOutS) = r; \
|
|
2502
2527
|
} \
|
|
2503
2528
|
} \
|
|
2504
2529
|
} else { \
|
|
@@ -2507,16 +2532,16 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2507
2532
|
T_OUT r; \
|
|
2508
2533
|
if ( ! __ssMM[__ssMaskU ? __sj : __sj * __ssInMS] ) { \
|
|
2509
2534
|
T_LOAD v = __ssIContig \
|
|
2510
|
-
? ((const
|
|
2511
|
-
: *(const
|
|
2535
|
+
? ((const __ca_u_T_LOAD *) __ssQi)[__sj] \
|
|
2536
|
+
: *(const __ca_u_T_LOAD *)(__ssQi + __sj * __ssInS); \
|
|
2512
2537
|
STEP; \
|
|
2513
2538
|
} else { \
|
|
2514
2539
|
r = acc; /* masked: write current running aggregate (legacy parity) */ \
|
|
2515
2540
|
} \
|
|
2516
2541
|
if ( __ssOContig ) \
|
|
2517
|
-
((
|
|
2542
|
+
((__ca_u_T_OUT *) __ssQo)[__sj] = r; \
|
|
2518
2543
|
else \
|
|
2519
|
-
*(
|
|
2544
|
+
*(__ca_u_T_OUT *)(__ssQo + __sj * __ssOutS) = r; \
|
|
2520
2545
|
} \
|
|
2521
2546
|
} \
|
|
2522
2547
|
for ( int8_t __sk = __ssOuterK - 1; __sk >= 0; __sk-- ) { \
|
|
@@ -2553,6 +2578,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2553
2578
|
(defensive: falls back to holding the sentinel unmasked). */
|
|
2554
2579
|
#define CA_SLAB_SCAN_T_GATED(T_LOAD, T_OUT, st_in, p_in, m_in, \
|
|
2555
2580
|
st_out, p_out, m_out, INIT, STEP) do { \
|
|
2581
|
+
typedef T_LOAD __ca_u_T_LOAD CA_UNALIGNED; \
|
|
2582
|
+
typedef T_OUT __ca_u_T_OUT CA_UNALIGNED; \
|
|
2556
2583
|
T_OUT acc = (INIT); \
|
|
2557
2584
|
int8_t __ssK = (st_in).slab_ndim; \
|
|
2558
2585
|
int8_t __ssOuterK = __ssK - 1; \
|
|
@@ -2581,8 +2608,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2581
2608
|
int __ssSeen = 0; \
|
|
2582
2609
|
if ( (m_in) == NULL ) { \
|
|
2583
2610
|
if ( __ssIContig && __ssOContig ) { \
|
|
2584
|
-
const
|
|
2585
|
-
|
|
2611
|
+
const __ca_u_T_LOAD *__ssSi = (const __ca_u_T_LOAD *) __ssQi; \
|
|
2612
|
+
__ca_u_T_OUT *__ssSo = (__ca_u_T_OUT *) __ssQo; \
|
|
2586
2613
|
for ( ca_size_t __sj = 0; __sj < __ssInnerN; __sj++ ) { \
|
|
2587
2614
|
T_LOAD v = __ssSi[__sj]; \
|
|
2588
2615
|
T_OUT r; \
|
|
@@ -2591,10 +2618,10 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2591
2618
|
} \
|
|
2592
2619
|
} else { \
|
|
2593
2620
|
for ( ca_size_t __sj = 0; __sj < __ssInnerN; __sj++ ) { \
|
|
2594
|
-
T_LOAD v = *(const
|
|
2621
|
+
T_LOAD v = *(const __ca_u_T_LOAD *)(__ssQi + __sj * __ssInS); \
|
|
2595
2622
|
T_OUT r; \
|
|
2596
2623
|
STEP; \
|
|
2597
|
-
*(
|
|
2624
|
+
*(__ca_u_T_OUT *)(__ssQo + __sj * __ssOutS) = r; \
|
|
2598
2625
|
} \
|
|
2599
2626
|
} \
|
|
2600
2627
|
} else { \
|
|
@@ -2603,8 +2630,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2603
2630
|
T_OUT r; \
|
|
2604
2631
|
if ( ! __ssMM[__ssMaskU ? __sj : __sj * __ssInMS] ) { \
|
|
2605
2632
|
T_LOAD v = __ssIContig \
|
|
2606
|
-
? ((const
|
|
2607
|
-
: *(const
|
|
2633
|
+
? ((const __ca_u_T_LOAD *) __ssQi)[__sj] \
|
|
2634
|
+
: *(const __ca_u_T_LOAD *)(__ssQi + __sj * __ssInS); \
|
|
2608
2635
|
STEP; \
|
|
2609
2636
|
__ssSeen = 1; \
|
|
2610
2637
|
} else if ( ! __ssSeen && (m_out) != NULL ) { \
|
|
@@ -2614,9 +2641,9 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2614
2641
|
r = acc; /* masked after first present: hold running extremum */\
|
|
2615
2642
|
} \
|
|
2616
2643
|
if ( __ssOContig ) \
|
|
2617
|
-
((
|
|
2644
|
+
((__ca_u_T_OUT *) __ssQo)[__sj] = r; \
|
|
2618
2645
|
else \
|
|
2619
|
-
*(
|
|
2646
|
+
*(__ca_u_T_OUT *)(__ssQo + __sj * __ssOutS) = r; \
|
|
2620
2647
|
} \
|
|
2621
2648
|
} \
|
|
2622
2649
|
for ( int8_t __sk = __ssOuterK - 1; __sk >= 0; __sk-- ) { \
|
|
@@ -2646,6 +2673,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2646
2673
|
"last live value" trail. */
|
|
2647
2674
|
#define CA_SLAB_SCAN_TA(T_LOAD, T_OUT, T_ACC, st_in, p_in, m_in, \
|
|
2648
2675
|
st_out, p_out, INIT, STEP) do { \
|
|
2676
|
+
typedef T_LOAD __ca_u_T_LOAD CA_UNALIGNED; \
|
|
2677
|
+
typedef T_OUT __ca_u_T_OUT CA_UNALIGNED; \
|
|
2649
2678
|
T_ACC acc = (INIT); \
|
|
2650
2679
|
int8_t __ssK = (st_in).slab_ndim; \
|
|
2651
2680
|
int8_t __ssOuterK = __ssK - 1; \
|
|
@@ -2673,16 +2702,16 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2673
2702
|
if ( (m_in) == NULL ) { \
|
|
2674
2703
|
for ( ca_size_t __sj = 0; __sj < __ssInnerN; __sj++ ) { \
|
|
2675
2704
|
T_LOAD v = __ssIContig \
|
|
2676
|
-
? ((const
|
|
2677
|
-
: *(const
|
|
2705
|
+
? ((const __ca_u_T_LOAD *) __ssQi)[__sj] \
|
|
2706
|
+
: *(const __ca_u_T_LOAD *)(__ssQi + __sj * __ssInS); \
|
|
2678
2707
|
T_OUT r; \
|
|
2679
2708
|
int first = __ssFirst; \
|
|
2680
2709
|
STEP; \
|
|
2681
2710
|
__ssFirst = 0; \
|
|
2682
2711
|
if ( __ssOContig ) \
|
|
2683
|
-
((
|
|
2712
|
+
((__ca_u_T_OUT *) __ssQo)[__sj] = r; \
|
|
2684
2713
|
else \
|
|
2685
|
-
*(
|
|
2714
|
+
*(__ca_u_T_OUT *)(__ssQo + __sj * __ssOutS) = r; \
|
|
2686
2715
|
} \
|
|
2687
2716
|
} else { \
|
|
2688
2717
|
const boolean8_t *__ssMM = (const boolean8_t *)(m_in) + __ssMoff; \
|
|
@@ -2690,8 +2719,8 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2690
2719
|
T_OUT r; \
|
|
2691
2720
|
if ( ! __ssMM[__ssMaskU ? __sj : __sj * __ssInMS] ) { \
|
|
2692
2721
|
T_LOAD v = __ssIContig \
|
|
2693
|
-
? ((const
|
|
2694
|
-
: *(const
|
|
2722
|
+
? ((const __ca_u_T_LOAD *) __ssQi)[__sj] \
|
|
2723
|
+
: *(const __ca_u_T_LOAD *)(__ssQi + __sj * __ssInS); \
|
|
2695
2724
|
int first = __ssFirst; \
|
|
2696
2725
|
STEP; \
|
|
2697
2726
|
__ssFirst = 0; \
|
|
@@ -2699,9 +2728,9 @@ VALUE ca_iter_ensure (int32_t n, ca_iter_state *states,
|
|
|
2699
2728
|
r = (T_OUT) 0; /* masked: neutral output for downstream OR */ \
|
|
2700
2729
|
} \
|
|
2701
2730
|
if ( __ssOContig ) \
|
|
2702
|
-
((
|
|
2731
|
+
((__ca_u_T_OUT *) __ssQo)[__sj] = r; \
|
|
2703
2732
|
else \
|
|
2704
|
-
*(
|
|
2733
|
+
*(__ca_u_T_OUT *)(__ssQo + __sj * __ssOutS) = r; \
|
|
2705
2734
|
} \
|
|
2706
2735
|
} \
|
|
2707
2736
|
for ( int8_t __sk = __ssOuterK - 1; __sk >= 0; __sk-- ) { \
|