Blame IlmImfTest/testDwaCompressorSimd.cpp

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (c) 2009-2014 DreamWorks Animation LLC. 
Packit Service 6754ca
//
Packit Service 6754ca
// All rights reserved.
Packit Service 6754ca
//
Packit Service 6754ca
// Redistribution and use in source and binary forms, with or without
Packit Service 6754ca
// modification, are permitted provided that the following conditions are
Packit Service 6754ca
// met:
Packit Service 6754ca
// *       Redistributions of source code must retain the above copyright
Packit Service 6754ca
// notice, this list of conditions and the following disclaimer.
Packit Service 6754ca
// *       Redistributions in binary form must reproduce the above
Packit Service 6754ca
// copyright notice, this list of conditions and the following disclaimer
Packit Service 6754ca
// in the documentation and/or other materials provided with the
Packit Service 6754ca
// distribution.
Packit Service 6754ca
// *       Neither the name of DreamWorks Animation nor the names of
Packit Service 6754ca
// its contributors may be used to endorse or promote products derived
Packit Service 6754ca
// from this software without specific prior written permission.
Packit Service 6754ca
//
Packit Service 6754ca
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 6754ca
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service 6754ca
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 6754ca
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 6754ca
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 6754ca
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 6754ca
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 6754ca
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service 6754ca
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 6754ca
//
Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
Packit Service 6754ca
#include <half.h>
Packit Service 6754ca
#include <math.h>
Packit Service 6754ca
#include <string.h>
Packit Service 6754ca
#include <ImfDwaCompressorSimd.h>
Packit Service 6754ca
#include <ImfSystemSpecific.h>
Packit Service 6754ca
#include <ImathRandom.h>
Packit Service 6754ca
#include <iostream>
Packit Service 6754ca
#include <assert.h>
Packit Service 6754ca
Packit Service 6754ca
using namespace OPENEXR_IMF_NAMESPACE;
Packit Service 6754ca
using namespace IMATH_NAMESPACE;
Packit Service 6754ca
using namespace std;
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
namespace
Packit Service 6754ca
{
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
dumpBuffer (const SimdAlignedBuffer64f &buffer)
Packit Service 6754ca
{
Packit Service 6754ca
    for (int i=0; i<8; ++i) 
Packit Service 6754ca
    {
Packit Service 6754ca
        for (int j=0; j<8; ++j) 
Packit Service 6754ca
        {
Packit Service 6754ca
            cout << buffer._buffer[i*8+j] << "  ";
Packit Service 6754ca
        }
Packit Service 6754ca
        cout << endl;
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
compareBuffer (const SimdAlignedBuffer64f &src,
Packit Service 6754ca
               const SimdAlignedBuffer64f &dst,
Packit Service 6754ca
               const float                 errThresh)
Packit Service 6754ca
{
Packit Service 6754ca
    for (int i=0; i<64; ++i) 
Packit Service 6754ca
    {
Packit Service 6754ca
        double diff   = fabs(src._buffer[i] - dst._buffer[i]);
Packit Service 6754ca
Packit Service 6754ca
        if (diff > errThresh) 
Packit Service 6754ca
        {
Packit Service 6754ca
            cout << scientific;
Packit Service 6754ca
            cout << "Error exceeded threshold on element "  << i << endl;
Packit Service 6754ca
            cout << " diff: " << diff << endl;
Packit Service 6754ca
            cout << "Goal (src): " << scientific << endl;
Packit Service 6754ca
            dumpBuffer(src);
Packit Service 6754ca
            cout << "Test (dst): " << endl;
Packit Service 6754ca
            dumpBuffer(dst);
Packit Service 6754ca
Packit Service 6754ca
            assert(false);
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
compareBufferRelative (const SimdAlignedBuffer64f &src,
Packit Service 6754ca
                       const SimdAlignedBuffer64f &dst,
Packit Service 6754ca
                       const float                 relErrThresh,
Packit Service 6754ca
                       const float                 absErrThresh)
Packit Service 6754ca
{
Packit Service 6754ca
    for (int i=0; i<64; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
        double diff    = fabs(src._buffer[i] - dst._buffer[i]);
Packit Service 6754ca
        double relDiff = diff / fabs(src._buffer[i]);
Packit Service 6754ca
Packit Service 6754ca
        if (relDiff > relErrThresh && diff > absErrThresh)
Packit Service 6754ca
        {
Packit Service 6754ca
            cout << scientific;
Packit Service 6754ca
            cout << "Error exceeded threshold on element "  << i << endl;
Packit Service 6754ca
            cout << " diff: " << diff << " relErr: " << fixed << 100.0*relDiff << " %" << endl;
Packit Service 6754ca
            cout << "Goal (src): " << scientific << endl;
Packit Service 6754ca
            dumpBuffer(src);
Packit Service 6754ca
            cout << "Test (dst): " << endl;
Packit Service 6754ca
            dumpBuffer(dst);
Packit Service 6754ca
Packit Service 6754ca
            assert(false);
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
// 
Packit Service 6754ca
// Test that we can round trip CSC data with reasonable precision
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
testCsc()
Packit Service 6754ca
{
Packit Service 6754ca
    const int            numIter = 1000000;
Packit Service 6754ca
    Rand48               rand48(0);
Packit Service 6754ca
    SimdAlignedBuffer64f orig[3];
Packit Service 6754ca
    SimdAlignedBuffer64f test[3];
Packit Service 6754ca
Packit Service 6754ca
    cout << "   Color Space Conversion Round Trip " << endl;
Packit Service 6754ca
    cout << "      csc709Forward64() - 64 x csc709Inverse()" << endl;
Packit Service 6754ca
    for (int iter=0; iter
Packit Service 6754ca
    {   
Packit Service 6754ca
        for (int i=0; i<64; ++i)
Packit Service 6754ca
        {
Packit Service 6754ca
            test[0]._buffer[i] = orig[0]._buffer[i] = rand48.nextf();
Packit Service 6754ca
            test[1]._buffer[i] = orig[1]._buffer[i] = rand48.nextf();
Packit Service 6754ca
            test[2]._buffer[i] = orig[2]._buffer[i] = rand48.nextf();
Packit Service 6754ca
        }
Packit Service 6754ca
        
Packit Service 6754ca
        csc709Forward64(test[0]._buffer, test[1]._buffer, test[2]._buffer);
Packit Service 6754ca
        for (int i=0; i<64; ++i)
Packit Service 6754ca
        {
Packit Service 6754ca
            csc709Inverse(test[0]._buffer[i], test[1]._buffer[i], test[2]._buffer[i]);
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        compareBuffer(orig[0], test[0], 1e-3);
Packit Service 6754ca
        compareBuffer(orig[1], test[1], 1e-3);
Packit Service 6754ca
        compareBuffer(orig[2], test[2], 1e-3);
Packit Service 6754ca
Packit Service 6754ca
    } // iter
Packit Service 6754ca
Packit Service 6754ca
    cout << "      csc709Forward64() - csc709Inverse64()" << endl;
Packit Service 6754ca
    for (int iter=0; iter
Packit Service 6754ca
    {    
Packit Service 6754ca
        for (int i=0; i<64; ++i)
Packit Service 6754ca
        {
Packit Service 6754ca
            test[0]._buffer[i] = orig[0]._buffer[i] = rand48.nextf();
Packit Service 6754ca
            test[1]._buffer[i] = orig[1]._buffer[i] = rand48.nextf();
Packit Service 6754ca
            test[2]._buffer[i] = orig[2]._buffer[i] = rand48.nextf();
Packit Service 6754ca
        }
Packit Service 6754ca
        
Packit Service 6754ca
        csc709Forward64(test[0]._buffer, test[1]._buffer, test[2]._buffer);
Packit Service 6754ca
        csc709Inverse64(test[0]._buffer, test[1]._buffer, test[2]._buffer);
Packit Service 6754ca
Packit Service 6754ca
        compareBuffer(orig[0], test[0], 1e-3);
Packit Service 6754ca
        compareBuffer(orig[1], test[1], 1e-3);
Packit Service 6754ca
        compareBuffer(orig[2], test[2], 1e-3);
Packit Service 6754ca
Packit Service 6754ca
    } // iter
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
// Test interleaving two byte arrays
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
testInterleave()
Packit Service 6754ca
{
Packit Service 6754ca
    const int bufferLen = 100000;
Packit Service 6754ca
    const int numIter   = 10000;
Packit Service 6754ca
    Rand48    rand48(0);
Packit Service 6754ca
    char     *srcA    = new char[bufferLen];
Packit Service 6754ca
    char     *srcB    = new char[bufferLen];
Packit Service 6754ca
    char     *dst     = new char[2*bufferLen];
Packit Service 6754ca
    char     *test    = new char[2*bufferLen];
Packit Service 6754ca
    
Packit Service 6754ca
    cout << "   Byte Interleaving " << endl;
Packit Service 6754ca
Packit Service 6754ca
    for (int i=0; i
Packit Service 6754ca
    {
Packit Service 6754ca
        srcA[i]    = (char)rand48.nextf(0.0, 255.0);
Packit Service 6754ca
        srcB[i]    = (char)rand48.nextf(0.0, 255.0);
Packit Service 6754ca
        dst[2*i]   = srcA[i];
Packit Service 6754ca
        dst[2*i+1] = srcB[i];
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    for (int iter=0; iter
Packit Service 6754ca
    {
Packit Service 6754ca
        memset(test, 0, 2*bufferLen);
Packit Service 6754ca
Packit Service 6754ca
        int offset = (int)rand48.nextf(0.0, bufferLen/2);
Packit Service 6754ca
        int len    = (int)rand48.nextf(1.0, bufferLen - 1 - offset);
Packit Service 6754ca
Packit Service 6754ca
        interleaveByte2( test+2*offset, srcA+offset, srcB+offset, len);
Packit Service 6754ca
        for (int i=0; i
Packit Service 6754ca
            assert( test[2*offset + 2*i]     == dst[2*offset + 2*i]);
Packit Service 6754ca
            assert( test[2*offset + 2*i + 1] == dst[2*offset + 2*i + 1]);
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    delete[] srcA;
Packit Service 6754ca
    delete[] srcB;
Packit Service 6754ca
    delete[] dst;
Packit Service 6754ca
    delete[] test;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
// Test that we can route trip DCT data with reasonable precision
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
testDct()
Packit Service 6754ca
{
Packit Service 6754ca
    const int            numIter = 1000000;
Packit Service 6754ca
    Rand48               rand48(0);
Packit Service 6754ca
    SimdAlignedBuffer64f orig;
Packit Service 6754ca
    SimdAlignedBuffer64f test;
Packit Service 6754ca
   
Packit Service 6754ca
    cout << "   DCT Round Trip " << endl;
Packit Service 6754ca
    for (int iter=0; iter
Packit Service 6754ca
    {
Packit Service 6754ca
        for (int i=0; i<64; ++i) 
Packit Service 6754ca
        {
Packit Service 6754ca
            orig._buffer[i] = test._buffer[i] = rand48.nextf();
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        dctForward8x8(test._buffer);
Packit Service 6754ca
        dctInverse8x8_scalar<0>(test._buffer);
Packit Service 6754ca
Packit Service 6754ca
        compareBufferRelative(orig, test, .02, 1e-3);
Packit Service 6754ca
    } 
Packit Service 6754ca
Packit Service 6754ca
    cout << "      Inverse, DC Only" << endl;
Packit Service 6754ca
    for (int iter=0; iter
Packit Service 6754ca
    {
Packit Service 6754ca
        orig._buffer[0] = test._buffer[0] = rand48.nextf();
Packit Service 6754ca
        for (int i=1; i<64; ++i) 
Packit Service 6754ca
        {
Packit Service 6754ca
            orig._buffer[i] = test._buffer[i] = 0;
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        dctInverse8x8_scalar<0>(orig._buffer);
Packit Service 6754ca
        dctInverse8x8DcOnly(test._buffer);
Packit Service 6754ca
Packit Service 6754ca
        compareBufferRelative(orig, test, .01, 1e-6);
Packit Service 6754ca
    } 
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
#define INVERSE_DCT_SCALAR_TEST_N(_func, _n, _desc)                \
Packit Service 6754ca
    cout << "         " << _desc << endl;                          \
Packit Service 6754ca
    for (int iter=0; iter
Packit Service 6754ca
    {                                                              \
Packit Service 6754ca
        for (int i=0; i<64; ++i)                                   \
Packit Service 6754ca
        {                                                          \
Packit Service 6754ca
            if (i < 8*(8-_n))                                      \
Packit Service 6754ca
            {                                                      \
Packit Service 6754ca
               orig._buffer[i] = test._buffer[i] = rand48.nextf(); \
Packit Service 6754ca
            } else {                                               \
Packit Service 6754ca
               orig._buffer[i] = test._buffer[i] = 0;              \
Packit Service 6754ca
            }                                                      \
Packit Service 6754ca
        }                                                          \
Packit Service 6754ca
        dctInverse8x8_scalar<0>(orig._buffer);                     \
Packit Service 6754ca
        _func<_n>(test._buffer);                                   \
Packit Service 6754ca
        compareBufferRelative(orig, test, .01, 1e-6);              \
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    cout << "      Inverse, Scalar: " << endl;
Packit Service 6754ca
    INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 0, "8x8")
Packit Service 6754ca
    INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 1, "7x8")
Packit Service 6754ca
    INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 2, "6x8")
Packit Service 6754ca
    INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 3, "5x8")
Packit Service 6754ca
    INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 4, "4x8")
Packit Service 6754ca
    INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 5, "3x8")
Packit Service 6754ca
    INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 6, "2x8")
Packit Service 6754ca
    INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_scalar, 7, "1x8")
Packit Service 6754ca
Packit Service 6754ca
    CpuId cpuid;
Packit Service 6754ca
    if (cpuid.sse2) 
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << "      Inverse, SSE2: " << endl;
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 0, "8x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 1, "7x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 2, "6x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 3, "5x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 4, "4x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 5, "3x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 6, "2x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_sse2, 7, "1x8")
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    if (cpuid.avx) 
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << "      Inverse, AVX: " << endl;
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 0, "8x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 1, "7x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 2, "6x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 3, "5x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 4, "4x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 5, "3x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 6, "2x8")
Packit Service 6754ca
        INVERSE_DCT_SCALAR_TEST_N(dctInverse8x8_avx, 7, "1x8")
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
// Test FLOAT -> HALF conversion, mostly for F16C enabled processors
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
testFloatToHalf()
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "   FLOAT -> HALF conversion" << endl;
Packit Service 6754ca
Packit Service 6754ca
    const int             numIter = 1000000;
Packit Service 6754ca
    Rand48                rand48(0);
Packit Service 6754ca
    SimdAlignedBuffer64f  src;
Packit Service 6754ca
    SimdAlignedBuffer64us dst;
Packit Service 6754ca
Packit Service 6754ca
    cout << "      convertFloatToHalf64_scalar()" << endl;
Packit Service 6754ca
    for (int iter=0; iter
Packit Service 6754ca
    {
Packit Service 6754ca
        for (int i=0; i<64; ++i)
Packit Service 6754ca
        {
Packit Service 6754ca
            if (i < 32)
Packit Service 6754ca
            {
Packit Service 6754ca
                src._buffer[i] = (float)140000*(rand48.nextf()-.5);
Packit Service 6754ca
            } else
Packit Service 6754ca
            {
Packit Service 6754ca
                src._buffer[i] = (float)(rand48.nextf()-.5);
Packit Service 6754ca
            }
Packit Service 6754ca
            dst._buffer[i] = 0;
Packit Service 6754ca
        }
Packit Service 6754ca
Packit Service 6754ca
        convertFloatToHalf64_scalar(dst._buffer, src._buffer);
Packit Service 6754ca
Packit Service 6754ca
        for (int i=0; i<64; ++i)
Packit Service 6754ca
        {
Packit Service 6754ca
            half value = (half)src._buffer[i];
Packit Service 6754ca
            if (value.bits() != dst._buffer[i])
Packit Service 6754ca
            {
Packit Service 6754ca
                cout << src._buffer[i] << " -> " << dst._buffer[i] 
Packit Service 6754ca
                                 << " expected " << value.bits() << endl;
Packit Service 6754ca
                assert(false);
Packit Service 6754ca
            }
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    CpuId cpuid;
Packit Service 6754ca
    if (cpuid.avx && cpuid.f16c)
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << "      convertFloatToHalf64_f16c()" << endl;
Packit Service 6754ca
        for (int iter=0; iter
Packit Service 6754ca
        {
Packit Service 6754ca
            for (int i=0; i<64; ++i)
Packit Service 6754ca
            {
Packit Service 6754ca
                if (i < 32)
Packit Service 6754ca
                {
Packit Service 6754ca
                    src._buffer[i] = (float)140000*(rand48.nextf()-.5);
Packit Service 6754ca
                } 
Packit Service 6754ca
                else
Packit Service 6754ca
                {
Packit Service 6754ca
                    src._buffer[i] = (float)(rand48.nextf()-.5);
Packit Service 6754ca
                }
Packit Service 6754ca
                dst._buffer[i] = 0;
Packit Service 6754ca
            }
Packit Service 6754ca
Packit Service 6754ca
            convertFloatToHalf64_f16c(dst._buffer, src._buffer);
Packit Service 6754ca
Packit Service 6754ca
            for (int i=0; i<64; ++i)
Packit Service 6754ca
            {
Packit Service 6754ca
                half value = (half)src._buffer[i];
Packit Service 6754ca
                if (value.bits() != dst._buffer[i])
Packit Service 6754ca
                {
Packit Service 6754ca
                    cout << src._buffer[i] << " -> " << dst._buffer[i] 
Packit Service 6754ca
                                     << " expected " << value.bits() << endl;
Packit Service 6754ca
                    assert(false);
Packit Service 6754ca
                }
Packit Service 6754ca
            }
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
//
Packit Service 6754ca
// Test ZigZag reordering + HALF -> FLOAT conversion
Packit Service 6754ca
//
Packit Service 6754ca
void
Packit Service 6754ca
testFromHalfZigZag()
Packit Service 6754ca
{
Packit Service 6754ca
    SimdAlignedBuffer64us src;
Packit Service 6754ca
    SimdAlignedBuffer64f  dst;
Packit Service 6754ca
Packit Service 6754ca
    cout << "   ZigZag re-ordering with HALF -> FLOAT conversion" << endl;
Packit Service 6754ca
Packit Service 6754ca
    // First off, simple check to see that the reordering is working
Packit Service 6754ca
    // This pattern, when converted, should give 0.0 - 63.0 as floats
Packit Service 6754ca
    // in order.
Packit Service 6754ca
    unsigned short pattern[] = {
Packit Service 6754ca
        0x0000, 0x3c00, 0x4800, 0x4c00, 0x4880, 0x4000, 0x4200, 0x4900,
Packit Service 6754ca
        0x4c40, 0x4e00, 0x5000, 0x4e40, 0x4c80, 0x4980, 0x4400, 0x4500,
Packit Service 6754ca
        0x4a00, 0x4cc0, 0x4e80, 0x5020, 0x5100, 0x5200, 0x5120, 0x5040,
Packit Service 6754ca
        0x4ec0, 0x4d00, 0x4a80, 0x4600, 0x4700, 0x4b00, 0x4d40, 0x4f00,
Packit Service 6754ca
        0x5060, 0x5140, 0x5220, 0x5300, 0x5320, 0x5240, 0x5160, 0x5080,
Packit Service 6754ca
        0x4f40, 0x4d80, 0x4b80, 0x4dc0, 0x4f80, 0x50a0, 0x5180, 0x5260,
Packit Service 6754ca
        0x5340, 0x5360, 0x5280, 0x51a0, 0x50c0, 0x4fc0, 0x50e0, 0x51c0,
Packit Service 6754ca
        0x52a0, 0x5380, 0x53a0, 0x52c0, 0x51e0, 0x52e0, 0x53c0, 0x53e0
Packit Service 6754ca
    };
Packit Service 6754ca
Packit Service 6754ca
    cout << "      fromHalfZigZag_scaler()" << endl;
Packit Service 6754ca
    for (int i=0; i<64; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
        src._buffer[i] = pattern[i];
Packit Service 6754ca
    }
Packit Service 6754ca
    fromHalfZigZag_scalar(src._buffer, dst._buffer);
Packit Service 6754ca
    for (int i=0; i<64; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
        if ( fabsf(dst._buffer[i] - (float)i) > 1e-5 )
Packit Service 6754ca
        {
Packit Service 6754ca
            cout << "At index " << i << ": ";
Packit Service 6754ca
            cout << "expecting " << (float)i << "; got " << dst._buffer[i] << endl;
Packit Service 6754ca
            assert(false);
Packit Service 6754ca
        }
Packit Service 6754ca
    }
Packit Service 6754ca
       
Packit Service 6754ca
    // Then compare the two implementations, if supported
Packit Service 6754ca
    CpuId cpuid;
Packit Service 6754ca
    if (cpuid.avx && cpuid.f16c)
Packit Service 6754ca
    {
Packit Service 6754ca
        const int             numIter = 1000000;
Packit Service 6754ca
        Rand48                rand48(0);
Packit Service 6754ca
        half                  h;
Packit Service 6754ca
        SimdAlignedBuffer64f  dstF16c;
Packit Service 6754ca
Packit Service 6754ca
        cout << "      fromHalfZigZag_f16c()" << endl;
Packit Service 6754ca
Packit Service 6754ca
        for (int iter=0; iter
Packit Service 6754ca
        {
Packit Service 6754ca
            for (int i=0; i<64; ++i)
Packit Service 6754ca
            {
Packit Service 6754ca
                if (i < 32)
Packit Service 6754ca
                {
Packit Service 6754ca
                    h = (half)(140000.*(rand48.nextf() - .5));
Packit Service 6754ca
                }
Packit Service 6754ca
                else 
Packit Service 6754ca
                {
Packit Service 6754ca
                    h = (half)(rand48.nextf() - .5);
Packit Service 6754ca
                }
Packit Service 6754ca
                src._buffer[i] = h.bits();
Packit Service 6754ca
            }
Packit Service 6754ca
Packit Service 6754ca
            fromHalfZigZag_scalar(src._buffer, dst._buffer);
Packit Service 6754ca
            fromHalfZigZag_f16c(src._buffer, dstF16c._buffer);
Packit Service 6754ca
Packit Service 6754ca
            for (int i=0; i<64; ++i)
Packit Service 6754ca
            {
Packit Service 6754ca
                if ( fabsf(dst._buffer[i] - dstF16c._buffer[i]) > 1e-5 )
Packit Service 6754ca
                {
Packit Service 6754ca
                    cout << "At index " << i << ": ";
Packit Service 6754ca
                    cout << "expecting " << dst._buffer[i] << "; got "
Packit Service 6754ca
                         << dstF16c._buffer[i] << endl;
Packit Service 6754ca
                    assert(false);
Packit Service 6754ca
                }
Packit Service 6754ca
            }
Packit Service 6754ca
        } // iter
Packit Service 6754ca
    } // f16c
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
} // namespace
Packit Service 6754ca
Packit Service 6754ca
void 
Packit Service 6754ca
testDwaCompressorSimd (const string&)
Packit Service 6754ca
{
Packit Service 6754ca
    cout << "SIMD helper functions for DwaCompressor:" << endl;
Packit Service 6754ca
Packit Service 6754ca
    try
Packit Service 6754ca
    {
Packit Service 6754ca
    
Packit Service 6754ca
        testCsc();
Packit Service 6754ca
        testInterleave();
Packit Service 6754ca
        testFloatToHalf();
Packit Service 6754ca
        testFromHalfZigZag();
Packit Service 6754ca
Packit Service 6754ca
        testDct();
Packit Service 6754ca
Packit Service 6754ca
    }
Packit Service 6754ca
    catch (const exception &e)
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << "unexpected exception: " << e.what() << endl;
Packit Service 6754ca
        assert (false);
Packit Service 6754ca
    }
Packit Service 6754ca
    catch (...)
Packit Service 6754ca
    {
Packit Service 6754ca
        cout << "unexpected exception" << endl;
Packit Service 6754ca
        assert (false);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    cout << "ok\n" << endl;
Packit Service 6754ca
}