Como você verifica se um pedaço alinhado de 16 u32
é consecutivo (e crescente)?
Por exemplo: [100, 101, 102, ..., 115]
é. E [100, 99, 3 ...]
não é.
Estou no AVX512f. Isto é o que tenho até agora:
Algo A:
* predefine DECREASE_U32, a u32x16 of [15,14,13,...0]
* let a = input + DECREASE_32 // wrapping is OK
* compare a to u32x16::splat(first_item(a))
* Return whether all true
Alterativa (Algo B)
* let b = copy of A
* permute the elements of b by one position
* let b = a-b
* Is b all 1's (except for 1st position)
Estou fazendo isso em Rust com a packed_simd
caixa, mas qualquer linguagem/pseudocódigo está bem. (Gostaria que houvesse uma operação SIMD para subtrair itens adjacentes.)