Byte-Oriented SpreadByMask and FilterByMask
FilterByMask, SpreadByMask and MergeByMask are core facilities for compressing and or expanding set of bit streams in the Parabix framework.
For example, given a mask stream M
and a set of bit streams S
,
S1 = FilterByMask(M, S)
will return a shortened set of bit streams S1
such that each stream in S1
consists of the elements of S
for which the corresponding mask bits of M
are 1.
Sometimes it is desirable to directly filter byte streams rather than bit streams. This can be achieved by transposing the byte streams to parallel bit stream form, applying the FilterByMask, SpreadByMask or MergeByMask operation and then inverting the transposition.
However, there exist AVX-512 instructions for directly filtering or spreading byte streams based on bit-based masks. Therefore, it should be possible to implement more efficient byte-oriented FilterByMask, SpreadByMask or MergeByMask operations using these instructions.
The project is to use implement these more efficient byte-oriented operations using the byte-oriented AVX-512 filtering and spreading instructions.
This project involves writing LLVM code to implement the byte-oriented FilterByMask, SpreadByMask and/or MergeByMask operations, as well as creating abstractions in the IDISA builders to map byte-oriented extract and deposit operations in terms of specific SIMD instructions for AVX-512 and other architectures.