improve packetmath unit test

This commit is contained in:
Gael Guennebaud 2011-02-23 21:24:26 +03:00
parent c121e6f390
commit 0dfea7fce4

View File

@ -173,10 +173,13 @@ template<typename Scalar> void packetmath()
CHECK_CWISE1(internal::negate, internal::pnegate); CHECK_CWISE1(internal::negate, internal::pnegate);
CHECK_CWISE1(internal::conj, internal::pconj); CHECK_CWISE1(internal::conj, internal::pconj);
for(int offset=0;offset<3)
{
for (int i=0; i<PacketSize; ++i) for (int i=0; i<PacketSize; ++i)
ref[i] = data1[0]; ref[i] = data1[offset];
internal::pstore(data2, internal::pset1<Packet>(data1[0])); internal::pstore(data2, internal::pset1<Packet>(data1[offset]));
VERIFY(areApprox(ref, data2, PacketSize) && "internal::pset1"); VERIFY(areApprox(ref, data2, PacketSize) && "internal::pset1");
}
VERIFY(internal::isApprox(data1[0], internal::pfirst(internal::pload<Packet>(data1))) && "internal::pfirst"); VERIFY(internal::isApprox(data1[0], internal::pfirst(internal::pload<Packet>(data1))) && "internal::pfirst");
@ -271,6 +274,34 @@ template<typename Scalar> void packetmath_real()
VERIFY(internal::isApprox(ref[0], internal::predux_max(internal::pload<Packet>(data1))) && "internal::predux_max"); VERIFY(internal::isApprox(ref[0], internal::predux_max(internal::pload<Packet>(data1))) && "internal::predux_max");
} }
template<typename Scalar,bool ConjLhs,bool ConjRhs> void test_conj_helper(Scalar* data1, Scalar* data2, Scalar* ref, Scalar* pval)
{
typedef typename internal::packet_traits<Scalar>::type Packet;
const int PacketSize = internal::packet_traits<Scalar>::size;
internal::conj_if<ConjLhs> cj0;
internal::conj_if<ConjRhs> cj1;
internal::conj_helper<Scalar,Scalar,ConjLhs,ConjRhs> cj;
internal::conj_helper<Packet,Packet,ConjLhs,ConjRhs> pcj;
for(int i=0;i<PacketSize;++i)
{
ref[i] = cj0(data1[i]) * cj1(data2[i]);
VERIFY(internal::isApprox(ref[i], cj.pmul(data1[i],data2[i])) && "conj_helper pmul");
}
internal::pstore(pval,pcj.pmul(internal::pload<Packet>(data1),internal::pload<Packet>(data2)));
VERIFY(areApprox(ref, pval, PacketSize) && "conj_helper pmul");
for(int i=0;i<PacketSize;++i)
{
Scalar tmp = ref[i];
ref[i] += cj0(data1[i]) * cj1(data2[i]);
VERIFY(internal::isApprox(ref[i], cj.pmadd(data1[i],data2[i],tmp)) && "conj_helper pmadd");
}
internal::pstore(pval,pcj.pmadd(internal::pload<Packet>(data1),internal::pload<Packet>(data2),internal::pload<Packet>(pval)));
VERIFY(areApprox(ref, pval, PacketSize) && "conj_helper pmadd");
}
template<typename Scalar> void packetmath_complex() template<typename Scalar> void packetmath_complex()
{ {
typedef typename internal::packet_traits<Scalar>::type Packet; typedef typename internal::packet_traits<Scalar>::type Packet;
@ -288,50 +319,10 @@ template<typename Scalar> void packetmath_complex()
data2[i] = internal::random<Scalar>() * Scalar(1e2); data2[i] = internal::random<Scalar>() * Scalar(1e2);
} }
{ test_conj_helper<Scalar,false,false> (data1,data2,ref,pval);
internal::conj_helper<Scalar,Scalar,false,false> cj; test_conj_helper<Scalar,false,true> (data1,data2,ref,pval);
internal::conj_helper<Packet,Packet,false,false> pcj; test_conj_helper<Scalar,true,false> (data1,data2,ref,pval);
for(int i=0;i<PacketSize;++i) test_conj_helper<Scalar,true,true> (data1,data2,ref,pval);
{
ref[i] = data1[i] * data2[i];
VERIFY(internal::isApprox(ref[i], cj.pmul(data1[i],data2[i])) && "conj_helper");
}
internal::pstore(pval,pcj.pmul(internal::pload<Packet>(data1),internal::pload<Packet>(data2)));
VERIFY(areApprox(ref, pval, PacketSize) && "conj_helper");
}
{
internal::conj_helper<Scalar,Scalar,true,false> cj;
internal::conj_helper<Packet,Packet,true,false> pcj;
for(int i=0;i<PacketSize;++i)
{
ref[i] = internal::conj(data1[i]) * data2[i];
VERIFY(internal::isApprox(ref[i], cj.pmul(data1[i],data2[i])) && "conj_helper");
}
internal::pstore(pval,pcj.pmul(internal::pload<Packet>(data1),internal::pload<Packet>(data2)));
VERIFY(areApprox(ref, pval, PacketSize) && "conj_helper");
}
{
internal::conj_helper<Scalar,Scalar,false,true> cj;
internal::conj_helper<Packet,Packet,false,true> pcj;
for(int i=0;i<PacketSize;++i)
{
ref[i] = data1[i] * internal::conj(data2[i]);
VERIFY(internal::isApprox(ref[i], cj.pmul(data1[i],data2[i])) && "conj_helper");
}
internal::pstore(pval,pcj.pmul(internal::pload<Packet>(data1),internal::pload<Packet>(data2)));
VERIFY(areApprox(ref, pval, PacketSize) && "conj_helper");
}
{
internal::conj_helper<Scalar,Scalar,true,true> cj;
internal::conj_helper<Packet,Packet,true,true> pcj;
for(int i=0;i<PacketSize;++i)
{
ref[i] = internal::conj(data1[i]) * internal::conj(data2[i]);
VERIFY(internal::isApprox(ref[i], cj.pmul(data1[i],data2[i])) && "conj_helper");
}
internal::pstore(pval,pcj.pmul(internal::pload<Packet>(data1),internal::pload<Packet>(data2)));
VERIFY(areApprox(ref, pval, PacketSize) && "conj_helper");
}
{ {
for(int i=0;i<PacketSize;++i) for(int i=0;i<PacketSize;++i)