m the same operation on multiple data points simultaneously, exploiting data parallel- ism rather than concurrency. SIMD is particularly useful in DSP algorithms and included in most modern CPU architectures including ARM Cortex A-series, Power Architecture, and x86. Operations in a SIMD pipeline are done on a fixed-length vector-typically 128, 256, or 512 bits wide, comprising of multiple data elements that are subject to the same operation. The element data types can vary but are typically 8-, 16- or 32-bit fixed point or 16- (half pre- cision) or 32-bit IEEE single-precision Floating Point. Most implementations keep a separate vector register file. Typical SIMD instruction sets are optimized for DSP with Intra and interelement arithme- tic instructions, Intra and interelement conditional instructions, and Permute, Shift and Rotate, Splat, Pack/Unpack, and Merge instructions. Given that performance is key, most instructions are fully pipelined to support a single-cycle throughput. Like for any other DSP, SIMD programming can become a specialized task. Support for SIMD can be achieved in multiple ways: Let Compiler do the job. Auto-vectorization is technically supported since many years. However, we will claim that there are no practical auto-vectorizers in existence that achieve the performance targets that are required. Even if auto-vectorization becomes a real thing, the software will still need to be written in a "compiler friendly way": they will still require certain expertise to work with. Using C intrinsics. There are standardized lists of intrinsics supported in all SIMD enabled compilers. Intrinsics can guarantee good level of control, up to the level of register assignment if need be, although generated code often only gets close to Assembly programming Using Assembly Language programming, which is the most effective, and the most laborious way. We can provide 100% performance extraction at the cost of software efforts. In practice, C intrinsics is often the "way to go," striking a balance between eff