Re: [Openexr-devel] Vector-of-float to vector-of-half conversion?

2011-07-21 Thread Simon Eves
How about these...?

http://software.intel.com/sites/products/documentation/hpc/composerxe/en-us/cpp/mac/intref_cls/common/intref_bk_convertpost32_hf.htm

On Wed, Jul 20, 2011 at 4:59 PM, James Bowman jamesb-...@excamera.com wrote:
 Here's my conversion code.  It handles infinity, overflows and underflows.
  But it does not handle denormals or NaNs.  It also truncates the mantissa,
 instead of rounding it.  As I clock it, it's about 2X the speed of the
 conversion in Half.
 #include xmmintrin.h
 #define Ki(x) _mm_set_epi32((x),(x),(x),(x))
 // Convert n floats at src to half-floats at dst.  n is a multiple of 4
 static void qhalf(unsigned short *dst, const float *src, size_t n)
 {
   while (n) {
     __m128i full = _mm_loadu_si128((__m128i*)src);
     __m128i sign = full  Ki(1UL  31);                      // extract
 sign
     __m128i mantissa = full  Ki((1  23) - 1);              // extract
 mantissa
     __m128i exp8 = _mm_srli_epi32(full, 23)  Ki(0xff);       // extract
 exponent
     __m128i is_huge = _mm_cmpgt_epi32(exp8, Ki(0x8f));        // means flush
 to INF
     __m128i is_tiny = _mm_cmplt_epi32(exp8, Ki(0x70));        // means flush
 to zero
     __m128i exp5 = _mm_add_epi32(exp8, Ki(-0x7f + 0xf));      // rebias
 exponent
     // INF is represented by exponent=0x1f and mantissa=0
     exp5 = _mm_and_si128(_mm_or_si128(exp5, is_huge), Ki(0x1f));
     mantissa = _mm_andnot_si128(is_huge, mantissa);
     __m128i half = _mm_slli_epi32(exp5, 10) | _mm_srli_epi32(mantissa, 13);
     // Underflow: force to zero
     half = _mm_andnot_si128(is_tiny, half);
     // apply sign
     half = _mm_or_si128(half, _mm_srai_epi32(sign, 16));
     _mm_storel_pi((__m64*)dst, (__m128)_mm_packs_epi32((__m128i)half,
 (__m128i)half));
     dst += 4;
     src += 4;
     n -= 4;
   }
 }

 On Tue, Jul 19, 2011 at 11:19 AM, Florian Kainz ka...@ilm.com wrote:

 Have any of you tried to convert vectors of 32-bit floating-point
 numbers to vectors of 16-bit floating-point numbers in a way that
 is faster than calling OpenEXR's half-from-float constructor for
 each vector element?  Maybe using MMX, SSE or AVX instructions?

 ___
 Openexr-devel mailing list
 Openexr-devel@nongnu.org
 https://lists.nongnu.org/mailman/listinfo/openexr-devel



 --
 James Bowman
 http://www.excamera.com/sphinx/articles-openexr.html



 ___
 Openexr-devel mailing list
 Openexr-devel@nongnu.org
 https://lists.nongnu.org/mailman/listinfo/openexr-devel



___
Openexr-devel mailing list
Openexr-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/openexr-devel


[Openexr-devel] Vector-of-float to vector-of-half conversion?

2011-07-19 Thread Florian Kainz


Have any of you tried to convert vectors of 32-bit floating-point
numbers to vectors of 16-bit floating-point numbers in a way that
is faster than calling OpenEXR's half-from-float constructor for
each vector element?  Maybe using MMX, SSE or AVX instructions?

___
Openexr-devel mailing list
Openexr-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/openexr-devel


Re: [Openexr-devel] Vector-of-float to vector-of-half conversion?

2011-07-19 Thread James Bowman
Yes, I have some SSE code that converts four floats in parallel.
I can dig it out if anyone is interested...

J.

On Tue, Jul 19, 2011 at 11:19 AM, Florian Kainz ka...@ilm.com wrote:


 Have any of you tried to convert vectors of 32-bit floating-point
 numbers to vectors of 16-bit floating-point numbers in a way that
 is faster than calling OpenEXR's half-from-float constructor for
 each vector element?  Maybe using MMX, SSE or AVX instructions?

 __**_
 Openexr-devel mailing list
 Openexr-devel@nongnu.org
 https://lists.nongnu.org/**mailman/listinfo/openexr-develhttps://lists.nongnu.org/mailman/listinfo/openexr-devel




-- 
James Bowman
http://www.excamera.com/sphinx/articles-openexr.html
___
Openexr-devel mailing list
Openexr-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/openexr-devel