mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-09 21:50:45 +01:00
re-work double precision promotion for summit
This commit is contained in:
parent
f1fe444d4f
commit
ddb192bac7
@ -234,7 +234,7 @@ innerProductNorm(ComplexD& ip, RealD &nrm, const Lattice<vobj> &left,const Latti
|
|||||||
accelerator_for( ss, sites, nsimd,{
|
accelerator_for( ss, sites, nsimd,{
|
||||||
auto left_tmp = left_v(ss);
|
auto left_tmp = left_v(ss);
|
||||||
coalescedWrite(inner_tmp_v[ss],innerProduct(left_tmp,right_v(ss)));
|
coalescedWrite(inner_tmp_v[ss],innerProduct(left_tmp,right_v(ss)));
|
||||||
coalescedWrite(norm_tmp_v[ss],innerProduct(left_tmp,left_tmp)));
|
coalescedWrite(norm_tmp_v[ss],innerProduct(left_tmp,left_tmp));
|
||||||
});
|
});
|
||||||
|
|
||||||
tmp[0] = TensorRemove(sumD_gpu(inner_tmp_v,sites));
|
tmp[0] = TensorRemove(sumD_gpu(inner_tmp_v,sites));
|
||||||
|
@ -146,7 +146,7 @@ public:
|
|||||||
int ieee32big = (format == std::string("IEEE32BIG"));
|
int ieee32big = (format == std::string("IEEE32BIG"));
|
||||||
int ieee32 = (format == std::string("IEEE32"));
|
int ieee32 = (format == std::string("IEEE32"));
|
||||||
int ieee64big = (format == std::string("IEEE64BIG"));
|
int ieee64big = (format == std::string("IEEE64BIG"));
|
||||||
int ieee64 = (format == std::string("IEEE64"));
|
int ieee64 = (format == std::string("IEEE64") || format == std::string("IEEE64LITTLE"));
|
||||||
|
|
||||||
uint32_t nersc_csum,scidac_csuma,scidac_csumb;
|
uint32_t nersc_csum,scidac_csuma,scidac_csumb;
|
||||||
// depending on datatype, set up munger;
|
// depending on datatype, set up munger;
|
||||||
|
@ -43,10 +43,38 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
template<class T> struct isGridScalar<iScalar<T>> : public std::true_type { static constexpr bool notvalue = false; };
|
template<class T> struct isGridScalar<iScalar<T>> : public std::true_type { static constexpr bool notvalue = false; };
|
||||||
|
|
||||||
// Store double-precision data in single-precision grids for precision promoted localInnerProductD
|
// Store double-precision data in single-precision grids for precision promoted localInnerProductD
|
||||||
typedef iVector<ComplexD,2> ComplexD2;
|
template<typename T>
|
||||||
typedef iVector<vComplexD,2> vComplexD2;
|
class TypePair {
|
||||||
typedef iVector<RealD,2> RealD2;
|
public:
|
||||||
typedef iVector<vRealD,2> vRealD2;
|
T _internal[2];
|
||||||
|
TypePair<T>& operator=(const Grid::Zero& o) {
|
||||||
|
_internal[0] = Zero();
|
||||||
|
_internal[1] = Zero();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
TypePair<T> operator+(const TypePair<T>& o) const {
|
||||||
|
TypePair<T> r;
|
||||||
|
r._internal[0] = _internal[0] + o._internal[0];
|
||||||
|
r._internal[1] = _internal[1] + o._internal[1];
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
TypePair<T>& operator+=(const TypePair<T>& o) {
|
||||||
|
_internal[0] += o._internal[0];
|
||||||
|
_internal[1] += o._internal[1];
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend accelerator_inline void add(TypePair<T>* ret, const TypePair<T>* a, const TypePair<T>* b) {
|
||||||
|
add(&ret->_internal[0],&a->_internal[0],&b->_internal[0]);
|
||||||
|
add(&ret->_internal[1],&a->_internal[1],&b->_internal[1]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
typedef TypePair<ComplexD> ComplexD2;
|
||||||
|
typedef TypePair<RealD> RealD2;
|
||||||
|
typedef TypePair<vComplexD> vComplexD2;
|
||||||
|
typedef TypePair<vRealD> vRealD2;
|
||||||
|
|
||||||
// Traits to identify fundamental data types
|
// Traits to identify fundamental data types
|
||||||
template<typename T> struct isGridFundamental : public std::false_type { static constexpr bool notvalue = true; };
|
template<typename T> struct isGridFundamental : public std::false_type { static constexpr bool notvalue = true; };
|
||||||
@ -58,6 +86,10 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
template<> struct isGridFundamental<ComplexD> : public std::true_type { static constexpr bool notvalue = false; };
|
template<> struct isGridFundamental<ComplexD> : public std::true_type { static constexpr bool notvalue = false; };
|
||||||
template<> struct isGridFundamental<RealF> : public std::true_type { static constexpr bool notvalue = false; };
|
template<> struct isGridFundamental<RealF> : public std::true_type { static constexpr bool notvalue = false; };
|
||||||
template<> struct isGridFundamental<RealD> : public std::true_type { static constexpr bool notvalue = false; };
|
template<> struct isGridFundamental<RealD> : public std::true_type { static constexpr bool notvalue = false; };
|
||||||
|
template<> struct isGridFundamental<vComplexD2> : public std::true_type { static constexpr bool notvalue = false; };
|
||||||
|
template<> struct isGridFundamental<vRealD2> : public std::true_type { static constexpr bool notvalue = false; };
|
||||||
|
template<> struct isGridFundamental<ComplexD2> : public std::true_type { static constexpr bool notvalue = false; };
|
||||||
|
template<> struct isGridFundamental<RealD2> : public std::true_type { static constexpr bool notvalue = false; };
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -119,6 +151,19 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
typedef RealD DoublePrecision;
|
typedef RealD DoublePrecision;
|
||||||
typedef RealD DoublePrecision2;
|
typedef RealD DoublePrecision2;
|
||||||
};
|
};
|
||||||
|
template<> struct GridTypeMapper<RealD2> : public GridTypeMapper_Base {
|
||||||
|
typedef RealD2 scalar_type;
|
||||||
|
typedef RealD2 scalar_typeD;
|
||||||
|
typedef RealD2 vector_type;
|
||||||
|
typedef RealD2 vector_typeD;
|
||||||
|
typedef RealD2 tensor_reduced;
|
||||||
|
typedef RealD2 scalar_object;
|
||||||
|
typedef RealD2 scalar_objectD;
|
||||||
|
typedef ComplexD2 Complexified;
|
||||||
|
typedef RealD2 Realified;
|
||||||
|
typedef RealD2 DoublePrecision;
|
||||||
|
typedef RealD2 DoublePrecision2;
|
||||||
|
};
|
||||||
template<> struct GridTypeMapper<ComplexF> : public GridTypeMapper_Base {
|
template<> struct GridTypeMapper<ComplexF> : public GridTypeMapper_Base {
|
||||||
typedef ComplexF scalar_type;
|
typedef ComplexF scalar_type;
|
||||||
typedef ComplexD scalar_typeD;
|
typedef ComplexD scalar_typeD;
|
||||||
@ -145,6 +190,19 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
typedef ComplexD DoublePrecision;
|
typedef ComplexD DoublePrecision;
|
||||||
typedef ComplexD DoublePrecision2;
|
typedef ComplexD DoublePrecision2;
|
||||||
};
|
};
|
||||||
|
template<> struct GridTypeMapper<ComplexD2> : public GridTypeMapper_Base {
|
||||||
|
typedef ComplexD2 scalar_type;
|
||||||
|
typedef ComplexD2 scalar_typeD;
|
||||||
|
typedef ComplexD2 vector_type;
|
||||||
|
typedef ComplexD2 vector_typeD;
|
||||||
|
typedef ComplexD2 tensor_reduced;
|
||||||
|
typedef ComplexD2 scalar_object;
|
||||||
|
typedef ComplexD2 scalar_objectD;
|
||||||
|
typedef ComplexD2 Complexified;
|
||||||
|
typedef RealD2 Realified;
|
||||||
|
typedef ComplexD2 DoublePrecision;
|
||||||
|
typedef ComplexD2 DoublePrecision2;
|
||||||
|
};
|
||||||
template<> struct GridTypeMapper<Integer> : public GridTypeMapper_Base {
|
template<> struct GridTypeMapper<Integer> : public GridTypeMapper_Base {
|
||||||
typedef Integer scalar_type;
|
typedef Integer scalar_type;
|
||||||
typedef Integer scalar_typeD;
|
typedef Integer scalar_typeD;
|
||||||
@ -185,6 +243,19 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
typedef vRealD DoublePrecision;
|
typedef vRealD DoublePrecision;
|
||||||
typedef vRealD DoublePrecision2;
|
typedef vRealD DoublePrecision2;
|
||||||
};
|
};
|
||||||
|
template<> struct GridTypeMapper<vRealD2> : public GridTypeMapper_Base {
|
||||||
|
typedef RealD2 scalar_type;
|
||||||
|
typedef RealD2 scalar_typeD;
|
||||||
|
typedef vRealD2 vector_type;
|
||||||
|
typedef vRealD2 vector_typeD;
|
||||||
|
typedef vRealD2 tensor_reduced;
|
||||||
|
typedef RealD2 scalar_object;
|
||||||
|
typedef RealD2 scalar_objectD;
|
||||||
|
typedef vComplexD2 Complexified;
|
||||||
|
typedef vRealD2 Realified;
|
||||||
|
typedef vRealD2 DoublePrecision;
|
||||||
|
typedef vRealD2 DoublePrecision2;
|
||||||
|
};
|
||||||
template<> struct GridTypeMapper<vRealH> : public GridTypeMapper_Base {
|
template<> struct GridTypeMapper<vRealH> : public GridTypeMapper_Base {
|
||||||
// Fixme this is incomplete until Grid supports fp16 or bfp16 arithmetic types
|
// Fixme this is incomplete until Grid supports fp16 or bfp16 arithmetic types
|
||||||
typedef RealF scalar_type;
|
typedef RealF scalar_type;
|
||||||
@ -239,6 +310,19 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
typedef vComplexD DoublePrecision;
|
typedef vComplexD DoublePrecision;
|
||||||
typedef vComplexD DoublePrecision2;
|
typedef vComplexD DoublePrecision2;
|
||||||
};
|
};
|
||||||
|
template<> struct GridTypeMapper<vComplexD2> : public GridTypeMapper_Base {
|
||||||
|
typedef ComplexD2 scalar_type;
|
||||||
|
typedef ComplexD2 scalar_typeD;
|
||||||
|
typedef vComplexD2 vector_type;
|
||||||
|
typedef vComplexD2 vector_typeD;
|
||||||
|
typedef vComplexD2 tensor_reduced;
|
||||||
|
typedef ComplexD2 scalar_object;
|
||||||
|
typedef ComplexD2 scalar_objectD;
|
||||||
|
typedef vComplexD2 Complexified;
|
||||||
|
typedef vRealD2 Realified;
|
||||||
|
typedef vComplexD2 DoublePrecision;
|
||||||
|
typedef vComplexD2 DoublePrecision2;
|
||||||
|
};
|
||||||
template<> struct GridTypeMapper<vInteger> : public GridTypeMapper_Base {
|
template<> struct GridTypeMapper<vInteger> : public GridTypeMapper_Base {
|
||||||
typedef Integer scalar_type;
|
typedef Integer scalar_type;
|
||||||
typedef Integer scalar_typeD;
|
typedef Integer scalar_typeD;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user