MCPcopy Create free account
hub / github.com/numpy/numpy / count_nonzero_u32

Function count_nonzero_u32

numpy/core/src/multiarray/item_selection.c:2524–2552  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2522}
2523
2524static inline NPY_GCC_OPT_3 npy_intp
2525count_nonzero_u32(const char *data, npy_intp bstride, npy_uintp len)
2526{
2527 npy_intp count = 0;
2528#if NPY_SIMD
2529 if (bstride == sizeof(npy_uint32)) {
2530 const npy_uintp max_iter = NPY_MAX_UINT32*npyv_nlanes_u32;
2531 const npy_uintp len_m = (len > max_iter ? max_iter : len) & -npyv_nlanes_u32;
2532 const npyv_u32 vone = npyv_setall_u32(1);
2533 const npyv_u32 vzero = npyv_zero_u32();
2534
2535 npyv_u32 vsum32 = npyv_zero_u32();
2536 for (const char *end = data + len_m*bstride; data < end; data += NPY_SIMD_WIDTH) {
2537 npyv_u32 mask = npyv_cvt_u32_b32(npyv_cmpeq_u32(npyv_load_u32((npy_uint32*)data), vzero));
2538 mask = npyv_and_u32(mask, vone);
2539 vsum32 = npyv_add_u32(vsum32, mask);
2540 }
2541 const npyv_u32 maskevn = npyv_reinterpret_u32_u64(npyv_setall_u64(0xffffffffULL));
2542 npyv_u64 odd = npyv_shri_u64(npyv_reinterpret_u64_u32(vsum32), 32);
2543 npyv_u64 even = npyv_reinterpret_u64_u32(npyv_and_u32(vsum32, maskevn));
2544 count = len_m - npyv_sum_u64(npyv_add_u64(odd, even));
2545 len -= len_m;
2546 }
2547#endif
2548 for (; len > 0; --len, data += bstride) {
2549 count += (*(npy_uint32*)data != 0);
2550 }
2551 return count;
2552}
2553
2554static inline NPY_GCC_OPT_3 npy_intp
2555count_nonzero_u64(const char *data, npy_intp bstride, npy_uintp len)

Callers

nothing calls this directly

Calls 1

npyv_setall_u64Function · 0.50

Tested by

no test coverage detected