Changes

Jump to: navigation, search

SIMD/Uses/Conversion

824 bytes added, 20:16, 12 April 2014
Code example
SIMD instruction sets like SSE2 have specialized data conversion operations -- including, e.g., conversion of floating point values to integer values with rounding. In the case of SSE2, both scalar and vector values can be converted (i.e., a single value at a time or a vector of values). In the latter case, the conversion does not only avoid costly branches and additional arithmetic operations, but also gives several converted values with a single operation.
 
== Example ==
 
From [https://github.com/maikmerten/mpeg/blob/master/transform.c a public domain MPEG encoder]:
 
 
for(sptr = sourcematrix,mptr=newmatrix;mptr<newmatrix+BLOCKSIZE;sptr++) {
#ifdef __SSE2__
*(mptr++) = _mm_cvtsi128_si32(_mm_cvtpd_epi32(_mm_load1_pd(sptr)));
#else
*(mptr++) = (int) (*sptr > 0 ? (*(sptr)+0.5):(*(sptr)-0.5));
#endif
}
 
(mptr is defined as int *mptr, sptr as double *sptr).
 
If the code is compiled with SSE2 optimization enabled, SSE2 intrinsics are used to load a double value into a SSE2 register, convert the register contents to 32-bit integers, and extract one 32-bit integer that subsequently is written to memory. Although this code only converts one value at a time, the speed increase compared to the traditional conversion approach turns out to be significant.
51
edits

Navigation menu