From c802a03e07b63793c67f629556675bb8298b3d43 Mon Sep 17 00:00:00 2001 From: paboyle Date: Wed, 4 Mar 2015 04:54:50 +0000 Subject: [PATCH 001/429] Delete INSTALL --- INSTALL | 1 - 1 file changed, 1 deletion(-) delete mode 120000 INSTALL diff --git a/INSTALL b/INSTALL deleted file mode 120000 index 80a61507..00000000 --- a/INSTALL +++ /dev/null @@ -1 +0,0 @@ -/opt/local/share/automake-1.15/INSTALL \ No newline at end of file From b0c9282fe9d066a319c2d9771a60751d7453d379 Mon Sep 17 00:00:00 2001 From: paboyle Date: Wed, 4 Mar 2015 04:55:04 +0000 Subject: [PATCH 002/429] Delete COPYING --- COPYING | 1 - 1 file changed, 1 deletion(-) delete mode 120000 COPYING diff --git a/COPYING b/COPYING deleted file mode 120000 index af6f8816..00000000 --- a/COPYING +++ /dev/null @@ -1 +0,0 @@ -/opt/local/share/automake-1.15/COPYING \ No newline at end of file From 1a1474b32339d9873fb46772032256ffe3330b72 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 4 Mar 2015 05:31:44 +0000 Subject: [PATCH 003/429] Better organisation --- Grid.h | 1122 +------------------------------------- Grid_Lattice.h | 98 +--- Grid_QCD.h | 94 ++++ Grid_aligned_allocator.h | 56 ++ Grid_config.h | 101 ++++ Grid_math_types.h | 819 ++++++++++++++++++++++++++++ Grid_signal.cc | 16 +- Grid_simd.h | 68 ++- 8 files changed, 1161 insertions(+), 1213 deletions(-) create mode 100644 Grid_QCD.h create mode 100644 Grid_aligned_allocator.h create mode 100644 Grid_config.h create mode 100644 Grid_math_types.h diff --git a/Grid.h b/Grid.h index b3669ace..042835ca 100644 --- a/Grid.h +++ b/Grid.h @@ -40,1123 +40,21 @@ #endif -//////////////////////////////////////////////////////////// -// SIMD Alignment controls -//////////////////////////////////////////////////////////// -#ifdef HAVE_VAR_ATTRIBUTE_ALIGNED -#define ALIGN_DIRECTIVE(A) __attribute__ ((aligned(A))) -#else -#define ALIGN_DIRECTIVE(A) __declspec(align(A)) -#endif - -#ifdef SSE2 -#include -#define SIMDalign ALIGN_DIRECTIVE(16) -#endif - -#if defined(AVX1) || defined (AVX2) -#include -#define SIMDalign ALIGN_DIRECTIVE(32) -#endif - -#ifdef AVX512 -#include -#define SIMDalign ALIGN_DIRECTIVE(64) -#endif - +#include +#include +#include +#include +#include +#include +#include namespace dpo { void Grid_init(void); - -inline double usecond(void) -{ - struct timeval tv; - gettimeofday(&tv,NULL); - return 1.0*tv.tv_usec + 1.0e6*tv.tv_sec; -} - - typedef float RealF; - typedef double RealD; - typedef RealF Real; - - typedef std::complex ComplexF; - typedef std::complex ComplexD; - typedef std::complex Complex; - - - class Zero{}; - static Zero zero; - template inline void ZeroIt(itype &arg){ arg=zero;}; - template<> inline void ZeroIt(ComplexF &arg){ arg=0; }; - template<> inline void ZeroIt(ComplexD &arg){ arg=0; }; - template<> inline void ZeroIt(RealF &arg){ arg=0; }; - template<> inline void ZeroIt(RealD &arg){ arg=0; }; - - // TODO - // - // Base class to share common code between vRealF, VComplexF etc... - // - // lattice Broad cast assignment - // - // where() support - // implement with masks, and/or? Type of the mask & boolean support? - // - // Unary functions - // cos,sin, tan, acos, asin, cosh, acosh, tanh, sinh, // Scalar only arg - // exp, log, sqrt, fabs - // - // transposeColor, transposeSpin, - // adjColor, adjSpin, - // traceColor, traceSpin. - // peekColor, peekSpin + pokeColor PokeSpin - // - // copyMask. - // - // localMaxAbs - // - // norm2, - // sumMulti equivalent. - // Fourier transform equivalent. - // - - //////////////////////////////////////////////////////////////////////////////// - //Provide support functions for basic real and complex data types required by dpo - //Single and double precision versions. Should be able to template this once only. - //////////////////////////////////////////////////////////////////////////////// - - inline void mac (ComplexD * __restrict__ y,const ComplexD * __restrict__ a,const ComplexD *__restrict__ x){ *y = (*a) * (*x)+(*y); }; - inline void mult(ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) * (*r);} - inline void sub (ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) - (*r);} - inline void add (ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) + (*r);} - inline ComplexD adj(const ComplexD& r){ return(conj(r)); } - // conj already supported for complex - - inline void mac (ComplexF * __restrict__ y,const ComplexF * __restrict__ a,const ComplexF *__restrict__ x){ *y = (*a) * (*x)+(*y); } - inline void mult(ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) * (*r); } - inline void sub (ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) - (*r); } - inline void add (ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) + (*r); } - inline Complex adj(const Complex& r ){ return(conj(r)); } - //conj already supported for complex - - inline void mac (RealD * __restrict__ y,const RealD * __restrict__ a,const RealD *__restrict__ x){ *y = (*a) * (*x)+(*y);} - inline void mult(RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) * (*r);} - inline void sub (RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) - (*r);} - inline void add (RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) + (*r);} - inline RealD adj(const RealD & r){ return r; } // No-op for real - inline RealD conj(const RealD & r){ return r; } - - inline void mac (RealF * __restrict__ y,const RealF * __restrict__ a,const RealF *__restrict__ x){ *y = (*a) * (*x)+(*y); } - inline void mult(RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) * (*r); } - inline void sub (RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) - (*r); } - inline void add (RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) + (*r); } - inline RealF adj(const RealF & r){ return r; } - inline RealF conj(const RealF & r){ return r; } - - //////////////////////////////////////////////////////////////////////// - // Vector types are arch dependent///////////////////////////////////// - //////////////////////////////////////////////////////////////////////// -#if defined (SSE2) - typedef __m128 fvec; - typedef __m128d dvec; - typedef __m128 cvec; - typedef __m128d zvec; -#endif -#if defined (AVX1) || defined (AVX2) - typedef __m256 fvec; - typedef __m256d dvec; - typedef __m256 cvec; - typedef __m256d zvec; -#endif -#if defined (AVX512) - typedef __m512 fvec; - typedef __m512d dvec; - typedef __m512 cvec; - typedef __m512d zvec; -#endif -#if defined (QPX) - typedef float fvec __attribute__ ((vector_size (16))); // QPX has same SIMD width irrespective of precision - typedef float cvec __attribute__ ((vector_size (16))); - - typedef vector4double dvec; - typedef vector4double zvec; -#endif -#if defined (AVX1) || defined (AVX2) || defined (AVX512) - inline void v_prefetch0(int size, const char *ptr){ - for(int i=0;i class iScalar -{ -public: - SIMDalign vtype _internal; - iScalar(){}; - iScalar(Zero &z){ *this = zero; }; - iScalar & operator= (const Zero &hero){ - zeroit(*this); - return *this; - } - friend void zeroit(iScalar &that){ - zeroit(that._internal); - } - // Unary negation - friend inline iScalar operator -(const iScalar &r) { - iScalar ret; - ret._internal= -r._internal; - return ret; - } - // *=,+=,-= operators - inline iScalar &operator *=(const iScalar &r) { - *this = (*this)*r; - return *this; - } - inline iScalar &operator -=(const iScalar &r) { - *this = (*this)-r; - return *this; - } - inline iScalar &operator +=(const iScalar &r) { - *this = (*this)+r; - return *this; - } - + double usecond(void); + void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr); + void Grid_debug_handler_init(void); }; - -template class iVector -{ -public: - SIMDalign vtype _internal[N]; - iVector(Zero &z){ *this = zero; }; - iVector() {}; - iVector & operator= (Zero &hero){ - zeroit(*this); - return *this; - } - friend void zeroit(iVector &that){ - for(int i=0;i operator -(const iVector &r) { - iVector ret; - for(int i=0;i &operator *=(const iScalar &r) { - *this = (*this)*r; - return *this; - } - inline iVector &operator -=(const iVector &r) { - *this = (*this)-r; - return *this; - } - inline iVector &operator +=(const iVector &r) { - *this = (*this)+r; - return *this; - } - -}; - - -template class iMatrix -{ -public: - SIMDalign vtype _internal[N][N]; - iMatrix(Zero &z){ *this = zero; }; - iMatrix() {}; - iMatrix & operator= (Zero &hero){ - zeroit(*this); - return *this; - } - friend void zeroit(iMatrix &that){ - for(int i=0;i operator -(const iMatrix &r) { - iMatrix ret; - for(int i=0;i - inline iMatrix &operator *=(const T &r) { - *this = (*this)*r; - return *this; - } - template - inline iMatrix &operator -=(const T &r) { - *this = (*this)-r; - return *this; - } - template - inline iMatrix &operator +=(const T &r) { - *this = (*this)+r; - return *this; - } - -}; -/* - inline vComplexD localInnerProduct(const vComplexD & l, const vComplexD & r) { return conj(l)*r; } - inline vComplexF localInnerProduct(const vComplexF & l, const vComplexF & r) { return conj(l)*r; } - inline vRealD localInnerProduct(const vRealD & l, const vRealD & r) { return conj(l)*r; } - inline vRealF localInnerProduct(const vRealF & l, const vRealF & r) { return conj(l)*r; } -*/ - inline ComplexD localInnerProduct(const ComplexD & l, const ComplexD & r) { return conj(l)*r; } - inline ComplexF localInnerProduct(const ComplexF & l, const ComplexF & r) { return conj(l)*r; } - inline RealD localInnerProduct(const RealD & l, const RealD & r) { return conj(l)*r; } - inline RealF localInnerProduct(const RealF & l, const RealF & r) { return conj(l)*r; } - - - /////////////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////// ADD /////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////////////// - - -// ADD is simple for now; cannot mix types and straightforward template -// Scalar +/- Scalar -// Vector +/- Vector -// Matrix +/- Matrix -template inline void add(iScalar * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iScalar * __restrict__ rhs) -{ - add(&ret->_internal,&lhs->_internal,&rhs->_internal); -} -template inline void add(iVector * __restrict__ ret, - const iVector * __restrict__ lhs, - const iVector * __restrict__ rhs) -{ - for(int c=0;c_internal[c]=lhs->_internal[c]+rhs->_internal[c]; - } - return; -} -template inline void add(iMatrix * __restrict__ ret, - const iMatrix * __restrict__ lhs, - const iMatrix * __restrict__ rhs) -{ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal[c1][c2]); - }} - return; -} -template inline void add(iMatrix * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iMatrix * __restrict__ rhs) -{ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); - }} - return; -} -template inline void add(iMatrix * __restrict__ ret, - const iMatrix * __restrict__ lhs, - const iScalar * __restrict__ rhs) -{ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); - else - ret->_internal[c1][c2]=lhs->_internal[c1][c2]; - }} - return; -} -// Need to figure multi-precision. -template Mytype timesI(Mytype &r) -{ - iScalar i; - i._internal = Complex(0,1); - return r*i; -} - - // + operator for scalar, vector, matrix -template -//inline auto operator + (iScalar& lhs,iScalar&& rhs) -> iScalar -inline auto operator + (const iScalar& lhs,const iScalar& rhs) -> iScalar -{ - typedef iScalar ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator + (const iVector& lhs,const iVector& rhs) ->iVector -{ - typedef iVector ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator + (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator + (const iScalar& lhs,const iMatrix& rhs)->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator + (const iMatrix& lhs,const iScalar& rhs)->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; -} - - - /////////////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////// SUB /////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////////////// - - -// SUB is simple for now; cannot mix types and straightforward template -// Scalar +/- Scalar -// Vector +/- Vector -// Matrix +/- Matrix -// Matrix /- scalar -template inline void sub(iScalar * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iScalar * __restrict__ rhs) -{ - sub(&ret->_internal,&lhs->_internal,&rhs->_internal); -} - -template inline void sub(iVector * __restrict__ ret, - const iVector * __restrict__ lhs, - const iVector * __restrict__ rhs) -{ - for(int c=0;c_internal[c]=lhs->_internal[c]-rhs->_internal[c]; - } - return; -} -template inline void sub(iMatrix * __restrict__ ret, - const iMatrix * __restrict__ lhs, - const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal[c1][c2]); - }} - return; -} -template inline void sub(iMatrix * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); - } else { - // Fails -- need unary minus. Catalogue other unops? - ret->_internal[c1][c2]=zero; - ret->_internal[c1][c2]=ret->_internal[c1][c2]-rhs->_internal[c1][c2]; - - } - }} - return; -} -template inline void sub(iMatrix * __restrict__ ret, - const iMatrix * __restrict__ lhs, - const iScalar * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); - else - ret->_internal[c1][c2]=lhs->_internal[c1][c2]; - }} - return; -} - -template void vprefetch(const iScalar &vv) -{ - vprefetch(vv._internal); -} -template void vprefetch(const iVector &vv) -{ - for(int i=0;i void vprefetch(const iMatrix &vv) -{ - for(int i=0;i inline auto -operator - (const iScalar& lhs, const iScalar& rhs) -> iScalar -{ - typedef iScalar ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator - (const iVector& lhs,const iVector& rhs) ->iVector -{ - typedef iVector ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator - (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator - (const iScalar& lhs,const iMatrix& rhs)->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator - (const iMatrix& lhs,const iScalar& rhs)->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////// MAC /////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////// - - /////////////////////////// - // Legal multiplication table - /////////////////////////// - // scal x scal = scal - // mat x mat = mat - // mat x scal = mat - // scal x mat = mat - // mat x vec = vec - // vec x scal = vec - // scal x vec = vec - /////////////////////////// -template -inline void mac(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs) -{ - mac(&ret->_internal,&lhs->_internal,&rhs->_internal); -} -template -inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); - }}} - return; -} -template -inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ - for(int c1=0;c1_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); - }} - return; -} -template -inline void mac(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ - for(int c1=0;c1_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); - }} - return; -} -template -inline void mac(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) -{ - for(int c1=0;c1_internal[c1],&lhs->_internal[c1][c2],&rhs->_internal[c2]); - }} - return; -} -template -inline void mac(iVector * __restrict__ ret,const iScalar * __restrict__ lhs,const iVector * __restrict__ rhs) -{ - for(int c1=0;c1_internal[c1],&lhs->_internal,&rhs->_internal[c1]); - } - return; -} -template -inline void mac(iVector * __restrict__ ret,const iVector * __restrict__ lhs,const iScalar * __restrict__ rhs) -{ - for(int c1=0;c1_internal[c1],&lhs->_internal[c1],&rhs->_internal); - } - return; -} - - /////////////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////// MUL /////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////////////// - - -template -inline void mult(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs){ - mult(&ret->_internal,&lhs->_internal,&rhs->_internal); -} - -template -inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][0],&rhs->_internal[0][c2]); - for(int c3=1;c3_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); - } - }} - return; -} -template -inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); - }} - return; -} - -template -inline void mult(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); - }} - return; -} -// Matrix left multiplies vector -template -inline void mult(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) -{ - for(int c1=0;c1_internal[c1],&lhs->_internal[c1][0],&rhs->_internal[0]); - for(int c2=1;c2_internal[c1],&lhs->_internal[c1][c2],&rhs->_internal[c2]); - } - } - return; -} -template -inline void mult(iVector * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iVector * __restrict__ rhs){ - for(int c1=0;c1_internal[c1],&lhs->_internal,&rhs->_internal[c1]); - } -} -template -inline void mult(iVector * __restrict__ ret, - const iVector * __restrict__ rhs, - const iScalar * __restrict__ lhs){ - mult(ret,lhs,rhs); -} - - - -template inline -iVector operator * (const iMatrix& lhs,const iVector& rhs) -{ - iVector ret; - mult(&ret,&lhs,&rhs); - return ret; -} - -template inline -iVector operator * (const iScalar& lhs,const iVector& rhs) -{ - iVector ret; - mult(&ret,&lhs,&rhs); - return ret; -} - -template inline -iVector operator * (const iVector& lhs,const iScalar& rhs) -{ - iVector ret; - mult(&ret,&lhs,&rhs); - return ret; -} - - ////////////////////////////////////////////////////////////////// - // Glue operators to mult routines. Must resolve return type cleverly from typeof(internal) - // since nesting matrix x matrix-> matrix - // while matrix x matrix-> matrix - // so return type depends on argument types in nasty way. - ////////////////////////////////////////////////////////////////// - // scal x scal = scal - // mat x mat = mat - // mat x scal = mat - // scal x mat = mat - // mat x vec = vec - // vec x scal = vec - // scal x vec = vec - -template -inline auto operator * (const iScalar& lhs,const iScalar& rhs) -> iScalar -{ - typedef iScalar ret_t; - ret_t ret; - mult(&ret,&lhs,&rhs); - return ret; -} -template inline -auto operator * (const iMatrix& lhs,const iMatrix& rhs) -> iMatrix -{ - typedef decltype(lhs._internal[0][0]*rhs._internal[0][0]) ret_t; - iMatrix ret; - mult(&ret,&lhs,&rhs); - return ret; -} -template inline -auto operator * (const iMatrix& lhs,const iScalar& rhs) -> iMatrix -{ - typedef decltype(lhs._internal[0][0]*rhs._internal) ret_t; - - iMatrix ret; - for(int c1=0;c1 inline -auto operator * (const iScalar& lhs,const iMatrix& rhs) -> iMatrix -{ - typedef decltype(lhs._internal*rhs._internal[0][0]) ret_t; - iMatrix ret; - for(int c1=0;c1 inline -auto operator * (const iMatrix& lhs,const iVector& rhs) -> iVector -{ - typedef decltype(lhs._internal[0][0]*rhs._internal[0]) ret_t; - iVector ret; - for(int c1=0;c1 inline -auto operator * (const iScalar& lhs,const iVector& rhs) -> iVector -{ - typedef decltype(lhs._internal*rhs._internal[0]) ret_t; - iVector ret; - for(int c1=0;c1 inline -auto operator * (const iVector& lhs,const iScalar& rhs) -> iVector -{ - typedef decltype(lhs._internal[0]*rhs._internal) ret_t; - iVector ret; - for(int c1=0;c1 Scalar - // localInnerProduct Vector x Vector -> Scalar - // localInnerProduct Matrix x Matrix -> Scalar - /////////////////////////////////////////////////////////////////////////////////////// - template inline - auto localInnerProduct (const iVector& lhs,const iVector& rhs) -> iScalar - { - typedef decltype(localInnerProduct(lhs._internal[0],rhs._internal[0])) ret_t; - iScalar ret=zero; - for(int c1=0;c1 inline - auto localInnerProduct (const iMatrix& lhs,const iMatrix& rhs) -> iScalar - { - typedef decltype(localInnerProduct(lhs._internal[0][0],rhs._internal[0][0])) ret_t; - iScalar ret=zero; - for(int c1=0;c1 inline - auto localInnerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar - { - typedef decltype(localInnerProduct(lhs._internal,rhs._internal)) ret_t; - iScalar ret; - ret._internal = localInnerProduct(lhs._internal,rhs._internal); - return ret; - } - - /////////////////////////////////////////////////////////////////////////////////////// - // outerProduct Scalar x Scalar -> Scalar - // Vector x Vector -> Matrix - /////////////////////////////////////////////////////////////////////////////////////// - -template inline -auto outerProduct (const iVector& lhs,const iVector& rhs) -> iMatrix -{ - typedef decltype(outerProduct(lhs._internal[0],rhs._internal[0])) ret_t; - iMatrix ret; - for(int c1=0;c1 inline -auto outerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar -{ - typedef decltype(outerProduct(lhs._internal,rhs._internal)) ret_t; - iScalar ret; - ret._internal = outerProduct(lhs._internal,rhs._internal); - return ret; -} -/* - inline vComplexF outerProduct(const vComplexF &l, const vComplexF& r) - { - return l*r; - } - inline vComplexD outerProduct(const vComplexD &l, const vComplexD& r) - { - return l*r; - } - inline vRealF outerProduct(const vRealF &l, const vRealF& r) - { - return l*r; - } - inline vRealD outerProduct(const vRealD &l, const vRealD& r) - { - return l*r; - } -*/ - inline ComplexF outerProduct(const ComplexF &l, const ComplexF& r) - { - return l*r; - } - inline ComplexD outerProduct(const ComplexD &l, const ComplexD& r) - { - return l*r; - } - inline RealF outerProduct(const RealF &l, const RealF& r) - { - return l*r; - } - inline RealD outerProduct(const RealD &l, const RealD& r) - { - return l*r; - } - /////////////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////// CONJ /////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////////////// - -// Conj function for scalar, vector, matrix -template inline iScalar conj(const iScalar&r) -{ - iScalar ret; - ret._internal = conj(r._internal); - return ret; -} - -// Adj function for scalar, vector, matrix -template inline iScalar adj(const iScalar&r) -{ - iScalar ret; - ret._internal = adj(r._internal); - return ret; -} -template inline iVector adj(const iVector&r) -{ - iVector ret; - for(int i=0;i inline iMatrix adj(const iMatrix &arg) -{ - iMatrix ret; - for(int c1=0;c1 inline auto real(const iScalar &z) -> iScalar -{ - iScalar ret; - ret._internal = real(z._internal); - return ret; -} -template inline auto real(const iMatrix &z) -> iMatrix -{ - iMatrix ret; - for(int c1=0;c1 inline auto real(const iVector &z) -> iVector -{ - iVector ret; - for(int c1=0;c1 inline auto imag(const iScalar &z) -> iScalar -{ - iScalar ret; - ret._internal = imag(z._internal); - return ret; -} -template inline auto imag(const iMatrix &z) -> iMatrix -{ - iMatrix ret; - for(int c1=0;c1 inline auto imag(const iVector &z) -> iVector -{ - iVector ret; - for(int c1=0;c1 -inline auto trace(const iMatrix &arg) -> iScalar -{ - iScalar ret; - ZeroIt(ret._internal); - for(int i=0;i -inline auto trace(const iScalar &arg) -> iScalar -{ - iScalar ret; - ret._internal=trace(arg._internal); - return ret; -} - -///////////////////////////////////////////////////////////////////////// -// Generic routine to promote object -> object -// Supports the array reordering transformation that gives me SIMD utilisation -///////////////////////////////////////////////////////////////////////// -/* -template class object> -inline object splat(objects){ - object ret; - vComplex * v_ptr = (vComplex *)& ret; - Complex * s_ptr = (Complex *) &s; - for(int i=0;i friend class Lattice; - - -//protected: - - // Lattice wide random support. not yet fully implemented. Need seed strategy - // and one generator per site. - //std::default_random_engine generator; - // static std::mt19937 generator( 9 ); - - - // Grid information. - unsigned long _ndimension; - std::vector _layout; // Which dimensions get relayed out over simd lanes. - std::vector _dimensions; // Dimensions of array - std::vector _rdimensions;// Reduced dimensions with simd lane images removed - std::vector _ostride; // Outer stride for each dimension - std::vector _istride; // Inner stride i.e. within simd lane - int _osites; // _isites*_osites = product(dimensions). - int _isites; - - // subslice information - std::vector _slice_block; - std::vector _slice_stride; - std::vector _slice_nblock; -public: - - // These routines are key. Subdivide the linearised cartesian index into - // "inner" index identifying which simd lane of object is associated with coord - // "outer" index identifying which element of _odata in class "Lattice" is associated with coord. - // Compared to, say, Blitz++ we simply need to store BOTH an inner stride and an outer - // stride per dimension. The cost of evaluating the indexing information is doubled for an n-dimensional - // coordinate. Note, however, for data parallel operations the "inner" indexing cost is not paid and all - // lanes are operated upon simultaneously. - - inline int oIndexReduced(std::vector &rcoor) - { - int idx=0; - for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*rcoor[d]; - return idx; - } - virtual int oIndex(std::vector &coor) - { - int idx=0; - for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*(coor[d]%_rdimensions[d]); - return idx; - } - inline int iIndex(std::vector &rcoor) - { - int idx=0; - for(int d=0;d<_ndimension;d++) idx+=_istride[d]*(rcoor[d]/_rdimensions[d]); - return idx; - } - - inline int oSites(void) { return _osites; }; - inline int iSites(void) { return _isites; }; - virtual int CheckerBoard(std::vector site)=0; - virtual int CheckerBoardDestination(int source_cb,int shift)=0; - virtual int CheckerBoardShift(int source_cb,int dim,int shift)=0; -}; - -//////////////////////////////////////////////////////////////////// -// A lattice of something, but assume the something is SIMDized. -//////////////////////////////////////////////////////////////////// -template -class myallocator { -public: - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - typedef _Tp* pointer; - typedef const _Tp* const_pointer; - typedef _Tp& reference; - typedef const _Tp& const_reference; - typedef _Tp value_type; - - template struct rebind { typedef myallocator<_Tp1> other; }; - myallocator() throw() { } - myallocator(const myallocator&) throw() { } - template myallocator(const myallocator<_Tp1>&) throw() { } - ~myallocator() throw() { } - pointer address(reference __x) const { return &__x; } - const_pointer address(const_reference __x) const { return &__x; } - size_type max_size() const throw() { return size_t(-1) / sizeof(_Tp); } - // Should override allocate and deallocate - pointer allocate(size_type __n, const void* = 0) - { - //_Tp * ptr = (_Tp *) memalign(sizeof(_Tp),__n*sizeof(_Tp)); - // _Tp * ptr = (_Tp *) memalign(128,__n*sizeof(_Tp)); -#ifdef AVX512 - _Tp * ptr = (_Tp *) memalign(128,__n*sizeof(_Tp)); -#else - _Tp * ptr = (_Tp *) _mm_malloc(__n*sizeof(_Tp),128); -#endif - - return ptr; - } - void deallocate(pointer __p, size_type) { - free(__p); - } - void construct(pointer __p, const _Tp& __val) { }; - void construct(pointer __p) { }; - void destroy(pointer __p) { }; -}; - -template inline bool -operator==(const myallocator<_Tp>&, const myallocator<_Tp>&){ return true; } - -template inline bool -operator!=(const myallocator<_Tp>&, const myallocator<_Tp>&){ return false; } - - -}; // namespace dpo - #endif diff --git a/Grid_Lattice.h b/Grid_Lattice.h index f18784fb..47b85b0f 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -1,5 +1,7 @@ +#ifndef GRID_LATTICE_H +#define GRID_LATTICE_H + #include "Grid.h" -#include "Grid_vComplexD.h" namespace dpo { @@ -9,7 +11,7 @@ class Lattice public: Grid *_grid; int checkerboard; - std::vector > _odata; + std::vector > _odata; public: @@ -554,95 +556,5 @@ public: return ret; } - -namespace QCD { - - static const int Nc=3; - static const int Ns=4; - - static const int CbRed =0; - static const int CbBlack=1; - - // QCD iMatrix types - template using iSinglet = iScalar > ; - template using iSpinMatrix = iMatrix, Ns>; - template using iSpinColourMatrix = iMatrix, Ns>; - - template using iColourMatrix = iScalar> ; - - template using iSpinVector = iVector, Ns>; - template using iColourVector = iScalar >; - template using iSpinColourVector = iVector, Ns>; - - typedef iSinglet TComplex; // This is painful. Tensor singlet complex type. - typedef iSinglet vTComplex; - typedef iSinglet TReal; // This is painful. Tensor singlet complex type. - - typedef iSpinMatrix SpinMatrix; - typedef iColourMatrix ColourMatrix; - typedef iSpinColourMatrix SpinColourMatrix; - - typedef iSpinVector SpinVector; - typedef iColourVector ColourVector; - typedef iSpinColourVector SpinColourVector; - - - typedef iSpinMatrix vSpinMatrix; - typedef iColourMatrix vColourMatrix; - typedef iSpinColourMatrix vSpinColourMatrix; - - typedef iSpinVector vSpinVector; - typedef iColourVector vColourVector; - typedef iSpinColourVector vSpinColourVector; - - - typedef Lattice LatticeComplex; - - typedef Lattice LatticeColourMatrix; - typedef Lattice LatticeSpinMatrix; - typedef Lattice LatticePropagator; - typedef LatticePropagator LatticeSpinColourMatrix; - - typedef Lattice LatticeFermion; - typedef Lattice LatticeSpinColourVector; - typedef Lattice LatticeSpinVector; - typedef Lattice LatticeColourVector; - - // localNorm2, - template - inline LatticeComplex localNorm2 (const Lattice &rhs) - { - LatticeComplex ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=trace(adj(rhs)*rhs); - } - return ret; - } - // localInnerProduct - template - inline LatticeComplex localInnerProduct (const Lattice &lhs,const Lattice &rhs) - { - LatticeComplex ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=localInnerProduct(lhs._odata[ss],rhs._odata[ss]); - } - return ret; - } - - // outerProduct Scalar x Scalar -> Scalar - // Vector x Vector -> Matrix - template - inline auto outerProduct (const Lattice &lhs,const Lattice &rhs) -> Lattice - { - Lattice ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=outerProduct(lhs._odata[ss],rhs._odata[ss]); - } - return ret; - } -} //namespace QCD - } +#endif diff --git a/Grid_QCD.h b/Grid_QCD.h new file mode 100644 index 00000000..92a02506 --- /dev/null +++ b/Grid_QCD.h @@ -0,0 +1,94 @@ +#ifndef GRID_QCD_H +#define GRID_QCD_H +namespace dpo{ +namespace QCD { + + static const int Nc=3; + static const int Ns=4; + + static const int CbRed =0; + static const int CbBlack=1; + + // QCD iMatrix types + template using iSinglet = iScalar > ; + template using iSpinMatrix = iMatrix, Ns>; + template using iSpinColourMatrix = iMatrix, Ns>; + + template using iColourMatrix = iScalar> ; + + template using iSpinVector = iVector, Ns>; + template using iColourVector = iScalar >; + template using iSpinColourVector = iVector, Ns>; + + typedef iSinglet TComplex; // This is painful. Tensor singlet complex type. + typedef iSinglet vTComplex; + typedef iSinglet TReal; // This is painful. Tensor singlet complex type. + + typedef iSpinMatrix SpinMatrix; + typedef iColourMatrix ColourMatrix; + typedef iSpinColourMatrix SpinColourMatrix; + + typedef iSpinVector SpinVector; + typedef iColourVector ColourVector; + typedef iSpinColourVector SpinColourVector; + + + typedef iSpinMatrix vSpinMatrix; + typedef iColourMatrix vColourMatrix; + typedef iSpinColourMatrix vSpinColourMatrix; + + typedef iSpinVector vSpinVector; + typedef iColourVector vColourVector; + typedef iSpinColourVector vSpinColourVector; + + + typedef Lattice LatticeComplex; + + typedef Lattice LatticeColourMatrix; + typedef Lattice LatticeSpinMatrix; + typedef Lattice LatticePropagator; + typedef LatticePropagator LatticeSpinColourMatrix; + + typedef Lattice LatticeFermion; + typedef Lattice LatticeSpinColourVector; + typedef Lattice LatticeSpinVector; + typedef Lattice LatticeColourVector; + + // localNorm2, + template + inline LatticeComplex localNorm2 (const Lattice &rhs) + { + LatticeComplex ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=trace(adj(rhs)*rhs); + } + return ret; + } + // localInnerProduct + template + inline LatticeComplex localInnerProduct (const Lattice &lhs,const Lattice &rhs) + { + LatticeComplex ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=localInnerProduct(lhs._odata[ss],rhs._odata[ss]); + } + return ret; + } + + // outerProduct Scalar x Scalar -> Scalar + // Vector x Vector -> Matrix + template + inline auto outerProduct (const Lattice &lhs,const Lattice &rhs) -> Lattice + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=outerProduct(lhs._odata[ss],rhs._odata[ss]); + } + return ret; + } +} //namespace QCD +} // dpo +#endif diff --git a/Grid_aligned_allocator.h b/Grid_aligned_allocator.h new file mode 100644 index 00000000..6040c233 --- /dev/null +++ b/Grid_aligned_allocator.h @@ -0,0 +1,56 @@ +#ifndef GRID_ALIGNED_ALLOCATOR_H +#define GRID_ALIGNED_ALLOCATOR_H +namespace dpo { + +//////////////////////////////////////////////////////////////////// +// A lattice of something, but assume the something is SIMDized. +//////////////////////////////////////////////////////////////////// +template +class alignedAllocator { +public: + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + + template struct rebind { typedef alignedAllocator<_Tp1> other; }; + alignedAllocator() throw() { } + alignedAllocator(const alignedAllocator&) throw() { } + template alignedAllocator(const alignedAllocator<_Tp1>&) throw() { } + ~alignedAllocator() throw() { } + pointer address(reference __x) const { return &__x; } + const_pointer address(const_reference __x) const { return &__x; } + size_type max_size() const throw() { return size_t(-1) / sizeof(_Tp); } + // Should override allocate and deallocate + pointer allocate(size_type __n, const void* = 0) + { + //_Tp * ptr = (_Tp *) memalign(sizeof(_Tp),__n*sizeof(_Tp)); + // _Tp * ptr = (_Tp *) memalign(128,__n*sizeof(_Tp)); +#ifdef AVX512 + _Tp * ptr = (_Tp *) memalign(128,__n*sizeof(_Tp)); +#else + _Tp * ptr = (_Tp *) _mm_malloc(__n*sizeof(_Tp),128); +#endif + + return ptr; + } + void deallocate(pointer __p, size_type) { + free(__p); + } + void construct(pointer __p, const _Tp& __val) { }; + void construct(pointer __p) { }; + void destroy(pointer __p) { }; +}; + +template inline bool +operator==(const alignedAllocator<_Tp>&, const alignedAllocator<_Tp>&){ return true; } + +template inline bool +operator!=(const alignedAllocator<_Tp>&, const alignedAllocator<_Tp>&){ return false; } + + +}; // namespace dpo +#endif diff --git a/Grid_config.h b/Grid_config.h new file mode 100644 index 00000000..b882917d --- /dev/null +++ b/Grid_config.h @@ -0,0 +1,101 @@ +/* Grid_config.h. Generated from Grid_config.h.in by configure. */ +/* Grid_config.h.in. Generated from configure.ac by autoheader. */ + +/* AVX */ +#define AVX1 1 + +/* AVX2 */ +/* #undef AVX2 */ + +/* AVX512 */ +/* #undef AVX512 */ + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MALLOC_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_MALLOC_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if the system has the `aligned' variable attribute */ +#define HAVE_VAR_ATTRIBUTE_ALIGNED 1 + +/* Name of package */ +#define PACKAGE "grid" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "paboyle@ph.ed.ac.uk" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "Grid" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "Grid 1.0" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "grid" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.0" + +/* SSE2 */ +/* #undef SSE2 */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "1.0" + +/* Define for Solaris 2.5.1 so the uint32_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +/* #undef _UINT32_T */ + +/* Define for Solaris 2.5.1 so the uint64_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +/* #undef _UINT64_T */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +/* #undef uint32_t */ + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +/* #undef uint64_t */ diff --git a/Grid_math_types.h b/Grid_math_types.h new file mode 100644 index 00000000..405d5c9a --- /dev/null +++ b/Grid_math_types.h @@ -0,0 +1,819 @@ +#ifndef GRID_MATH_TYPES_H +#define GRID_MATH_TYPES_H +namespace dpo { +/////////////////////////////////////////////////// +// Scalar, Vector, Matrix objects. +// These can be composed to form tensor products of internal indices. +/////////////////////////////////////////////////// + +template class iScalar +{ +public: + SIMDalign vtype _internal; + iScalar(){}; + iScalar(Zero &z){ *this = zero; }; + iScalar & operator= (const Zero &hero){ + zeroit(*this); + return *this; + } + friend void zeroit(iScalar &that){ + zeroit(that._internal); + } + // Unary negation + friend inline iScalar operator -(const iScalar &r) { + iScalar ret; + ret._internal= -r._internal; + return ret; + } + // *=,+=,-= operators + inline iScalar &operator *=(const iScalar &r) { + *this = (*this)*r; + return *this; + } + inline iScalar &operator -=(const iScalar &r) { + *this = (*this)-r; + return *this; + } + inline iScalar &operator +=(const iScalar &r) { + *this = (*this)+r; + return *this; + } + + +}; + +template class iVector +{ +public: + SIMDalign vtype _internal[N]; + iVector(Zero &z){ *this = zero; }; + iVector() {}; + iVector & operator= (Zero &hero){ + zeroit(*this); + return *this; + } + friend void zeroit(iVector &that){ + for(int i=0;i operator -(const iVector &r) { + iVector ret; + for(int i=0;i &operator *=(const iScalar &r) { + *this = (*this)*r; + return *this; + } + inline iVector &operator -=(const iVector &r) { + *this = (*this)-r; + return *this; + } + inline iVector &operator +=(const iVector &r) { + *this = (*this)+r; + return *this; + } + +}; + + +template class iMatrix +{ +public: + SIMDalign vtype _internal[N][N]; + iMatrix(Zero &z){ *this = zero; }; + iMatrix() {}; + iMatrix & operator= (Zero &hero){ + zeroit(*this); + return *this; + } + friend void zeroit(iMatrix &that){ + for(int i=0;i operator -(const iMatrix &r) { + iMatrix ret; + for(int i=0;i + inline iMatrix &operator *=(const T &r) { + *this = (*this)*r; + return *this; + } + template + inline iMatrix &operator -=(const T &r) { + *this = (*this)-r; + return *this; + } + template + inline iMatrix &operator +=(const T &r) { + *this = (*this)+r; + return *this; + } + +}; + + + /////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////// ADD /////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + + +// ADD is simple for now; cannot mix types and straightforward template +// Scalar +/- Scalar +// Vector +/- Vector +// Matrix +/- Matrix +template inline void add(iScalar * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iScalar * __restrict__ rhs) +{ + add(&ret->_internal,&lhs->_internal,&rhs->_internal); +} +template inline void add(iVector * __restrict__ ret, + const iVector * __restrict__ lhs, + const iVector * __restrict__ rhs) +{ + for(int c=0;c_internal[c]=lhs->_internal[c]+rhs->_internal[c]; + } + return; +} +template inline void add(iMatrix * __restrict__ ret, + const iMatrix * __restrict__ lhs, + const iMatrix * __restrict__ rhs) +{ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal[c1][c2]); + }} + return; +} +template inline void add(iMatrix * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iMatrix * __restrict__ rhs) +{ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); + }} + return; +} +template inline void add(iMatrix * __restrict__ ret, + const iMatrix * __restrict__ lhs, + const iScalar * __restrict__ rhs) +{ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); + else + ret->_internal[c1][c2]=lhs->_internal[c1][c2]; + }} + return; +} +// Need to figure multi-precision. +template Mytype timesI(Mytype &r) +{ + iScalar i; + i._internal = Complex(0,1); + return r*i; +} + + // + operator for scalar, vector, matrix +template +//inline auto operator + (iScalar& lhs,iScalar&& rhs) -> iScalar +inline auto operator + (const iScalar& lhs,const iScalar& rhs) -> iScalar +{ + typedef iScalar ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator + (const iVector& lhs,const iVector& rhs) ->iVector +{ + typedef iVector ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator + (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix +{ + typedef iMatrix ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator + (const iScalar& lhs,const iMatrix& rhs)->iMatrix +{ + typedef iMatrix ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator + (const iMatrix& lhs,const iScalar& rhs)->iMatrix +{ + typedef iMatrix ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; +} + + + /////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////// SUB /////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + + +// SUB is simple for now; cannot mix types and straightforward template +// Scalar +/- Scalar +// Vector +/- Vector +// Matrix +/- Matrix +// Matrix /- scalar +template inline void sub(iScalar * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iScalar * __restrict__ rhs) +{ + sub(&ret->_internal,&lhs->_internal,&rhs->_internal); +} + +template inline void sub(iVector * __restrict__ ret, + const iVector * __restrict__ lhs, + const iVector * __restrict__ rhs) +{ + for(int c=0;c_internal[c]=lhs->_internal[c]-rhs->_internal[c]; + } + return; +} +template inline void sub(iMatrix * __restrict__ ret, + const iMatrix * __restrict__ lhs, + const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal[c1][c2]); + }} + return; +} +template inline void sub(iMatrix * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); + } else { + // Fails -- need unary minus. Catalogue other unops? + ret->_internal[c1][c2]=zero; + ret->_internal[c1][c2]=ret->_internal[c1][c2]-rhs->_internal[c1][c2]; + + } + }} + return; +} +template inline void sub(iMatrix * __restrict__ ret, + const iMatrix * __restrict__ lhs, + const iScalar * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); + else + ret->_internal[c1][c2]=lhs->_internal[c1][c2]; + }} + return; +} + +template void vprefetch(const iScalar &vv) +{ + vprefetch(vv._internal); +} +template void vprefetch(const iVector &vv) +{ + for(int i=0;i void vprefetch(const iMatrix &vv) +{ + for(int i=0;i inline auto +operator - (const iScalar& lhs, const iScalar& rhs) -> iScalar +{ + typedef iScalar ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator - (const iVector& lhs,const iVector& rhs) ->iVector +{ + typedef iVector ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator - (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix +{ + typedef iMatrix ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator - (const iScalar& lhs,const iMatrix& rhs)->iMatrix +{ + typedef iMatrix ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator - (const iMatrix& lhs,const iScalar& rhs)->iMatrix +{ + typedef iMatrix ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////// MAC /////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// + + /////////////////////////// + // Legal multiplication table + /////////////////////////// + // scal x scal = scal + // mat x mat = mat + // mat x scal = mat + // scal x mat = mat + // mat x vec = vec + // vec x scal = vec + // scal x vec = vec + /////////////////////////// +template +inline void mac(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs) +{ + mac(&ret->_internal,&lhs->_internal,&rhs->_internal); +} +template +inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); + }}} + return; +} +template +inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ + for(int c1=0;c1_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); + }} + return; +} +template +inline void mac(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ + for(int c1=0;c1_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); + }} + return; +} +template +inline void mac(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) +{ + for(int c1=0;c1_internal[c1],&lhs->_internal[c1][c2],&rhs->_internal[c2]); + }} + return; +} +template +inline void mac(iVector * __restrict__ ret,const iScalar * __restrict__ lhs,const iVector * __restrict__ rhs) +{ + for(int c1=0;c1_internal[c1],&lhs->_internal,&rhs->_internal[c1]); + } + return; +} +template +inline void mac(iVector * __restrict__ ret,const iVector * __restrict__ lhs,const iScalar * __restrict__ rhs) +{ + for(int c1=0;c1_internal[c1],&lhs->_internal[c1],&rhs->_internal); + } + return; +} + + /////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////// MUL /////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + + +template +inline void mult(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs){ + mult(&ret->_internal,&lhs->_internal,&rhs->_internal); +} + +template +inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][0],&rhs->_internal[0][c2]); + for(int c3=1;c3_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); + } + }} + return; +} +template +inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); + }} + return; +} + +template +inline void mult(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); + }} + return; +} +// Matrix left multiplies vector +template +inline void mult(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) +{ + for(int c1=0;c1_internal[c1],&lhs->_internal[c1][0],&rhs->_internal[0]); + for(int c2=1;c2_internal[c1],&lhs->_internal[c1][c2],&rhs->_internal[c2]); + } + } + return; +} +template +inline void mult(iVector * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iVector * __restrict__ rhs){ + for(int c1=0;c1_internal[c1],&lhs->_internal,&rhs->_internal[c1]); + } +} +template +inline void mult(iVector * __restrict__ ret, + const iVector * __restrict__ rhs, + const iScalar * __restrict__ lhs){ + mult(ret,lhs,rhs); +} + + + +template inline +iVector operator * (const iMatrix& lhs,const iVector& rhs) +{ + iVector ret; + mult(&ret,&lhs,&rhs); + return ret; +} + +template inline +iVector operator * (const iScalar& lhs,const iVector& rhs) +{ + iVector ret; + mult(&ret,&lhs,&rhs); + return ret; +} + +template inline +iVector operator * (const iVector& lhs,const iScalar& rhs) +{ + iVector ret; + mult(&ret,&lhs,&rhs); + return ret; +} + + ////////////////////////////////////////////////////////////////// + // Glue operators to mult routines. Must resolve return type cleverly from typeof(internal) + // since nesting matrix x matrix-> matrix + // while matrix x matrix-> matrix + // so return type depends on argument types in nasty way. + ////////////////////////////////////////////////////////////////// + // scal x scal = scal + // mat x mat = mat + // mat x scal = mat + // scal x mat = mat + // mat x vec = vec + // vec x scal = vec + // scal x vec = vec + +template +inline auto operator * (const iScalar& lhs,const iScalar& rhs) -> iScalar +{ + typedef iScalar ret_t; + ret_t ret; + mult(&ret,&lhs,&rhs); + return ret; +} +template inline +auto operator * (const iMatrix& lhs,const iMatrix& rhs) -> iMatrix +{ + typedef decltype(lhs._internal[0][0]*rhs._internal[0][0]) ret_t; + iMatrix ret; + mult(&ret,&lhs,&rhs); + return ret; +} +template inline +auto operator * (const iMatrix& lhs,const iScalar& rhs) -> iMatrix +{ + typedef decltype(lhs._internal[0][0]*rhs._internal) ret_t; + + iMatrix ret; + for(int c1=0;c1 inline +auto operator * (const iScalar& lhs,const iMatrix& rhs) -> iMatrix +{ + typedef decltype(lhs._internal*rhs._internal[0][0]) ret_t; + iMatrix ret; + for(int c1=0;c1 inline +auto operator * (const iMatrix& lhs,const iVector& rhs) -> iVector +{ + typedef decltype(lhs._internal[0][0]*rhs._internal[0]) ret_t; + iVector ret; + for(int c1=0;c1 inline +auto operator * (const iScalar& lhs,const iVector& rhs) -> iVector +{ + typedef decltype(lhs._internal*rhs._internal[0]) ret_t; + iVector ret; + for(int c1=0;c1 inline +auto operator * (const iVector& lhs,const iScalar& rhs) -> iVector +{ + typedef decltype(lhs._internal[0]*rhs._internal) ret_t; + iVector ret; + for(int c1=0;c1 Scalar + // localInnerProduct Vector x Vector -> Scalar + // localInnerProduct Matrix x Matrix -> Scalar + /////////////////////////////////////////////////////////////////////////////////////// + template inline + auto localInnerProduct (const iVector& lhs,const iVector& rhs) -> iScalar + { + typedef decltype(localInnerProduct(lhs._internal[0],rhs._internal[0])) ret_t; + iScalar ret=zero; + for(int c1=0;c1 inline + auto localInnerProduct (const iMatrix& lhs,const iMatrix& rhs) -> iScalar + { + typedef decltype(localInnerProduct(lhs._internal[0][0],rhs._internal[0][0])) ret_t; + iScalar ret=zero; + for(int c1=0;c1 inline + auto localInnerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar + { + typedef decltype(localInnerProduct(lhs._internal,rhs._internal)) ret_t; + iScalar ret; + ret._internal = localInnerProduct(lhs._internal,rhs._internal); + return ret; + } + + /////////////////////////////////////////////////////////////////////////////////////// + // outerProduct Scalar x Scalar -> Scalar + // Vector x Vector -> Matrix + /////////////////////////////////////////////////////////////////////////////////////// + +template inline +auto outerProduct (const iVector& lhs,const iVector& rhs) -> iMatrix +{ + typedef decltype(outerProduct(lhs._internal[0],rhs._internal[0])) ret_t; + iMatrix ret; + for(int c1=0;c1 inline +auto outerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar +{ + typedef decltype(outerProduct(lhs._internal,rhs._internal)) ret_t; + iScalar ret; + ret._internal = outerProduct(lhs._internal,rhs._internal); + return ret; +} + +inline ComplexF outerProduct(const ComplexF &l, const ComplexF& r) +{ + return l*r; +} +inline ComplexD outerProduct(const ComplexD &l, const ComplexD& r) +{ + return l*r; +} +inline RealF outerProduct(const RealF &l, const RealF& r) +{ + return l*r; +} +inline RealD outerProduct(const RealD &l, const RealD& r) +{ + return l*r; +} + /////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////// CONJ /////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + +// Conj function for scalar, vector, matrix +template inline iScalar conj(const iScalar&r) +{ + iScalar ret; + ret._internal = conj(r._internal); + return ret; +} + +// Adj function for scalar, vector, matrix +template inline iScalar adj(const iScalar&r) +{ + iScalar ret; + ret._internal = adj(r._internal); + return ret; +} +template inline iVector adj(const iVector&r) +{ + iVector ret; + for(int i=0;i inline iMatrix adj(const iMatrix &arg) +{ + iMatrix ret; + for(int c1=0;c1 inline auto real(const iScalar &z) -> iScalar +{ + iScalar ret; + ret._internal = real(z._internal); + return ret; +} +template inline auto real(const iMatrix &z) -> iMatrix +{ + iMatrix ret; + for(int c1=0;c1 inline auto real(const iVector &z) -> iVector +{ + iVector ret; + for(int c1=0;c1 inline auto imag(const iScalar &z) -> iScalar +{ + iScalar ret; + ret._internal = imag(z._internal); + return ret; +} +template inline auto imag(const iMatrix &z) -> iMatrix +{ + iMatrix ret; + for(int c1=0;c1 inline auto imag(const iVector &z) -> iVector +{ + iVector ret; + for(int c1=0;c1 +inline auto trace(const iMatrix &arg) -> iScalar +{ + iScalar ret; + ZeroIt(ret._internal); + for(int i=0;i +inline auto trace(const iScalar &arg) -> iScalar +{ + iScalar ret; + ret._internal=trace(arg._internal); + return ret; +} +}; +///////////////////////////////////////////////////////////////////////// +// Generic routine to promote object -> object +// Supports the array reordering transformation that gives me SIMD utilisation +///////////////////////////////////////////////////////////////////////// +/* +template class object> +inline object splat(objects){ + object ret; + vComplex * v_ptr = (vComplex *)& ret; + Complex * s_ptr = (Complex *) &s; + for(int i=0;i only arg + // exp, log, sqrt, fabs + // + // transposeColor, transposeSpin, + // adjColor, adjSpin, + // traceColor, traceSpin. + // peekColor, peekSpin + pokeColor PokeSpin + // + // copyMask. + // + // localMaxAbs + // + // norm2, + // sumMulti equivalent. + // Fourier transform equivalent. + // + namespace dpo { @@ -21,7 +48,46 @@ namespace dpo { typedef std::complex ComplexD; typedef std::complex Complex; - + + inline RealF adj(const RealF & r){ return r; } + inline RealF conj(const RealF & r){ return r; } + inline ComplexD localInnerProduct(const ComplexD & l, const ComplexD & r) { return conj(l)*r; } + inline ComplexF localInnerProduct(const ComplexF & l, const ComplexF & r) { return conj(l)*r; } + inline RealD localInnerProduct(const RealD & l, const RealD & r) { return l*r; } + inline RealF localInnerProduct(const RealF & l, const RealF & r) { return l*r; } + + //////////////////////////////////////////////////////////////////////////////// + //Provide support functions for basic real and complex data types required by dpo + //Single and double precision versions. Should be able to template this once only. + //////////////////////////////////////////////////////////////////////////////// + inline void mac (ComplexD * __restrict__ y,const ComplexD * __restrict__ a,const ComplexD *__restrict__ x){ *y = (*a) * (*x)+(*y); }; + inline void mult(ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) * (*r);} + inline void sub (ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) - (*r);} + inline void add (ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) + (*r);} + inline ComplexD adj(const ComplexD& r){ return(conj(r)); } + // conj already supported for complex + + inline void mac (ComplexF * __restrict__ y,const ComplexF * __restrict__ a,const ComplexF *__restrict__ x){ *y = (*a) * (*x)+(*y); } + inline void mult(ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) * (*r); } + inline void sub (ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) - (*r); } + inline void add (ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) + (*r); } + inline Complex adj(const Complex& r ){ return(conj(r)); } + //conj already supported for complex + + inline void mac (RealD * __restrict__ y,const RealD * __restrict__ a,const RealD *__restrict__ x){ *y = (*a) * (*x)+(*y);} + inline void mult(RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) * (*r);} + inline void sub (RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) - (*r);} + inline void add (RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) + (*r);} + inline RealD adj(const RealD & r){ return r; } // No-op for real + inline RealD conj(const RealD & r){ return r; } + + inline void mac (RealF * __restrict__ y,const RealF * __restrict__ a,const RealF *__restrict__ x){ *y = (*a) * (*x)+(*y); } + inline void mult(RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) * (*r); } + inline void sub (RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) - (*r); } + inline void add (RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) + (*r); } + + + class Zero{}; static Zero zero; template inline void ZeroIt(itype &arg){ arg=zero;}; From b1cb3f255d552febe57befa6bb1e6304ad426def Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 4 Mar 2015 05:33:26 +0000 Subject: [PATCH 004/429] Update organisation --- Grid_Cartesian.h | 79 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/Grid_Cartesian.h b/Grid_Cartesian.h index 779cf44f..03044bdd 100644 --- a/Grid_Cartesian.h +++ b/Grid_Cartesian.h @@ -1,7 +1,83 @@ +#ifndef GRID_CARTESIAN_H +#define GRID_CARTESIAN_H + #include "Grid.h" -#include "Grid_vComplexD.h" namespace dpo{ + + +///////////////////////////////////////////////////////////////////////////////////////// +// Grid Support. Following will go into Grid.h. +///////////////////////////////////////////////////////////////////////////////////////// + // Cartesian grids + // dpo::Grid + // dpo::GridCartesian + // dpo::GridCartesianRedBlack + +class Grid { +public: + // Give Lattice access + template friend class Lattice; + + +//protected: + + // Lattice wide random support. not yet fully implemented. Need seed strategy + // and one generator per site. + //std::default_random_engine generator; + // static std::mt19937 generator( 9 ); + + + // Grid information. + unsigned long _ndimension; + std::vector _layout; // Which dimensions get relayed out over simd lanes. + std::vector _dimensions; // Dimensions of array + std::vector _rdimensions;// Reduced dimensions with simd lane images removed + std::vector _ostride; // Outer stride for each dimension + std::vector _istride; // Inner stride i.e. within simd lane + int _osites; // _isites*_osites = product(dimensions). + int _isites; + + // subslice information + std::vector _slice_block; + std::vector _slice_stride; + std::vector _slice_nblock; +public: + + // These routines are key. Subdivide the linearised cartesian index into + // "inner" index identifying which simd lane of object is associated with coord + // "outer" index identifying which element of _odata in class "Lattice" is associated with coord. + // Compared to, say, Blitz++ we simply need to store BOTH an inner stride and an outer + // stride per dimension. The cost of evaluating the indexing information is doubled for an n-dimensional + // coordinate. Note, however, for data parallel operations the "inner" indexing cost is not paid and all + // lanes are operated upon simultaneously. + + inline int oIndexReduced(std::vector &rcoor) + { + int idx=0; + for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*rcoor[d]; + return idx; + } + virtual int oIndex(std::vector &coor) + { + int idx=0; + for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*(coor[d]%_rdimensions[d]); + return idx; + } + inline int iIndex(std::vector &rcoor) + { + int idx=0; + for(int d=0;d<_ndimension;d++) idx+=_istride[d]*(rcoor[d]/_rdimensions[d]); + return idx; + } + + inline int oSites(void) { return _osites; }; + inline int iSites(void) { return _isites; }; + virtual int CheckerBoard(std::vector site)=0; + virtual int CheckerBoardDestination(int source_cb,int shift)=0; + virtual int CheckerBoardShift(int source_cb,int dim,int shift)=0; +}; + class GridCartesian: public Grid { public: virtual int CheckerBoard(std::vector site){ @@ -176,3 +252,4 @@ protected: }; } +#endif From 5aefa56e5c10dba004977864fce11890077912e3 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 4 Mar 2015 05:34:15 +0000 Subject: [PATCH 005/429] Better organisation --- Grid.h | 2 +- Grid_config.h.in | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Grid.h b/Grid.h index 042835ca..0cbe583b 100644 --- a/Grid.h +++ b/Grid.h @@ -42,7 +42,7 @@ #include #include -#include +#include #include #include #include diff --git a/Grid_config.h.in b/Grid_config.h.in index 3fc06db0..88003589 100644 --- a/Grid_config.h.in +++ b/Grid_config.h.in @@ -1,7 +1,7 @@ /* Grid_config.h.in. Generated from configure.ac by autoheader. */ /* AVX */ -#undef AVX +#undef AVX1 /* AVX2 */ #undef AVX2 @@ -48,6 +48,9 @@ /* Define to 1 if the system has the `aligned' variable attribute */ #undef HAVE_VAR_ATTRIBUTE_ALIGNED +/* Name of package */ +#undef PACKAGE + /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT @@ -66,15 +69,15 @@ /* Define to the version of this package. */ #undef PACKAGE_VERSION -/* SSE */ -#undef SSE - /* SSE2 */ #undef SSE2 /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS +/* Version number of package */ +#undef VERSION + /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ From eb15a8dacbb892efeab4842e5158624aaaba1f19 Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Wed, 4 Mar 2015 11:38:10 +0000 Subject: [PATCH 006/429] AVX2 fix --- Grid_Cartesian.h | 3 +-- Grid_config.h | 4 ++-- Grid_main.cc | 9 ++++++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Grid_Cartesian.h b/Grid_Cartesian.h index 03044bdd..488d47e9 100644 --- a/Grid_Cartesian.h +++ b/Grid_Cartesian.h @@ -108,9 +108,8 @@ public: for(int d=0;d<_ndimension;d++){ _dimensions[d] = dimensions[d]; _layout[d] = layout[d]; - // Use a reduced simd grid - _rdimensions[d]= _dimensions[d]/_layout[d]; + _rdimensions[d]= _dimensions[d]/_layout[d]; //<-- _layout[d] is zero _osites *= _rdimensions[d]; _isites *= _layout[d]; diff --git a/Grid_config.h b/Grid_config.h index b882917d..b3833326 100644 --- a/Grid_config.h +++ b/Grid_config.h @@ -2,10 +2,10 @@ /* Grid_config.h.in. Generated from configure.ac by autoheader. */ /* AVX */ -#define AVX1 1 +/* #undef AVX1 */ /* AVX2 */ -/* #undef AVX2 */ +#define AVX2 1 /* AVX512 */ /* #undef AVX512 */ diff --git a/Grid_main.cc b/Grid_main.cc index a3ef32c8..33dfc37b 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -46,12 +46,19 @@ int main (int argc, char ** argv) simd_layout[2] = 2; simd_layout[3] = 2; #endif -#ifdef AVX1 +#if defined (AVX1)|| defined (AVX2) simd_layout[0] = 1; simd_layout[1] = 1; simd_layout[2] = 2; simd_layout[3] = 2; #endif +#if defined (SSE2) + simd_layout[0] = 1; + simd_layout[1] = 1; + simd_layout[2] = 1; + simd_layout[3] = 2; +#endif + GridCartesian Fine(latt_size,simd_layout); GridRedBlackCartesian rbFine(latt_size,simd_layout); From 09582509e50079caa2b746c165e4b80b704a9d47 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 4 Mar 2015 11:44:05 +0000 Subject: [PATCH 007/429] Improving benchmark to include Cshift --- Grid_main.cc | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Grid_main.cc b/Grid_main.cc index a3ef32c8..4727470b 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -182,21 +182,19 @@ int main (int argc, char ** argv) printf("mult NumThread %d , Lattice size %d , %f Mflop/s\n",omp,lat,flops/(t1-t0)); printf("mult NumThread %d , Lattice size %d , %f MB/s\n",omp,lat,bytes/(t1-t0)); -/* - mult(FooBar,Foo,Bar); - // FooBar = Foo * Bar; + mult(FooBar,Foo,Bar); + FooBar = Foo * Bar; t0=usecond(); for(int i=0;i Date: Wed, 4 Mar 2015 11:50:59 +0000 Subject: [PATCH 008/429] Better openMP for Cshift --- Grid_Lattice.h | 91 +++++++------------------------------------------- Grid_config.h | 4 +-- 2 files changed, 14 insertions(+), 81 deletions(-) diff --git a/Grid_Lattice.h b/Grid_Lattice.h index 47b85b0f..d0fb9465 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -68,7 +68,8 @@ public: } return ret; }; -#if 0 + + friend Lattice Cshift(Lattice &rhs,int dimension,int shift) { Lattice ret(rhs._grid); @@ -131,20 +132,24 @@ public: } if ( permute_slice ) { - - int internal=sizeof(vobj)/sizeof(vComplex); + + int internal=sizeof(vobj)/sizeof(vComplex); int num =rhs._grid->_slice_block[dimension]*internal; - + +#pragma omp parallel for collapse(2) for(int n=0;n_slice_nblock[dimension];n++){ - vComplex *optr = (vComplex *)&ret._odata[o]; - vComplex *iptr = (vComplex *)&rhs._odata[so]; for(int b=0;b_slice_stride[dimension]; so+=rhs._grid->_slice_stride[dimension]; } + } else { + +#pragma omp parallel for collapse(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int i=0;i_slice_block[dimension];i++){ ret._odata[o+i]=rhs._odata[so+i]; @@ -157,78 +162,6 @@ public: } return ret; } -#else - friend Lattice Cshift(Lattice &rhs,int dimension,int shift) - { - Lattice ret(rhs._grid); - int sx,so,o; - - ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); - shift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift); - int rd = rhs._grid->_rdimensions[dimension]; - int ld = rhs._grid->_dimensions[dimension]; - - // Map to always positive shift. - shift = (shift+ld)%ld; - - // Work out whether to permute and the permute type - // ABCDEFGH -> AE BF CG DH permute - // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH - // Shift 1 DH AE BF CG 1 0 0 0 HABCDEFG - // Shift 2 CG DH AE BF 1 1 0 0 GHABCDEF - // Shift 3 BF CG DH AE 1 1 1 0 FGHACBDE - // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD - // Shift 5 DH AE BF CG 0 1 1 1 DEFGHABC - // Shift 6 CG DH AE BF 0 0 1 1 CDEFGHAB - // Shift 7 BF CG DH AE 0 0 0 1 BCDEFGHA - int permute_dim =rhs._grid->_layout[dimension]>1 ; - int permute_type=0; - for(int d=0;d_layout[d]>1 ) permute_type++; - - - // loop over all work - int work =rd*rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; -//#pragma omp parallel for - for(int ww=0;ww_slice_block[dimension] ; w=w/rhs._grid->_slice_block[dimension]; - int n = w%rhs._grid->_slice_nblock[dimension]; w=w/rhs._grid->_slice_nblock[dimension]; - int x = w; - - sx = (x-shift+ld)%rd; - o = x*rhs._grid->_ostride[dimension]+n*rhs._grid->_slice_stride[dimension]; // common sub expression alert. - so =sx*rhs._grid->_ostride[dimension]+n*rhs._grid->_slice_stride[dimension]; - - int permute_slice=0; - if ( permute_dim ) { - permute_slice = shift/rd; - if ( x inline Lattice & operator = (const sobj & r){ diff --git a/Grid_config.h b/Grid_config.h index b3833326..b882917d 100644 --- a/Grid_config.h +++ b/Grid_config.h @@ -2,10 +2,10 @@ /* Grid_config.h.in. Generated from configure.ac by autoheader. */ /* AVX */ -/* #undef AVX1 */ +#define AVX1 1 /* AVX2 */ -#define AVX2 1 +/* #undef AVX2 */ /* AVX512 */ /* #undef AVX512 */ From 523abad40fc743fafc3e1161401e1987095e2b05 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 4 Mar 2015 11:53:59 +0000 Subject: [PATCH 009/429] Place them in to avoid forced autoreconf on user --- Makefile.in | 885 +++++++ configure | 6545 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 7430 insertions(+) create mode 100644 Makefile.in create mode 100755 configure diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 00000000..c1d09a38 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,885 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +bin_PROGRAMS = Grid_main$(EXEEXT) +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(include_HEADERS) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = Grid_config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(includedir)" +LIBRARIES = $(lib_LIBRARIES) +AR = ar +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libGrid_a_AR = $(AR) $(ARFLAGS) +libGrid_a_LIBADD = +am_libGrid_a_OBJECTS = Grid_signal.$(OBJEXT) +libGrid_a_OBJECTS = $(am_libGrid_a_OBJECTS) +PROGRAMS = $(bin_PROGRAMS) +am_Grid_main_OBJECTS = Grid_main.$(OBJEXT) +Grid_main_OBJECTS = $(am_Grid_main_OBJECTS) +Grid_main_DEPENDENCIES = libGrid.a +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libGrid_a_SOURCES) $(Grid_main_SOURCES) +DIST_SOURCES = $(libGrid_a_SOURCES) $(Grid_main_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)Grid_config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +AM_RECURSIVE_TARGETS = cscope +am__DIST_COMMON = $(srcdir)/Grid_config.h.in $(srcdir)/Makefile.in \ + AUTHORS COPYING ChangeLog INSTALL NEWS README compile depcomp \ + install-sh missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build_alias = @build_alias@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# additional include paths necessary to compile the C++ library +AM_CXXFLAGS = -I$(top_srcdir)/ + +# +# Libraries +# +lib_LIBRARIES = libGrid.a +libGrid_a_SOURCES = Grid_signal.cc + +# +# Include files +# +include_HEADERS = Grid.h\ + Grid_vComplexD.h\ + Grid_vComplexF.h\ + Grid_vRealD.h\ + Grid_vRealF.h\ + Grid_Cartesian.h\ + Grid_Lattice.h\ + Grid_config.h + +Grid_main_SOURCES = Grid_main.cc +Grid_main_LDADD = libGrid.a +all: Grid_config.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .cc .o .obj +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +Grid_config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/Grid_config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status Grid_config.h +$(srcdir)/Grid_config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f Grid_config.h stamp-h1 +install-libLIBRARIES: $(lib_LIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; } + @$(POST_INSTALL) + @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + if test -f $$p; then \ + $(am__strip_dir) \ + echo " ( cd '$(DESTDIR)$(libdir)' && $(RANLIB) $$f )"; \ + ( cd "$(DESTDIR)$(libdir)" && $(RANLIB) $$f ) || exit $$?; \ + else :; fi; \ + done + +uninstall-libLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(libdir)'; $(am__uninstall_files_from_dir) + +clean-libLIBRARIES: + -test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES) + +libGrid.a: $(libGrid_a_OBJECTS) $(libGrid_a_DEPENDENCIES) $(EXTRA_libGrid_a_DEPENDENCIES) + $(AM_V_at)-rm -f libGrid.a + $(AM_V_AR)$(libGrid_a_AR) libGrid.a $(libGrid_a_OBJECTS) $(libGrid_a_LIBADD) + $(AM_V_at)$(RANLIB) libGrid.a +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +Grid_main$(EXEEXT): $(Grid_main_OBJECTS) $(Grid_main_DEPENDENCIES) $(EXTRA_Grid_main_DEPENDENCIES) + @rm -f Grid_main$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Grid_main_OBJECTS) $(Grid_main_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_signal.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(HEADERS) Grid_config.h +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-libLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ + uninstall-libLIBRARIES + +.MAKE: all install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \ + clean-binPROGRAMS clean-cscope clean-generic \ + clean-libLIBRARIES cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-tags distcleancheck \ + distdir distuninstallcheck dvi dvi-am html html-am info \ + info-am install install-am install-binPROGRAMS install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-libLIBRARIES install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-includeHEADERS \ + uninstall-libLIBRARIES + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/configure b/configure new file mode 100755 index 00000000..ea75c846 --- /dev/null +++ b/configure @@ -0,0 +1,6545 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for Grid 1.0. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: paboyle@ph.ed.ac.uk about your system, including any +$0: error possibly output before this message. Then install +$0: a modern shell, or manually run the script under such a +$0: shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='Grid' +PACKAGE_TARNAME='grid' +PACKAGE_VERSION='1.0' +PACKAGE_STRING='Grid 1.0' +PACKAGE_BUGREPORT='paboyle@ph.ed.ac.uk' +PACKAGE_URL='' + +ac_unique_file="Grid.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +EGREP +GREP +CPP +RANLIB +OPENMP_CFLAGS +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +ac_ct_CC +CFLAGS +CC +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CXX +CPPFLAGS +LDFLAGS +CXXFLAGS +CXX +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +enable_openmp +enable_simd +' + ac_precious_vars='build_alias +host_alias +target_alias +CXX +CXXFLAGS +LDFLAGS +LIBS +CPPFLAGS +CCC +CC +CFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures Grid 1.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/grid] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of Grid 1.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --disable-openmp do not use OpenMP + --enable-simd=SSE|AVX|AVX2|AVX512 + Select instructions + +Some influential environment variables: + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CC C compiler command + CFLAGS C compiler flags + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +Grid configure 1.0 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_find_uintX_t LINENO BITS VAR +# ------------------------------------ +# Finds an unsigned integer type with width BITS, setting cache variable VAR +# accordingly. +ac_fn_c_find_uintX_t () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 +$as_echo_n "checking for uint$2_t... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + # Order is important - never check a type that is potentially smaller + # than half of the expected target width. + for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + case $ac_type in #( + uint$2_t) : + eval "$3=yes" ;; #( + *) : + eval "$3=\$ac_type" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no"; then : + +else + break +fi + done +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_find_uintX_t + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by Grid $as_me 1.0, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +am__api_version='1.15' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='grid' + VERSION='1.0' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + + +ac_config_headers="$ac_config_headers Grid_config.h" + + +# Checks for programs. +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 +$as_echo_n "checking whether the C++ compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C++ compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 +$as_echo_n "checking for C++ compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + + + OPENMP_CFLAGS= + # Check whether --enable-openmp was given. +if test "${enable_openmp+set}" = set; then : + enableval=$enable_openmp; +fi + + if test "$enable_openmp" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5 +$as_echo_n "checking for $CC option to support OpenMP... " >&6; } +if ${ac_cv_prog_c_openmp+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifndef _OPENMP + choke me +#endif +#include +int main () { return omp_get_num_threads (); } + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_prog_c_openmp='none needed' +else + ac_cv_prog_c_openmp='unsupported' + for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ + -Popenmp --openmp; do + ac_save_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS $ac_option" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifndef _OPENMP + choke me +#endif +#include +int main () { return omp_get_num_threads (); } + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_prog_c_openmp=$ac_option +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS=$ac_save_CFLAGS + if test "$ac_cv_prog_c_openmp" != unsupported; then + break + fi + done +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5 +$as_echo "$ac_cv_prog_c_openmp" >&6; } + case $ac_cv_prog_c_openmp in #( + "none needed" | unsupported) + ;; #( + *) + OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; + esac + fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + +# Checks for libraries. + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__((aligned))" >&5 +$as_echo_n "checking for __attribute__((aligned))... " >&6; } +if ${ax_cv_have_var_attribute_aligned+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + int foo __attribute__((aligned(32))); + +int +main () +{ + + + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if test -s conftest.err; then : + ax_cv_have_var_attribute_aligned=no +else + ax_cv_have_var_attribute_aligned=yes +fi +else + ax_cv_have_var_attribute_aligned=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_var_attribute_aligned" >&5 +$as_echo "$ax_cv_have_var_attribute_aligned" >&6; } + + if test yes = $ax_cv_have_var_attribute_aligned; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_VAR_ATTRIBUTE_ALIGNED 1 +_ACEOF + +fi + + + + +# Checks for header files. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in stdint.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STDINT_H 1 +_ACEOF + +fi + +done + +for ac_header in malloc/malloc.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_malloc_malloc_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MALLOC_MALLOC_H 1 +_ACEOF + +fi + +done + +for ac_header in malloc.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_malloc_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MALLOC_H 1 +_ACEOF + +fi + +done + + +# Checks for typedefs, structures, and compiler characteristics. +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" +case $ac_cv_c_uint32_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT32_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint32_t $ac_cv_c_uint32_t +_ACEOF +;; + esac + +ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" +case $ac_cv_c_uint64_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT64_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint64_t $ac_cv_c_uint64_t +_ACEOF +;; + esac + + +# Checks for library functions. +for ac_func in gettimeofday +do : + ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETTIMEOFDAY 1 +_ACEOF + +fi +done + + +# Check whether --enable-simd was given. +if test "${enable_simd+set}" = set; then : + enableval=$enable_simd; ac_SIMD=${enable_simd} +else + ac_SIMD=AVX2 +fi + + +case ${ac_SIMD} in + SSE2) + echo Configuring for SSE2 + +$as_echo "#define SSE2 1" >>confdefs.h + + ;; + AVX) + echo Configuring for AVX + +$as_echo "#define AVX1 1" >>confdefs.h + + ;; + AVX2) + echo Configuring for AVX2 + +$as_echo "#define AVX2 1" >>confdefs.h + + ;; + AVX512) + echo Configuring for AVX512 + +$as_echo "#define AVX512 1" >>confdefs.h + + ;; + *) + as_fn_error $? "${ac_SIMD} unsupported --enable-simd option" "$LINENO" 5; + ;; +esac + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by Grid $as_me 1.0, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +Grid config.status 1.0 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "Grid_config.h") CONFIG_HEADERS="$CONFIG_HEADERS Grid_config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + From 110ddd19003e3f08e25070d07a1be3f73e8310bb Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 4 Mar 2015 11:54:46 +0000 Subject: [PATCH 010/429] install-sh distro --- install-sh | 1 + 1 file changed, 1 insertion(+) create mode 120000 install-sh diff --git a/install-sh b/install-sh new file mode 120000 index 00000000..545f1114 --- /dev/null +++ b/install-sh @@ -0,0 +1 @@ +/opt/local/share/automake-1.15/install-sh \ No newline at end of file From 63c7eb262eeacd66c935de3f395ca370edec8f57 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 4 Mar 2015 11:55:44 +0000 Subject: [PATCH 011/429] file --- install-sh | 502 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 501 insertions(+), 1 deletion(-) mode change 120000 => 100755 install-sh diff --git a/install-sh b/install-sh deleted file mode 120000 index 545f1114..00000000 --- a/install-sh +++ /dev/null @@ -1 +0,0 @@ -/opt/local/share/automake-1.15/install-sh \ No newline at end of file diff --git a/install-sh b/install-sh new file mode 100755 index 00000000..0b0fdcbb --- /dev/null +++ b/install-sh @@ -0,0 +1,501 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2013-12-25.23; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: From 96260b60b07679cf5fce4ab457f50c613a1014f5 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 4 Mar 2015 11:57:14 +0000 Subject: [PATCH 012/429] files --- compile | 347 +++++++++++++++++++++++++ depcomp | 791 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ missing | 215 +++++++++++++++ 3 files changed, 1353 insertions(+) create mode 100755 compile create mode 100755 depcomp create mode 100755 missing diff --git a/compile b/compile new file mode 100755 index 00000000..a85b723c --- /dev/null +++ b/compile @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/depcomp b/depcomp new file mode 100755 index 00000000..fc98710e --- /dev/null +++ b/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2013-05-30.07; # UTC + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/missing b/missing new file mode 100755 index 00000000..f62bbae3 --- /dev/null +++ b/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2013-10-28.13; # UTC + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: From d4a93ec7b4e18a45be42401aa538b48d40d66994 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 4 Mar 2015 11:58:45 +0000 Subject: [PATCH 013/429] missing --- aclocal.m4 | 1153 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1153 insertions(+) create mode 100644 aclocal.m4 diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 00000000..34cdc48d --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1153 @@ +# generated automatically by aclocal 1.15 -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.15' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.15], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.15])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/ax_gcc_var_attribute.m4]) From 59eff71fc597b57a4840442ef99e6dfa5f7fef94 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 4 Mar 2015 12:03:07 +0000 Subject: [PATCH 014/429] Extra files --- COPYING | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ INSTALL | 370 +++++++++++++++++++++++++++++++ 2 files changed, 1044 insertions(+) create mode 100644 COPYING create mode 100644 INSTALL diff --git a/COPYING b/COPYING new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/INSTALL b/INSTALL new file mode 100644 index 00000000..20998407 --- /dev/null +++ b/INSTALL @@ -0,0 +1,370 @@ +Installation Instructions +************************* + +Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, +Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell command `./configure && make && make install' +should configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX `make' updates targets which have the same time stamps as +their prerequisites, which makes it generally unusable when shipped +generated files such as `configure' are involved. Use GNU `make' +instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf limitation. Until the limitation is lifted, you can use +this workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. From 4e8b9c6928301a9b90bf8935d30b0b3e5c6c4a38 Mon Sep 17 00:00:00 2001 From: Azusa Yamaguchi Date: Wed, 4 Mar 2015 13:25:23 +0000 Subject: [PATCH 015/429] Changes for MIC --- Grid.h | 2 + Grid_Lattice.h | 134 +- Grid_config.h | 14 +- Grid_config.h.in | 6 - Grid_main.cc | 12 +- Makefile.in | 360 +--- aclocal.m4 | 708 +++---- configure | 4701 ++++++++++++++++++++++++++-------------------- configure.ac | 3 +- 9 files changed, 3153 insertions(+), 2787 deletions(-) diff --git a/Grid.h b/Grid.h index 0cbe583b..f73d52ba 100644 --- a/Grid.h +++ b/Grid.h @@ -20,12 +20,14 @@ #include #include #include +#include #include //////////////////////////////////////////////////////////// // Tunable header includes //////////////////////////////////////////////////////////// +#define HAVE_OPENMP #ifdef HAVE_OPENMP #define OMP #include diff --git a/Grid_Lattice.h b/Grid_Lattice.h index d0fb9465..223ad2cd 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -69,7 +69,8 @@ public: return ret; }; - +#if 0 + // Collapse doesn't appear to work the way I think it should in icpc friend Lattice Cshift(Lattice &rhs,int dimension,int shift) { Lattice ret(rhs._grid); @@ -131,25 +132,23 @@ public: if ( x_slice_block[dimension]*internal; - -#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + vComplex *optr = (vComplex *)&ret._odata[o]; + vComplex *iptr = (vComplex *)&rhs._odata[so]; for(int b=0;b_slice_stride[dimension]; so+=rhs._grid->_slice_stride[dimension]; } - } else { - -#pragma omp parallel for collapse(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int i=0;i_slice_block[dimension];i++){ ret._odata[o+i]=rhs._odata[so+i]; @@ -159,9 +158,122 @@ public: } } +#else + + if ( permute_slice ) { + + int internal=sizeof(vobj)/sizeof(vComplex); + int num =rhs._grid->_slice_block[dimension]*internal; + + +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_stride[dimension]]; + vComplex *iptr = (vComplex *)&rhs._odata[so+n*rhs._grid->_slice_stride[dimension]]; + permute(optr[b],iptr[b],permute_type); + } + } + + } else { + + +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int i=0;i_slice_block[dimension];i++){ + int oo = o+ n*rhs._grid->_slice_stride[dimension]; + int soo=so+ n*rhs._grid->_slice_stride[dimension]; + ret._odata[oo+i]=rhs._odata[soo+i]; + } + } + + } +#endif } return ret; } +#else + friend Lattice Cshift(Lattice &rhs,int dimension,int shift) + { + Lattice ret(rhs._grid); + + ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); + shift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift); + int rd = rhs._grid->_rdimensions[dimension]; + int ld = rhs._grid->_dimensions[dimension]; + + // Map to always positive shift. + shift = (shift+ld)%ld; + + // Work out whether to permute and the permute type + // ABCDEFGH -> AE BF CG DH permute + // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH + // Shift 1 DH AE BF CG 1 0 0 0 HABCDEFG + // Shift 2 CG DH AE BF 1 1 0 0 GHABCDEF + // Shift 3 BF CG DH AE 1 1 1 0 FGHACBDE + // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD + // Shift 5 DH AE BF CG 0 1 1 1 DEFGHABC + // Shift 6 CG DH AE BF 0 0 1 1 CDEFGHAB + // Shift 7 BF CG DH AE 0 0 0 1 BCDEFGHA + int permute_dim =rhs._grid->_layout[dimension]>1 ; + int permute_type=0; + for(int d=0;d_layout[d]>1 ) permute_type++; + + + // loop over all work + int work =rd*rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; + +#pragma omp parallel for + for(int ww=0;ww_slice_block[dimension] ; w=w/rhs._grid->_slice_block[dimension]; + int n = w%rhs._grid->_slice_nblock[dimension]; w=w/rhs._grid->_slice_nblock[dimension]; + int x = w; + + int sx,so,o; + sx = (x-shift+ld)%rd; + o = x*rhs._grid->_ostride[dimension]+n*rhs._grid->_slice_stride[dimension]; // common sub expression alert. + so =sx*rhs._grid->_ostride[dimension]+n*rhs._grid->_slice_stride[dimension]; + + int permute_slice=0; + if ( permute_dim ) { + permute_slice = shift/rd; + if ( x inline Lattice & operator = (const sobj & r){ diff --git a/Grid_config.h b/Grid_config.h index b882917d..12eeb8ac 100644 --- a/Grid_config.h +++ b/Grid_config.h @@ -2,13 +2,13 @@ /* Grid_config.h.in. Generated from configure.ac by autoheader. */ /* AVX */ -#define AVX1 1 +/* #undef AVX1 */ /* AVX2 */ /* #undef AVX2 */ /* AVX512 */ -/* #undef AVX512 */ +#define AVX512 1 /* Define to 1 if you have the `gettimeofday' function. */ #define HAVE_GETTIMEOFDAY 1 @@ -17,10 +17,10 @@ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the header file. */ -/* #undef HAVE_MALLOC_H */ +#define HAVE_MALLOC_H 1 /* Define to 1 if you have the header file. */ -#define HAVE_MALLOC_MALLOC_H 1 +/* #undef HAVE_MALLOC_MALLOC_H */ /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 @@ -46,9 +46,6 @@ /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 -/* Define to 1 if the system has the `aligned' variable attribute */ -#define HAVE_VAR_ATTRIBUTE_ALIGNED 1 - /* Name of package */ #define PACKAGE "grid" @@ -64,9 +61,6 @@ /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "grid" -/* Define to the home page for this package. */ -#define PACKAGE_URL "" - /* Define to the version of this package. */ #define PACKAGE_VERSION "1.0" diff --git a/Grid_config.h.in b/Grid_config.h.in index 88003589..5c57e4cf 100644 --- a/Grid_config.h.in +++ b/Grid_config.h.in @@ -45,9 +45,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H -/* Define to 1 if the system has the `aligned' variable attribute */ -#undef HAVE_VAR_ATTRIBUTE_ALIGNED - /* Name of package */ #undef PACKAGE @@ -63,9 +60,6 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME -/* Define to the home page for this package. */ -#undef PACKAGE_URL - /* Define to the version of this package. */ #undef PACKAGE_VERSION diff --git a/Grid_main.cc b/Grid_main.cc index 45dbaccb..0b0c3e99 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -27,13 +27,17 @@ int main (int argc, char ** argv) std::vector latt_size(4); std::vector simd_layout(4); - for(int omp=1;omp<2;omp*=2){ +#ifdef AVX512 + for(int omp=128;omp<236;omp+=16){ +#else + for(int omp=1;omp<8;omp*=2){ +#endif #ifdef OMP omp_set_num_threads(omp); #endif - for(int lat=8;lat<=12;lat+=2){ + for(int lat=16;lat<=20;lat+=4){ latt_size[0] = lat; latt_size[1] = lat; latt_size[2] = lat; @@ -191,6 +195,8 @@ int main (int argc, char ** argv) mult(FooBar,Foo,Bar); FooBar = Foo * Bar; + + bytes = ncall*1.0*volume*Nc*Nc *2*5*sizeof(dpo::Real); t0=usecond(); for(int i=0;i&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -90,13 +36,14 @@ PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = Grid_main$(EXEEXT) subdir = . +DIST_COMMON = README $(am__configure_deps) $(include_HEADERS) \ + $(srcdir)/Grid_config.h.in $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ + ChangeLog INSTALL NEWS compile depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_gcc_var_attribute.m4 \ - $(top_srcdir)/configure.ac +am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ - $(am__configure_deps) $(include_HEADERS) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d @@ -124,21 +71,11 @@ am__nobase_list = $(am__nobase_strip_setup); \ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(includedir)" LIBRARIES = $(lib_LIBRARIES) AR = ar ARFLAGS = cru -AM_V_AR = $(am__v_AR_@AM_V@) -am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) -am__v_AR_0 = @echo " AR " $@; -am__v_AR_1 = libGrid_a_AR = $(AR) $(ARFLAGS) libGrid_a_LIBADD = am_libGrid_a_OBJECTS = Grid_signal.$(OBJEXT) @@ -147,88 +84,33 @@ PROGRAMS = $(bin_PROGRAMS) am_Grid_main_OBJECTS = Grid_main.$(OBJEXT) Grid_main_OBJECTS = $(am_Grid_main_OBJECTS) Grid_main_DEPENDENCIES = libGrid.a -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -AM_V_CXX = $(am__v_CXX_@AM_V@) -am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) -am__v_CXX_0 = @echo " CXX " $@; -am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ -AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) -am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) -am__v_CXXLD_0 = @echo " CXXLD " $@; -am__v_CXXLD_1 = SOURCES = $(libGrid_a_SOURCES) $(Grid_main_SOURCES) DIST_SOURCES = $(libGrid_a_SOURCES) $(Grid_main_SOURCES) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac HEADERS = $(include_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ - $(LISP)Grid_config.h.in -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags -CSCOPE = cscope -AM_RECURSIVE_TARGETS = cscope -am__DIST_COMMON = $(srcdir)/Grid_config.h.in $(srcdir)/Makefile.in \ - AUTHORS COPYING ChangeLog INSTALL NEWS README compile depcomp \ - install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ - if test -d "$(distdir)"; then \ - find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -rf "$(distdir)" \ - || { sleep 5 && rm -rf "$(distdir)"; }; \ - else :; fi -am__post_remove_distdir = $(am__remove_distdir) + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best -DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print -am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ - | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -268,7 +150,6 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -348,7 +229,7 @@ all: Grid_config.h .SUFFIXES: .SUFFIXES: .cc .o .obj -am--refresh: Makefile +am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ @@ -363,6 +244,7 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -383,8 +265,10 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): Grid_config.h: stamp-h1 - @test -f $@ || rm -f stamp-h1 - @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi stamp-h1: $(srcdir)/Grid_config.h.in $(top_builddir)/config.status @rm -f stamp-h1 @@ -398,6 +282,7 @@ distclean-hdr: -rm -f Grid_config.h stamp-h1 install-libLIBRARIES: $(lib_LIBRARIES) @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -405,8 +290,6 @@ install-libLIBRARIES: $(lib_LIBRARIES) else :; fi; \ done; \ test -z "$$list2" || { \ - echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \ $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; } @$(POST_INSTALL) @@ -423,29 +306,26 @@ uninstall-libLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(libdir)'; $(am__uninstall_files_from_dir) + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(libdir)' && rm -f "$$files" )"; \ + cd "$(DESTDIR)$(libdir)" && rm -f $$files clean-libLIBRARIES: -test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES) - -libGrid.a: $(libGrid_a_OBJECTS) $(libGrid_a_DEPENDENCIES) $(EXTRA_libGrid_a_DEPENDENCIES) - $(AM_V_at)-rm -f libGrid.a - $(AM_V_AR)$(libGrid_a_AR) libGrid.a $(libGrid_a_OBJECTS) $(libGrid_a_LIBADD) - $(AM_V_at)$(RANLIB) libGrid.a +libGrid.a: $(libGrid_a_OBJECTS) $(libGrid_a_DEPENDENCIES) + -rm -f libGrid.a + $(libGrid_a_AR) libGrid.a $(libGrid_a_OBJECTS) $(libGrid_a_LIBADD) + $(RANLIB) libGrid.a install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ - fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p \ - ; then echo "$$p"; echo "$$p"; else :; fi; \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ done | \ - sed -e 'p;s,.*/,,;n;h' \ - -e 's|.*|.|' \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ @@ -466,18 +346,16 @@ uninstall-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' \ - `; \ + -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) - -Grid_main$(EXEEXT): $(Grid_main_OBJECTS) $(Grid_main_DEPENDENCIES) $(EXTRA_Grid_main_DEPENDENCIES) +Grid_main$(EXEEXT): $(Grid_main_OBJECTS) $(Grid_main_DEPENDENCIES) @rm -f Grid_main$(EXEEXT) - $(AM_V_CXXLD)$(CXXLINK) $(Grid_main_OBJECTS) $(Grid_main_LDADD) $(LIBS) + $(CXXLINK) $(Grid_main_OBJECTS) $(Grid_main_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -489,25 +367,22 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_signal.Po@am__quote@ .cc.o: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cc.obj: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) + test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ - fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -521,17 +396,30 @@ uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(includedir)" && rm -f $$files -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) +TAGS: $(HEADERS) $(SOURCES) Grid_config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ - $(am__define_uniq_tagged_files); \ + list='$(SOURCES) $(HEADERS) Grid_config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -543,11 +431,15 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $$unique; \ fi; \ fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) Grid_config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) Grid_config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -556,31 +448,9 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" -cscope: cscope.files - test ! -s cscope.files \ - || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) -clean-cscope: - -rm -f cscope.files -cscope.files: clean-cscope cscopelist -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) @@ -623,42 +493,36 @@ distdir: $(DISTFILES) || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__post_remove_distdir) + $(am__remove_distdir) dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 - $(am__post_remove_distdir) + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) -dist-lzip: distdir - tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz - $(am__post_remove_distdir) +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) dist-xz: distdir - tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz - $(am__post_remove_distdir) + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) dist-tarZ: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 - @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__post_remove_distdir) + $(am__remove_distdir) dist-shar: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 - @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__post_remove_distdir) + $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) - $(am__post_remove_distdir) + $(am__remove_distdir) -dist dist-all: - $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' - $(am__post_remove_distdir) +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another @@ -669,8 +533,8 @@ distcheck: dist GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lz*) \ - lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ @@ -680,19 +544,17 @@ distcheck: dist *.zip*) \ unzip $(distdir).zip ;;\ esac - chmod -R a-w $(distdir) - chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod -R a-w $(distdir); chmod u+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build/sub \ - && ../../configure \ - $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -715,21 +577,13 @@ distcheck: dist && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 - $(am__post_remove_distdir) + $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: - @test -n '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: trying to run $@ with an empty' \ - '$$(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - $(am__cd) '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ @@ -762,15 +616,10 @@ install-am: all-am installcheck: installcheck-am install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: @@ -858,10 +707,9 @@ uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ .MAKE: all install-am install-strip -.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \ - clean-binPROGRAMS clean-cscope clean-generic \ - clean-libLIBRARIES cscope cscopelist-am ctags ctags-am dist \ - dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ +.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ + clean-binPROGRAMS clean-generic clean-libLIBRARIES ctags dist \ + dist-all dist-bzip2 dist-gzip dist-lzma dist-shar dist-tarZ \ dist-xz dist-zip distcheck distclean distclean-compile \ distclean-generic distclean-hdr distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ @@ -873,12 +721,10 @@ uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-includeHEADERS \ uninstall-libLIBRARIES -.PRECIOUS: Makefile - # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/aclocal.m4 b/aclocal.m4 index 34cdc48d..bcc213b4 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.15 -*- Autoconf -*- - -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -11,16 +11,15 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. -m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],, +[m4_warning([this file was generated for autoconf 2.63. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically 'autoreconf'.])]) +To do so, use the procedure documented by the package, typically `autoreconf'.])]) -# Copyright (C) 2002-2014 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -32,10 +31,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.15' +[am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.15], [], +m4_if([$1], [1.11.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,22 +50,22 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.15])dnl +[AM_AUTOMAKE_VERSION([1.11.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to -# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and @@ -85,7 +84,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is '.', but things will broke when you +# harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, @@ -103,26 +102,30 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -# Expand $ac_aux_dir to an absolute path. -am_aux_dir=`cd "$ac_aux_dir" && pwd` +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 9 + # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ([2.52])dnl - m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl @@ -141,14 +144,16 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 10 -# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing @@ -158,7 +163,7 @@ fi])]) # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was @@ -171,13 +176,12 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl -m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], - [$1], [CXX], [depcc="$CXX" am_compiler_list=], - [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], - [$1], [UPC], [depcc="$UPC" am_compiler_list=], - [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], @@ -185,9 +189,8 @@ AC_CACHE_CHECK([dependency style of $depcc], # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -226,16 +229,16 @@ AC_CACHE_CHECK([dependency style of $depcc], : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with '-c' and '-o' for the sake of the "dashmstdout" + # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -244,16 +247,16 @@ AC_CACHE_CHECK([dependency style of $depcc], test "$am__universal" = false || continue ;; nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -301,7 +304,7 @@ AM_CONDITIONAL([am__fastdep$1], [ # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl @@ -311,39 +314,34 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE([dependency-tracking], [dnl -AS_HELP_STRING( - [--enable-dependency-tracking], - [do not reject slow dependency extractors]) -AS_HELP_STRING( - [--disable-dependency-tracking], - [speeds up one-time build])]) +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' - am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -AC_SUBST([am__nodep])dnl -_AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +#serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Older Autoconf quotes --file arguments for eval, but not when files + # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -356,7 +354,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but + # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -368,19 +366,21 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. + # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue + test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` @@ -398,7 +398,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each '.P' file that we will +# is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], @@ -408,21 +408,18 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 16 + # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. -dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. -m4_define([AC_PROG_CC], -m4_defn([AC_PROG_CC]) -[_AM_PROG_CC_C_O -]) - # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- @@ -435,7 +432,7 @@ m4_defn([AC_PROG_CC]) # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.65])dnl +[AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -464,42 +461,33 @@ AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], -[AC_DIAGNOSE([obsolete], - [$0: two- and three-arguments forms are deprecated.]) -m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if( - m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), - [ok:ok],, +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) - AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -AM_MISSING_PROG([AUTOCONF], [autoconf]) -AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -AM_MISSING_PROG([AUTOHEADER], [autoheader]) -AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target (and possibly the TAP driver). The -# system "awk" is bad on some platforms. +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -508,82 +496,34 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES([CC])], - [m4_define([AC_PROG_CC], - m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES([CXX])], - [m4_define([AC_PROG_CXX], - m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES([OBJC])], - [m4_define([AC_PROG_OBJC], - m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], - [_AM_DEPENDENCIES([OBJCXX])], - [m4_define([AC_PROG_OBJCXX], - m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) -AC_REQUIRE([AM_SILENT_RULES])dnl -dnl The testsuite driver may need to know about EXEEXT, so add the -dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This -dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl - -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) - fi -fi -dnl The trailing newline in this macro's definition is deliberate, for -dnl backward compatibility and to allow trailing 'dnl'-style comments -dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) -dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. @@ -605,7 +545,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -616,7 +556,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh+set}" != xset; then +if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -624,14 +564,16 @@ if test x"${install_sh+set}" != xset; then install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi -AC_SUBST([install_sh])]) +AC_SUBST(install_sh)]) -# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 2 + # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], @@ -647,12 +589,14 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 4 + # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. @@ -670,7 +614,7 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. +# Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -697,12 +641,15 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 6 + # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], @@ -710,10 +657,11 @@ AC_DEFUN([AM_MISSING_PROG], $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) + # AM_MISSING_HAS_RUN # ------------------ -# Define MISSING if not defined so far and test if it is modern enough. -# If it is, set am_missing_run to use it, otherwise, to nothing. +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl @@ -726,35 +674,63 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " else am_missing_run= - AC_MSG_WARN(['missing' script is too old or missing]) + AC_MSG_WARN([`missing' script is too old or missing]) fi ]) -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) -# -------------------- +# ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) -# ------------------------ +# ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) @@ -765,82 +741,24 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_PROG_CC_C_O -# --------------- -# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC -# to automatically call this. -AC_DEFUN([_AM_PROG_CC_C_O], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -AC_LANG_PUSH([C])dnl -AC_CACHE_CHECK( - [whether $CC understands -c and -o together], - [am_cv_prog_cc_c_o], - [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i]) -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -AC_LANG_POP([C])]) - -# For backward compatibility. -AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) - -# Copyright (C) 2001-2014 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_RUN_LOG(COMMAND) -# ------------------- -# Run COMMAND, save the exit status in ac_status, and log it. -# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) -AC_DEFUN([AM_RUN_LOG], -[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD - ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - (exit $ac_status); }]) - # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 5 + # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -851,40 +769,32 @@ case `pwd` in esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac -# Do 'set' in a subshell so we don't clobber the current shell's +# Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken - alias in your environment]) - fi - if test "$[2]" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done test "$[2]" = conftest.file ) then @@ -894,85 +804,9 @@ else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi -AC_MSG_RESULT([yes]) -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi -AC_CONFIG_COMMANDS_PRE( - [AC_MSG_CHECKING([that generated files are newer than configure]) - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - AC_MSG_RESULT([done])]) -rm -f conftest.file -]) +AC_MSG_RESULT(yes)]) -# Copyright (C) 2009-2014 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_SILENT_RULES([DEFAULT]) -# -------------------------- -# Enable less verbose build rules; with the default set to DEFAULT -# ("yes" being less verbose, "no" or empty being verbose). -AC_DEFUN([AM_SILENT_RULES], -[AC_ARG_ENABLE([silent-rules], [dnl -AS_HELP_STRING( - [--enable-silent-rules], - [less verbose build output (undo: "make V=1")]) -AS_HELP_STRING( - [--disable-silent-rules], - [verbose build output (undo: "make V=0")])dnl -]) -case $enable_silent_rules in @%:@ ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; -esac -dnl -dnl A few 'make' implementations (e.g., NonStop OS and NextStep) -dnl do not support nested variable expansions. -dnl See automake bug#9928 and bug#10237. -am_make=${MAKE-make} -AC_CACHE_CHECK([whether $am_make supports nested variables], - [am_cv_make_support_nested_variables], - [if AS_ECHO([['TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi]) -if test $am_cv_make_support_nested_variables = yes; then - dnl Using '$V' instead of '$(V)' breaks IRIX make. - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AC_SUBST([AM_V])dnl -AM_SUBST_NOTMAKE([AM_V])dnl -AC_SUBST([AM_DEFAULT_V])dnl -AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl -AC_SUBST([AM_DEFAULT_VERBOSITY])dnl -AM_BACKSLASH='\' -AC_SUBST([AM_BACKSLASH])dnl -_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl -]) - -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -980,32 +814,34 @@ _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl # AM_PROG_INSTALL_STRIP # --------------------- -# One issue with vendor 'install' (even GNU) is that you can't +# One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in "make install-strip", and initialize +# always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 2 + # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. @@ -1013,22 +849,24 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])]) AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) -# -------------------------- +# --------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 2 + # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. -# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory @@ -1038,116 +876,76 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar -# AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AC_SUBST([AMTAR], ['$${TAR-tar}']) - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' - +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac - [m4_case([$1], - [ustar], - [# The POSIX 1988 'ustar' format is defined with fixed-size fields. - # There is notably a 21 bits limit for the UID and the GID. In fact, - # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 - # and bug#13588). - am_max_uid=2097151 # 2^21 - 1 - am_max_gid=$am_max_uid - # The $UID and $GID variables are not portable, so we need to resort - # to the POSIX-mandated id(1) utility. Errors in the 'id' calls - # below are definitely unexpected, so allow the users to see them - # (that is, avoid stderr redirection). - am_uid=`id -u || echo unknown` - am_gid=`id -g || echo unknown` - AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) - if test $am_uid -le $am_max_uid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi - AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) - if test $am_gid -le $am_max_gid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi], + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break - [pax], - [], - - [m4_fatal([Unknown tar format])]) - - AC_MSG_CHECKING([how to create a $1 tar archive]) - - # Go ahead even if we have the value already cached. We do so because we - # need to set the values for the 'am__tar' and 'am__untar' variables. - _am_tools=${am_cv_prog_tar_$1-$_am_tools} - - for _am_tool in $_am_tools; do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works. - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi - done + # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir - AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) - AC_MSG_RESULT([$am_cv_prog_tar_$1])]) - +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR -m4_include([m4/ax_gcc_var_attribute.m4]) diff --git a/configure b/configure index ea75c846..f63f8031 100755 --- a/configure +++ b/configure @@ -1,22 +1,20 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for Grid 1.0. +# Generated by GNU Autoconf 2.63 for Grid 1.0. # # Report bugs to . # -# -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -# -# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -24,15 +22,23 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; esac + fi + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + as_nl=' ' export as_nl @@ -40,13 +46,7 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -57,7 +57,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in #( + case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -80,6 +80,13 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -89,16 +96,15 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( +case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done IFS=$as_save_IFS ;; @@ -110,16 +116,12 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 + { (exit 1); exit 1; } fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' @@ -131,294 +133,7 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: paboyle@ph.ed.ac.uk about your system, including any -$0: error possibly output before this message. Then install -$0: a modern shell, or manually run the script under such a -$0: shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - +# Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -432,12 +147,8 @@ else as_basename=false fi -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi +# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -457,19 +168,295 @@ $as_echo X/"$0" | } s/.*/./; q'` -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits +# CDPATH. +$as_unset CDPATH - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= @@ -486,12 +473,9 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). @@ -500,18 +484,29 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits exit } + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( +case `echo -n x` in -n*) - case `echo 'xy\c'` in + case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; + *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -526,29 +521,49 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' + as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -pR' + as_ln_s='cp -p' fi else - as_ln_s='cp -pR' + as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' + as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -as_test_x='test -x' -as_executable_p=as_fn_executable_p +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -557,11 +572,11 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -test -n "$DJDIR" || exec 7<&0 &1 + +exec 7<&0 &1 # Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` @@ -576,6 +591,7 @@ cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='Grid' @@ -583,7 +599,6 @@ PACKAGE_TARNAME='grid' PACKAGE_VERSION='1.0' PACKAGE_STRING='Grid 1.0' PACKAGE_BUGREPORT='paboyle@ph.ed.ac.uk' -PACKAGE_URL='' ac_unique_file="Grid.h" # Factoring default headers for most tests. @@ -640,7 +655,6 @@ CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE -am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE @@ -654,10 +668,6 @@ CPPFLAGS LDFLAGS CXXFLAGS CXX -AM_BACKSLASH -AM_DEFAULT_VERBOSITY -AM_DEFAULT_V -AM_V am__untar am__tar AMTAR @@ -711,7 +721,6 @@ bindir program_transform_name prefix exec_prefix -PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION @@ -722,7 +731,6 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking -enable_silent_rules enable_dependency_tracking enable_openmp enable_simd @@ -801,9 +809,8 @@ do fi case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. @@ -848,7 +855,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -874,7 +882,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1078,7 +1087,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1094,7 +1104,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1124,17 +1135,17 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" + -*) { $as_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1143,7 +1154,7 @@ Try \`$0 --help' for more information" $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac @@ -1151,13 +1162,15 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" + { $as_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1180,7 +1193,8 @@ do [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" + { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' @@ -1194,6 +1208,8 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1208,9 +1224,11 @@ test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" + { $as_echo "$as_me: error: working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } # Find the source files, if location was not specified. @@ -1249,11 +1267,13 @@ else fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" + { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then @@ -1293,7 +1313,7 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages + -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files @@ -1353,12 +1373,8 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-silent-rules less verbose build output (undo: "make V=1") - --disable-silent-rules verbose build output (undo: "make V=0") - --enable-dependency-tracking - do not reject slow dependency extractors - --disable-dependency-tracking - speeds up one-time build + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors --disable-openmp do not use OpenMP --enable-simd=SSE|AVX|AVX2|AVX512 Select instructions @@ -1369,7 +1385,7 @@ Some influential environment variables: LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags @@ -1442,522 +1458,21 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Grid configure 1.0 -generated by GNU Autoconf 2.69 +generated by GNU Autoconf 2.63 -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_cxx_try_compile LINENO -# ---------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_compile - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_type - -# ac_fn_c_find_uintX_t LINENO BITS VAR -# ------------------------------------ -# Finds an unsigned integer type with width BITS, setting cache variable VAR -# accordingly. -ac_fn_c_find_uintX_t () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 -$as_echo_n "checking for uint$2_t... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - # Order is important - never check a type that is potentially smaller - # than half of the expected target width. - for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ - 'unsigned long long int' 'unsigned short int' 'unsigned char'; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - case $ac_type in #( - uint$2_t) : - eval "$3=yes" ;; #( - *) : - eval "$3=\$ac_type" ;; -esac -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if eval test \"x\$"$3"\" = x"no"; then : - -else - break -fi - done -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_find_uintX_t - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Grid $as_me 1.0, which was -generated by GNU Autoconf 2.69. Invocation command line was +generated by GNU Autoconf 2.63. Invocation command line was $ $0 $@ @@ -1993,8 +1508,8 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done + $as_echo "PATH: $as_dir" +done IFS=$as_save_IFS } >&5 @@ -2031,9 +1546,9 @@ do ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) - as_fn_append ac_configure_args1 " '$ac_arg'" + ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else @@ -2049,13 +1564,13 @@ do -* ) ac_must_keep_next=true ;; esac fi - as_fn_append ac_configure_args " '$ac_arg'" + ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there @@ -2067,9 +1582,11 @@ trap 'exit_status=$? { echo - $as_echo "## ---------------- ## + cat <<\_ASBOX +## ---------------- ## ## Cache variables. ## -## ---------------- ##" +## ---------------- ## +_ASBOX echo # The following way of writing the cache mishandles newlines in values, ( @@ -2078,13 +1595,13 @@ trap 'exit_status=$? case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; + *) $as_unset $ac_var ;; esac ;; esac done @@ -2103,9 +1620,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - $as_echo "## ----------------- ## + cat <<\_ASBOX +## ----------------- ## ## Output variables. ## -## ----------------- ##" +## ----------------- ## +_ASBOX echo for ac_var in $ac_subst_vars do @@ -2118,9 +1637,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; echo if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## + cat <<\_ASBOX +## ------------------- ## ## File substitutions. ## -## ------------------- ##" +## ------------------- ## +_ASBOX echo for ac_var in $ac_subst_files do @@ -2134,9 +1655,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; fi if test -s confdefs.h; then - $as_echo "## ----------- ## + cat <<\_ASBOX +## ----------- ## ## confdefs.h. ## -## ----------- ##" +## ----------- ## +_ASBOX echo cat confdefs.h echo @@ -2150,39 +1673,37 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; exit $exit_status ' 0 for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h -$as_echo "/* confdefs.h */" > confdefs.h - # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF + cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF + cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF + cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF @@ -2191,12 +1712,7 @@ _ACEOF ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac + ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site @@ -2207,23 +1723,19 @@ fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 + if test -r "$ac_site_file"; then + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } + . "$ac_site_file" fi done if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; @@ -2231,7 +1743,7 @@ $as_echo "$as_me: loading cache $cache_file" >&6;} esac fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi @@ -2246,11 +1758,11 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; @@ -2260,17 +1772,17 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 + { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 + { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 + { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac @@ -2282,20 +1794,43 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 + { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## + + + + + + + + + + + + + + + + + + + + + + + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -2304,7 +1839,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -am__api_version='1.15' +am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -2323,7 +1858,9 @@ for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do fi done if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} + { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, @@ -2349,10 +1886,10 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : +if test "${ac_cv_path_install+set}" = set; then $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -2360,11 +1897,11 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -2372,7 +1909,7 @@ case $as_dir/ in #(( # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -2401,7 +1938,7 @@ case $as_dir/ in #(( ;; esac - done +done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir @@ -2417,7 +1954,7 @@ fi INSTALL=$ac_install_sh fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. @@ -2428,73 +1965,68 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; + { { $as_echo "$as_me:$LINENO: error: unsafe absolute working directory name" >&5 +$as_echo "$as_me: error: unsafe absolute working directory name" >&2;} + { (exit 1); exit 1; }; };; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; + { { $as_echo "$as_me:$LINENO: error: unsafe srcdir value: \`$srcdir'" >&5 +$as_echo "$as_me: error: unsafe srcdir value: \`$srcdir'" >&2;} + { (exit 1); exit 1; }; };; esac -# Do 'set' in a subshell so we don't clobber the current shell's +# Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done test "$2" = conftest.file ) then # Ok. : else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +$as_echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +{ $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi - -rm -f conftest.file - test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. @@ -2505,8 +2037,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# Expand $ac_aux_dir to an absolute path. -am_aux_dir=`cd "$ac_aux_dir" && pwd` +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2517,15 +2049,15 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " else am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi -if test x"${install_sh+set}" != xset; then +if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2534,17 +2066,17 @@ if test x"${install_sh+set}" != xset; then esac fi -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. +# will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : +if test "${ac_cv_prog_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then @@ -2555,24 +2087,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -2582,9 +2114,9 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then @@ -2595,24 +2127,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -2621,7 +2153,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -2634,10 +2166,10 @@ fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : + if test "${ac_cv_path_mkdir+set}" = set; then $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -2645,9 +2177,9 @@ for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do + for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ @@ -2657,12 +2189,11 @@ do esac done done - done +done IFS=$as_save_IFS fi - test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else @@ -2670,19 +2201,26 @@ fi # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. + test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : +if test "${ac_cv_prog_AWK+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then @@ -2693,24 +2231,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 + { $as_echo "$as_me:$LINENO: result: $AWK" >&5 $as_echo "$AWK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -2718,11 +2256,11 @@ fi test -n "$AWK" && break done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF @@ -2730,7 +2268,7 @@ SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; @@ -2740,11 +2278,11 @@ esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -2758,52 +2296,15 @@ else fi rmdir .tst 2>/dev/null -# Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : - enableval=$enable_silent_rules; -fi - -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=1;; -esac -am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' - if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -2847,72 +2348,19 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -mkdir_p='$(MKDIR_P)' +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. -# We need awk for the "check" target (and possibly the TAP driver). The -# system "awk" is bad on some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' +AMTAR=${AMTAR-"${am_missing_run}tar"} - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar pax cpio none' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 - fi -fi - - ac_config_headers="$ac_config_headers Grid_config.h" @@ -2932,9 +2380,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : +if test "${ac_cv_prog_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then @@ -2945,24 +2393,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 + { $as_echo "$as_me:$LINENO: result: $CXX" >&5 $as_echo "$CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -2976,9 +2424,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then @@ -2989,24 +2437,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3019,7 +2467,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3030,31 +2478,48 @@ fi fi fi # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" +{ (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3070,8 +2535,8 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 -$as_echo_n "checking whether the C++ compiler works... " >&6; } +{ $as_echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5 +$as_echo_n "checking for C++ compiler default output file name... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: @@ -3087,17 +2552,17 @@ do done rm -f $ac_rmfiles -if { { ac_try="$ac_link_default" +if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -3114,7 +2579,7 @@ do # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -3133,41 +2598,84 @@ test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C++ compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +{ { $as_echo "$as_me:$LINENO: error: C++ compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C++ compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 -$as_echo_n "checking for C++ compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } + ac_exeext=$ac_cv_exeext +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5 +$as_echo_n "checking whether the C++ compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" +if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -3182,83 +2690,32 @@ for ac_file in conftest.exe conftest conftest.*; do esac done else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : +if test "${ac_cv_objext+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3270,17 +2727,17 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" +if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -3293,23 +2750,31 @@ else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } fi + rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3323,16 +2788,37 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else - ac_compiler_gnu=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes @@ -3341,16 +2827,20 @@ else fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : +if test "${ac_cv_prog_cxx_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3361,11 +2851,35 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3376,12 +2890,36 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3392,17 +2930,42 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS @@ -3436,14 +2999,14 @@ am__doit: .PHONY: am__doit END # If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. +# Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -3464,19 +3027,18 @@ if test "$am__include" = "#"; then fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : +if test "${enable_dependency_tracking+set}" = set; then enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' - am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= @@ -3490,18 +3052,17 @@ fi depcc="$CXX" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -3535,16 +3096,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with '-c' and '-o' for the sake of the "dashmstdout" + # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -3553,16 +3114,16 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -3601,7 +3162,7 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type @@ -3624,9 +3185,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3637,24 +3198,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3664,9 +3225,9 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3677,24 +3238,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3703,7 +3264,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3717,9 +3278,9 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3730,24 +3291,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3757,9 +3318,9 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3771,18 +3332,18 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then @@ -3801,10 +3362,10 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3816,9 +3377,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3829,24 +3390,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3860,9 +3421,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3873,24 +3434,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3903,7 +3464,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3914,42 +3475,62 @@ fi fi -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" +{ (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : +if test "${ac_cv_c_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3963,16 +3544,37 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else - ac_compiler_gnu=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes @@ -3981,16 +3583,20 @@ else fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : +if test "${ac_cv_prog_cc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -4001,11 +3607,35 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -4016,12 +3646,36 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : else - ac_c_werror_flag=$ac_save_c_werror_flag + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -4032,17 +3686,42 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS @@ -4059,18 +3738,23 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : +if test "${ac_cv_prog_cc_c89+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include -struct stat; +#include +#include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); @@ -4122,9 +3806,32 @@ for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done @@ -4135,19 +3842,17 @@ fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 + { $as_echo "$as_me:$LINENO: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac -if test "x$ac_cv_prog_cc_c89" != xno; then : -fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -4155,79 +3860,19 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 - ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -4261,16 +3906,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with '-c' and '-o' for the sake of the "dashmstdout" + # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -4279,16 +3924,16 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -4327,7 +3972,7 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type @@ -4346,18 +3991,17 @@ fi OPENMP_CFLAGS= # Check whether --enable-openmp was given. -if test "${enable_openmp+set}" = set; then : +if test "${enable_openmp+set}" = set; then enableval=$enable_openmp; fi if test "$enable_openmp" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5 + { $as_echo "$as_me:$LINENO: checking for $CC option to support OpenMP" >&5 $as_echo_n "checking for $CC option to support OpenMP... " >&6; } -if ${ac_cv_prog_c_openmp+:} false; then : +if test "${ac_cv_prog_c_openmp+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + cat >conftest.$ac_ext <<_ACEOF #ifndef _OPENMP choke me @@ -4366,16 +4010,37 @@ else int main () { return omp_get_num_threads (); } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_prog_c_openmp='none needed' else - ac_cv_prog_c_openmp='unsupported' - for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ - -Popenmp --openmp; do + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_prog_c_openmp='unsupported' + for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp; do ac_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $ac_option" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + cat >conftest.$ac_ext <<_ACEOF #ifndef _OPENMP choke me @@ -4384,27 +4049,56 @@ else int main () { return omp_get_num_threads (); } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_prog_c_openmp=$ac_option +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext CFLAGS=$ac_save_CFLAGS if test "$ac_cv_prog_c_openmp" != unsupported; then break fi done fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_c_openmp" >&5 $as_echo "$ac_cv_prog_c_openmp" >&6; } case $ac_cv_prog_c_openmp in #( "none needed" | unsupported) - ;; #( + ;; #( *) - OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; + OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; esac fi @@ -4412,9 +4106,9 @@ $as_echo "$ac_cv_prog_c_openmp" >&6; } if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : +if test "${ac_cv_prog_RANLIB+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then @@ -4425,24 +4119,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 + { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4452,9 +4146,9 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then @@ -4465,24 +4159,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4491,7 +4185,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -4503,58 +4197,7 @@ fi # Checks for libraries. - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__((aligned))" >&5 -$as_echo_n "checking for __attribute__((aligned))... " >&6; } -if ${ax_cv_have_var_attribute_aligned+:} false; then : - $as_echo_n "(cached) " >&6 -else - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - - int foo __attribute__((aligned(32))); - -int -main () -{ - - - - ; - return 0; -} - -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if test -s conftest.err; then : - ax_cv_have_var_attribute_aligned=no -else - ax_cv_have_var_attribute_aligned=yes -fi -else - ax_cv_have_var_attribute_aligned=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_var_attribute_aligned" >&5 -$as_echo "$ax_cv_have_var_attribute_aligned" >&6; } - - if test yes = $ax_cv_have_var_attribute_aligned; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_VAR_ATTRIBUTE_ALIGNED 1 -_ACEOF - -fi - - - +#AX_GCC_VAR_ATTRIBUTE(aligned) # Checks for header files. ac_ext=c @@ -4562,14 +4205,14 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : + if test "${ac_cv_prog_CPP+set}" = set; then $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded @@ -4584,7 +4227,11 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4593,34 +4240,78 @@ do #endif Syntax error _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then break fi @@ -4632,7 +4323,7 @@ fi else ac_cv_prog_CPP=$CPP fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes @@ -4643,7 +4334,11 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4652,40 +4347,87 @@ do #endif Syntax error _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } +{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } fi ac_ext=c @@ -4695,9 +4437,9 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : +if test "${ac_cv_path_GREP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then @@ -4708,10 +4450,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do + for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in @@ -4728,7 +4470,7 @@ case `"$ac_path_GREP" --version 2>&1` in $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val + ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" @@ -4743,24 +4485,26 @@ esac $ac_path_GREP_found && break 3 done done - done +done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : +if test "${ac_cv_path_EGREP+set}" = set; then $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 @@ -4774,10 +4518,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do + for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in @@ -4794,7 +4538,7 @@ case `"$ac_path_EGREP" --version 2>&1` in $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val + ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" @@ -4809,10 +4553,12 @@ esac $ac_path_EGREP_found && break 3 done done - done +done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP @@ -4820,17 +4566,21 @@ fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : +if test "${ac_cv_header_stdc+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include @@ -4845,23 +4595,48 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else - ac_cv_header_stdc=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - + $EGREP "memchr" >/dev/null 2>&1; then + : else ac_cv_header_stdc=no fi @@ -4871,14 +4646,18 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - + $EGREP "free" >/dev/null 2>&1; then + : else ac_cv_header_stdc=no fi @@ -4888,10 +4667,14 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes; then : else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include @@ -4918,33 +4701,118 @@ main () return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : else - ac_cv_header_stdc=no + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -$as_echo "#define STDC_HEADERS 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -4954,36 +4822,453 @@ fi done + for ac_header in stdint.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" -if test "x$ac_cv_header_stdint_h" = xyes; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_STDINT_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done + for ac_header in malloc/malloc.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" -if test "x$ac_cv_header_malloc_malloc_h" = xyes; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_MALLOC_MALLOC_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done + for ac_header in malloc.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" -if test "x$ac_cv_header_malloc_h" = xyes; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_MALLOC_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -4992,9 +5277,102 @@ done # Checks for typedefs, structures, and compiler characteristics. -ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : +{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 +$as_echo_n "checking for size_t... " >&6; } +if test "${ac_cv_type_size_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_size_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (size_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((size_t))) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_type_size_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +$as_echo "$ac_cv_type_size_t" >&6; } +if test "x$ac_cv_type_size_t" = x""yes; then + : else cat >>confdefs.h <<_ACEOF @@ -5003,12 +5381,75 @@ _ACEOF fi -ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" -case $ac_cv_c_uint32_t in #( + + { $as_echo "$as_me:$LINENO: checking for uint32_t" >&5 +$as_echo_n "checking for uint32_t... " >&6; } +if test "${ac_cv_c_uint32_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_c_uint32_t=no + for ac_type in 'uint32_t' 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) -1 >> (32 - 1) == 1)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + case $ac_type in + uint32_t) ac_cv_c_uint32_t=yes ;; + *) ac_cv_c_uint32_t=$ac_type ;; +esac + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_uint32_t" != no && break + done +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_uint32_t" >&5 +$as_echo "$ac_cv_c_uint32_t" >&6; } + case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) -$as_echo "#define _UINT32_T 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define _UINT32_T 1 +_ACEOF cat >>confdefs.h <<_ACEOF @@ -5017,12 +5458,75 @@ _ACEOF ;; esac -ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" -case $ac_cv_c_uint64_t in #( + + { $as_echo "$as_me:$LINENO: checking for uint64_t" >&5 +$as_echo_n "checking for uint64_t... " >&6; } +if test "${ac_cv_c_uint64_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_c_uint64_t=no + for ac_type in 'uint64_t' 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) -1 >> (64 - 1) == 1)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + case $ac_type in + uint64_t) ac_cv_c_uint64_t=yes ;; + *) ac_cv_c_uint64_t=$ac_type ;; +esac + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_uint64_t" != no && break + done +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_uint64_t" >&5 +$as_echo "$ac_cv_c_uint64_t" >&6; } + case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) -$as_echo "#define _UINT64_T 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define _UINT64_T 1 +_ACEOF cat >>confdefs.h <<_ACEOF @@ -5033,12 +5537,102 @@ _ACEOF # Checks for library functions. + for ac_func in gettimeofday -do : - ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" -if test "x$ac_cv_func_gettimeofday" = xyes; then : +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_GETTIMEOFDAY 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -5046,7 +5640,7 @@ done # Check whether --enable-simd was given. -if test "${enable_simd+set}" = set; then : +if test "${enable_simd+set}" = set; then enableval=$enable_simd; ac_SIMD=${enable_simd} else ac_SIMD=AVX2 @@ -5057,29 +5651,39 @@ case ${ac_SIMD} in SSE2) echo Configuring for SSE2 -$as_echo "#define SSE2 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define SSE2 1 +_ACEOF ;; AVX) echo Configuring for AVX -$as_echo "#define AVX1 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define AVX1 1 +_ACEOF ;; AVX2) echo Configuring for AVX2 -$as_echo "#define AVX2 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define AVX2 1 +_ACEOF ;; AVX512) echo Configuring for AVX512 -$as_echo "#define AVX512 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define AVX512 1 +_ACEOF ;; *) - as_fn_error $? "${ac_SIMD} unsupported --enable-simd option" "$LINENO" 5; + { { $as_echo "$as_me:$LINENO: error: ${ac_SIMD} unsupported --enable-simd option" >&5 +$as_echo "$as_me: error: ${ac_SIMD} unsupported --enable-simd option" >&2;} + { (exit 1); exit 1; }; }; ;; esac @@ -5112,13 +5716,13 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; + *) $as_unset $ac_var ;; esac ;; esac done @@ -5126,8 +5730,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" @@ -5149,23 +5753,12 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi + cat confcache >$cache_file else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi @@ -5179,29 +5772,20 @@ DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= -U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' @@ -5211,26 +5795,34 @@ else fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } fi -: "${CONFIG_STATUS=./config.status}" +: ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -5240,18 +5832,17 @@ cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 debug=false ac_cs_recheck=false ac_cs_silent=false - SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -5259,15 +5850,23 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; esac + fi + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + as_nl=' ' export as_nl @@ -5275,13 +5874,7 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -5292,7 +5885,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in #( + case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -5315,6 +5908,13 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -5324,16 +5924,15 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( +case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done IFS=$as_save_IFS ;; @@ -5345,16 +5944,12 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 + { (exit 1); exit 1; } fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' @@ -5366,89 +5961,7 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - +# Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -5462,12 +5975,8 @@ else as_basename=false fi -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi +# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -5487,25 +5996,76 @@ $as_echo X/"$0" | } s/.*/./; q'` -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( +case `echo -n x` in -n*) - case `echo 'xy\c'` in + case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; + *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -5520,85 +6080,49 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' + as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -pR' + as_ln_s='cp -p' fi else - as_ln_s='cp -pR' + as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' + as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -5608,19 +6132,13 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to +# Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Grid $as_me 1.0, which was -generated by GNU Autoconf 2.69. Invocation command line was +generated by GNU Autoconf 2.63. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -5652,15 +6170,13 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. +\`$as_me' instantiates files from templates according to the +current configuration. -Usage: $0 [OPTION]... [TAG]... +Usage: $0 [OPTION]... [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit - --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files @@ -5679,17 +6195,16 @@ $config_headers Configuration commands: $config_commands -Report bugs to ." +Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Grid config.status 1.0 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2008 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -5707,16 +6222,11 @@ ac_need_defaults=: while test $# != 0 do case $1 in - --*=?*) + --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; *) ac_option=$1 ac_optarg=$2 @@ -5730,29 +6240,27 @@ do ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; esac - as_fn_append CONFIG_FILES " '$ac_optarg'" + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ @@ -5760,10 +6268,11 @@ Try \`$0 --help' for more information.";; ac_cs_silent=: ;; # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; + -*) { $as_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; - *) as_fn_append ac_config_targets " $1" + *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac @@ -5780,7 +6289,7 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' @@ -5818,7 +6327,9 @@ do "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; esac done @@ -5841,24 +6352,26 @@ fi # after its creation but before its name has been assigned to `$tmp'. $debug || { - tmp= ac_tmp= + tmp= trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 - trap 'as_fn_exit 1' 1 2 13 15 + trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" + test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -5866,13 +6379,7 @@ ac_tmp=$tmp if test -n "$CONFIG_FILES"; then -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi +ac_cr=' ' ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' @@ -5880,7 +6387,7 @@ else ac_cs_awk_cr=$ac_cr fi -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF @@ -5889,18 +6396,24 @@ _ACEOF echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -5908,7 +6421,7 @@ done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h @@ -5922,7 +6435,7 @@ s/'"$ac_delim"'$// t delim :nl h -s/\(.\{148\}\)..*/\1/ +s/\(.\{148\}\).*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p @@ -5936,7 +6449,7 @@ s/.\{148\}// t nl :delim h -s/\(.\{148\}\)..*/\1/ +s/\(.\{148\}\).*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p @@ -5956,7 +6469,7 @@ t delim rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && +cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" @@ -5988,29 +6501,23 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } _ACEOF -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// s/^[^=]*=[ ]*$// }' fi @@ -6022,7 +6529,7 @@ fi # test -n "$CONFIG_FILES" # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || +cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF @@ -6034,11 +6541,13 @@ _ACEOF # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then break elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -6123,7 +6632,9 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } fi # test -n "$CONFIG_HEADERS" @@ -6136,7 +6647,9 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -6155,7 +6668,7 @@ do for ac_f do case $ac_f in - -) ac_f="$ac_tmp/stdin";; + -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. @@ -6164,10 +6677,12 @@ do [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" + ac_file_inputs="$ac_file_inputs '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't @@ -6178,7 +6693,7 @@ do `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. @@ -6190,8 +6705,10 @@ $as_echo "$as_me: creating $ac_file" >&6;} esac case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; esac ;; esac @@ -6219,7 +6736,47 @@ $as_echo X"$ac_file" | q } s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in @@ -6276,6 +6833,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= + ac_sed_dataroot=' /datarootdir/ { p @@ -6285,11 +6843,12 @@ ac_sed_dataroot=' /@docdir@/p /@infodir@/p /@localedir@/p -/@mandir@/p' +/@mandir@/p +' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 @@ -6299,7 +6858,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; + s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF @@ -6327,24 +6886,27 @@ s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} +which seems to be undefined. Please make sure it is defined." >&2;} - rm -f "$ac_tmp/stdin" + rm -f "$tmp/stdin" case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; :H) # @@ -6353,21 +6915,27 @@ which seems to be undefined. Please make sure it is defined" >&2;} if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } fi else $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" @@ -6405,7 +6973,7 @@ $as_echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac @@ -6413,7 +6981,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Older Autoconf quotes --file arguments for eval, but not when files + # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -6426,7 +6994,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but + # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -6460,19 +7028,21 @@ $as_echo X"$mf" | continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. + # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue + test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || @@ -6498,7 +7068,47 @@ $as_echo X"$file" | q } s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p + { as_dir=$dirpart/$fdir + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done @@ -6510,12 +7120,15 @@ $as_echo X"$file" | done # for ac_tag -as_fn_exit 0 +{ (exit 0); exit 0; } _ACEOF +chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } # configure is writing to config.log, and then calls config.status. @@ -6536,10 +7149,10 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 + $ac_cs_success || { (exit 1); exit 1; } fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 + { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi diff --git a/configure.ac b/configure.ac index d007df0e..becb98dd 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,4 @@ # Process this file with autoconf to produce a configure script. -AC_PREREQ([2.69]) AC_INIT([Grid], [1.0], [paboyle@ph.ed.ac.uk]) AM_INIT_AUTOMAKE AC_CONFIG_MACRO_DIR([m4]) @@ -12,7 +11,7 @@ AC_OPENMP AC_PROG_RANLIB # Checks for libraries. -AX_GCC_VAR_ATTRIBUTE(aligned) +#AX_GCC_VAR_ATTRIBUTE(aligned) # Checks for header files. AC_CHECK_HEADERS(stdint.h) From a8238d0b25af98b623ec5f16f949e74e96eb4ced Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 4 Mar 2015 13:43:19 +0000 Subject: [PATCH 016/429] Move to better name --- Grid_init.cc | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100755 Grid_init.cc diff --git a/Grid_init.cc b/Grid_init.cc new file mode 100755 index 00000000..e943c3b0 --- /dev/null +++ b/Grid_init.cc @@ -0,0 +1,82 @@ +/****************************************************************************/ +/* PAB: Signal magic. Processor state dump is x86-64 specific */ +/****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Grid.h" + +#undef __X86_64 +namespace dpo { + +void Grid_init(void) +{ + Grid_debug_handler_init(); +} +double usecond(void) { + struct timeval tv; + gettimeofday(&tv,NULL); + return 1.0*tv.tv_usec + 1.0e6*tv.tv_sec; +} + +void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr) +{ + ucontext_t * uc= (ucontext_t *)ptr; + + printf("Caught signal %d\n",si->si_signo); + printf(" mem address %llx\n",(uint64_t)si->si_addr); + printf(" code %d\n",si->si_code); + +#ifdef __X86_64 + struct sigcontext *sc = (struct sigcontext *)&uc->uc_mcontext; + printf(" instruction %llx\n",(uint64_t)sc->rip); + +#define REG(A) printf(" %s %lx\n",#A, sc-> A); + REG(rdi); + REG(rsi); + REG(rbp); + REG(rbx); + REG(rdx); + REG(rax); + REG(rcx); + REG(rsp); + REG(rip); + + + REG(r8); + REG(r9); + REG(r10); + REG(r11); + REG(r12); + REG(r13); + REG(r14); + REG(r15); +#endif + + fflush(stdout); + + if ( si->si_signo == SIGSEGV ) { + printf("Grid_sa_signal_handler: Oops... this was a sigsegv you naughty naughty programmer. Goodbye\n"); + fflush(stdout); + exit(-1); + } + return; +}; + +void Grid_debug_handler_init(void) +{ + struct sigaction sa,osa; + sigemptyset (&sa.sa_mask); + sa.sa_sigaction= Grid_sa_signal_handler; + sa.sa_flags = SA_SIGINFO; + sigaction(SIGSEGV,&sa,NULL); + sigaction(SIGTRAP,&sa,NULL); +} +} From d9054f67fde53bef0088f259757eddca894de659 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 4 Mar 2015 13:43:48 +0000 Subject: [PATCH 017/429] remove --- Grid_signal.cc | 82 -------------------------------------------------- 1 file changed, 82 deletions(-) delete mode 100755 Grid_signal.cc diff --git a/Grid_signal.cc b/Grid_signal.cc deleted file mode 100755 index e943c3b0..00000000 --- a/Grid_signal.cc +++ /dev/null @@ -1,82 +0,0 @@ -/****************************************************************************/ -/* PAB: Signal magic. Processor state dump is x86-64 specific */ -/****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Grid.h" - -#undef __X86_64 -namespace dpo { - -void Grid_init(void) -{ - Grid_debug_handler_init(); -} -double usecond(void) { - struct timeval tv; - gettimeofday(&tv,NULL); - return 1.0*tv.tv_usec + 1.0e6*tv.tv_sec; -} - -void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr) -{ - ucontext_t * uc= (ucontext_t *)ptr; - - printf("Caught signal %d\n",si->si_signo); - printf(" mem address %llx\n",(uint64_t)si->si_addr); - printf(" code %d\n",si->si_code); - -#ifdef __X86_64 - struct sigcontext *sc = (struct sigcontext *)&uc->uc_mcontext; - printf(" instruction %llx\n",(uint64_t)sc->rip); - -#define REG(A) printf(" %s %lx\n",#A, sc-> A); - REG(rdi); - REG(rsi); - REG(rbp); - REG(rbx); - REG(rdx); - REG(rax); - REG(rcx); - REG(rsp); - REG(rip); - - - REG(r8); - REG(r9); - REG(r10); - REG(r11); - REG(r12); - REG(r13); - REG(r14); - REG(r15); -#endif - - fflush(stdout); - - if ( si->si_signo == SIGSEGV ) { - printf("Grid_sa_signal_handler: Oops... this was a sigsegv you naughty naughty programmer. Goodbye\n"); - fflush(stdout); - exit(-1); - } - return; -}; - -void Grid_debug_handler_init(void) -{ - struct sigaction sa,osa; - sigemptyset (&sa.sa_mask); - sa.sa_sigaction= Grid_sa_signal_handler; - sa.sa_flags = SA_SIGINFO; - sigaction(SIGSEGV,&sa,NULL); - sigaction(SIGTRAP,&sa,NULL); -} -} From 82eeb9d07e58ce5b91a14481b59b9198dd32aa76 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 4 Mar 2015 13:44:33 +0000 Subject: [PATCH 018/429] Improving --- Grid.h | 2 +- Grid_config.h | 8 ++++---- Makefile.am | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Grid.h b/Grid.h index f73d52ba..5a3571e4 100644 --- a/Grid.h +++ b/Grid.h @@ -27,7 +27,7 @@ //////////////////////////////////////////////////////////// // Tunable header includes //////////////////////////////////////////////////////////// -#define HAVE_OPENMP + #ifdef HAVE_OPENMP #define OMP #include diff --git a/Grid_config.h b/Grid_config.h index 12eeb8ac..64003419 100644 --- a/Grid_config.h +++ b/Grid_config.h @@ -2,13 +2,13 @@ /* Grid_config.h.in. Generated from configure.ac by autoheader. */ /* AVX */ -/* #undef AVX1 */ +#define AVX1 1 /* AVX2 */ /* #undef AVX2 */ /* AVX512 */ -#define AVX512 1 +/* #undef AVX512 */ /* Define to 1 if you have the `gettimeofday' function. */ #define HAVE_GETTIMEOFDAY 1 @@ -17,10 +17,10 @@ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the header file. */ -#define HAVE_MALLOC_H 1 +/* #undef HAVE_MALLOC_H */ /* Define to 1 if you have the header file. */ -/* #undef HAVE_MALLOC_MALLOC_H */ +#define HAVE_MALLOC_MALLOC_H 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 diff --git a/Makefile.am b/Makefile.am index b6c2ef16..13c2484b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,7 +5,7 @@ AM_CXXFLAGS = -I$(top_srcdir)/ # Libraries # lib_LIBRARIES = libGrid.a -libGrid_a_SOURCES = Grid_signal.cc +libGrid_a_SOURCES = Grid_init.cc # # Include files From 483cab34ab3982635b17c5600975df58e95b5db3 Mon Sep 17 00:00:00 2001 From: paboyle Date: Sat, 7 Mar 2015 07:00:39 +0000 Subject: [PATCH 019/429] Update AUTHORS --- AUTHORS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/AUTHORS b/AUTHORS index e69de29b..4ec04f53 100644 --- a/AUTHORS +++ b/AUTHORS @@ -0,0 +1,5 @@ +Peter Boyle +Azusa Yamaguchi +Intel Parallel Computing Centre @ Higgs Centre for Theoretical Physics +University of Edinburgh +Scotland, UK From 1e08841fa5b9f49a91e0bdd558b5680436ab96a8 Mon Sep 17 00:00:00 2001 From: paboyle Date: Sat, 7 Mar 2015 07:09:09 +0000 Subject: [PATCH 020/429] Update INSTALL --- INSTALL | 86 ++++++--------------------------------------------------- 1 file changed, 8 insertions(+), 78 deletions(-) diff --git a/INSTALL b/INSTALL index 20998407..9996b52c 100644 --- a/INSTALL +++ b/INSTALL @@ -102,9 +102,13 @@ for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here -is an example: +is are examples: - ./configure CC=c99 CFLAGS=-g LIBS=-lposix + ./configure CXX=clang++ CXXFLAGS="-std=c++11 -O3 -mavx" --enable-simd=AVX1 + + ./configure CXX=clang++ CXXFLAGS="-std=c++11 -O3 -mavx2" --enable-simd=AVX2 + + ./configure CXX=icpc CXXFLAGS="-std=c++11 -O3 -mmic" --enable-simd=AVX512 --host=none *Note Defining Variables::, for more details. @@ -124,19 +128,6 @@ architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. - On MacOS X 10.5 and later systems, you can create libraries and -executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like -this: - - ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CPP="gcc -E" CXXCPP="g++ -E" - - This is not guaranteed to produce working output in all cases, you -may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. Installation Names ================== @@ -218,70 +209,9 @@ overridden with `make V=0'. Particular systems ================== - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in -order to use an ANSI C compiler: +Cross compiling for native execution on XeonPhi requires - ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" - -and if that doesn't work, install pre-built binaries of GCC for HP-UX. - - HP-UX `make' updates targets which have the same time stamps as -their prerequisites, which makes it generally unusable when shipped -generated files such as `configure' are involved. Use GNU `make' -instead. - - On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try - - ./configure CC="cc" - -and if that doesn't work, try - - ./configure CC="cc -nodtk" - - On Solaris, don't put `/usr/ucb' early in your `PATH'. This -directory contains several dysfunctional programs; working variants of -these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -in your `PATH', put it _after_ `/usr/bin'. - - On Haiku, software installed for all users goes in `/boot/common', -not `/usr/local'. It is recommended to use the following options: - - ./configure --prefix=/boot/common - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS - KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. + --build=none Sharing Defaults ================ From f04b6312c8bba06d33bce0234b3a9f4f8c9d370f Mon Sep 17 00:00:00 2001 From: paboyle Date: Sat, 7 Mar 2015 07:19:01 +0000 Subject: [PATCH 021/429] Update README --- README | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/README b/README index e69de29b..41b66b6b 100644 --- a/README +++ b/README @@ -0,0 +1,42 @@ +This library provides data parallel C++ container classes with internal memory layout +that is transformed to map efficiently to SIMD architectures. CSHIFT facilities +are provided, similar to HPF and cmfortran, and user control is given over the mapping of +array indices to both MPI tasks and SIMD processing elements. + +* Identically shaped arrays then be processed with perfect data parallelisation. +* Such identically shapped arrays are called conformable arrays. + +The transformation is based on the observation that Cartesian array processing involves +identical processing to be performed on different regions of the Cartesian array. + +The library will (eventually) both geometrically decompose into MPI tasks and across SIMD lanes. + +Data parallel array operations can then be specified with a SINGLE data parallel paradigm, but +optimally use MPI, OpenMP and SIMD parallelism under the hood. This is a significant simplification +for most programmers. + +The layout transformations are parametrised by the SIMD vector length. This adapts according to the architecture. +Presently SSE2 (128 bit) AVX, AVX2 (256 bit) and IMCI and AVX512 (512 bit) targets are supported. + +These are presented as + + vRealF, vRealD, vComplexF, vComplexD + +internal vector data types. These may be useful in themselves for other programmers. +The corresponding scalar types are named + + RealF, RealD, ComplexF, ComplexD + +MPI parallelism is UNIMPLEMENTED and for now only OpenMP and SIMD parallelism is present in the library. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is are examples: + + ./configure CXX=clang++ CXXFLAGS="-std=c++11 -O3 -mavx" --enable-simd=AVX1 + + ./configure CXX=clang++ CXXFLAGS="-std=c++11 -O3 -mavx2" --enable-simd=AVX2 + + ./configure CXX=icpc CXXFLAGS="-std=c++11 -O3 -mmic" --enable-simd=AVX512 --host=none + + From 886df6ed1e8afc76bb7fab10d096e7bfbc7f7a30 Mon Sep 17 00:00:00 2001 From: paboyle Date: Sat, 7 Mar 2015 07:20:12 +0000 Subject: [PATCH 022/429] Update README.md --- README.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/README.md b/README.md index 9f2e51a6..42537417 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,45 @@ # Grid Data parallel C++ mathematical object library + +This library provides data parallel C++ container classes with internal memory layout +that is transformed to map efficiently to SIMD architectures. CSHIFT facilities +are provided, similar to HPF and cmfortran, and user control is given over the mapping of +array indices to both MPI tasks and SIMD processing elements. + +* Identically shaped arrays then be processed with perfect data parallelisation. +* Such identically shapped arrays are called conformable arrays. + +The transformation is based on the observation that Cartesian array processing involves +identical processing to be performed on different regions of the Cartesian array. + +The library will (eventually) both geometrically decompose into MPI tasks and across SIMD lanes. + +Data parallel array operations can then be specified with a SINGLE data parallel paradigm, but +optimally use MPI, OpenMP and SIMD parallelism under the hood. This is a significant simplification +for most programmers. + +The layout transformations are parametrised by the SIMD vector length. This adapts according to the architecture. +Presently SSE2 (128 bit) AVX, AVX2 (256 bit) and IMCI and AVX512 (512 bit) targets are supported. + +These are presented as + + vRealF, vRealD, vComplexF, vComplexD + +internal vector data types. These may be useful in themselves for other programmers. +The corresponding scalar types are named + + RealF, RealD, ComplexF, ComplexD + +MPI parallelism is UNIMPLEMENTED and for now only OpenMP and SIMD parallelism is present in the library. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is are examples: + + ./configure CXX=clang++ CXXFLAGS="-std=c++11 -O3 -mavx" --enable-simd=AVX1 + + ./configure CXX=clang++ CXXFLAGS="-std=c++11 -O3 -mavx2" --enable-simd=AVX2 + + ./configure CXX=icpc CXXFLAGS="-std=c++11 -O3 -mmic" --enable-simd=AVX512 --host=none + + From 196fd203e246546749db358c4582b33ee40c6cf7 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 29 Mar 2015 20:35:37 +0100 Subject: [PATCH 023/429] Fixing the Checkerboarding cshift. Implemented "fake" communications in preparation for the leap to MPI. --- Grid/Grid.xcodeproj/project.pbxproj | 239 +++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 4124 bytes .../pab.xcuserdatad/xcschemes/Grid.xcscheme | 43 ++ .../xcschemes/xcschememanagement.plist | 22 + Grid_Cartesian.h | 184 ++++++--- Grid_Communicator.h | 39 ++ Grid_Lattice.h | 299 ++++---------- Grid_QCD.h | 1 - Grid_config.h | 12 + Grid_fake.cc | 34 ++ Grid_fake_cshift.h | 246 +++++++++++ Grid_init.cc | 4 +- Grid_main.cc | 124 ++++-- Grid_math_types.h | 113 +++++- Grid_mpi.cc | 85 ++++ Grid_mpi_cshift.h | 384 ++++++++++++++++++ Grid_none_cshift.h | 313 ++++++++++++++ Grid_simd.h | 4 +- Grid_vComplexD.h | 46 ++- Grid_vComplexF.h | 47 ++- Grid_vRealD.h | 35 ++ Grid_vRealF.h | 38 +- 23 files changed, 1976 insertions(+), 343 deletions(-) create mode 100644 Grid/Grid.xcodeproj/project.pbxproj create mode 100644 Grid/Grid.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Grid/Grid.xcodeproj/project.xcworkspace/xcuserdata/pab.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Grid/Grid.xcodeproj/xcuserdata/pab.xcuserdatad/xcschemes/Grid.xcscheme create mode 100644 Grid/Grid.xcodeproj/xcuserdata/pab.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Grid_Communicator.h create mode 100644 Grid_fake.cc create mode 100644 Grid_fake_cshift.h create mode 100644 Grid_mpi.cc create mode 100644 Grid_mpi_cshift.h create mode 100644 Grid_none_cshift.h diff --git a/Grid/Grid.xcodeproj/project.pbxproj b/Grid/Grid.xcodeproj/project.pbxproj new file mode 100644 index 00000000..20cd1d1a --- /dev/null +++ b/Grid/Grid.xcodeproj/project.pbxproj @@ -0,0 +1,239 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0BF5DA461AC370840045EA34 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0BF5DA451AC370840045EA34 /* main.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 0BF5DA401AC370840045EA34 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0BF5DA421AC370840045EA34 /* Grid */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Grid; sourceTree = BUILT_PRODUCTS_DIR; }; + 0BF5DA451AC370840045EA34 /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 0BF5DA3F1AC370840045EA34 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0BF5DA391AC370840045EA34 = { + isa = PBXGroup; + children = ( + 0BF5DA441AC370840045EA34 /* Grid */, + 0BF5DA431AC370840045EA34 /* Products */, + ); + sourceTree = ""; + }; + 0BF5DA431AC370840045EA34 /* Products */ = { + isa = PBXGroup; + children = ( + 0BF5DA421AC370840045EA34 /* Grid */, + ); + name = Products; + sourceTree = ""; + }; + 0BF5DA441AC370840045EA34 /* Grid */ = { + isa = PBXGroup; + children = ( + 0BF5DA451AC370840045EA34 /* main.cpp */, + ); + path = Grid; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 0BF5DA411AC370840045EA34 /* Grid */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0BF5DA491AC370840045EA34 /* Build configuration list for PBXNativeTarget "Grid" */; + buildPhases = ( + 0BF5DA3E1AC370840045EA34 /* Sources */, + 0BF5DA3F1AC370840045EA34 /* Frameworks */, + 0BF5DA401AC370840045EA34 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Grid; + productName = Grid; + productReference = 0BF5DA421AC370840045EA34 /* Grid */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0BF5DA3A1AC370840045EA34 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0610; + ORGANIZATIONNAME = "University of Edinburgh"; + TargetAttributes = { + 0BF5DA411AC370840045EA34 = { + CreatedOnToolsVersion = 6.1.1; + }; + }; + }; + buildConfigurationList = 0BF5DA3D1AC370840045EA34 /* Build configuration list for PBXProject "Grid" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 0BF5DA391AC370840045EA34; + productRefGroup = 0BF5DA431AC370840045EA34 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 0BF5DA411AC370840045EA34 /* Grid */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 0BF5DA3E1AC370840045EA34 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0BF5DA461AC370840045EA34 /* main.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 0BF5DA471AC370840045EA34 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 0BF5DA481AC370840045EA34 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + 0BF5DA4A1AC370840045EA34 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 0BF5DA4B1AC370840045EA34 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0BF5DA3D1AC370840045EA34 /* Build configuration list for PBXProject "Grid" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0BF5DA471AC370840045EA34 /* Debug */, + 0BF5DA481AC370840045EA34 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 0BF5DA491AC370840045EA34 /* Build configuration list for PBXNativeTarget "Grid" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0BF5DA4A1AC370840045EA34 /* Debug */, + 0BF5DA4B1AC370840045EA34 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0BF5DA3A1AC370840045EA34 /* Project object */; +} diff --git a/Grid/Grid.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Grid/Grid.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..ce76f4f5 --- /dev/null +++ b/Grid/Grid.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Grid/Grid.xcodeproj/project.xcworkspace/xcuserdata/pab.xcuserdatad/UserInterfaceState.xcuserstate b/Grid/Grid.xcodeproj/project.xcworkspace/xcuserdata/pab.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..638ce019b327e05f2249ae344a55de843e067d13 GIT binary patch literal 4124 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 H + + + + + + + + + + + + + + + + + + diff --git a/Grid/Grid.xcodeproj/xcuserdata/pab.xcuserdatad/xcschemes/xcschememanagement.plist b/Grid/Grid.xcodeproj/xcuserdata/pab.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..1d4ba5a6 --- /dev/null +++ b/Grid/Grid.xcodeproj/xcuserdata/pab.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + Grid.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 0BF5DA411AC370840045EA34 + + primary + + + + + diff --git a/Grid_Cartesian.h b/Grid_Cartesian.h index 488d47e9..bfe301a9 100644 --- a/Grid_Cartesian.h +++ b/Grid_Cartesian.h @@ -1,10 +1,9 @@ #ifndef GRID_CARTESIAN_H #define GRID_CARTESIAN_H -#include "Grid.h" - +#include +#include namespace dpo{ - ///////////////////////////////////////////////////////////////////////////////////////// // Grid Support. Following will go into Grid.h. @@ -13,28 +12,47 @@ namespace dpo{ // dpo::Grid // dpo::GridCartesian // dpo::GridCartesianRedBlack - -class Grid { + + +class SimdGrid : public CartesianCommunicator { public: + + + SimdGrid(std::vector & processor_grid) : CartesianCommunicator(processor_grid) {}; + // Give Lattice access template friend class Lattice; - //protected: - // Lattice wide random support. not yet fully implemented. Need seed strategy - // and one generator per site. - //std::default_random_engine generator; + // Lattice wide random support. not yet fully implemented. Need seed strategy + // and one generator per site. + //std::default_random_engine generator; // static std::mt19937 generator( 9 ); - // Grid information. - unsigned long _ndimension; - std::vector _layout; // Which dimensions get relayed out over simd lanes. - std::vector _dimensions; // Dimensions of array - std::vector _rdimensions;// Reduced dimensions with simd lane images removed + + // Commicator provides + // unsigned long _ndimension; + // std::vector _processors; // processor grid + // int _processor; // linear processor rank + // std::vector _processor_coor; // linear processor rank + + std::vector _simd_layout; // Which dimensions get relayed out over simd lanes. + + + std::vector _fdimensions;// Global dimensions of array with cb removed + std::vector _gdimensions;// Global dimensions of array + std::vector _ldimensions;// local dimensions of array with processor images removed + std::vector _rdimensions;// Reduced local dimensions with simd lane images and processor images removed + + // std::vector _lstart; // local start of array in gcoors. _processor_coor[d]*_ldimensions[d] + // std::vector _lend; // local end of array in gcoors _processor_coor[d]*_ldimensions[d]+_ldimensions_[d]-1 + + std::vector _ostride; // Outer stride for each dimension std::vector _istride; // Inner stride i.e. within simd lane + int _osites; // _isites*_osites = product(dimensions). int _isites; @@ -70,15 +88,33 @@ public: for(int d=0;d<_ndimension;d++) idx+=_istride[d]*(rcoor[d]/_rdimensions[d]); return idx; } - + inline int oSites(void) { return _osites; }; inline int iSites(void) { return _isites; }; + + inline int CheckerboardFromOsite (int Osite){ + std::vector ocoor; + CoordFromOsite(ocoor,Osite); + int ss=0; + for(int d=0;d<_ndimension;d++){ + ss=ss+ocoor[d]; + } + return ss&0x1; + } + inline void CoordFromOsite (std::vector& coor,int Osite){ + coor.resize(_ndimension); + for(int d=0;d<_ndimension;d++){ + coor[d] = Osite % _rdimensions[d]; + Osite = Osite / _rdimensions[d]; + } + } + virtual int CheckerBoard(std::vector site)=0; virtual int CheckerBoardDestination(int source_cb,int shift)=0; - virtual int CheckerBoardShift(int source_cb,int dim,int shift)=0; + virtual int CheckerBoardShift(int source_cb,int dim,int shift,int osite)=0; }; -class GridCartesian: public Grid { +class GridCartesian: public SimdGrid { public: virtual int CheckerBoard(std::vector site){ return 0; @@ -86,19 +122,24 @@ public: virtual int CheckerBoardDestination(int cb,int shift){ return 0; } - virtual int CheckerBoardShift(int source_cb,int dim,int shift){ + virtual int CheckerBoardShift(int source_cb,int dim,int shift, int osite){ return shift; } - GridCartesian(std::vector &dimensions,std::vector layout) + GridCartesian(std::vector &dimensions, + std::vector &simd_layout, + std::vector &processor_grid + ) : SimdGrid(processor_grid) { /////////////////////// // Grid information /////////////////////// _ndimension = dimensions.size(); - _dimensions.resize(_ndimension); + _fdimensions.resize(_ndimension); + _gdimensions.resize(_ndimension); + _ldimensions.resize(_ndimension); _rdimensions.resize(_ndimension); - _layout.resize(_ndimension); + _simd_layout.resize(_ndimension); _ostride.resize(_ndimension); _istride.resize(_ndimension); @@ -106,21 +147,26 @@ public: _osites = 1; _isites = 1; for(int d=0;d<_ndimension;d++){ - _dimensions[d] = dimensions[d]; - _layout[d] = layout[d]; - // Use a reduced simd grid - _rdimensions[d]= _dimensions[d]/_layout[d]; //<-- _layout[d] is zero - _osites *= _rdimensions[d]; - _isites *= _layout[d]; + _fdimensions[d] = dimensions[d]; // Global dimensions + _gdimensions[d] = _fdimensions[d]; // Global dimensions + _simd_layout[d] = simd_layout[d]; + + //FIXME check for exact division + + // Use a reduced simd grid + _ldimensions[d]= _gdimensions[d]/_processors[d]; //local dimensions + _rdimensions[d]= _ldimensions[d]/_simd_layout[d]; //overdecomposition + _osites *= _rdimensions[d]; + _isites *= _simd_layout[d]; - // Addressing support - if ( d==0 ) { - _ostride[d] = 1; - _istride[d] = 1; - } else { - _ostride[d] = _ostride[d-1]*_rdimensions[d-1]; - _istride[d] = _istride[d-1]*_layout[d-1]; - } + // Addressing support + if ( d==0 ) { + _ostride[d] = 1; + _istride[d] = 1; + } else { + _ostride[d] = _ostride[d-1]*_rdimensions[d-1]; + _istride[d] = _istride[d-1]*_simd_layout[d-1]; + } } /////////////////////// @@ -148,46 +194,57 @@ public: } }; }; - + // Specialise this for red black grids storing half the data like a chess board. -class GridRedBlackCartesian : public Grid +class GridRedBlackCartesian : public SimdGrid { public: virtual int CheckerBoard(std::vector site){ - return site[0]&0x1; + return (site[0]+site[1]+site[2]+site[3])&0x1; } - virtual int CheckerBoardShift(int source_cb,int dim,int shift){ - if ( dim == 0 ){ - int fulldim =2*_dimensions[0]; - shift = (shift+fulldim)%fulldim; - if ( source_cb ) { - // Shift 0,1 -> 0 - return (shift+1)/2; - } else { - // Shift 0->0, 1 -> 1, 2->1 - return (shift)/2; - } - } else { - return shift; - } + + // Depending on the cb of site, we toggle source cb. + // for block #b, element #e = (b, e) + // we need + virtual int CheckerBoardShift(int source_cb,int dim,int shift,int osite){ + + if(dim != 0) return shift; + + int fulldim =_fdimensions[0]; + shift = (shift+fulldim)%fulldim; + + // Probably faster with table lookup; + // or by looping over x,y,z and multiply rather than computing checkerboard. + int ocb=CheckerboardFromOsite(osite); + + if ( (source_cb+ocb)&1 ) { + return (shift)/2; + } else { + return (shift+1)/2; + } } + virtual int CheckerBoardDestination(int source_cb,int shift){ - if ((shift+2*_dimensions[0])&0x1) { + if ((shift+_fdimensions[0])&0x1) { return 1-source_cb; } else { return source_cb; } }; - GridRedBlackCartesian(std::vector &dimensions,std::vector layout) + GridRedBlackCartesian(std::vector &dimensions, + std::vector &simd_layout, + std::vector &processor_grid) : SimdGrid(processor_grid) { /////////////////////// // Grid information /////////////////////// _ndimension = dimensions.size(); - _dimensions.resize(_ndimension); + _fdimensions.resize(_ndimension); + _gdimensions.resize(_ndimension); + _ldimensions.resize(_ndimension); _rdimensions.resize(_ndimension); - _layout.resize(_ndimension); + _simd_layout.resize(_ndimension); _ostride.resize(_ndimension); _istride.resize(_ndimension); @@ -195,14 +252,17 @@ public: _osites = 1; _isites = 1; for(int d=0;d<_ndimension;d++){ - _dimensions[d] = dimensions[d]; - _dimensions[0] = dimensions[0]/2; - _layout[d] = layout[d]; + _fdimensions[d] = dimensions[d]; + _gdimensions[d] = _fdimensions[d]; + if (d==0) _gdimensions[0] = _gdimensions[0]/2; // Remove a checkerboard + _ldimensions[d] = _gdimensions[d]/_processors[d]; // Use a reduced simd grid - _rdimensions[d]= _dimensions[d]/_layout[d]; + _simd_layout[d] = simd_layout[d]; + _rdimensions[d]= _ldimensions[d]/_simd_layout[d]; + _osites *= _rdimensions[d]; - _isites *= _layout[d]; + _isites *= _simd_layout[d]; // Addressing support if ( d==0 ) { @@ -210,7 +270,7 @@ public: _istride[d] = 1; } else { _ostride[d] = _ostride[d-1]*_rdimensions[d-1]; - _istride[d] = _istride[d-1]*_layout[d-1]; + _istride[d] = _istride[d-1]*_simd_layout[d-1]; } } diff --git a/Grid_Communicator.h b/Grid_Communicator.h new file mode 100644 index 00000000..5be6f26f --- /dev/null +++ b/Grid_Communicator.h @@ -0,0 +1,39 @@ +#ifndef GRID_COMMUNICATOR_H +#define GRID_COMMUNICATOR_H +/////////////////////////////////// +// Processor layout information +/////////////////////////////////// +namespace dpo { +class CartesianCommunicator { + public: + + // Communicator should know nothing of the physics grid, only processor grid. + + std::vector _processors; // Which dimensions get relayed out over processors lanes. + int _processor; // linear processor rank + std::vector _processor_coor; // linear processor coordinate + unsigned long _ndimension; + +#ifdef GRID_COMMS_MPI + MPI_Comm communicator; +#endif + + CartesianCommunicator(std::vector &pdimensions_in); + + int Rank(std::vector coor); + void GlobalSumF(float &); + void GlobalSumFVector(float *,int N); + + void GlobalSumF(double &); + void GlobalSumFVector(double *,int N); + + void SendToRecvFrom(void *xmit, + std::vector to_coordinate, + void *recv, + std::vector from_coordinate, + int bytes); + +}; +} + +#endif diff --git a/Grid_Lattice.h b/Grid_Lattice.h index 223ad2cd..8c8dc386 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -3,19 +3,31 @@ #include "Grid.h" + + namespace dpo { +// Permute the pointers 32bitx16 = 512 +static int permute_map[4][16] = { + { 1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14}, + { 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13}, + { 4,5,6,7,0,1,2,3,12,13,14,15,8,9,10,11}, + { 9,10,11,12,13,14,15,0,1,2,3,4,5,6,7,8} +}; + + template class Lattice { public: - Grid *_grid; + SimdGrid *_grid; int checkerboard; std::vector > _odata; public: - - Lattice(Grid *grid) : _grid(grid) { + + + Lattice(SimdGrid *grid) : _grid(grid) { _odata.reserve(_grid->oSites()); if ( ((uint64_t)&_odata[0])&0xF) { exit(-1); @@ -23,6 +35,19 @@ public: checkerboard=0; } + +#ifdef GRID_COMMS_NONE +#include +#endif + +#ifdef GRID_COMMS_FAKE +#include +#endif + +#ifdef GRID_COMMS_MPI +#include +#endif + // overloading dpo::conformable but no conformable in dpo ...?:w template @@ -69,212 +94,6 @@ public: return ret; }; -#if 0 - // Collapse doesn't appear to work the way I think it should in icpc - friend Lattice Cshift(Lattice &rhs,int dimension,int shift) - { - Lattice ret(rhs._grid); - - ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); - shift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift); - int sx,so,o; - int rd = rhs._grid->_rdimensions[dimension]; - int ld = rhs._grid->_dimensions[dimension]; - - // Map to always positive shift. - shift = (shift+ld)%ld; - - // Work out whether to permute and the permute type - // ABCDEFGH -> AE BF CG DH permute - // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH - // Shift 1 DH AE BF CG 1 0 0 0 HABCDEFG - // Shift 2 CG DH AE BF 1 1 0 0 GHABCDEF - // Shift 3 BF CG DH AE 1 1 1 0 FGHACBDE - // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD - // Shift 5 DH AE BF CG 0 1 1 1 DEFGHABC - // Shift 6 CG DH AE BF 0 0 1 1 CDEFGHAB - // Shift 7 BF CG DH AE 0 0 0 1 BCDEFGHA - int permute_dim =rhs._grid->_layout[dimension]>1 ; - int permute_type=0; - for(int d=0;d_layout[d]>1 ) permute_type++; - - - // loop over perp slices. - // Threading considerations: - // Need to map thread_num to - // - // x_min,x_max for Loop-A - // n_min,n_max for Loop-B - // b_min,b_max for Loop-C - // In a way that maximally load balances. - // - // Optimal: - // There are rd*n_block*block items of work. - // These serialise as item "w" - // b=w%block; w=w/block - // n=w%nblock; x=w/nblock. Perhaps 20 cycles? - // - // Logic: - // x_chunk = (rd+thread)/nthreads simply divide work across nodes. - // - // rd=5 , threads = 8; - // 0 1 2 3 4 5 6 7 - // 0 0 0 1 1 1 1 1 - for(int x=0;x_ostride[dimension]; - so =sx*rhs._grid->_ostride[dimension]; - - int permute_slice=0; - if ( permute_dim ) { - permute_slice = shift/rd; - if ( x_slice_block[dimension]*internal; - - for(int n=0;n_slice_nblock[dimension];n++){ - vComplex *optr = (vComplex *)&ret._odata[o]; - vComplex *iptr = (vComplex *)&rhs._odata[so]; - for(int b=0;b_slice_stride[dimension]; - so+=rhs._grid->_slice_stride[dimension]; - } - } else { - for(int n=0;n_slice_nblock[dimension];n++){ - for(int i=0;i_slice_block[dimension];i++){ - ret._odata[o+i]=rhs._odata[so+i]; - } - o+=rhs._grid->_slice_stride[dimension]; - so+=rhs._grid->_slice_stride[dimension]; - } - - } -#else - - if ( permute_slice ) { - - int internal=sizeof(vobj)/sizeof(vComplex); - int num =rhs._grid->_slice_block[dimension]*internal; - - -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_stride[dimension]]; - vComplex *iptr = (vComplex *)&rhs._odata[so+n*rhs._grid->_slice_stride[dimension]]; - permute(optr[b],iptr[b],permute_type); - } - } - - } else { - - -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int i=0;i_slice_block[dimension];i++){ - int oo = o+ n*rhs._grid->_slice_stride[dimension]; - int soo=so+ n*rhs._grid->_slice_stride[dimension]; - ret._odata[oo+i]=rhs._odata[soo+i]; - } - } - - } -#endif - } - return ret; - } -#else - friend Lattice Cshift(Lattice &rhs,int dimension,int shift) - { - Lattice ret(rhs._grid); - - ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); - shift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift); - int rd = rhs._grid->_rdimensions[dimension]; - int ld = rhs._grid->_dimensions[dimension]; - - // Map to always positive shift. - shift = (shift+ld)%ld; - - // Work out whether to permute and the permute type - // ABCDEFGH -> AE BF CG DH permute - // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH - // Shift 1 DH AE BF CG 1 0 0 0 HABCDEFG - // Shift 2 CG DH AE BF 1 1 0 0 GHABCDEF - // Shift 3 BF CG DH AE 1 1 1 0 FGHACBDE - // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD - // Shift 5 DH AE BF CG 0 1 1 1 DEFGHABC - // Shift 6 CG DH AE BF 0 0 1 1 CDEFGHAB - // Shift 7 BF CG DH AE 0 0 0 1 BCDEFGHA - int permute_dim =rhs._grid->_layout[dimension]>1 ; - int permute_type=0; - for(int d=0;d_layout[d]>1 ) permute_type++; - - - // loop over all work - int work =rd*rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; - -#pragma omp parallel for - for(int ww=0;ww_slice_block[dimension] ; w=w/rhs._grid->_slice_block[dimension]; - int n = w%rhs._grid->_slice_nblock[dimension]; w=w/rhs._grid->_slice_nblock[dimension]; - int x = w; - - int sx,so,o; - sx = (x-shift+ld)%rd; - o = x*rhs._grid->_ostride[dimension]+n*rhs._grid->_slice_stride[dimension]; // common sub expression alert. - so =sx*rhs._grid->_ostride[dimension]+n*rhs._grid->_slice_stride[dimension]; - - int permute_slice=0; - if ( permute_dim ) { - permute_slice = shift/rd; - if ( x inline Lattice & operator = (const sobj & r){ #pragma omp parallel for @@ -288,14 +107,15 @@ public: template friend void pokeSite(const sobj &s,Lattice &l,std::vector &site){ - if ( l._grid.checkerboard != l._grid->Checkerboard(site)){ - printf("Poking wrong checkerboard\n"); - exit(EXIT_FAILURE); + if ( l.checkerboard != l._grid->CheckerBoard(site)){ + printf("Poking wrong checkerboard\n"); + exit(EXIT_FAILURE); } int o_index = l._grid->oIndex(site); int i_index = l._grid->iIndex(site); + // BUGGY. This assumes complex real Real *v_ptr = (Real *)&l._odata[o_index]; Real *s_ptr = (Real *)&s; v_ptr = v_ptr + 2*i_index; @@ -348,6 +168,22 @@ public: } }; + friend void lex_sites(Lattice &l){ + + Real *v_ptr = (Real *)&l._odata[0]; + size_t o_len = l._grid->oSites(); + size_t v_len = sizeof(vobj)/sizeof(vRealF); + size_t vec_len = vRealF::Nsimd(); + + for(int i=0;i &l){ // Zero mean, unit variance. std::normal_distribution distribution(0.0,1.0); @@ -427,22 +263,41 @@ public: return ret; }; - - // remove and insert a half checkerboard friend void pickCheckerboard(int cb,Lattice &half,const Lattice &full){ + half.checkerboard = cb; + int ssh=0; #pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - half._odata[ss] = full._odata[ss*2+cb]; - } - half.checkerboard = cb; + for(int ss=0;ssoSites();ss++){ + std::vector coor; + int cbos; + + full._grid->CoordFromOsite(coor,ss); + cbos=half._grid->CheckerBoard(coor); + + if (cbos==cb) { + + half._odata[ssh] = full._odata[ss]; + ssh++; + } + } } friend void setCheckerboard(Lattice &full,const Lattice &half){ - int cb = half.checkerboard; + int cb = half.checkerboard; + int ssh=0; #pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - full._odata[ss*2+cb]=half._odata[ss]; - } + for(int ss=0;ssoSites();ss++){ + std::vector coor; + int cbos; + + full._grid->CoordFromOsite(coor,ss); + cbos=half._grid->CheckerBoard(coor); + + if (cbos==cb) { + full._odata[ss]=half._odata[ssh]; + ssh++; + } + } } }; // class Lattice diff --git a/Grid_QCD.h b/Grid_QCD.h index 92a02506..e51e2641 100644 --- a/Grid_QCD.h +++ b/Grid_QCD.h @@ -5,7 +5,6 @@ namespace QCD { static const int Nc=3; static const int Ns=4; - static const int CbRed =0; static const int CbBlack=1; diff --git a/Grid_config.h b/Grid_config.h index 64003419..2a442ea5 100644 --- a/Grid_config.h +++ b/Grid_config.h @@ -10,6 +10,15 @@ /* AVX512 */ /* #undef AVX512 */ +/* GRID_COMMS_FAKE */ +#define GRID_COMMS_FAKE 1 + +/* GRID_COMMS_MPI */ +/* #undef GRID_COMMS_MPI */ + +/* GRID_COMMS_NONE */ +/* #undef GRID_COMMS_NONE */ + /* Define to 1 if you have the `gettimeofday' function. */ #define HAVE_GETTIMEOFDAY 1 @@ -61,6 +70,9 @@ /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "grid" +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + /* Define to the version of this package. */ #define PACKAGE_VERSION "1.0" diff --git a/Grid_fake.cc b/Grid_fake.cc new file mode 100644 index 00000000..7e664f33 --- /dev/null +++ b/Grid_fake.cc @@ -0,0 +1,34 @@ +#include "Grid.h" +namespace dpo { + +CartesianCommunicator::CartesianCommunicator(std::vector &processors) +{ + _ndimension = _processors.size(); + _processor_coor.resize(_ndimension); + _processors = processors; + + // Require 1^N processor grid for fake + for(int d=0;d<_ndimension;d++) if(_processors[d]!=1) exit(-1); + + _processor = 0;// I am the one. The only one.. + for(int d=0;d<_ndimension;d++) _processor_coor[d] = 0; +} + +void CartesianCommunicator::GlobalSumF(float &){} +void CartesianCommunicator::GlobalSumFVector(float *,int N){} +void CartesianCommunicator::GlobalSumF(double &){} +void CartesianCommunicator::GlobalSumFVector(double *,int N){} + +// Basic Halo comms primitive +void CartesianCommunicator::SendToRecvFrom(void *xmit, + std::vector to_coordinate, + void *recv, + std::vector from_coordinate, + int bytes) +{ + exit(-1); + bcopy(xmit,recv,bytes); +} + +} + diff --git a/Grid_fake_cshift.h b/Grid_fake_cshift.h new file mode 100644 index 00000000..0f306b1b --- /dev/null +++ b/Grid_fake_cshift.h @@ -0,0 +1,246 @@ +#ifndef _GRID_FAKE_H_ +#define _GRID_FAKE_H_ + + + +friend Lattice Cshift(Lattice &rhs,int dimension,int shift) +{ + typedef typename vobj::vector_type vector_type; + typedef typename vobj::scalar_type scalar_type; + const int Nsimd = vector_type::Nsimd(); + + Lattice ret(rhs._grid); + + int fd = rhs._grid->_fdimensions[dimension]; + int rd = rhs._grid->_rdimensions[dimension]; + //int ld = rhs._grid->_ldimensions[dimension]; + //int gd = rhs._grid->_gdimensions[dimension]; + + + // Map to always positive shift modulo global full dimension. + shift = (shift+fd)%fd; + + ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); + + // the permute type + + int permute_dim =rhs._grid->_simd_layout[dimension]>1 ; + int permute_type=0; + for(int d=0;d_simd_layout[d]>1 ) permute_type++; + } + + /////////////////////////////////////////////// + // Move via a fake comms buffer + // Simd direction uses an extract/merge pair + /////////////////////////////////////////////// + int buffer_size = rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; + int words = sizeof(vobj)/sizeof(vector_type); + + std::vector > comm_buf(buffer_size); + std::vector > comm_buf_extract(Nsimd,std::vector(buffer_size*words) ); + std::vector pointers(Nsimd); + + for(int x=0;x_ostride[dimension]; // base offset for result + + if ( permute_dim ) { + + int o = 0; // relative offset to base + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); + + int sx = (x+sshift)%rd; + + // base offset for source + int so = sx*rhs._grid->_ostride[dimension]; + + int permute_slice=0; + int wrap = sshift/rd; + int num = sshift%rd; + + if ( x< rd-num ) permute_slice=wrap; + else permute_slice = 1-wrap; + + if ( permute_slice ) { + extract(rhs._odata[so+o+b],pointers); + } else { + ret._odata[ro+o+b]=rhs._odata[so+o+b]; + } + + } + o +=rhs._grid->_slice_stride[dimension]; + } + + for(int i=0;i_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); + int sx = (x+sshift)%rd; + + // base offset for source + int so = sx*rhs._grid->_ostride[dimension]; + + int permute_slice=0; + int wrap = sshift/rd; + int num = sshift%rd; + + if ( x< rd-num ) permute_slice=wrap; + else permute_slice = 1-wrap; + + if ( permute_slice ) { + merge(ret._odata[ro+o+b],pointers); + } + } + o +=rhs._grid->_slice_stride[dimension]; + } + + } else { + + int co; // comm offset + int o; + + co=0; o=0; + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + // This call in inner loop is annoying but necessary for dimension=0 + // in the case of RedBlack grids. Could optimise away with + // alternate code paths for all other cases. + int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); + int sx = (x+sshift)%rd; + int so = sx*rhs._grid->_ostride[dimension]; + + comm_buf[co++]=rhs._odata[so+o+b]; + + } + o +=rhs._grid->_slice_stride[dimension]; + } + + // Step through a copy into a comms buffer and pull back in. + // Genuine fake implementation could calculate if loops back + co=0; o=0; + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + ret._odata[ro+o+b]=comm_buf[co++]; + } + o +=rhs._grid->_slice_stride[dimension]; + } + } + } + return ret; +} + +/* + friend Lattice Cshift(Lattice &rhs,int dimension,int shift) + { + Lattice ret(rhs._grid); + + int rd = rhs._grid->_rdimensions[dimension]; + int ld = rhs._grid->_ldimensions[dimension]; + int gd = rhs._grid->_gdimensions[dimension]; + + // Map to always positive shift. + shift = (shift+gd)%gd; + + ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); + shift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift); + + // Work out whether to permute and the permute type + // ABCDEFGH -> AE BF CG DH permute + // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH + // Shift 1 BF CG DH AE 0 0 0 1 BCDEFGHA + // Shift 2 CG DH AE BF 0 0 1 1 CDEFGHAB + // Shift 3 DH AE BF CG 0 1 1 1 DEFGHABC + // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD + // Shift 5 BF CG DH AE 1 1 1 0 FGHACBDE + // Shift 6 CG DH AE BF 1 1 0 0 GHABCDEF + // Shift 7 DH AE BF CG 1 0 0 0 HABCDEFG + + int permute_dim =rhs._grid->_simd_layout[dimension]>1 ; + int permute_type=0; + for(int d=0;d_simd_layout[d]>1 ) permute_type++; + + + // loop over all work + int work =rd*rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; + + // Packed gather sequence is clean + int buffer_size = rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; + + typedef typename vobj::scalar_type scalar_t; + typedef typename vobj::vector_type vector_t; + const int ns=sizeof(vobj)/sizeof(scalar_t); + const int nv=sizeof(vobj)/sizeof(vector_t); + std::vector > comm_buf(buffer_size); + + for(int x=0;x_ostride[dimension]; + int so =sx*rhs._grid->_ostride[dimension]; + + + int permute_slice=0; + if ( permute_dim ) { + permute_slice = shift/rd; + if ( x_slice_nblock[dimension];n++){ + + vector_t *optr = (vector_t *)&ret._odata[o]; + vector_t *iptr = (vector_t *)&rhs._odata[so]; + int skew = buffer_size*ns/2; + + for(int b=0;b_slice_block[dimension];b++){ + for(int n=0;n_slice_stride[dimension]; + // bo+=rhs._grid->_slice_stride[dimension]*ns/2; + + } + + } else { + int bo=0; + for(int n=0;n_slice_nblock[dimension];n++){ + for(int i=0;i_slice_block[dimension];i++){ + comm_buf[bo++] =rhs._odata[so+i]; + } + so+=rhs._grid->_slice_stride[dimension]; + } + bo=0; + for(int n=0;n_slice_nblock[dimension];n++){ + for(int i=0;i_slice_block[dimension];i++){ + ret._odata[o+i]=comm_buf[bo++]; + } + o+=rhs._grid->_slice_stride[dimension]; + } + } + } + return ret; + }; +*/ + +#endif diff --git a/Grid_init.cc b/Grid_init.cc index e943c3b0..bb22ce29 100755 --- a/Grid_init.cc +++ b/Grid_init.cc @@ -28,13 +28,13 @@ double usecond(void) { void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr) { - ucontext_t * uc= (ucontext_t *)ptr; - printf("Caught signal %d\n",si->si_signo); printf(" mem address %llx\n",(uint64_t)si->si_addr); printf(" code %d\n",si->si_code); #ifdef __X86_64 + ucontext_t * uc= (ucontext_t *)ptr; + struct sigcontext *sc = (struct sigcontext *)&uc->uc_mcontext; printf(" instruction %llx\n",(uint64_t)sc->rip); diff --git a/Grid_main.cc b/Grid_main.cc index 0b0c3e99..4079e62a 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -14,7 +14,7 @@ using namespace dpo::QCD; int main (int argc, char ** argv) { -#ifdef KNL +#if 0 struct sigaction sa,osa; sigemptyset (&sa.sa_mask); sa.sa_sigaction= sa_action; @@ -27,6 +27,9 @@ int main (int argc, char ** argv) std::vector latt_size(4); std::vector simd_layout(4); + std::vector mpi_layout(4); + for(int d=0;d<4;d++) mpi_layout[d]=1; + #ifdef AVX512 for(int omp=128;omp<236;omp+=16){ #else @@ -37,7 +40,7 @@ int main (int argc, char ** argv) omp_set_num_threads(omp); #endif - for(int lat=16;lat<=20;lat+=4){ + for(int lat=4;lat<=16;lat+=40){ latt_size[0] = lat; latt_size[1] = lat; latt_size[2] = lat; @@ -62,11 +65,9 @@ int main (int argc, char ** argv) simd_layout[2] = 1; simd_layout[3] = 2; #endif - - GridCartesian Fine(latt_size,simd_layout); - GridRedBlackCartesian rbFine(latt_size,simd_layout); - + GridCartesian Fine(latt_size,simd_layout,mpi_layout); + GridRedBlackCartesian rbFine(latt_size,simd_layout,mpi_layout); LatticeColourMatrix Foo(&Fine); LatticeColourMatrix Bar(&Fine); @@ -152,19 +153,23 @@ int main (int argc, char ** argv) trscMat = trace(scMat); // Trace FooBar = Bar; - int shift=1; - int dir=0; + /* + { + std::vector coor(4); + for(int d=0;d<4;d++) coor[d] = 0; + peekSite(cmat,Foo,coor); + Foo = zero; + pokeSite(cmat,Foo,coor); + } random(Foo); - pickCheckerboard(CbRed,rFoo,Foo); // Pick out red or black checkerboards - pickCheckerboard(CbBlack,bFoo,Foo); + */ + lex_sites(Foo); + + + //setCheckerboard(ShiftedCheck,rFoo); + //setCheckerboard(ShiftedCheck,bFoo); - Shifted = Cshift(Foo,dir,shift); // Shift everything - bShifted = Cshift(rFoo,dir,shift); // Shift red - rShifted = Cshift(bFoo,dir,shift); // Shift black - - setCheckerboard(ShiftedCheck,bShifted); // Put them all together - setCheckerboard(ShiftedCheck,rShifted); // and check the results (later) // Lattice SU(3) x SU(3) FooBar = Foo * Bar; @@ -211,25 +216,69 @@ int main (int argc, char ** argv) printf("Cshift Mult: NumThread %d , Lattice size %d , %f Mflop/s\n",omp,lat,flops/(t1-t0)); printf("Cshift Mult: NumThread %d , Lattice size %d , %f MB/s\n",omp,lat,bytes/(t1-t0)); - pickCheckerboard(0,rFoo,FooBar); - pickCheckerboard(1,bFoo,FooBar); - - setCheckerboard(FooBar,rFoo); - setCheckerboard(FooBar,bFoo); + // pickCheckerboard(0,rFoo,FooBar); + // pickCheckerboard(1,bFoo,FooBar); + // setCheckerboard(FooBar,rFoo); + // setCheckerboard(FooBar,bFoo); double nrm=0; + + for(int dir=0;dir<4;dir++){ + for(int shift=0;shift coor(4); - for(coor[0]=0;coor[0]black + std::cout << "Shifting odd parities"<red + + ShiftedCheck=zero; + setCheckerboard(ShiftedCheck,bShifted); // Put them all together + setCheckerboard(ShiftedCheck,rShifted); // and check the results (later) + + // Check results + std::vector coor(4); + for(coor[3]=0;coor[3] diff; std::vector shiftcoor = coor; - shiftcoor[dir]=(shiftcoor[dir]-shift+latt_size[dir])%latt_size[dir]; - + shiftcoor[dir]=(shiftcoor[dir]+shift+latt_size[dir])%latt_size[dir]; + + std::vector rl(4); + for(int dd=0;dd<4;dd++){ + rl[dd] = latt_size[dd]/simd_layout[dd]; + } + int lex = coor[0]%rl[0] + + (coor[1]%rl[1])*rl[0] + + (coor[2]%rl[2])*rl[0]*rl[1] + + (coor[3]%rl[3])*rl[0]*rl[1]*rl[2]; + lex += + +1000*(coor[0]/rl[0]) + +1000*(coor[1]/rl[1])*simd_layout[0] + +1000*(coor[2]/rl[2])*simd_layout[0]*simd_layout[1] + +1000*(coor[3]/rl[3])*simd_layout[0]*simd_layout[1]*simd_layout[2]; + + int lex_coor = shiftcoor[0]%rl[0] + + (shiftcoor[1]%rl[1])*rl[0] + + (shiftcoor[2]%rl[2])*rl[0]*rl[1] + + (shiftcoor[3]%rl[3])*rl[0]*rl[1]*rl[2]; + lex_coor += + +1000*(shiftcoor[0]/rl[0]) + +1000*(shiftcoor[1]/rl[1])*simd_layout[0] + +1000*(shiftcoor[2]/rl[2])*simd_layout[0]*simd_layout[1] + +1000*(shiftcoor[3]/rl[3])*simd_layout[0]*simd_layout[1]*simd_layout[2]; + ColourMatrix foo; ColourMatrix bar; ColourMatrix shifted1; @@ -242,7 +291,6 @@ int main (int argc, char ** argv) peekSite(shifted1,Shifted,coor); peekSite(shifted2,Foo,shiftcoor); peekSite(shifted3,ShiftedCheck,coor); - peekSite(foo,Foo,coor); mdiff = shifted1-shifted2; @@ -258,13 +306,13 @@ int main (int argc, char ** argv) diff =shifted1._internal._internal[r][c]-shifted2._internal._internal[r][c]; nn=real(conj(diff)*diff); if ( nn > 0 ) - cout<<"Shift fail "< 0 ) - cout<<"Shift rb fail "< + +namespace dpo { + + // Should error check all MPI calls. + +CartesianCommunicator::CartesianCommunicator(std::vector &processors) +{ + _ndimension = _processors.size(); + std::vector periodic(_ndimension,1); + + _processors = processors; + _processor_coords.resize(_ndimension); + + MPI_Cart_create(MPI_COMM_WORLD _ndimension,&_processors[0],&periodic[0],1,&communicator); + MPI_Comm_rank(communicator,&_processor); + MPI_Cart_coords(communicator,_processor,_ndimension,&_processor_coords[0]); + +} + +void CartesianCommunicator::GlobalSumF(float &f){ + MPI_Allreduce(&f,&f,1,MPI_FLOAT,MPI_SUM,communicator); +} +void CartesianCommunicator::GlobalSumFVector(float *f,int N) +{ + MPI_Allreduce(f,f,N,MPI_FLOAT,MPI_SUM,communicator); +} +void CartesianCommunicator::GlobalSumF(double &d) +{ + MPI_Allreduce(&d,&d,1,MPI_DOUBLE,MPI_SUM,communicator); +} +void CartesianCommunicator::GlobalSumFVector(double *d,int N) +{ + MPI_Allreduce(d,d,N,MPI_DOUBLE,MPI_SUM,communicator); +} + +int CartesianCommunicator::ShiftedRank(int dim,int shift) +{ + int rank; + MPI_Cart_shift(communicator,dim,shift,&_processor,&rank); + return rank; +} +int CartesianCommunicator::Rank(std::vector coor) +{ + int rank; + MPI_Cart_rank (communicator, &coor[0], &rank); + return rank; +} + +// Basic Halo comms primitive +void CartesianCommunicator::SendToRecvFrom(void *xmit, + std::vector &to_coordinate, + void *recv, + std::vector &from_coordinate, + int bytes) +{ + int dest = Rank(to_coordinate); + int from = Rank(from_coordinate); + + MPI_Request x_req; + MPI_Request r_req; + MPI_Status OkeyDokey; + + MPI_Isend(xmit, bytes, MPI_CHAR,dest,dest,communicator,&x_req); + MPI_Irecv(recv, bytes, MPI_CHAR,from,from,communicator,&r_req); + MPI_Wait(&x_req,&OkeyDokey); + MPI_Wait(&r_req,&OkeyDokey); + MPI_Barrier(); +} + +} + +#if 0 + +// Could possibly do a direct block strided send? + int MPI_Type_vector( + int count, + int blocklength, + int stride, + MPI_Datatype old_type, + MPI_Datatype *newtype_p + ); + +#endif diff --git a/Grid_mpi_cshift.h b/Grid_mpi_cshift.h new file mode 100644 index 00000000..9031170b --- /dev/null +++ b/Grid_mpi_cshift.h @@ -0,0 +1,384 @@ +#ifndef _GRID_MPI_CSHIFT_H_ +#define _GRID_MPI_CSHIFT_H_ + + +////////////////////////////////////////////// +// Q. Split this into seperate sub functions? +////////////////////////////////////////////// + +// CshiftCB_comms_splice +// CshiftCB_comms +// CshiftCB_local +// CshiftCB_local_permute + +// Cshift_comms_splice +// Cshift_comms +// Cshift_local +// Cshift_local_permute + +// Broadly I remain annoyed that the iteration is so painful +// for red black data layout, when simple block strided descriptors suffice for non-cb. +// +// The other option is to do it table driven, or perhaps store the CB of each site in a table. +// +// Must not lose sight that goal is to be able to construct really efficient +// gather to a point stencil code. CSHIFT is not the best way, so probably need +// additional stencil support. +// +// Could still do a templated syntax tree and make CSHIFT return lattice vector. +// +// Stencil based code could pre-exchange haloes and use a table lookup for neighbours +// +// Lattice could also allocate haloes which get used for stencil code. +// +// Grid could create a neighbour index table for a given stencil. +// Could also implement CovariantCshift. + +////////////////////////////////////////////////////// +//Non checkerboarded support functions +////////////////////////////////////////////////////// + +friend void Gather_plane (Lattice &rhs,std::vector &buffer, int dimension,int plane) +{ + const int Nsimd = vector_type::Nsimd(); + int rd = rhs._grid->_rdimensions[dimension]; + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); + int sx = (x+sshift)%rd; + int so = sx*rhs._grid->_ostride[dimension]; + int permute_slice=0; + int wrap = sshift/rd; + int num = sshift%rd; + + if ( x< rd-num ) permute_slice=wrap; + else permute_slice = 1-wrap; + + if ( permute_slice ) { + permute(ret._odata[ro+o+b],rhs._odata[so+o+b],permute_type); + } else { + ret._odata[ro+o+b]=rhs._odata[so+o+b]; + } + } + o +=rhs._grid->_slice_stride[dimension]; + } + } + +} +//friend void Gather_plane_extract(Lattice &rhs,std::vector pointers,int dimension,int plane); +// +//friend void Scatter_plane (Lattice &rhs,std::vector face, int dimension,int plane); +//friend void Scatter_plane_merge (Lattice &rhs,std::vector pointers,int dimension,int plane); +// +//template friend void Copy_plane_permute(Lattice &rhs,std::vector face, int dimension,int plane); +// friend void Copy_plane(Lattice &rhs,std::vector face, int dimension,int plane); +// + +////////////////////////////////////////////////////// +//Checkerboarded support functions +////////////////////////////////////////////////////// + +//friend void GatherCB_plane (Lattice &rhs,std::vector face, int dimension,int plane); +//friend void GatherCB_plane_extract(Lattice &rhs,std::vector pointers,int dimension,int plane); +// +//friend void ScatterCB_plane (Lattice &rhs,std::vector face, int dimension,int plane); +//friend void ScatterCB_plane_merge (Lattice &rhs,std::vector pointers,int dimension,int plane); +// +//template friend void CopyCB_plane_permute(Lattice &rhs,std::vector face, int dimension,int plane); +// friend void Copy_plane(Lattice &rhs,std::vector face, int dimension,int plane); + + +friend Lattice Cshift(Lattice &rhs,int dimension,int shift) +{ + typedef typename vobj::vector_type vector_type; + typedef typename vobj::scalar_type scalar_type; + const int Nsimd = vector_type::Nsimd(); + + Lattice ret(rhs._grid); + + int fd = rhs._grid->_fdimensions[dimension]; + int rd = rhs._grid->_rdimensions[dimension]; + //int ld = rhs._grid->_ldimensions[dimension]; + //int gd = rhs._grid->_gdimensions[dimension]; + + + // Map to always positive shift modulo global full dimension. + shift = (shift+fd)%fd; + + ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); + + // the permute type + int simd_layout = rhs._grid->_simd_layout[dimension]; + int comm_dim = rhs._grid->_processors[dimension] >1 ; + int permute_dim = rhs._grid->_simd_layout[dimension]>1 && (!comm_dim); + int splice_dim = rhs._grid->_simd_layout[dimension]>1 && (comm_dim); + + int permute_type=0; + for(int d=0;d_simd_layout[d]>1 ) permute_type++; + } + + // Logic for non-distributed dimension + std::vector comm_offnode(simd_layout); + std::vector comm_to (simd_layout); + std::vector comm_from (simd_layout); + std::vector comm_rx (simd_layout); // reduced coordinate of neighbour plane + std::vector comm_simd_lane(simd_layout);// simd lane of neigbour plane + + /////////////////////////////////////////////// + // Move via a fake comms buffer + // Simd direction uses an extract/merge pair + /////////////////////////////////////////////// + int buffer_size = rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; + int words = sizeof(vobj)/sizeof(vector_type); + + std::vector > comm_buf(buffer_size); + std::vector > comm_buf_extract(Nsimd,std::vector(buffer_size*words) ); + std::vector pointers(Nsimd); + + + + if ( permute_dim ) { + + for(int x=0;x_ostride[dimension]; // base offset for result + int o = 0; // relative offset to base + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); + int sx = (x+sshift)%rd; + int so = sx*rhs._grid->_ostride[dimension]; + int permute_slice=0; + int wrap = sshift/rd; + int num = sshift%rd; + + if ( x< rd-num ) permute_slice=wrap; + else permute_slice = 1-wrap; + + if ( permute_slice ) { + permute(ret._odata[ro+o+b],rhs._odata[so+o+b],permute_type); + } else { + ret._odata[ro+o+b]=rhs._odata[so+o+b]; + } + } + o +=rhs._grid->_slice_stride[dimension]; + } + } + + } else if ( splice_dim ) { + + if ( rhs._grid->_simd_layout[dimension] > 2 ) exit(-1); // use Cassert. Audit code for exit and replace + if ( rhs._grid->_simd_layout[dimension] < 1 ) exit(-1); + + + for(int i=0;i_ostride[dimension]; // base offset for result + + o = 0; // relative offset to base + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); + int sx = (x+sshift)%rd; + + // base offset for source + int so = sx*rhs._grid->_ostride[dimension]; + + int permute_slice=0; + int wrap = sshift/rd; + int num = sshift%rd; + + if ( x< rd-num ) permute_slice=wrap; + else permute_slice = 1-wrap; + + if ( permute_slice ) { + extract(rhs._odata[so+o+b],pointers); + } + } + o +=rhs._grid->_slice_stride[dimension]; + } + + + /////////////////////////////////////////// + // Work out what to send where + /////////////////////////////////////////// + + for(int s=0;s ld; + comm_send_rx[s] = shifted_x%rd; // which slice geton the other node + comm_send_simd_lane [s] = shifted_x/rd; // which slice on the other node + comm_from[s] = shifted_x/ld; + comm_to [s] = (2*_processors[dimension]-comm_from[s]) % _processors[dimension]; + comm_from[s] = (comm_from[s]+_processors[dimension]) % _processors[dimension]; + + } + + //////////////////////////////////////////////// + // Insert communication phase + //////////////////////////////////////////////// +#if 0 + } else if (comm_dim ) { + + // Packed gather sequence is clean + int buffer_size = rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_nblock[dimension]; + std::vector > send_buf(buffer_size); + std::vector > recv_buf(buffer_size); + + // off node; communcate slice (ld==rd) + if ( x+shift > rd ) { + int sb=0; + for(int n=0;n_slice_nblock[dimension];n++){ + for(int i=0;i_slice_block[dimension];i++){ + send_buf[sb++]=rhs._odata[so+i]; + } + so+=rhs._grid->_slice_stride[dimension]; + } + + // Make a comm_fake them mimics comms in periodic case. + + // scatter face + int rb=0; + for(int n=0;n_slice_nblock[dimension];n++){ + for(int i=0;i_slice_block[dimension];i++){ + ret._odata[so+i]=recv_buf[rb++]; + } + so+=rhs._grid->_slice_stride[dimension]; + } + + } else { + + for(int n=0;n_slice_nblock[dimension];n++){ + for(int i=0;i_slice_block[dimension];i++){ + ret._odata[o+i]=rhs._odata[so+i]; + } + o+=rhs._grid->_slice_stride[dimension]; + so+=rhs._grid->_slice_stride[dimension]; + } + } + +#endif + + //////////////////////////////////////////////// + // Pull receive buffers and permuted buffers in + //////////////////////////////////////////////// + for(int i=0;i_ostride[dimension]; // base offset for result + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); + int sx = (x+sshift)%rd; + + // base offset for source + int so = sx*rhs._grid->_ostride[dimension]; + + int permute_slice=0; + int wrap = sshift/rd; + int num = sshift%rd; + + if ( x< rd-num ) permute_slice=wrap; + else permute_slice = 1-wrap; + + if ( permute_slice ) { + merge(ret._odata[ro+o+b],pointers); + } + } + o +=rhs._grid->_slice_stride[dimension]; + } + } + + + } else if ( comm_dim ) { + + + int co; // comm offset + int o; + + co=0; + for(int x=0;x_ostride[dimension]; // base offset for result + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + // This call in inner loop is annoying but necessary for dimension=0 + // in the case of RedBlack grids. Could optimise away with + // alternate code paths for all other cases. + int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); + int sx = (x+sshift)%rd; + int so = sx*rhs._grid->_ostride[dimension]; + + comm_buf[co++]=rhs._odata[so+o+b]; + + } + o +=rhs._grid->_slice_stride[dimension]; + } + + // Step through a copy into a comms buffer and pull back in. + // Genuine fake implementation could calculate if loops back + co=0; o=0; + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + ret._odata[ro+o+b]=comm_buf[co++]; + } + o +=rhs._grid->_slice_stride[dimension]; + } + } + + } else { // Local dimension, no permute required + + for(int x=0;x_ostride[dimension]; // base offset for result + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + // This call in inner loop is annoying but necessary for dimension=0 + // in the case of RedBlack grids. Could optimise away with + // alternate code paths for all other cases. + int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); + + int sx = (x+sshift)%rd; + int so = sx*rhs._grid->_ostride[dimension]; + ret._odata[bo+o+b]=rhs._odata[so+o+b]; + + } + o +=rhs._grid->_slice_stride[dimension]; + } + } + + } + + return ret; +} + + +#endif diff --git a/Grid_none_cshift.h b/Grid_none_cshift.h new file mode 100644 index 00000000..87ae6a68 --- /dev/null +++ b/Grid_none_cshift.h @@ -0,0 +1,313 @@ +#ifndef _GRID_NONE_CSHIFT_H_ +#define _GRID_NONE_CSHIFT_H_ + // Work out whether to permute + // ABCDEFGH -> AE BF CG DH permute wrap num + // + // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH 0 0 + // Shift 1 BF CG DH AE 0 0 0 1 BCDEFGHA 0 1 + // Shift 2 CG DH AE BF 0 0 1 1 CDEFGHAB 0 2 + // Shift 3 DH AE BF CG 0 1 1 1 DEFGHABC 0 3 + // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD 1 0 + // Shift 5 BF CG DH AE 1 1 1 0 FGHACBDE 1 1 + // Shift 6 CG DH AE BF 1 1 0 0 GHABCDEF 1 2 + // Shift 7 DH AE BF CG 1 0 0 0 HABCDEFG 1 3 + + // Suppose 4way simd in one dim. + // ABCDEFGH -> AECG BFDH permute wrap num + + // Shift 0 AECG BFDH 0,00 0,00 ABCDEFGH 0 0 + // Shift 1 BFDH CGEA 0,00 1,01 BCDEFGHA 0 1 + // Shift 2 CGEA DHFB 1,01 1,01 CDEFGHAB 1 0 + // Shift 3 DHFB EAGC 1,01 1,11 DEFGHABC 1 1 + // Shift 4 EAGC FBHD 1,11 1,11 EFGHABCD 2 0 + // Shift 5 FBHD GCAE 1,11 1,10 FGHABCDE 2 1 + // Shift 6 GCAE HDBF 1,10 1,10 GHABCDEF 3 0 + // Shift 7 HDBF AECG 1,10 0,00 HABCDEFG 3 1 + + // Generalisation to 8 way simd, 16 way simd required. + // + // Need log2 Nway masks. consisting of + // 1 bit 256 bit granule + // 2 bit 128 bit granule + // 4 bits 64 bit granule + // 8 bits 32 bit granules + // + // 15 bits.... + +// For optimisation: +// +// split into Cshift_none_rb_permute +// split into Cshift_none_rb_simple +// +// split into Cshift_none_permute +// split into Cshift_none_simple + +friend Lattice Cshift(Lattice &rhs,int dimension,int shift) +{ + Lattice ret(rhs._grid); + + int fd = rhs._grid->_fdimensions[dimension]; + int rd = rhs._grid->_rdimensions[dimension]; + int ld = rhs._grid->_ldimensions[dimension]; + int gd = rhs._grid->_gdimensions[dimension]; + + + // Map to always positive shift modulo global full dimension. + shift = (shift+fd)%fd; + + ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); + + // the permute type + + int permute_dim =rhs._grid->_simd_layout[dimension]>1 ; + int permute_type=0; + for(int d=0;d_simd_layout[d]>1 ) permute_type++; + } + + for(int x=0;x_ostride[dimension]; + int o = 0; + + if ( permute_dim ) { + + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); + + int sx = (x+sshift)%rd; + int so = sx*rhs._grid->_ostride[dimension]; + + int permute_slice=0; + int wrap = sshift/rd; + int num = sshift%rd; + + if ( x< rd-num ) permute_slice=wrap; + else permute_slice = 1-wrap; + + if ( permute_slice ) { + permute(ret._odata[bo+o+b],rhs._odata[so+o+b],permute_type); + } else { + ret._odata[bo+o+b]=rhs._odata[so+o+b]; + } + + } + o +=rhs._grid->_slice_stride[dimension]; + + } + } else { + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + // This call in inner loop is annoying but necessary for dimension=0 + // in the case of RedBlack grids. Could optimise away with + // alternate code paths for all other cases. + int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); + + int sx = (x+sshift)%rd; + int so = sx*rhs._grid->_ostride[dimension]; + ret._odata[bo+o+b]=rhs._odata[so+o+b]; + + } + o +=rhs._grid->_slice_stride[dimension]; + } + } + } + return ret; +} + +#if 0 +// Collapse doesn't appear to work the way I think it should in icpc +friend Lattice Cshift(Lattice &rhs,int dimension,int shift) +{ + Lattice ret(rhs._grid); + + ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); + shift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift); + int sx,so,o; + int rd = rhs._grid->_rdimensions[dimension]; + int ld = rhs._grid->_dimensions[dimension]; + // Map to always positive shift. + shift = (shift+ld)%ld; + // Work out whether to permute and the permute type + // ABCDEFGH -> AE BF CG DH permute + // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH + // Shift 1 DH AE BF CG 1 0 0 0 HABCDEFG + // Shift 2 CG DH AE BF 1 1 0 0 GHABCDEF + // Shift 3 BF CG DH AE 1 1 1 0 FGHACBDE + // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD + // Shift 5 DH AE BF CG 0 1 1 1 DEFGHABC + // Shift 6 CG DH AE BF 0 0 1 1 CDEFGHAB + // Shift 7 BF CG DH AE 0 0 0 1 BCDEFGHA + int permute_dim =rhs._grid->_layout[dimension]>1 ; + int permute_type=0; + for(int d=0;d_layout[d]>1 ) permute_type++; + + // loop over perp slices. + // Threading considerations: + // Need to map thread_num to + // + // x_min,x_max for Loop-A + // n_min,n_max for Loop-B + // b_min,b_max for Loop-C + // In a way that maximally load balances. + // + // Optimal: + // There are rd*n_block*block items of work. + // These serialise as item "w" + // b=w%block; w=w/block + // n=w%nblock; x=w/nblock. Perhaps 20 cycles? + // + // Logic: + // x_chunk = (rd+thread)/nthreads simply divide work across nodes. + // + // rd=5 , threads = 8; + // 0 1 2 3 4 5 6 7 + // 0 0 0 1 1 1 1 1 + for(int x=0;x_ostride[dimension]; + so =sx*rhs._grid->_ostride[dimension]; + int permute_slice=0; + if ( permute_dim ) { + permute_slice = shift/rd; + if ( x_slice_block[dimension]*internal; + + for(int n=0;n_slice_nblock[dimension];n++){ + vComplex *optr = (vComplex *)&ret._odata[o]; + vComplex *iptr = (vComplex *)&rhs._odata[so]; + for(int b=0;b_slice_stride[dimension]; + so+=rhs._grid->_slice_stride[dimension]; + } + } else { + for(int n=0;n_slice_nblock[dimension];n++){ + for(int i=0;i_slice_block[dimension];i++){ + ret._odata[o+i]=rhs._odata[so+i]; + } + o+=rhs._grid->_slice_stride[dimension]; + so+=rhs._grid->_slice_stride[dimension]; + } + + } +#else + if ( permute_slice ) { + int internal=sizeof(vobj)/sizeof(vComplex); + int num =rhs._grid->_slice_block[dimension]*internal; +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_stride[dimension]]; + vComplex *iptr = (vComplex *)&rhs._odata[so+n*rhs._grid->_slice_stride[dimension]]; + permute(optr[b],iptr[b],permute_type); + } + } + } else { +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int i=0;i_slice_block[dimension];i++){ + int oo = o+ n*rhs._grid->_slice_stride[dimension]; + int soo=so+ n*rhs._grid->_slice_stride[dimension]; + ret._odata[oo+i]=rhs._odata[soo+i]; + } + } + + } +#endif + } + return ret; +} +friend Lattice Cshift(Lattice &rhs,int dimension,int shift) +{ + Lattice ret(rhs._grid); + + ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); + shift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift); + int rd = rhs._grid->_rdimensions[dimension]; + int ld = rhs._grid->_dimensions[dimension]; + + // Map to always positive shift. + shift = (shift+ld)%ld; + + // Work out whether to permute and the permute type + // ABCDEFGH -> AE BF CG DH permute + // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH + // Shift 1 DH AE BF CG 1 0 0 0 HABCDEFG + // Shift 2 CG DH AE BF 1 1 0 0 GHABCDEF + // Shift 3 BF CG DH AE 1 1 1 0 FGHACBDE + // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD + // Shift 5 DH AE BF CG 0 1 1 1 DEFGHABC + // Shift 6 CG DH AE BF 0 0 1 1 CDEFGHAB + // Shift 7 BF CG DH AE 0 0 0 1 BCDEFGHA + int permute_dim =rhs._grid->_layout[dimension]>1 ; + int permute_type=0; + for(int d=0;d_layout[d]>1 ) permute_type++; + + + // loop over all work + int work =rd*rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; + +#pragma omp parallel for + for(int ww=0;ww_slice_block[dimension] ; w=w/rhs._grid->_slice_block[dimension]; + int n = w%rhs._grid->_slice_nblock[dimension]; w=w/rhs._grid->_slice_nblock[dimension]; + int x = w; + + int sx,so,o; + sx = (x-shift+ld)%rd; + o = x*rhs._grid->_ostride[dimension]+n*rhs._grid->_slice_stride[dimension]; // common sub expression alert. + so =sx*rhs._grid->_ostride[dimension]+n*rhs._grid->_slice_stride[dimension]; + + int permute_slice=0; + if ( permute_dim ) { + permute_slice = shift/rd; + if ( x ComplexF; typedef std::complex ComplexD; typedef std::complex Complex; - + inline RealF adj(const RealF & r){ return r; } inline RealF conj(const RealF & r){ return r; } @@ -130,7 +130,7 @@ namespace dpo { #if defined (AVX1) || defined (AVX2) typedef __m256 fvec; typedef __m256d dvec; - typedef __m256 cvec; + typedef __m256 cvec; typedef __m256d zvec; #endif #if defined (AVX512) diff --git a/Grid_vComplexD.h b/Grid_vComplexD.h index 71fa45ef..15dc00c6 100644 --- a/Grid_vComplexD.h +++ b/Grid_vComplexD.h @@ -8,6 +8,9 @@ namespace dpo { protected: zvec v; public: + typedef zvec vector_type; + typedef ComplexD scalar_type; + vComplexD & operator = ( Zero & z){ vzero(*this); return (*this); @@ -145,14 +148,43 @@ namespace dpo { ymm0 = _mm512_swizzle_pd(b.v, _MM_SWIZ_REG_CDAB); // OK ret.v= _mm512_fmadd_pd(ymm0,imag,ymm1); /* Imag OK */ - - #endif #ifdef QPX ret.v = vec_mul(a.v,b.v); #endif return ret; }; + + ///////////////////////////////////////////////////////////////// + // Extract + ///////////////////////////////////////////////////////////////// + friend inline void extract(vComplexD &y,std::vector &extracted){ + // Bounce off stack is painful + // temporary hack while I figure out the right interface + const int Nsimd = vComplexD::Nsimd(); + std::vector buf(Nsimd); + + vstore(y,&buf[0]); + + for(int i=0;i &extracted){ + // Bounce off stack is painful + // temporary hack while I figure out the right interface + const int Nsimd = vComplexD::Nsimd(); + std::vector buf(Nsimd); + + for(int i=0;i BA i.e. ab cd =>cd ab #endif #ifdef SSE2 - //No cases here + break; #endif #ifdef AVX512 // 4 complex=>2 permute @@ -205,7 +237,7 @@ namespace dpo { #endif } - friend inline void vset(vComplexD &ret, std::complex *a){ + friend inline void vset(vComplexD &ret,ComplexD *a){ #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_pd(a[1].imag(),a[1].real(),a[0].imag(),a[0].real()); #endif @@ -221,7 +253,7 @@ namespace dpo { #endif } -friend inline void vstore(vComplexD &ret, std::complex *a){ +friend inline void vstore(vComplexD &ret, ComplexD *a){ #if defined (AVX1)|| defined (AVX2) _mm256_store_pd((double *)a,ret.v); #endif @@ -273,10 +305,10 @@ friend inline void vstore(vComplexD &ret, std::complex *a){ // return std::complex(_mm256_mask_reduce_add_pd(0x55, in.v),_mm256_mask_reduce_add_pd(0xAA, in.v)); __attribute__ ((aligned(32))) double c_[4]; _mm256_store_pd(c_,in.v); - return std::complex(c_[0]+c_[2],c_[1]+c_[3]); + return ComplexD(c_[0]+c_[2],c_[1]+c_[3]); #endif #ifdef AVX512 - return std::complex(_mm512_mask_reduce_add_pd(0x5555, in.v),_mm512_mask_reduce_add_pd(0xAAAA, in.v)); + return ComplexD(_mm512_mask_reduce_add_pd(0x5555, in.v),_mm512_mask_reduce_add_pd(0xAAAA, in.v)); #endif #ifdef QPX #endif diff --git a/Grid_vComplexF.h b/Grid_vComplexF.h index c5c6e58f..0b4f5e61 100644 --- a/Grid_vComplexF.h +++ b/Grid_vComplexF.h @@ -8,6 +8,11 @@ namespace dpo { cvec v; public: + static inline int Nsimd(void) { return sizeof(cvec)/sizeof(float)/2;} + public: + typedef cvec vector_type; + typedef ComplexF scalar_type; + vComplexF & operator = ( Zero & z){ vzero(*this); return (*this); @@ -125,6 +130,39 @@ namespace dpo { return ret; }; + ///////////////////////////////////////////////////////////////// + // Extract + ///////////////////////////////////////////////////////////////// + friend inline void extract(vComplexF &y,std::vector &extracted){ + // Bounce off heap is painful + // temporary hack while I figure out the right interface + vComplexF vbuf; + ComplexF *buf = (ComplexF *)&vbuf; + + vstore(y,&buf[0]); + for(int i=0;i &extracted){ + // Bounce off stack is painful + // temporary hack while I figure out the right interface + const int Nsimd = vComplexF::Nsimd(); + vComplexF vbuf; + ComplexF *buf = (ComplexF *)&vbuf; + + for(int i=0;i *a){ +friend inline void vstore(vComplexF &ret, ComplexF *a){ #if defined (AVX1)|| defined (AVX2) _mm256_store_ps((float *)a,ret.v); #endif @@ -225,11 +263,11 @@ exit(-1); #if defined (AVX1) || defined(AVX2) __attribute__ ((aligned(32))) float c_[8]; _mm256_store_ps(c_,in.v); - return std::complex(c_[0]+c_[2]+c_[4]+c_[6],c_[1]+c_[3]+c_[5]+c_[7]); + return ComplexF(c_[0]+c_[2]+c_[4]+c_[6],c_[1]+c_[3]+c_[5]+c_[7]); #endif #ifdef AVX512 - return std::complex(_mm512_mask_reduce_add_ps(0x5555, in.v),_mm512_mask_reduce_add_ps(0xAAAA, in.v)); + return ComplexF(_mm512_mask_reduce_add_ps(0x5555, in.v),_mm512_mask_reduce_add_ps(0xAAAA, in.v)); #endif #ifdef QPX #endif @@ -321,9 +359,6 @@ exit(-1); return *this; } - - public: - static int Nsimd(void) { return sizeof(cvec)/sizeof(float)/2;} }; inline vComplexF localInnerProduct(const vComplexF & l, const vComplexF & r) { return conj(l)*r; } diff --git a/Grid_vRealD.h b/Grid_vRealD.h index d092d509..e5d3d4c6 100644 --- a/Grid_vRealD.h +++ b/Grid_vRealD.h @@ -7,7 +7,11 @@ namespace dpo{ class vRealD { protected: dvec v; // dvec is double precision vector + public: + typedef dvec vector_type; + typedef RealD scalar_type; + vRealD(){}; friend inline void mult(vRealD * __restrict__ y,const vRealD * __restrict__ l,const vRealD *__restrict__ r) {*y = (*l) * (*r);} @@ -94,6 +98,37 @@ namespace dpo{ #endif return ret; }; + + ///////////////////////////////////////////////////////////////// + // Extract + ///////////////////////////////////////////////////////////////// + friend inline void extract(vRealD &y,std::vector &extracted){ + // Bounce off stack is painful + // temporary hack while I figure out the right interface + const int Nsimd = vRealD::Nsimd(); + RealD buf[Nsimd]; + + vstore(y,buf); + + for(int i=0;i &extracted){ + // Bounce off stack is painful + // temporary hack while I figure out the right interface + const int Nsimd = vRealD::Nsimd(); + RealD buf[Nsimd]; + + for(int i=0;i BA DC FE HG diff --git a/Grid_vRealF.h b/Grid_vRealF.h index 72f7d9e6..db74b005 100644 --- a/Grid_vRealF.h +++ b/Grid_vRealF.h @@ -7,7 +7,12 @@ namespace dpo { class vRealF { protected: fvec v; + public: + + typedef fvec vector_type; + typedef RealF scalar_type; + vRealF(){}; //////////////////////////////////// // Arithmetic operator overloads +,-,* @@ -113,6 +118,37 @@ namespace dpo { ////////////////////////////////// friend inline void vone (vRealF &ret){vsplat(ret,1.0);} friend inline void vzero(vRealF &ret){vsplat(ret,0.0);} + + + ///////////////////////////////////////////////////////////////// + // Extract + ///////////////////////////////////////////////////////////////// + friend inline void extract(vRealF &y,std::vector &extracted){ + // Bounce off stack is painful + // temporary hack while I figure out the right interface + const int Nsimd = vRealF::Nsimd(); + RealF buf[Nsimd]; + + vstore(y,buf); + + for(int i=0;i &extracted){ + // Bounce off stack is painful + // temporary hack while I figure out the right interface + const int Nsimd = vRealF::Nsimd(); + RealF buf[Nsimd]; + + for(int i=0;i Date: Sun, 29 Mar 2015 21:44:22 +0100 Subject: [PATCH 024/429] Make file and configure --- Makefile.am | 5 ++++- configure.ac | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 13c2484b..b9763db1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -23,5 +23,8 @@ include_HEADERS = Grid.h\ # Test code # bin_PROGRAMS = Grid_main -Grid_main_SOURCES = Grid_main.cc +Grid_main_SOURCES = \ + Grid_main.cc\ + Grid_fake.cc + Grid_main_LDADD = libGrid.a diff --git a/configure.ac b/configure.ac index becb98dd..147ce21f 100644 --- a/configure.ac +++ b/configure.ac @@ -50,5 +50,27 @@ case ${ac_SIMD} in ;; esac + +AC_ARG_ENABLE([comms],[AC_HELP_STRING([--enable-comms=none|fake|mpi],[Select communications])],[ac_COMMS=${enable_comms}],[ac_COMMS=none]) + +case ${ac_COMMS} in + fake) + echo Configuring for FAKE communications + AC_DEFINE([GRID_COMMS_FAKE],[1],[GRID_COMMS_FAKE] ) + ;; + none) + echo Configuring for NO communications + AC_DEFINE([GRID_COMMS_NONE],[1],[GRID_COMMS_NONE] ) + ;; + mpi) + echo Configuring for MPI communications + AC_DEFINE([GRID_COMMS_MPI],[1],[GRID_COMMS_MPI] ) + ;; + *) + AC_MSG_ERROR([${ac_COMMS} unsupported --enable-comms option]); + ;; +esac + + AC_CONFIG_FILES(Makefile) AC_OUTPUT From 4f57ccc66cc6820f12b4d94a5126ec39d3870591 Mon Sep 17 00:00:00 2001 From: azusayamaguchi Date: Sun, 29 Mar 2015 21:50:20 +0100 Subject: [PATCH 025/429] No compile fix --- Grid_fake.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/Grid_fake.cc b/Grid_fake.cc index 7e664f33..abc54c8e 100644 --- a/Grid_fake.cc +++ b/Grid_fake.cc @@ -27,7 +27,6 @@ void CartesianCommunicator::SendToRecvFrom(void *xmit, int bytes) { exit(-1); - bcopy(xmit,recv,bytes); } } From e0af0e658d4bb7c7cd3d05663adfb95240bc7978 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 29 Mar 2015 22:04:49 +0100 Subject: [PATCH 026/429] Commit --- Makefile.in | 371 ++-- configure | 4687 ++++++++++++++++++++++----------------------------- 2 files changed, 2294 insertions(+), 2764 deletions(-) diff --git a/Makefile.in b/Makefile.in index b841357d..9a79034e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -18,6 +17,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -36,14 +90,12 @@ PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = Grid_main$(EXEEXT) subdir = . -DIST_COMMON = README $(am__configure_deps) $(include_HEADERS) \ - $(srcdir)/Grid_config.h.in $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ - ChangeLog INSTALL NEWS compile depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(include_HEADERS) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d @@ -71,46 +123,111 @@ am__nobase_list = $(am__nobase_strip_setup); \ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(includedir)" LIBRARIES = $(lib_LIBRARIES) AR = ar ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = libGrid_a_AR = $(AR) $(ARFLAGS) libGrid_a_LIBADD = -am_libGrid_a_OBJECTS = Grid_signal.$(OBJEXT) +am_libGrid_a_OBJECTS = Grid_init.$(OBJEXT) libGrid_a_OBJECTS = $(am_libGrid_a_OBJECTS) PROGRAMS = $(bin_PROGRAMS) -am_Grid_main_OBJECTS = Grid_main.$(OBJEXT) +am_Grid_main_OBJECTS = Grid_main.$(OBJEXT) Grid_fake.$(OBJEXT) Grid_main_OBJECTS = $(am_Grid_main_OBJECTS) Grid_main_DEPENDENCIES = libGrid.a +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = SOURCES = $(libGrid_a_SOURCES) $(Grid_main_SOURCES) DIST_SOURCES = $(libGrid_a_SOURCES) $(Grid_main_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac HEADERS = $(include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)Grid_config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags +CSCOPE = cscope +AM_RECURSIVE_TARGETS = cscope +am__DIST_COMMON = $(srcdir)/Grid_config.h.in $(srcdir)/Makefile.in \ + AUTHORS COPYING ChangeLog INSTALL NEWS README compile depcomp \ + install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ - { test ! -d "$(distdir)" \ - || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr "$(distdir)"; }; } + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best +DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -150,6 +267,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -208,7 +326,7 @@ AM_CXXFLAGS = -I$(top_srcdir)/ # Libraries # lib_LIBRARIES = libGrid.a -libGrid_a_SOURCES = Grid_signal.cc +libGrid_a_SOURCES = Grid_init.cc # # Include files @@ -222,14 +340,17 @@ include_HEADERS = Grid.h\ Grid_Lattice.h\ Grid_config.h -Grid_main_SOURCES = Grid_main.cc +Grid_main_SOURCES = \ + Grid_main.cc\ + Grid_fake.cc + Grid_main_LDADD = libGrid.a all: Grid_config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cc .o .obj -am--refresh: +am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ @@ -244,7 +365,6 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -265,10 +385,8 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): Grid_config.h: stamp-h1 - @if test ! -f $@; then \ - rm -f stamp-h1; \ - $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ - else :; fi + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/Grid_config.h.in $(top_builddir)/config.status @rm -f stamp-h1 @@ -282,7 +400,6 @@ distclean-hdr: -rm -f Grid_config.h stamp-h1 install-libLIBRARIES: $(lib_LIBRARIES) @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -290,6 +407,8 @@ install-libLIBRARIES: $(lib_LIBRARIES) else :; fi; \ done; \ test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \ $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; } @$(POST_INSTALL) @@ -306,26 +425,29 @@ uninstall-libLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(libdir)' && rm -f "$$files" )"; \ - cd "$(DESTDIR)$(libdir)" && rm -f $$files + dir='$(DESTDIR)$(libdir)'; $(am__uninstall_files_from_dir) clean-libLIBRARIES: -test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES) -libGrid.a: $(libGrid_a_OBJECTS) $(libGrid_a_DEPENDENCIES) - -rm -f libGrid.a - $(libGrid_a_AR) libGrid.a $(libGrid_a_OBJECTS) $(libGrid_a_LIBADD) - $(RANLIB) libGrid.a + +libGrid.a: $(libGrid_a_OBJECTS) $(libGrid_a_DEPENDENCIES) $(EXTRA_libGrid_a_DEPENDENCIES) + $(AM_V_at)-rm -f libGrid.a + $(AM_V_AR)$(libGrid_a_AR) libGrid.a $(libGrid_a_OBJECTS) $(libGrid_a_LIBADD) + $(AM_V_at)$(RANLIB) libGrid.a install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p; \ - then echo "$$p"; echo "$$p"; else :; fi; \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ @@ -346,16 +468,18 @@ uninstall-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) -Grid_main$(EXEEXT): $(Grid_main_OBJECTS) $(Grid_main_DEPENDENCIES) + +Grid_main$(EXEEXT): $(Grid_main_OBJECTS) $(Grid_main_DEPENDENCIES) $(EXTRA_Grid_main_DEPENDENCIES) @rm -f Grid_main$(EXEEXT) - $(CXXLINK) $(Grid_main_OBJECTS) $(Grid_main_LDADD) $(LIBS) + $(AM_V_CXXLD)$(CXXLINK) $(Grid_main_OBJECTS) $(Grid_main_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -363,26 +487,30 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_fake.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_main.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_signal.Po@am__quote@ .cc.o: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -396,30 +524,17 @@ uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags -TAGS: $(HEADERS) $(SOURCES) Grid_config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) Grid_config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -431,15 +546,11 @@ TAGS: $(HEADERS) $(SOURCES) Grid_config.h.in $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) Grid_config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) Grid_config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -448,9 +559,31 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) @@ -493,36 +626,42 @@ distdir: $(DISTFILES) || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) + $(am__post_remove_distdir) dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) -dist-lzma: distdir - tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma - $(am__remove_distdir) +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) dist-xz: distdir - tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz - $(am__remove_distdir) + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) + $(am__post_remove_distdir) dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) + $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) + $(am__post_remove_distdir) -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another @@ -533,8 +672,8 @@ distcheck: dist GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lzma*) \ - lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ @@ -544,17 +683,19 @@ distcheck: dist *.zip*) \ unzip $(distdir).zip ;;\ esac - chmod -R a-w $(distdir); chmod u+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -577,13 +718,21 @@ distcheck: dist && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 - $(am__remove_distdir) + $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: - @$(am__cd) '$(distuninstallcheck_dir)' \ - && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ @@ -616,10 +765,15 @@ install-am: all-am installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: clean-generic: @@ -707,9 +861,10 @@ uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ .MAKE: all install-am install-strip -.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ - clean-binPROGRAMS clean-generic clean-libLIBRARIES ctags dist \ - dist-all dist-bzip2 dist-gzip dist-lzma dist-shar dist-tarZ \ +.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \ + clean-binPROGRAMS clean-cscope clean-generic \ + clean-libLIBRARIES cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ dist-xz dist-zip distcheck distclean distclean-compile \ distclean-generic distclean-hdr distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ @@ -721,10 +876,12 @@ uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-includeHEADERS \ uninstall-libLIBRARIES +.PRECIOUS: Makefile + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/configure b/configure index f63f8031..e048369e 100755 --- a/configure +++ b/configure @@ -1,20 +1,22 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.63 for Grid 1.0. +# Generated by GNU Autoconf 2.69 for Grid 1.0. # # Report bugs to . # -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -22,23 +24,15 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; esac - fi - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - as_nl=' ' export as_nl @@ -46,7 +40,13 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -57,7 +57,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in + case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -80,13 +80,6 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -96,15 +89,16 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -case $0 in +as_myself= +case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done IFS=$as_save_IFS ;; @@ -116,12 +110,16 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } + exit 1 fi -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' @@ -133,7 +131,294 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# Required to use basename. +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: paboyle@ph.ed.ac.uk about your system, including any +$0: error possibly output before this message. Then install +$0: a modern shell, or manually run the script under such a +$0: shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -147,8 +432,12 @@ else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -168,295 +457,19 @@ $as_echo X/"$0" | } s/.*/./; q'` -# CDPATH. -$as_unset CDPATH +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits -if test "x$CONFIG_SHELL" = x; then - if (eval ":") 2>/dev/null; then - as_have_required=yes -else - as_have_required=no -fi - - if test $as_have_required = yes && (eval ": -(as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=\$LINENO - as_lineno_2=\$LINENO - test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && - test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } -") 2> /dev/null; then - : -else - as_candidate_shells= - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - case $as_dir in - /*) - for as_base in sh bash ksh sh5; do - as_candidate_shells="$as_candidate_shells $as_dir/$as_base" - done;; - esac -done -IFS=$as_save_IFS - - - for as_shell in $as_candidate_shells $SHELL; do - # Try only shells that exist, to save several forks. - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { ("$as_shell") 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -_ASEOF -}; then - CONFIG_SHELL=$as_shell - as_have_required=yes - if { "$as_shell" 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -(as_func_return () { - (exit $1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = "$1" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test $exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } - -_ASEOF -}; then - break -fi - -fi - - done - - if test "x$CONFIG_SHELL" != x; then - for as_var in BASH_ENV ENV - do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - done - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi - - - if test $as_have_required = no; then - echo This script requires a shell more modern than all the - echo shells that I found on your system. Please install a - echo modern shell, or manually run the script under such a - echo shell if you do have one. - { (exit 1); exit 1; } -fi - - -fi - -fi - - - -(eval "as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0") || { - echo No shell found that supports shell functions. - echo Please tell bug-autoconf@gnu.org about your system, - echo including any error possibly output before this message. - echo This can help us improve future autoconf versions. - echo Configuration will now proceed without shell functions. -} - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= @@ -473,9 +486,12 @@ test \$exitcode = 0") || { s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). @@ -484,29 +500,18 @@ test \$exitcode = 0") || { exit } - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in +case `echo -n x` in #((((( -n*) - case `echo 'x\c'` in + case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -521,49 +526,29 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -572,11 +557,11 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -exec 7<&0 &1 +test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` @@ -591,7 +576,6 @@ cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='Grid' @@ -599,6 +583,7 @@ PACKAGE_TARNAME='grid' PACKAGE_VERSION='1.0' PACKAGE_STRING='Grid 1.0' PACKAGE_BUGREPORT='paboyle@ph.ed.ac.uk' +PACKAGE_URL='' ac_unique_file="Grid.h" # Factoring default headers for most tests. @@ -655,6 +640,7 @@ CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE +am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE @@ -668,6 +654,10 @@ CPPFLAGS LDFLAGS CXXFLAGS CXX +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V am__untar am__tar AMTAR @@ -721,6 +711,7 @@ bindir program_transform_name prefix exec_prefix +PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION @@ -731,9 +722,11 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking +enable_silent_rules enable_dependency_tracking enable_openmp enable_simd +enable_comms ' ac_precious_vars='build_alias host_alias @@ -809,8 +802,9 @@ do fi case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. @@ -855,8 +849,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -882,8 +875,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1087,8 +1079,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1104,8 +1095,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1135,17 +1125,17 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) { $as_echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1154,7 +1144,7 @@ Try \`$0 --help' for more information." >&2 $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac @@ -1162,15 +1152,13 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { $as_echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; - fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 - { (exit 1); exit 1; }; } ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1193,8 +1181,7 @@ do [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' @@ -1208,8 +1195,6 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1224,11 +1209,9 @@ test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - { $as_echo "$as_me: error: working directory cannot be determined" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. @@ -1267,13 +1250,11 @@ else fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 - { (exit 1); exit 1; }; } + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then @@ -1313,7 +1294,7 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages + -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files @@ -1373,11 +1354,17 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build --disable-openmp do not use OpenMP --enable-simd=SSE|AVX|AVX2|AVX512 Select instructions + --enable-comms=none|fake|mpi + Select communications Some influential environment variables: CXX C++ compiler command @@ -1385,7 +1372,7 @@ Some influential environment variables: LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags @@ -1458,21 +1445,522 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Grid configure 1.0 -generated by GNU Autoconf 2.63 +generated by GNU Autoconf 2.69 -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_find_uintX_t LINENO BITS VAR +# ------------------------------------ +# Finds an unsigned integer type with width BITS, setting cache variable VAR +# accordingly. +ac_fn_c_find_uintX_t () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 +$as_echo_n "checking for uint$2_t... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + # Order is important - never check a type that is potentially smaller + # than half of the expected target width. + for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + case $ac_type in #( + uint$2_t) : + eval "$3=yes" ;; #( + *) : + eval "$3=\$ac_type" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no"; then : + +else + break +fi + done +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_find_uintX_t + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Grid $as_me 1.0, which was -generated by GNU Autoconf 2.63. Invocation command line was +generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -1508,8 +1996,8 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" -done + $as_echo "PATH: $as_dir" + done IFS=$as_save_IFS } >&5 @@ -1546,9 +2034,9 @@ do ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" + as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else @@ -1564,13 +2052,13 @@ do -* ) ac_must_keep_next=true ;; esac fi - ac_configure_args="$ac_configure_args '$ac_arg'" + as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there @@ -1582,11 +2070,9 @@ trap 'exit_status=$? { echo - cat <<\_ASBOX -## ---------------- ## + $as_echo "## ---------------- ## ## Cache variables. ## -## ---------------- ## -_ASBOX +## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( @@ -1595,13 +2081,13 @@ _ASBOX case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; + *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done @@ -1620,11 +2106,9 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - cat <<\_ASBOX -## ----------------- ## + $as_echo "## ----------------- ## ## Output variables. ## -## ----------------- ## -_ASBOX +## ----------------- ##" echo for ac_var in $ac_subst_vars do @@ -1637,11 +2121,9 @@ _ASBOX echo if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## + $as_echo "## ------------------- ## ## File substitutions. ## -## ------------------- ## -_ASBOX +## ------------------- ##" echo for ac_var in $ac_subst_files do @@ -1655,11 +2137,9 @@ _ASBOX fi if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## + $as_echo "## ----------- ## ## confdefs.h. ## -## ----------- ## -_ASBOX +## ----------- ##" echo cat confdefs.h echo @@ -1673,46 +2153,53 @@ _ASBOX exit $exit_status ' 0 for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h +$as_echo "/* confdefs.h */" > confdefs.h + # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - ac_site_file1=$CONFIG_SITE + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site @@ -1723,19 +2210,23 @@ fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue - if test -r "$ac_site_file"; then - { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; @@ -1743,7 +2234,7 @@ $as_echo "$as_me: loading cache $cache_file" >&6;} esac fi else - { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi @@ -1758,11 +2249,11 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; @@ -1772,17 +2263,17 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac @@ -1794,43 +2285,20 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then - { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi - - - - - - - - - - - - - - - - - - - - - - - - +## -------------------- ## +## Main body of script. ## +## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -1839,7 +2307,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -am__api_version='1.11' +am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -1858,9 +2326,7 @@ for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do fi done if test -z "$ac_aux_dir"; then - { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 -$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, @@ -1886,10 +2352,10 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then +if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -1897,11 +2363,11 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -1909,7 +2375,7 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -1938,7 +2404,7 @@ case $as_dir/ in ;; esac -done + done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir @@ -1954,7 +2420,7 @@ fi INSTALL=$ac_install_sh fi fi -{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. @@ -1965,68 +2431,73 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) - { { $as_echo "$as_me:$LINENO: error: unsafe absolute working directory name" >&5 -$as_echo "$as_me: error: unsafe absolute working directory name" >&2;} - { (exit 1); exit 1; }; };; + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - { { $as_echo "$as_me:$LINENO: error: unsafe srcdir value: \`$srcdir'" >&5 -$as_echo "$as_me: error: unsafe srcdir value: \`$srcdir'" >&2;} - { (exit 1); exit 1; }; };; + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac -# Do `set' in a subshell so we don't clobber the current shell's +# Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&5 -$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&2;} - { (exit 1); exit 1; }; } - fi + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done test "$2" = conftest.file ) then # Ok. : else - { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! -Check your system clock" >&5 -$as_echo "$as_me: error: newly created file is older than distributed files! -Check your system clock" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 fi -{ $as_echo "$as_me:$LINENO: result: yes" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. @@ -2037,8 +2508,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2049,15 +2520,15 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2066,17 +2537,17 @@ if test x"${install_sh}" != xset; then esac fi -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. +# will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then +if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then @@ -2087,24 +2558,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2114,9 +2585,9 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then @@ -2127,24 +2598,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2153,7 +2624,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -2166,10 +2637,10 @@ fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then - if test "${ac_cv_path_mkdir+set}" = set; then + if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -2177,9 +2648,9 @@ for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do + for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ @@ -2189,11 +2660,12 @@ do esac done done -done + done IFS=$as_save_IFS fi + test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else @@ -2201,26 +2673,19 @@ fi # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. - test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi -{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AWK+set}" = set; then +if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then @@ -2231,24 +2696,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { $as_echo "$as_me:$LINENO: result: $AWK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2256,11 +2721,11 @@ fi test -n "$AWK" && break done -{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF @@ -2268,7 +2733,7 @@ SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; @@ -2278,11 +2743,11 @@ esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -2296,15 +2761,52 @@ else fi rmdir .tst 2>/dev/null +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then - { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi @@ -2348,19 +2850,72 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' -AMTAR=${AMTAR-"${am_missing_run}tar"} +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' -am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + ac_config_headers="$ac_config_headers Grid_config.h" @@ -2380,9 +2935,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CXX+set}" = set; then +if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then @@ -2393,24 +2948,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then - { $as_echo "$as_me:$LINENO: result: $CXX" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2424,9 +2979,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then +if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then @@ -2437,24 +2992,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2467,7 +3022,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -2478,48 +3033,31 @@ fi fi fi # Provide some information about the compiler. -$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 -{ (ac_try="$ac_compiler --version >&5" +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler --version >&5") 2>&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2535,8 +3073,8 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5 -$as_echo_n "checking for C++ compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 +$as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: @@ -2552,17 +3090,17 @@ do done rm -f $ac_rmfiles -if { (ac_try="$ac_link_default" +if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -2579,7 +3117,7 @@ do # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -2598,84 +3136,41 @@ test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi - -{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -if test -z "$ac_file"; then - $as_echo "$as_me: failed program was:" >&5 +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C++ compiler cannot create executables -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C++ compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; }; } -fi - -ac_exeext=$ac_cv_exeext - -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5 -$as_echo_n "checking whether the C++ compiler works... " >&6; } -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } - fi - fi -fi -{ $as_echo "$as_me:$LINENO: result: yes" >&5 +as_fn_error 77 "C++ compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 +$as_echo_n "checking for C++ compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } -if { (ac_try="$ac_link" +if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -2690,32 +3185,83 @@ for ac_file in conftest.exe conftest conftest.*; do esac done else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } fi - -rm -f conftest$ac_cv_exeext -{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then +if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2727,17 +3273,17 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { (ac_try="$ac_compile" +if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -2750,31 +3296,23 @@ else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } fi - rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if test "${ac_cv_cxx_compiler_gnu+set}" = set; then +if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2788,37 +3326,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no + ac_compiler_gnu=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes @@ -2827,20 +3344,16 @@ else fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } -if test "${ac_cv_prog_cxx_g+set}" = set; then +if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2851,35 +3364,11 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CXXFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2890,36 +3379,12 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cxx_werror_flag=$ac_save_cxx_werror_flag +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2930,42 +3395,17 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS @@ -2999,14 +3439,14 @@ am__doit: .PHONY: am__doit END # If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. +# Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -3027,18 +3467,19 @@ if test "$am__include" = "#"; then fi -{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then +if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' + am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= @@ -3052,17 +3493,18 @@ fi depcc="$CXX" am_compiler_list= -{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -3096,16 +3538,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -3114,16 +3556,16 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -3162,7 +3604,7 @@ else fi fi -{ $as_echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type @@ -3185,9 +3627,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3198,24 +3640,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3225,9 +3667,9 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then +if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3238,24 +3680,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3264,7 +3706,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3278,9 +3720,9 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3291,24 +3733,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3318,9 +3760,9 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3332,18 +3774,18 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then @@ -3362,10 +3804,10 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3377,9 +3819,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3390,24 +3832,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3421,9 +3863,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then +if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3434,24 +3876,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3464,7 +3906,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3475,62 +3917,42 @@ fi fi -test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. -$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -{ (ac_try="$ac_compiler --version >&5" +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler --version >&5") 2>&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done -{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then +if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3544,37 +3966,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no + ac_compiler_gnu=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes @@ -3583,20 +3984,16 @@ else fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then +if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3607,35 +4004,11 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3646,36 +4019,12 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_compile "$LINENO"; then : - ac_c_werror_flag=$ac_save_c_werror_flag +else + ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3686,42 +4035,17 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS @@ -3738,23 +4062,18 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then +if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include -#include -#include +struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); @@ -3806,32 +4125,9 @@ for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then + if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done @@ -3842,17 +4138,19 @@ fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) - { $as_echo "$as_me:$LINENO: result: none needed" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) - { $as_echo "$as_me:$LINENO: result: unsupported" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac +if test "x$ac_cv_prog_cc_c89" != xno; then : +fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -3860,19 +4158,79 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then +if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -3906,16 +4264,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -3924,16 +4282,16 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -3972,7 +4330,7 @@ else fi fi -{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type @@ -3991,17 +4349,18 @@ fi OPENMP_CFLAGS= # Check whether --enable-openmp was given. -if test "${enable_openmp+set}" = set; then +if test "${enable_openmp+set}" = set; then : enableval=$enable_openmp; fi if test "$enable_openmp" != no; then - { $as_echo "$as_me:$LINENO: checking for $CC option to support OpenMP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5 $as_echo_n "checking for $CC option to support OpenMP... " >&6; } -if test "${ac_cv_prog_c_openmp+set}" = set; then +if ${ac_cv_prog_c_openmp+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ #ifndef _OPENMP choke me @@ -4010,37 +4369,16 @@ else int main () { return omp_get_num_threads (); } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_c_openmp='none needed' else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_prog_c_openmp='unsupported' - for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp; do + ac_cv_prog_c_openmp='unsupported' + for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ + -Popenmp --openmp; do ac_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $ac_option" - cat >conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ #ifndef _OPENMP choke me @@ -4049,56 +4387,27 @@ sed 's/^/| /' conftest.$ac_ext >&5 int main () { return omp_get_num_threads (); } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_c_openmp=$ac_option -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS=$ac_save_CFLAGS if test "$ac_cv_prog_c_openmp" != unsupported; then break fi done fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_c_openmp" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5 $as_echo "$ac_cv_prog_c_openmp" >&6; } case $ac_cv_prog_c_openmp in #( "none needed" | unsupported) - ;; #( + ;; #( *) - OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; + OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; esac fi @@ -4106,9 +4415,9 @@ $as_echo "$ac_cv_prog_c_openmp" >&6; } if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then +if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then @@ -4119,24 +4428,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -4146,9 +4455,9 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then @@ -4159,24 +4468,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -4185,7 +4494,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -4205,14 +4514,14 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then + if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded @@ -4227,11 +4536,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4240,78 +4545,34 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi - -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break fi - -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : break fi @@ -4323,7 +4584,7 @@ fi else ac_cv_prog_CPP=$CPP fi -{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes @@ -4334,11 +4595,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4347,87 +4604,40 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi - -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break fi - -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c @@ -4437,9 +4647,9 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then +if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then @@ -4450,10 +4660,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do + for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in @@ -4470,7 +4680,7 @@ case `"$ac_path_GREP" --version 2>&1` in $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" @@ -4485,26 +4695,24 @@ esac $ac_path_GREP_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" -{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then +if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 @@ -4518,10 +4726,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do + for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in @@ -4538,7 +4746,7 @@ case `"$ac_path_EGREP" --version 2>&1` in $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" @@ -4553,12 +4761,10 @@ esac $ac_path_EGREP_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP @@ -4566,21 +4772,17 @@ fi fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" -{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then +if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -4595,48 +4797,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdc=no + ac_cv_header_stdc=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -4646,18 +4823,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -4667,14 +4840,10 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -4701,118 +4870,33 @@ main () return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : +if ac_fn_c_try_run "$LINENO"; then : + else - $as_echo "$as_me: program exited with status $ac_status" >&5 -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -rf conftest.dSYM -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi - fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF +$as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -4822,453 +4906,36 @@ fi done - for ac_header in stdint.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_STDINT_H 1 _ACEOF fi done - for ac_header in malloc/malloc.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_malloc_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_MALLOC_MALLOC_H 1 _ACEOF fi done - for ac_header in malloc.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_MALLOC_H 1 _ACEOF fi @@ -5277,102 +4944,9 @@ done # Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 -$as_echo_n "checking for size_t... " >&6; } -if test "${ac_cv_type_size_t+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_type_size_t=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if (sizeof (size_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if (sizeof ((size_t))) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : - ac_cv_type_size_t=yes -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 -$as_echo "$ac_cv_type_size_t" >&6; } -if test "x$ac_cv_type_size_t" = x""yes; then - : else cat >>confdefs.h <<_ACEOF @@ -5381,75 +4955,12 @@ _ACEOF fi - - { $as_echo "$as_me:$LINENO: checking for uint32_t" >&5 -$as_echo_n "checking for uint32_t... " >&6; } -if test "${ac_cv_c_uint32_t+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_c_uint32_t=no - for ac_type in 'uint32_t' 'unsigned int' 'unsigned long int' \ - 'unsigned long long int' 'unsigned short int' 'unsigned char'; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(($ac_type) -1 >> (32 - 1) == 1)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - case $ac_type in - uint32_t) ac_cv_c_uint32_t=yes ;; - *) ac_cv_c_uint32_t=$ac_type ;; -esac - -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_uint32_t" != no && break - done -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_uint32_t" >&5 -$as_echo "$ac_cv_c_uint32_t" >&6; } - case $ac_cv_c_uint32_t in #( +ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" +case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) -cat >>confdefs.h <<\_ACEOF -#define _UINT32_T 1 -_ACEOF +$as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF @@ -5458,75 +4969,12 @@ _ACEOF ;; esac - - { $as_echo "$as_me:$LINENO: checking for uint64_t" >&5 -$as_echo_n "checking for uint64_t... " >&6; } -if test "${ac_cv_c_uint64_t+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_c_uint64_t=no - for ac_type in 'uint64_t' 'unsigned int' 'unsigned long int' \ - 'unsigned long long int' 'unsigned short int' 'unsigned char'; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(($ac_type) -1 >> (64 - 1) == 1)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - case $ac_type in - uint64_t) ac_cv_c_uint64_t=yes ;; - *) ac_cv_c_uint64_t=$ac_type ;; -esac - -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_uint64_t" != no && break - done -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_uint64_t" >&5 -$as_echo "$ac_cv_c_uint64_t" >&6; } - case $ac_cv_c_uint64_t in #( +ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" +case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) -cat >>confdefs.h <<\_ACEOF -#define _UINT64_T 1 -_ACEOF +$as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF @@ -5537,102 +4985,12 @@ _ACEOF # Checks for library functions. - for ac_func in gettimeofday -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_GETTIMEOFDAY 1 _ACEOF fi @@ -5640,7 +4998,7 @@ done # Check whether --enable-simd was given. -if test "${enable_simd+set}" = set; then +if test "${enable_simd+set}" = set; then : enableval=$enable_simd; ac_SIMD=${enable_simd} else ac_SIMD=AVX2 @@ -5651,42 +5009,66 @@ case ${ac_SIMD} in SSE2) echo Configuring for SSE2 -cat >>confdefs.h <<\_ACEOF -#define SSE2 1 -_ACEOF +$as_echo "#define SSE2 1" >>confdefs.h ;; AVX) echo Configuring for AVX -cat >>confdefs.h <<\_ACEOF -#define AVX1 1 -_ACEOF +$as_echo "#define AVX1 1" >>confdefs.h ;; AVX2) echo Configuring for AVX2 -cat >>confdefs.h <<\_ACEOF -#define AVX2 1 -_ACEOF +$as_echo "#define AVX2 1" >>confdefs.h ;; AVX512) echo Configuring for AVX512 -cat >>confdefs.h <<\_ACEOF -#define AVX512 1 -_ACEOF +$as_echo "#define AVX512 1" >>confdefs.h ;; *) - { { $as_echo "$as_me:$LINENO: error: ${ac_SIMD} unsupported --enable-simd option" >&5 -$as_echo "$as_me: error: ${ac_SIMD} unsupported --enable-simd option" >&2;} - { (exit 1); exit 1; }; }; + as_fn_error $? "${ac_SIMD} unsupported --enable-simd option" "$LINENO" 5; ;; esac + +# Check whether --enable-comms was given. +if test "${enable_comms+set}" = set; then : + enableval=$enable_comms; ac_COMMS=${enable_comms} +else + ac_COMMS=none +fi + + +case ${ac_COMMS} in + fake) + echo Configuring for FAKE communications + +$as_echo "#define GRID_COMMS_FAKE 1" >>confdefs.h + + ;; + none) + echo Configuring for NO communications + +$as_echo "#define GRID_COMMS_NONE 1" >>confdefs.h + + ;; + mpi) + echo Configuring for MPI communications + +$as_echo "#define GRID_COMMS_MPI 1" >>confdefs.h + + ;; + *) + as_fn_error $? "${ac_COMMS} unsupported --enable-comms option" "$LINENO" 5; + ;; +esac + + ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF @@ -5716,13 +5098,13 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; + *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done @@ -5730,8 +5112,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" @@ -5753,12 +5135,23 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && - { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi else - { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi @@ -5772,20 +5165,29 @@ DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= +U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. - ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' @@ -5795,34 +5197,26 @@ else fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -: ${CONFIG_STATUS=./config.status} +: "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -5832,17 +5226,18 @@ cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 debug=false ac_cs_recheck=false ac_cs_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -5850,23 +5245,15 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; esac - fi - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - as_nl=' ' export as_nl @@ -5874,7 +5261,13 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -5885,7 +5278,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in + case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -5908,13 +5301,6 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -5924,15 +5310,16 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -case $0 in +as_myself= +case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done IFS=$as_save_IFS ;; @@ -5944,12 +5331,16 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } + exit 1 fi -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' @@ -5961,7 +5352,89 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# Required to use basename. +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -5975,8 +5448,12 @@ else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -5996,76 +5473,25 @@ $as_echo X/"$0" | } s/.*/./; q'` -# CDPATH. -$as_unset CDPATH - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in +case `echo -n x` in #((((( -n*) - case `echo 'x\c'` in + case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -6080,49 +5506,85 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -6132,13 +5594,19 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 -# Save the log message, to keep $[0] and so on meaningful, and to +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Grid $as_me 1.0, which was -generated by GNU Autoconf 2.63. Invocation command line was +generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -6170,13 +5638,15 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. -Usage: $0 [OPTION]... [FILE]... +Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit + --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files @@ -6195,16 +5665,17 @@ $config_headers Configuration commands: $config_commands -Report bugs to ." +Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Grid config.status 1.0 -configured by $0, generated by GNU Autoconf 2.63, - with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" -Copyright (C) 2008 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -6222,11 +5693,16 @@ ac_need_defaults=: while test $# != 0 do case $1 in - --*=*) + --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; *) ac_option=$1 ac_optarg=$2 @@ -6240,27 +5716,29 @@ do ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; esac - CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac - CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - { $as_echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; };; + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ @@ -6268,11 +5746,10 @@ Try \`$0 --help' for more information." >&2 ac_cs_silent=: ;; # This is an error. - -*) { $as_echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } ;; + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; - *) ac_config_targets="$ac_config_targets $1" + *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac @@ -6289,7 +5766,7 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' @@ -6327,9 +5804,7 @@ do "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done @@ -6352,26 +5827,24 @@ fi # after its creation but before its name has been assigned to `$tmp'. $debug || { - tmp= + tmp= ac_tmp= trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 + trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" + test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") -} || -{ - $as_echo "$as_me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -6379,7 +5852,13 @@ $debug || if test -n "$CONFIG_FILES"; then -ac_cr=' ' +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' @@ -6387,7 +5866,7 @@ else ac_cs_awk_cr=$ac_cr fi -echo 'BEGIN {' >"$tmp/subs1.awk" && +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF @@ -6396,24 +5875,18 @@ _ACEOF echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -6421,7 +5894,7 @@ done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h @@ -6435,7 +5908,7 @@ s/'"$ac_delim"'$// t delim :nl h -s/\(.\{148\}\).*/\1/ +s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p @@ -6449,7 +5922,7 @@ s/.\{148\}// t nl :delim h -s/\(.\{148\}\).*/\1/ +s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p @@ -6469,7 +5942,7 @@ t delim rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK -cat >>"\$tmp/subs1.awk" <<_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" @@ -6501,23 +5974,29 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 -$as_echo "$as_me: error: could not setup config files machinery" >&2;} - { (exit 1); exit 1; }; } +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// s/^[^=]*=[ ]*$// }' fi @@ -6529,7 +6008,7 @@ fi # test -n "$CONFIG_FILES" # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then -cat >"$tmp/defines.awk" <<\_ACAWK || +cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF @@ -6541,13 +6020,11 @@ _ACEOF # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do - ac_t=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_t"; then + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then break elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -6632,9 +6109,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 -$as_echo "$as_me: error: could not setup config headers machinery" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" @@ -6647,9 +6122,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 -$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} - { (exit 1); exit 1; }; };; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -6668,7 +6141,7 @@ $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} for ac_f do case $ac_f in - -) ac_f="$tmp/stdin";; + -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. @@ -6677,12 +6150,10 @@ $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} - { (exit 1); exit 1; }; };; + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - ac_file_inputs="$ac_file_inputs '$ac_f'" + as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't @@ -6693,7 +6164,7 @@ $as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. @@ -6705,10 +6176,8 @@ $as_echo "$as_me: creating $ac_file" >&6;} esac case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } ;; + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac @@ -6736,47 +6205,7 @@ $as_echo X"$ac_file" | q } s/.*/./; q'` - { as_dir="$ac_dir" - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } + as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in @@ -6833,7 +6262,6 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= - ac_sed_dataroot=' /datarootdir/ { p @@ -6843,12 +6271,11 @@ ac_sed_dataroot=' /@docdir@/p /@infodir@/p /@localedir@/p -/@mandir@/p -' +/@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 @@ -6858,7 +6285,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; + s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF @@ -6886,27 +6313,24 @@ s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} +which seems to be undefined. Please make sure it is defined" >&2;} - rm -f "$tmp/stdin" + rm -f "$ac_tmp/stdin" case $ac_file in - -) cat "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # @@ -6915,27 +6339,21 @@ $as_echo "$as_me: error: could not create $ac_file" >&2;} if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" - } >"$tmp/config.h" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } - if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" - mv "$tmp/config.h" "$ac_file" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ - || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 -$as_echo "$as_me: error: could not create -" >&2;} - { (exit 1); exit 1; }; } + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" @@ -6973,7 +6391,7 @@ $as_echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac @@ -6981,7 +6399,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -6994,7 +6412,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but + # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -7028,21 +6446,19 @@ $as_echo X"$mf" | continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. + # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue + test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || @@ -7068,47 +6484,7 @@ $as_echo X"$file" | q } s/.*/./; q'` - { as_dir=$dirpart/$fdir - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } + as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done @@ -7120,15 +6496,12 @@ $as_echo "$as_me: error: cannot create directory $as_dir" >&2;} done # for ac_tag -{ (exit 0); exit 0; } +as_fn_exit 0 _ACEOF -chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || - { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. @@ -7149,10 +6522,10 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } + $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi From 19372bf5ca986660744b30c84afd0a8357275560 Mon Sep 17 00:00:00 2001 From: azusayamaguchi Date: Sun, 29 Mar 2015 22:16:13 +0100 Subject: [PATCH 027/429] COnfig file --- Grid_config.h | 4 ++-- Grid_config.h.in | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Grid_config.h b/Grid_config.h index 2a442ea5..94ef0ea2 100644 --- a/Grid_config.h +++ b/Grid_config.h @@ -11,13 +11,13 @@ /* #undef AVX512 */ /* GRID_COMMS_FAKE */ -#define GRID_COMMS_FAKE 1 +/* #undef GRID_COMMS_FAKE */ /* GRID_COMMS_MPI */ /* #undef GRID_COMMS_MPI */ /* GRID_COMMS_NONE */ -/* #undef GRID_COMMS_NONE */ +#define GRID_COMMS_NONE 1 /* Define to 1 if you have the `gettimeofday' function. */ #define HAVE_GETTIMEOFDAY 1 diff --git a/Grid_config.h.in b/Grid_config.h.in index 5c57e4cf..ff15a834 100644 --- a/Grid_config.h.in +++ b/Grid_config.h.in @@ -9,6 +9,15 @@ /* AVX512 */ #undef AVX512 +/* GRID_COMMS_FAKE */ +#undef GRID_COMMS_FAKE + +/* GRID_COMMS_MPI */ +#undef GRID_COMMS_MPI + +/* GRID_COMMS_NONE */ +#undef GRID_COMMS_NONE + /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY @@ -60,6 +69,9 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME +/* Define to the home page for this package. */ +#undef PACKAGE_URL + /* Define to the version of this package. */ #undef PACKAGE_VERSION From 7b97e50b7ba66d1a231aff3e52edbc937459aa7b Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 3 Apr 2015 04:52:53 +0100 Subject: [PATCH 028/429] MPI is now working and passing basic tests. Will start to construct a more sensible test suite shortly since testing requirements now go beyond what a single Grid_main.cc can do. Will need a more organised src tree for this and will require substantial reorg of build system. --- Grid.h | 2 +- Grid_Cartesian.h | 27 +- Grid_Communicator.h | 10 +- Grid_Lattice.h | 5 +- Grid_config.h | 4 +- Grid_config.h.in | 12 + Grid_cshift_common.h | 384 +++++++++++++++++++++++ Grid_init.cc | 5 +- Grid_main.cc | 46 ++- Grid_mpi.cc | 46 +-- Grid_mpi_cshift.h | 625 ++++++++++++++++++-------------------- Grid_none_cshift.h | 304 +------------------ Makefile.am | 14 +- Makefile.in | 16 +- aclocal.m4 | 705 +++++++++++++++++++++++++++---------------- configure | 43 +++ configure.ac | 4 + 17 files changed, 1298 insertions(+), 954 deletions(-) create mode 100644 Grid_cshift_common.h diff --git a/Grid.h b/Grid.h index 5a3571e4..cc8b36c6 100644 --- a/Grid.h +++ b/Grid.h @@ -52,7 +52,7 @@ namespace dpo { - void Grid_init(void); + void Grid_init(int *argc,char ***argv); double usecond(void); void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr); void Grid_debug_handler_init(void); diff --git a/Grid_Cartesian.h b/Grid_Cartesian.h index bfe301a9..908d08a8 100644 --- a/Grid_Cartesian.h +++ b/Grid_Cartesian.h @@ -41,8 +41,8 @@ public: std::vector _simd_layout; // Which dimensions get relayed out over simd lanes. - std::vector _fdimensions;// Global dimensions of array with cb removed - std::vector _gdimensions;// Global dimensions of array + std::vector _fdimensions;// Global dimensions of array prior to cb removal + std::vector _gdimensions;// Global dimensions of array after cb removal std::vector _ldimensions;// local dimensions of array with processor images removed std::vector _rdimensions;// Reduced local dimensions with simd lane images and processor images removed @@ -88,11 +88,20 @@ public: for(int d=0;d<_ndimension;d++) idx+=_istride[d]*(rcoor[d]/_rdimensions[d]); return idx; } + inline int iCoordFromIsite(int lane,int mu) + { + std::vector coor(_ndimension); + for(int d=0;d<_ndimension;d++){ + coor[d] = lane % _simd_layout[d]; + lane = lane / _simd_layout[d]; + } + return coor[mu]; + } inline int oSites(void) { return _osites; }; inline int iSites(void) { return _isites; }; - inline int CheckerboardFromOsite (int Osite){ + inline int CheckerBoardFromOsite (int Osite){ std::vector ocoor; CoordFromOsite(ocoor,Osite); int ss=0; @@ -109,6 +118,7 @@ public: } } + virtual int CheckerBoarded(int dim)=0; virtual int CheckerBoard(std::vector site)=0; virtual int CheckerBoardDestination(int source_cb,int shift)=0; virtual int CheckerBoardShift(int source_cb,int dim,int shift,int osite)=0; @@ -116,6 +126,9 @@ public: class GridCartesian: public SimdGrid { public: + virtual int CheckerBoarded(int dim){ + return 0; + } virtual int CheckerBoard(std::vector site){ return 0; } @@ -199,6 +212,10 @@ public: class GridRedBlackCartesian : public SimdGrid { public: + virtual int CheckerBoarded(int dim){ + if( dim==0) return 1; + else return 0; + } virtual int CheckerBoard(std::vector site){ return (site[0]+site[1]+site[2]+site[3])&0x1; } @@ -215,11 +232,13 @@ public: // Probably faster with table lookup; // or by looping over x,y,z and multiply rather than computing checkerboard. - int ocb=CheckerboardFromOsite(osite); + int ocb=CheckerBoardFromOsite(osite); if ( (source_cb+ocb)&1 ) { + printf("Checkerboard shift %d\n",(shift)/2); return (shift)/2; } else { + printf("Checkerboard shift %d\n",(shift+1)/2); return (shift+1)/2; } } diff --git a/Grid_Communicator.h b/Grid_Communicator.h index 5be6f26f..19e25167 100644 --- a/Grid_Communicator.h +++ b/Grid_Communicator.h @@ -3,12 +3,16 @@ /////////////////////////////////// // Processor layout information /////////////////////////////////// +#ifdef GRID_COMMS_MPI +#include +#endif namespace dpo { class CartesianCommunicator { public: // Communicator should know nothing of the physics grid, only processor grid. + int _Nprocessors; // How many in all std::vector _processors; // Which dimensions get relayed out over processors lanes. int _processor; // linear processor rank std::vector _processor_coor; // linear processor coordinate @@ -20,7 +24,9 @@ class CartesianCommunicator { CartesianCommunicator(std::vector &pdimensions_in); + void ShiftedRanks(int dim,int shift,int & source, int & dest); int Rank(std::vector coor); + int MyRank(void); void GlobalSumF(float &); void GlobalSumFVector(float *,int N); @@ -28,9 +34,9 @@ class CartesianCommunicator { void GlobalSumFVector(double *,int N); void SendToRecvFrom(void *xmit, - std::vector to_coordinate, + int xmit_to_rank, void *recv, - std::vector from_coordinate, + int recv_from_rank, int bytes); }; diff --git a/Grid_Lattice.h b/Grid_Lattice.h index 8c8dc386..fcff36eb 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -23,7 +23,8 @@ public: SimdGrid *_grid; int checkerboard; std::vector > _odata; - + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; public: @@ -36,6 +37,8 @@ public: } +#include + #ifdef GRID_COMMS_NONE #include #endif diff --git a/Grid_config.h b/Grid_config.h index 2a442ea5..8a0fdc26 100644 --- a/Grid_config.h +++ b/Grid_config.h @@ -11,10 +11,10 @@ /* #undef AVX512 */ /* GRID_COMMS_FAKE */ -#define GRID_COMMS_FAKE 1 +/* #undef GRID_COMMS_FAKE */ /* GRID_COMMS_MPI */ -/* #undef GRID_COMMS_MPI */ +#define GRID_COMMS_MPI 1 /* GRID_COMMS_NONE */ /* #undef GRID_COMMS_NONE */ diff --git a/Grid_config.h.in b/Grid_config.h.in index 5c57e4cf..ff15a834 100644 --- a/Grid_config.h.in +++ b/Grid_config.h.in @@ -9,6 +9,15 @@ /* AVX512 */ #undef AVX512 +/* GRID_COMMS_FAKE */ +#undef GRID_COMMS_FAKE + +/* GRID_COMMS_MPI */ +#undef GRID_COMMS_MPI + +/* GRID_COMMS_NONE */ +#undef GRID_COMMS_NONE + /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY @@ -60,6 +69,9 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME +/* Define to the home page for this package. */ +#undef PACKAGE_URL + /* Define to the version of this package. */ #undef PACKAGE_VERSION diff --git a/Grid_cshift_common.h b/Grid_cshift_common.h new file mode 100644 index 00000000..b8624826 --- /dev/null +++ b/Grid_cshift_common.h @@ -0,0 +1,384 @@ +#ifndef _GRID_CSHIFT_COMMON_H_ +#define _GRID_CSHIFT_COMMON_H_ + +////////////////////////////////////////////////////// +// Gather for when there is no need to SIMD split +////////////////////////////////////////////////////// +friend void Gather_plane_simple (Lattice &rhs,std::vector > &buffer, int dimension,int plane,int cbmask) +{ + int rd = rhs._grid->_rdimensions[dimension]; + + // printf("Gather plane _simple mask %d\n",cbmask); + + if ( !rhs._grid->CheckerBoarded(dimension) ) { + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + + // Simple block stride gather of SIMD objects +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + buffer[bo++]=rhs._odata[so+o+b]; + } + o +=rhs._grid->_slice_stride[dimension]; + } + + } else { + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + + // int jjj=0; +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int ocb=1<CheckerBoardFromOsite(o+b);// Could easily be a table lookup + if ( ocb &cbmask ) { + buffer[bo]=rhs._odata[so+o+b]; + // float * ptr = (float *)& rhs._odata[so+o+b]; + // if( (cbmask!=3)&&(jjj<8)){ + // printf("Gather_plane_simple %d %le bo %d\n",so+o+b,*ptr,bo); + // jjj++; + // } + bo++; + } + + } + o +=rhs._grid->_slice_stride[dimension]; + } + } +} + + +////////////////////////////////////////////////////// +// Gather for when there *is* need to SIMD split +////////////////////////////////////////////////////// +friend void Gather_plane_extract(Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask) +{ + int rd = rhs._grid->_rdimensions[dimension]; + + if ( !rhs._grid->CheckerBoarded(dimension) ) { + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + + // Simple block stride gather of SIMD objects +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + extract(rhs._odata[so+o+b],pointers); + } + o +=rhs._grid->_slice_stride[dimension]; + } + + } else { + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int ocb=1<CheckerBoardFromOsite(o+b); + if ( ocb & cbmask ) { + extract(rhs._odata[so+o+b],pointers); + } + + } + o +=rhs._grid->_slice_stride[dimension]; + } + } +} + + + +////////////////////////////////////////////////////// +// Scatter for when there is no need to SIMD split +////////////////////////////////////////////////////// +friend void Scatter_plane_simple (Lattice &rhs,std::vector > &buffer, int dimension,int plane,int cbmask) +{ + int rd = rhs._grid->_rdimensions[dimension]; + + if ( !rhs._grid->CheckerBoarded(dimension) ) { + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + + // Simple block stride gather of SIMD objects +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + rhs._odata[so+o+b]=buffer[bo++]; + } + o +=rhs._grid->_slice_stride[dimension]; + } + + } else { + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int ocb=1<CheckerBoardFromOsite(o+b);// Could easily be a table lookup + if ( ocb & cbmask ) { + rhs._odata[so+o+b]=buffer[bo++]; + } + + } + o +=rhs._grid->_slice_stride[dimension]; + } + } +} + + +////////////////////////////////////////////////////// +// Scatter for when there *is* need to SIMD split +////////////////////////////////////////////////////// +friend void Scatter_plane_merge(Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask) +{ + int rd = rhs._grid->_rdimensions[dimension]; + + if ( !rhs._grid->CheckerBoarded(dimension) ) { + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + + // Simple block stride gather of SIMD objects +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + merge(rhs._odata[so+o+b],pointers); + } + o +=rhs._grid->_slice_stride[dimension]; + } + + } else { + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int ocb=1<CheckerBoardFromOsite(o+b); + if ( ocb&cbmask ) { + merge(rhs._odata[so+o+b],pointers); + } + + } + o +=rhs._grid->_slice_stride[dimension]; + } + } +} + + +////////////////////////////////////////////////////// +// local to node block strided copies +////////////////////////////////////////////////////// +// if lhs is odd, rhs even?? +friend void Copy_plane(Lattice& lhs,Lattice &rhs, int dimension,int lplane,int rplane,int cbmask) +{ + int rd = rhs._grid->_rdimensions[dimension]; + + if ( !rhs._grid->CheckerBoarded(dimension) ) { + + int o = 0; // relative offset to base within plane + int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int lo = lplane*lhs._grid->_ostride[dimension]; // offset in buffer + + // Simple block stride gather of SIMD objects +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + lhs._odata[lo+o+b]=rhs._odata[ro+o+b]; + } + o +=rhs._grid->_slice_stride[dimension]; + } + + } else { + + int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + // int jjj=0; +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int ocb=1<CheckerBoardFromOsite(o+b); + + if ( ocb&cbmask ) { + lhs._odata[lo+o+b]=rhs._odata[ro+o+b]; + // float *ptr =(float *) &rhs._odata[ro+o+b]; + // if((cbmask!=0x3)&&jjj<8) { + // printf("Copy_plane %d %le n,b=%d,%d mask %d ocb %d\n",ro+o+b,*ptr,n,b,cbmask,ocb); + // jjj++; + // } + } + + } + o +=rhs._grid->_slice_stride[dimension]; + } + + } +} + +friend void Copy_plane_permute(Lattice& lhs,Lattice &rhs, int dimension,int lplane,int rplane,int cbmask,int permute_type) +{ + int rd = rhs._grid->_rdimensions[dimension]; + + + if ( !rhs._grid->CheckerBoarded(dimension) ) { + + int o = 0; // relative offset to base within plane + int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int lo = lplane*rhs._grid->_ostride[dimension]; // offset in buffer + + // Simple block stride gather of SIMD objects +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + permute(lhs._odata[lo+o+b],rhs._odata[ro+o+b],permute_type); + } + o +=rhs._grid->_slice_stride[dimension]; + } + + } else { + + int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int ocb=1<CheckerBoardFromOsite(o+b); + + if ( ocb&cbmask ) { + permute(lhs._odata[lo+o+b],rhs._odata[ro+o+b],permute_type); + } + + } + o +=rhs._grid->_slice_stride[dimension]; + } + + } +} + +////////////////////////////////////////////////////// +// Local to node Cshift +////////////////////////////////////////////////////// + + // Work out whether to permute + // ABCDEFGH -> AE BF CG DH permute wrap num + // + // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH 0 0 + // Shift 1 BF CG DH AE 0 0 0 1 BCDEFGHA 0 1 + // Shift 2 CG DH AE BF 0 0 1 1 CDEFGHAB 0 2 + // Shift 3 DH AE BF CG 0 1 1 1 DEFGHABC 0 3 + // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD 1 0 + // Shift 5 BF CG DH AE 1 1 1 0 FGHACBDE 1 1 + // Shift 6 CG DH AE BF 1 1 0 0 GHABCDEF 1 2 + // Shift 7 DH AE BF CG 1 0 0 0 HABCDEFG 1 3 + + // Suppose 4way simd in one dim. + // ABCDEFGH -> AECG BFDH permute wrap num + + // Shift 0 AECG BFDH 0,00 0,00 ABCDEFGH 0 0 + // Shift 1 BFDH CGEA 0,00 1,01 BCDEFGHA 0 1 + // Shift 2 CGEA DHFB 1,01 1,01 CDEFGHAB 1 0 + // Shift 3 DHFB EAGC 1,01 1,11 DEFGHABC 1 1 + // Shift 4 EAGC FBHD 1,11 1,11 EFGHABCD 2 0 + // Shift 5 FBHD GCAE 1,11 1,10 FGHABCDE 2 1 + // Shift 6 GCAE HDBF 1,10 1,10 GHABCDEF 3 0 + // Shift 7 HDBF AECG 1,10 0,00 HABCDEFG 3 1 + + // Generalisation to 8 way simd, 16 way simd required. + // + // Need log2 Nway masks. consisting of + // 1 bit 256 bit granule + // 2 bit 128 bit granule + // 4 bits 64 bit granule + // 8 bits 32 bit granules + // + // 15 bits.... + +friend void Cshift_local(Lattice& ret,Lattice &rhs,int dimension,int shift) +{ + int sshift[2]; + + sshift[0] = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,0); + sshift[1] = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,1); + + if ( sshift[0] == sshift[1] ) { + Cshift_local(ret,rhs,dimension,shift,0x3); + } else { + Cshift_local(ret,rhs,dimension,shift,0x1);// if checkerboard is unfavourable take two passes + Cshift_local(ret,rhs,dimension,shift,0x2);// both with block stride loop iteration + } +} + + +friend Lattice Cshift_local(Lattice &ret,Lattice &rhs,int dimension,int shift,int cbmask) +{ + int fd = rhs._grid->_fdimensions[dimension]; + int rd = rhs._grid->_rdimensions[dimension]; + int ld = rhs._grid->_ldimensions[dimension]; + int gd = rhs._grid->_gdimensions[dimension]; + + + // Map to always positive shift modulo global full dimension. + shift = (shift+fd)%fd; + + ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); + + // the permute type + int permute_dim =rhs._grid->_simd_layout[dimension]>1 ; + int permute_type=0; + for(int d=0;d_simd_layout[d]>1 ) permute_type++; + } + + for(int x=0;x_ostride[dimension]; + + int cb= (cbmask==0x2)? 1 : 0; + + int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,cb); + int sx = (x+sshift)%rd; + + int permute_slice=0; + if(permute_dim){ + int wrap = sshift/rd; + int num = sshift%rd; + if ( x< rd-num ) permute_slice=wrap; + else permute_slice = 1-wrap; + } + + if ( permute_slice ) Copy_plane_permute(ret,rhs,dimension,x,sx,cbmask,permute_type); + else Copy_plane(ret,rhs,dimension,x,sx,cbmask); + + + } + return ret; +} + +#endif diff --git a/Grid_init.cc b/Grid_init.cc index bb22ce29..4f7d1849 100755 --- a/Grid_init.cc +++ b/Grid_init.cc @@ -16,8 +16,11 @@ #undef __X86_64 namespace dpo { -void Grid_init(void) +void Grid_init(int *argc,char ***argv) { +#ifdef GRID_COMMS_MPI + MPI_Init(argc,argv); +#endif Grid_debug_handler_init(); } double usecond(void) { diff --git a/Grid_main.cc b/Grid_main.cc index 4079e62a..795ea395 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -13,34 +13,28 @@ using namespace dpo::QCD; int main (int argc, char ** argv) { + Grid_init(&argc,&argv); -#if 0 - struct sigaction sa,osa; - sigemptyset (&sa.sa_mask); - sa.sa_sigaction= sa_action; - sa.sa_flags = SA_ONSTACK|SA_SIGINFO; - - sigaction(SIGSEGV,&sa,NULL); - sigaction(SIGTRAP,&sa,NULL); -#endif - - std::vector latt_size(4); - std::vector simd_layout(4); - - std::vector mpi_layout(4); - for(int d=0;d<4;d++) mpi_layout[d]=1; + std::vector latt_size(4); + std::vector simd_layout(4); + + std::vector mpi_layout(4); + mpi_layout[0]=4; + mpi_layout[1]=2; + mpi_layout[2]=4; + mpi_layout[3]=2; #ifdef AVX512 for(int omp=128;omp<236;omp+=16){ #else - for(int omp=1;omp<8;omp*=2){ + for(int omp=1;omp<8;omp*=20){ #endif #ifdef OMP omp_set_num_threads(omp); #endif - for(int lat=4;lat<=16;lat+=40){ + for(int lat=16;lat<=16;lat+=40){ latt_size[0] = lat; latt_size[1] = lat; latt_size[2] = lat; @@ -234,9 +228,9 @@ int main (int argc, char ** argv) std::cout << "Shifting both parities by "<< shift <<" direction "<< dir <black - std::cout << "Shifting odd parities"<red ShiftedCheck=zero; @@ -245,19 +239,19 @@ int main (int argc, char ** argv) // Check results std::vector coor(4); - for(coor[3]=0;coor[3] diff; std::vector shiftcoor = coor; - shiftcoor[dir]=(shiftcoor[dir]+shift+latt_size[dir])%latt_size[dir]; + shiftcoor[dir]=(shiftcoor[dir]+shift+latt_size[dir])%(latt_size[dir]/mpi_layout[dir]); std::vector rl(4); for(int dd=0;dd<4;dd++){ - rl[dd] = latt_size[dd]/simd_layout[dd]; + rl[dd] = latt_size[dd]/simd_layout[dd]/mpi_layout[dd]; } int lex = coor[0]%rl[0] + (coor[1]%rl[1])*rl[0] @@ -344,4 +338,6 @@ int main (int argc, char ** argv) } // loop for lat } // loop for omp + MPI_Finalize(); + } diff --git a/Grid_mpi.cc b/Grid_mpi.cc index 08d49312..6cda0f1b 100644 --- a/Grid_mpi.cc +++ b/Grid_mpi.cc @@ -7,16 +7,23 @@ namespace dpo { CartesianCommunicator::CartesianCommunicator(std::vector &processors) { - _ndimension = _processors.size(); + _ndimension = processors.size(); std::vector periodic(_ndimension,1); + _Nprocessors=1; _processors = processors; - _processor_coords.resize(_ndimension); - - MPI_Cart_create(MPI_COMM_WORLD _ndimension,&_processors[0],&periodic[0],1,&communicator); + _processor_coor.resize(_ndimension); + + MPI_Cart_create(MPI_COMM_WORLD, _ndimension,&_processors[0],&periodic[0],1,&communicator); MPI_Comm_rank(communicator,&_processor); - MPI_Cart_coords(communicator,_processor,_ndimension,&_processor_coords[0]); - + MPI_Cart_coords(communicator,_processor,_ndimension,&_processor_coor[0]); + printf("Hello world from processor ["); + for(int i=0;i<_ndimension;i++){ + printf("%d ",_processor_coor[i]); + _Nprocessors*=_processors[i]; + } + printf("]\n"); + fflush(stdout); } void CartesianCommunicator::GlobalSumF(float &f){ @@ -35,11 +42,9 @@ void CartesianCommunicator::GlobalSumFVector(double *d,int N) MPI_Allreduce(d,d,N,MPI_DOUBLE,MPI_SUM,communicator); } -int CartesianCommunicator::ShiftedRank(int dim,int shift) +void CartesianCommunicator::ShiftedRanks(int dim,int shift,int &source,int &dest) { - int rank; - MPI_Cart_shift(communicator,dim,shift,&_processor,&rank); - return rank; + MPI_Cart_shift(communicator,dim,shift,&source,&dest); } int CartesianCommunicator::Rank(std::vector coor) { @@ -50,23 +55,18 @@ int CartesianCommunicator::Rank(std::vector coor) // Basic Halo comms primitive void CartesianCommunicator::SendToRecvFrom(void *xmit, - std::vector &to_coordinate, + int dest, void *recv, - std::vector &from_coordinate, + int from, int bytes) { - int dest = Rank(to_coordinate); - int from = Rank(from_coordinate); + MPI_Request reqs[2]; + MPI_Status OkeyDokey[2]; + int rank = _processor; + MPI_Isend(xmit, bytes, MPI_CHAR,dest,_processor,communicator,&reqs[0]); + MPI_Irecv(recv, bytes, MPI_CHAR,from,from,communicator,&reqs[1]); + MPI_Waitall(2,reqs,OkeyDokey); - MPI_Request x_req; - MPI_Request r_req; - MPI_Status OkeyDokey; - - MPI_Isend(xmit, bytes, MPI_CHAR,dest,dest,communicator,&x_req); - MPI_Irecv(recv, bytes, MPI_CHAR,from,from,communicator,&r_req); - MPI_Wait(&x_req,&OkeyDokey); - MPI_Wait(&r_req,&OkeyDokey); - MPI_Barrier(); } } diff --git a/Grid_mpi_cshift.h b/Grid_mpi_cshift.h index 9031170b..4029f152 100644 --- a/Grid_mpi_cshift.h +++ b/Grid_mpi_cshift.h @@ -1,26 +1,9 @@ #ifndef _GRID_MPI_CSHIFT_H_ #define _GRID_MPI_CSHIFT_H_ - -////////////////////////////////////////////// -// Q. Split this into seperate sub functions? -////////////////////////////////////////////// - -// CshiftCB_comms_splice -// CshiftCB_comms -// CshiftCB_local -// CshiftCB_local_permute - -// Cshift_comms_splice -// Cshift_comms -// Cshift_local -// Cshift_local_permute - -// Broadly I remain annoyed that the iteration is so painful -// for red black data layout, when simple block strided descriptors suffice for non-cb. -// -// The other option is to do it table driven, or perhaps store the CB of each site in a table. -// +#define MAX(x,y) ((x)>(y)?(x):(y)) +#define MIN(x,y) ((x)>(y)?(y):(x)) +////////////////////////////////////////////////////////////////////////////////////////// // Must not lose sight that goal is to be able to construct really efficient // gather to a point stencil code. CSHIFT is not the best way, so probably need // additional stencil support. @@ -33,79 +16,31 @@ // // Grid could create a neighbour index table for a given stencil. // Could also implement CovariantCshift. +////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////// -//Non checkerboarded support functions -////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////// +// Q. Further split this into separate sub functions? +///////////////////////////////////////////////////////////// -friend void Gather_plane (Lattice &rhs,std::vector &buffer, int dimension,int plane) -{ - const int Nsimd = vector_type::Nsimd(); - int rd = rhs._grid->_rdimensions[dimension]; +// CshiftCB_local +// CshiftCB_local_permute - int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); - int sx = (x+sshift)%rd; - int so = sx*rhs._grid->_ostride[dimension]; - int permute_slice=0; - int wrap = sshift/rd; - int num = sshift%rd; - - if ( x< rd-num ) permute_slice=wrap; - else permute_slice = 1-wrap; - - if ( permute_slice ) { - permute(ret._odata[ro+o+b],rhs._odata[so+o+b],permute_type); - } else { - ret._odata[ro+o+b]=rhs._odata[so+o+b]; - } - } - o +=rhs._grid->_slice_stride[dimension]; - } - } - -} -//friend void Gather_plane_extract(Lattice &rhs,std::vector pointers,int dimension,int plane); -// -//friend void Scatter_plane (Lattice &rhs,std::vector face, int dimension,int plane); -//friend void Scatter_plane_merge (Lattice &rhs,std::vector pointers,int dimension,int plane); -// -//template friend void Copy_plane_permute(Lattice &rhs,std::vector face, int dimension,int plane); -// friend void Copy_plane(Lattice &rhs,std::vector face, int dimension,int plane); -// - -////////////////////////////////////////////////////// -//Checkerboarded support functions -////////////////////////////////////////////////////// - -//friend void GatherCB_plane (Lattice &rhs,std::vector face, int dimension,int plane); -//friend void GatherCB_plane_extract(Lattice &rhs,std::vector pointers,int dimension,int plane); -// -//friend void ScatterCB_plane (Lattice &rhs,std::vector face, int dimension,int plane); -//friend void ScatterCB_plane_merge (Lattice &rhs,std::vector pointers,int dimension,int plane); -// -//template friend void CopyCB_plane_permute(Lattice &rhs,std::vector face, int dimension,int plane); -// friend void Copy_plane(Lattice &rhs,std::vector face, int dimension,int plane); +// Cshift_comms_splice +// Cshift_comms +// Cshift_local +// Cshift_local_permute friend Lattice Cshift(Lattice &rhs,int dimension,int shift) { typedef typename vobj::vector_type vector_type; typedef typename vobj::scalar_type scalar_type; - const int Nsimd = vector_type::Nsimd(); Lattice ret(rhs._grid); int fd = rhs._grid->_fdimensions[dimension]; int rd = rhs._grid->_rdimensions[dimension]; - //int ld = rhs._grid->_ldimensions[dimension]; - //int gd = rhs._grid->_gdimensions[dimension]; - // Map to always positive shift modulo global full dimension. shift = (shift+fd)%fd; @@ -115,270 +50,288 @@ friend Lattice Cshift(Lattice &rhs,int dimension,int shift) // the permute type int simd_layout = rhs._grid->_simd_layout[dimension]; int comm_dim = rhs._grid->_processors[dimension] >1 ; - int permute_dim = rhs._grid->_simd_layout[dimension]>1 && (!comm_dim); int splice_dim = rhs._grid->_simd_layout[dimension]>1 && (comm_dim); - int permute_type=0; - for(int d=0;d_simd_layout[d]>1 ) permute_type++; - } - - // Logic for non-distributed dimension - std::vector comm_offnode(simd_layout); - std::vector comm_to (simd_layout); - std::vector comm_from (simd_layout); - std::vector comm_rx (simd_layout); // reduced coordinate of neighbour plane - std::vector comm_simd_lane(simd_layout);// simd lane of neigbour plane - - /////////////////////////////////////////////// - // Move via a fake comms buffer - // Simd direction uses an extract/merge pair - /////////////////////////////////////////////// - int buffer_size = rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; - int words = sizeof(vobj)/sizeof(vector_type); - - std::vector > comm_buf(buffer_size); - std::vector > comm_buf_extract(Nsimd,std::vector(buffer_size*words) ); - std::vector pointers(Nsimd); - - - - if ( permute_dim ) { - - for(int x=0;x_ostride[dimension]; // base offset for result - int o = 0; // relative offset to base - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); - int sx = (x+sshift)%rd; - int so = sx*rhs._grid->_ostride[dimension]; - int permute_slice=0; - int wrap = sshift/rd; - int num = sshift%rd; - - if ( x< rd-num ) permute_slice=wrap; - else permute_slice = 1-wrap; - - if ( permute_slice ) { - permute(ret._odata[ro+o+b],rhs._odata[so+o+b],permute_type); - } else { - ret._odata[ro+o+b]=rhs._odata[so+o+b]; - } - } - o +=rhs._grid->_slice_stride[dimension]; - } - } + if ( !comm_dim ) { + Cshift_local(ret,rhs,dimension,shift); // Handles checkerboarding } else if ( splice_dim ) { - - if ( rhs._grid->_simd_layout[dimension] > 2 ) exit(-1); // use Cassert. Audit code for exit and replace - if ( rhs._grid->_simd_layout[dimension] < 1 ) exit(-1); - - - for(int i=0;i_ostride[dimension]; // base offset for result - - o = 0; // relative offset to base - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); - int sx = (x+sshift)%rd; - - // base offset for source - int so = sx*rhs._grid->_ostride[dimension]; - - int permute_slice=0; - int wrap = sshift/rd; - int num = sshift%rd; - - if ( x< rd-num ) permute_slice=wrap; - else permute_slice = 1-wrap; - - if ( permute_slice ) { - extract(rhs._odata[so+o+b],pointers); - } - } - o +=rhs._grid->_slice_stride[dimension]; - } - - - /////////////////////////////////////////// - // Work out what to send where - /////////////////////////////////////////// - - for(int s=0;s ld; - comm_send_rx[s] = shifted_x%rd; // which slice geton the other node - comm_send_simd_lane [s] = shifted_x/rd; // which slice on the other node - comm_from[s] = shifted_x/ld; - comm_to [s] = (2*_processors[dimension]-comm_from[s]) % _processors[dimension]; - comm_from[s] = (comm_from[s]+_processors[dimension]) % _processors[dimension]; - - } - - //////////////////////////////////////////////// - // Insert communication phase - //////////////////////////////////////////////// -#if 0 - } else if (comm_dim ) { - - // Packed gather sequence is clean - int buffer_size = rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_nblock[dimension]; - std::vector > send_buf(buffer_size); - std::vector > recv_buf(buffer_size); - - // off node; communcate slice (ld==rd) - if ( x+shift > rd ) { - int sb=0; - for(int n=0;n_slice_nblock[dimension];n++){ - for(int i=0;i_slice_block[dimension];i++){ - send_buf[sb++]=rhs._odata[so+i]; - } - so+=rhs._grid->_slice_stride[dimension]; - } - - // Make a comm_fake them mimics comms in periodic case. - - // scatter face - int rb=0; - for(int n=0;n_slice_nblock[dimension];n++){ - for(int i=0;i_slice_block[dimension];i++){ - ret._odata[so+i]=recv_buf[rb++]; - } - so+=rhs._grid->_slice_stride[dimension]; - } - - } else { - - for(int n=0;n_slice_nblock[dimension];n++){ - for(int i=0;i_slice_block[dimension];i++){ - ret._odata[o+i]=rhs._odata[so+i]; - } - o+=rhs._grid->_slice_stride[dimension]; - so+=rhs._grid->_slice_stride[dimension]; - } - } - -#endif - - //////////////////////////////////////////////// - // Pull receive buffers and permuted buffers in - //////////////////////////////////////////////// - for(int i=0;i_ostride[dimension]; // base offset for result - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); - int sx = (x+sshift)%rd; - - // base offset for source - int so = sx*rhs._grid->_ostride[dimension]; - - int permute_slice=0; - int wrap = sshift/rd; - int num = sshift%rd; - - if ( x< rd-num ) permute_slice=wrap; - else permute_slice = 1-wrap; - - if ( permute_slice ) { - merge(ret._odata[ro+o+b],pointers); - } - } - o +=rhs._grid->_slice_stride[dimension]; - } - } - - - } else if ( comm_dim ) { - - - int co; // comm offset - int o; - - co=0; - for(int x=0;x_ostride[dimension]; // base offset for result - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - // This call in inner loop is annoying but necessary for dimension=0 - // in the case of RedBlack grids. Could optimise away with - // alternate code paths for all other cases. - int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); - int sx = (x+sshift)%rd; - int so = sx*rhs._grid->_ostride[dimension]; - - comm_buf[co++]=rhs._odata[so+o+b]; - - } - o +=rhs._grid->_slice_stride[dimension]; - } - - // Step through a copy into a comms buffer and pull back in. - // Genuine fake implementation could calculate if loops back - co=0; o=0; - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - ret._odata[ro+o+b]=comm_buf[co++]; - } - o +=rhs._grid->_slice_stride[dimension]; - } - } - - } else { // Local dimension, no permute required - - for(int x=0;x_ostride[dimension]; // base offset for result - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - // This call in inner loop is annoying but necessary for dimension=0 - // in the case of RedBlack grids. Could optimise away with - // alternate code paths for all other cases. - int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); - - int sx = (x+sshift)%rd; - int so = sx*rhs._grid->_ostride[dimension]; - ret._odata[bo+o+b]=rhs._odata[so+o+b]; - - } - o +=rhs._grid->_slice_stride[dimension]; - } - } - + Cshift_comms_simd(ret,rhs,dimension,shift); + } else { + Cshift_comms(ret,rhs,dimension,shift); } - return ret; } +friend void Cshift_comms(Lattice& ret,Lattice &rhs,int dimension,int shift) +{ + int sshift[2]; + + sshift[0] = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,0); + sshift[1] = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,1); + + if ( sshift[0] == sshift[1] ) { + // printf("Cshift_comms : single pass\n"); + Cshift_comms(ret,rhs,dimension,shift,0x3); + } else { + // printf("Cshift_comms : two pass\n"); + // printf("call1\n"); + Cshift_comms(ret,rhs,dimension,shift,0x1);// if checkerboard is unfavourable take two passes + // printf("call2\n"); + Cshift_comms(ret,rhs,dimension,shift,0x2);// both with block stride loop iteration + // printf("done\n"); + + } +} + +friend void Cshift_comms_simd(Lattice& ret,Lattice &rhs,int dimension,int shift) +{ + int sshift[2]; + + sshift[0] = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,0); + sshift[1] = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,1); + + if ( sshift[0] == sshift[1] ) { + Cshift_comms_simd(ret,rhs,dimension,shift,0x3); + } else { + // printf("call1 0x1 cb=even\n"); + Cshift_comms_simd(ret,rhs,dimension,shift,0x1);// if checkerboard is unfavourable take two passes + // printf("call2 0x2 cb=odd\n"); + Cshift_comms_simd(ret,rhs,dimension,shift,0x2);// both with block stride loop iteration + // printf("done\n"); + } +} + + +friend void Cshift_comms(Lattice &ret,Lattice &rhs,int dimension,int shift,int cbmask) +{ + typedef typename vobj::vector_type vector_type; + typedef typename vobj::scalar_type scalar_type; + + SimdGrid *grid=rhs._grid; + Lattice temp(rhs._grid); + + int fd = rhs._grid->_fdimensions[dimension]; + int rd = rhs._grid->_rdimensions[dimension]; + int simd_layout = rhs._grid->_simd_layout[dimension]; + int comm_dim = rhs._grid->_processors[dimension] >1 ; + assert(simd_layout==1); + assert(comm_dim==1); + assert(shift>=0); + assert(shift_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; + std::vector > send_buf(buffer_size); + std::vector > recv_buf(buffer_size); + + // This code could be simplified by multiple calls to single routine with extra params to + // encapsulate the difference in the code paths. + int cb= (cbmask==0x2)? 1 : 0; + int sshift= rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,cb); + + for(int x=0;x= rd ); + int sx = (x+sshift)%rd; + int comm_proc = (x+sshift)/rd; + + if (!offnode) { + // printf("local x %d sshift %d offnode %d rd %d cb %d\n",x,sshift,offnode,rd,cb); + Copy_plane(ret,rhs,dimension,x,sx,cbmask); + } else { + + int words = send_buf.size(); + if (cbmask != 0x3) words=words>>1; + + int bytes = words * sizeof(vobj); + + // printf("nonlocal x %d sx %d sshift %d offnode %d rd %d cb %d cbmask %d rhscb %d comm_proc %d\n", + // x,sx,sshift,offnode,rd,cb,cbmask,rhs.checkerboard,comm_proc); + // Copy_plane(temp,rhs,dimension,x,sx,cbmask); + + // Bug found; cbmask may differ between sx plan and rx plane. + Gather_plane_simple (rhs,send_buf,dimension,sx,cbmask); + // for(int i=0;i_processor; + int recv_from_rank; + int xmit_to_rank; + grid->ShiftedRanks(dimension,comm_proc,xmit_to_rank,recv_from_rank); + + // printf("bytes %d node %d sending to %d receiving from %d\n",bytes,rank,xmit_to_rank,recv_from_rank ); + grid->SendToRecvFrom((void *)&send_buf[0], + xmit_to_rank, + (void *)&recv_buf[0], + recv_from_rank, + bytes); + + Scatter_plane_simple (ret,recv_buf,dimension,x,cbmask); + } + } +} + + +friend void Cshift_comms_simd(Lattice &ret,Lattice &rhs,int dimension,int shift,int cbmask) +{ + const int Nsimd = vector_type::Nsimd(); + SimdGrid *grid=rhs._grid; + typedef typename vobj::vector_type vector_type; + typedef typename vobj::scalar_type scalar_type; + + int fd = grid->_fdimensions[dimension]; + int rd = grid->_rdimensions[dimension]; + int ld = grid->_ldimensions[dimension]; + int simd_layout = grid->_simd_layout[dimension]; + int comm_dim = grid->_processors[dimension] >1 ; + + assert(comm_dim==1); + assert(simd_layout==2); + assert(shift>=0); + assert(shift_simd_layout[d]>1 ) permute_type++; + } + + /////////////////////////////////////////////// + // Simd direction uses an extract/merge pair + /////////////////////////////////////////////// + int buffer_size = grid->_slice_nblock[dimension]*grid->_slice_block[dimension]; + int words = sizeof(vobj)/sizeof(vector_type); + + std::vector > send_buf_extract(Nsimd,std::vector(buffer_size*words) ); + std::vector > recv_buf_extract(Nsimd,std::vector(buffer_size*words) ); + int bytes = buffer_size*words*sizeof(scalar_type); + + std::vector pointers(Nsimd); // + std::vector rpointers(Nsimd); // received pointers + + /////////////////////////////////////////// + // Work out what to send where + /////////////////////////////////////////// + + int cb = (cbmask==0x2)? 1 : 0; + int sshift= grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,cb); + + // printf("cshift-comms-simd: shift = %d ; sshift = %d ; cbmask %d ; simd_layout %d\n",shift,sshift,cbmask,simd_layout); + std::vector comm_offnode(simd_layout); + std::vector comm_proc (simd_layout); //relative processor coord in dim=dimension + + // Strategy + // + //* Loop over source planes + //* if any communication needed extract and send + //* if communication needed extract and send + + for(int x=0;x= ld; + comm_any = comm_any | comm_offnode[s]; + comm_proc[s] = shifted_x/ld; + // printf("rd %d x %d shifted %d s=%d comm_any %d\n",rd, x,shifted_x,s,comm_any); + } + + int o = 0; + int bo = x*grid->_ostride[dimension]; + int sx = (x+sshift)%rd; + + // Need Convenience function in _grid. Move this in + if ( comm_any ) { + + for(int i=0;iiCoordFromIsite(i,dimension); + + if(comm_offnode[s]){ + + int rank = grid->_processor; + int recv_from_rank; + int xmit_to_rank; + grid->ShiftedRanks(dimension,comm_proc[s],xmit_to_rank,recv_from_rank); + + + grid->SendToRecvFrom((void *)&send_buf_extract[i][0], + xmit_to_rank, + (void *)&recv_buf_extract[i][0], + recv_from_rank, + bytes); + + // printf("Cshift_simd comms %d %le %le\n",i,real(recv_buf_extract[i][0]),real(send_buf_extract[i][0])); + + rpointers[i] = (scalar_type *)&recv_buf_extract[i][0]; + + } else { + + rpointers[i] = (scalar_type *)&send_buf_extract[i][0]; + // printf("Cshift_simd local %d %le \n",i,real(send_buf_extract[i][0])); + + } + + } + + // Permute by swizzling pointers in merge + int permute_slice=0; + int lshift=sshift%ld; + int wrap =lshift/rd; + int num =lshift%rd; + + if ( x< rd-num ) permute_slice=wrap; + else permute_slice = 1-wrap; + + for(int i=0;i AE BF CG DH permute wrap num - // - // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH 0 0 - // Shift 1 BF CG DH AE 0 0 0 1 BCDEFGHA 0 1 - // Shift 2 CG DH AE BF 0 0 1 1 CDEFGHAB 0 2 - // Shift 3 DH AE BF CG 0 1 1 1 DEFGHABC 0 3 - // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD 1 0 - // Shift 5 BF CG DH AE 1 1 1 0 FGHACBDE 1 1 - // Shift 6 CG DH AE BF 1 1 0 0 GHABCDEF 1 2 - // Shift 7 DH AE BF CG 1 0 0 0 HABCDEFG 1 3 - - // Suppose 4way simd in one dim. - // ABCDEFGH -> AECG BFDH permute wrap num - - // Shift 0 AECG BFDH 0,00 0,00 ABCDEFGH 0 0 - // Shift 1 BFDH CGEA 0,00 1,01 BCDEFGHA 0 1 - // Shift 2 CGEA DHFB 1,01 1,01 CDEFGHAB 1 0 - // Shift 3 DHFB EAGC 1,01 1,11 DEFGHABC 1 1 - // Shift 4 EAGC FBHD 1,11 1,11 EFGHABCD 2 0 - // Shift 5 FBHD GCAE 1,11 1,10 FGHABCDE 2 1 - // Shift 6 GCAE HDBF 1,10 1,10 GHABCDEF 3 0 - // Shift 7 HDBF AECG 1,10 0,00 HABCDEFG 3 1 - - // Generalisation to 8 way simd, 16 way simd required. - // - // Need log2 Nway masks. consisting of - // 1 bit 256 bit granule - // 2 bit 128 bit granule - // 4 bits 64 bit granule - // 8 bits 32 bit granules - // - // 15 bits.... - -// For optimisation: -// -// split into Cshift_none_rb_permute -// split into Cshift_none_rb_simple -// -// split into Cshift_none_permute -// split into Cshift_none_simple friend Lattice Cshift(Lattice &rhs,int dimension,int shift) { Lattice ret(rhs._grid); - - int fd = rhs._grid->_fdimensions[dimension]; - int rd = rhs._grid->_rdimensions[dimension]; - int ld = rhs._grid->_ldimensions[dimension]; - int gd = rhs._grid->_gdimensions[dimension]; - - - // Map to always positive shift modulo global full dimension. - shift = (shift+fd)%fd; - ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); - - // the permute type - - int permute_dim =rhs._grid->_simd_layout[dimension]>1 ; - int permute_type=0; - for(int d=0;d_simd_layout[d]>1 ) permute_type++; - } - - for(int x=0;x_ostride[dimension]; - int o = 0; - - if ( permute_dim ) { - - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); - - int sx = (x+sshift)%rd; - int so = sx*rhs._grid->_ostride[dimension]; - - int permute_slice=0; - int wrap = sshift/rd; - int num = sshift%rd; - - if ( x< rd-num ) permute_slice=wrap; - else permute_slice = 1-wrap; - - if ( permute_slice ) { - permute(ret._odata[bo+o+b],rhs._odata[so+o+b],permute_type); - } else { - ret._odata[bo+o+b]=rhs._odata[so+o+b]; - } - - } - o +=rhs._grid->_slice_stride[dimension]; - - } - } else { - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - // This call in inner loop is annoying but necessary for dimension=0 - // in the case of RedBlack grids. Could optimise away with - // alternate code paths for all other cases. - int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); - - int sx = (x+sshift)%rd; - int so = sx*rhs._grid->_ostride[dimension]; - ret._odata[bo+o+b]=rhs._odata[so+o+b]; - - } - o +=rhs._grid->_slice_stride[dimension]; - } - } - } - return ret; + Cshift_local(ret,rhs,dimension,shift); } -#if 0 -// Collapse doesn't appear to work the way I think it should in icpc -friend Lattice Cshift(Lattice &rhs,int dimension,int shift) -{ - Lattice ret(rhs._grid); - - ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); - shift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift); - int sx,so,o; - int rd = rhs._grid->_rdimensions[dimension]; - int ld = rhs._grid->_dimensions[dimension]; - // Map to always positive shift. - shift = (shift+ld)%ld; - // Work out whether to permute and the permute type - // ABCDEFGH -> AE BF CG DH permute - // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH - // Shift 1 DH AE BF CG 1 0 0 0 HABCDEFG - // Shift 2 CG DH AE BF 1 1 0 0 GHABCDEF - // Shift 3 BF CG DH AE 1 1 1 0 FGHACBDE - // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD - // Shift 5 DH AE BF CG 0 1 1 1 DEFGHABC - // Shift 6 CG DH AE BF 0 0 1 1 CDEFGHAB - // Shift 7 BF CG DH AE 0 0 0 1 BCDEFGHA - int permute_dim =rhs._grid->_layout[dimension]>1 ; - int permute_type=0; - for(int d=0;d_layout[d]>1 ) permute_type++; - - // loop over perp slices. - // Threading considerations: - // Need to map thread_num to - // - // x_min,x_max for Loop-A - // n_min,n_max for Loop-B - // b_min,b_max for Loop-C - // In a way that maximally load balances. - // - // Optimal: - // There are rd*n_block*block items of work. - // These serialise as item "w" - // b=w%block; w=w/block - // n=w%nblock; x=w/nblock. Perhaps 20 cycles? - // - // Logic: - // x_chunk = (rd+thread)/nthreads simply divide work across nodes. - // - // rd=5 , threads = 8; - // 0 1 2 3 4 5 6 7 - // 0 0 0 1 1 1 1 1 - for(int x=0;x_ostride[dimension]; - so =sx*rhs._grid->_ostride[dimension]; - int permute_slice=0; - if ( permute_dim ) { - permute_slice = shift/rd; - if ( x_slice_block[dimension]*internal; - - for(int n=0;n_slice_nblock[dimension];n++){ - vComplex *optr = (vComplex *)&ret._odata[o]; - vComplex *iptr = (vComplex *)&rhs._odata[so]; - for(int b=0;b_slice_stride[dimension]; - so+=rhs._grid->_slice_stride[dimension]; - } - } else { - for(int n=0;n_slice_nblock[dimension];n++){ - for(int i=0;i_slice_block[dimension];i++){ - ret._odata[o+i]=rhs._odata[so+i]; - } - o+=rhs._grid->_slice_stride[dimension]; - so+=rhs._grid->_slice_stride[dimension]; - } - - } -#else - if ( permute_slice ) { - int internal=sizeof(vobj)/sizeof(vComplex); - int num =rhs._grid->_slice_block[dimension]*internal; -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_stride[dimension]]; - vComplex *iptr = (vComplex *)&rhs._odata[so+n*rhs._grid->_slice_stride[dimension]]; - permute(optr[b],iptr[b],permute_type); - } - } - } else { -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int i=0;i_slice_block[dimension];i++){ - int oo = o+ n*rhs._grid->_slice_stride[dimension]; - int soo=so+ n*rhs._grid->_slice_stride[dimension]; - ret._odata[oo+i]=rhs._odata[soo+i]; - } - } - - } -#endif - } - return ret; -} -friend Lattice Cshift(Lattice &rhs,int dimension,int shift) -{ - Lattice ret(rhs._grid); - - ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); - shift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift); - int rd = rhs._grid->_rdimensions[dimension]; - int ld = rhs._grid->_dimensions[dimension]; - - // Map to always positive shift. - shift = (shift+ld)%ld; - - // Work out whether to permute and the permute type - // ABCDEFGH -> AE BF CG DH permute - // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH - // Shift 1 DH AE BF CG 1 0 0 0 HABCDEFG - // Shift 2 CG DH AE BF 1 1 0 0 GHABCDEF - // Shift 3 BF CG DH AE 1 1 1 0 FGHACBDE - // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD - // Shift 5 DH AE BF CG 0 1 1 1 DEFGHABC - // Shift 6 CG DH AE BF 0 0 1 1 CDEFGHAB - // Shift 7 BF CG DH AE 0 0 0 1 BCDEFGHA - int permute_dim =rhs._grid->_layout[dimension]>1 ; - int permute_type=0; - for(int d=0;d_layout[d]>1 ) permute_type++; - - - // loop over all work - int work =rd*rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; - -#pragma omp parallel for - for(int ww=0;ww_slice_block[dimension] ; w=w/rhs._grid->_slice_block[dimension]; - int n = w%rhs._grid->_slice_nblock[dimension]; w=w/rhs._grid->_slice_nblock[dimension]; - int x = w; - - int sx,so,o; - sx = (x-shift+ld)%rd; - o = x*rhs._grid->_ostride[dimension]+n*rhs._grid->_slice_stride[dimension]; // common sub expression alert. - so =sx*rhs._grid->_ostride[dimension]+n*rhs._grid->_slice_stride[dimension]; - - int permute_slice=0; - if ( permute_dim ) { - permute_slice = shift/rd; - if ( x sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -247,16 +244,16 @@ AC_CACHE_CHECK([dependency style of $depcc], test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -304,7 +301,7 @@ AM_CONDITIONAL([am__fastdep$1], [ # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl @@ -314,34 +311,39 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' + am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -#serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -354,7 +356,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but + # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -366,21 +368,19 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. + # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue + test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` @@ -398,7 +398,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will +# is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], @@ -408,18 +408,21 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 16 - # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- @@ -432,7 +435,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.62])dnl +[AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -461,33 +464,42 @@ AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -496,34 +508,82 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The `parallel-tests' driver may need to know about EXEEXT, so add the -dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) -dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. @@ -545,7 +605,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -556,7 +616,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -564,16 +624,14 @@ if test x"${install_sh}" != xset; then install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi -AC_SUBST(install_sh)]) +AC_SUBST([install_sh])]) -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], @@ -589,14 +647,12 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 - # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. @@ -614,7 +670,7 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. +# Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -641,15 +697,12 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 6 - # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], @@ -657,11 +710,10 @@ AC_DEFUN([AM_MISSING_PROG], $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) - # AM_MISSING_HAS_RUN # ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl @@ -674,63 +726,35 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) + AC_MSG_WARN(['missing' script is too old or missing]) fi ]) -# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_MKDIR_P -# --------------- -# Check for `mkdir -p'. -AC_DEFUN([AM_PROG_MKDIR_P], -[AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) - # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 - # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) -# ------------------------------ +# -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) -# ---------------------------------- +# ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) @@ -741,24 +765,82 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -769,32 +851,40 @@ case `pwd` in esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac -# Do `set' in a subshell so we don't clobber the current shell's +# Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done test "$[2]" = conftest.file ) then @@ -804,9 +894,85 @@ else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi -AC_MSG_RESULT(yes)]) +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -814,34 +980,32 @@ AC_MSG_RESULT(yes)]) # AM_PROG_INSTALL_STRIP # --------------------- -# One issue with vendor `install' (even GNU) is that you can't +# One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize +# always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. @@ -849,24 +1013,22 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])]) AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- +# -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory @@ -876,75 +1038,114 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar +# AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. -AM_MISSING_PROG([AMTAR], [tar]) -m4_if([$1], [v7], - [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - # tar/untar a dummy directory, and stop if the command works + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR diff --git a/configure b/configure index e048369e..cb6bab86 100755 --- a/configure +++ b/configure @@ -626,6 +626,12 @@ ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS +BUILD_COMMS_NONE_FALSE +BUILD_COMMS_NONE_TRUE +BUILD_COMMS_FAKE_FALSE +BUILD_COMMS_FAKE_TRUE +BUILD_COMMS_MPI_FALSE +BUILD_COMMS_MPI_TRUE EGREP GREP CPP @@ -5068,6 +5074,31 @@ $as_echo "#define GRID_COMMS_MPI 1" >>confdefs.h ;; esac + if test "X${ac_COMMS}X" == "XmpiX" ; then + BUILD_COMMS_MPI_TRUE= + BUILD_COMMS_MPI_FALSE='#' +else + BUILD_COMMS_MPI_TRUE='#' + BUILD_COMMS_MPI_FALSE= +fi + + if test "X${ac_COMMS}X" == "XfakeX" ; then + BUILD_COMMS_FAKE_TRUE= + BUILD_COMMS_FAKE_FALSE='#' +else + BUILD_COMMS_FAKE_TRUE='#' + BUILD_COMMS_FAKE_FALSE= +fi + + if test "X${ac_COMMS}X" == "XnoneX" ; then + BUILD_COMMS_NONE_TRUE= + BUILD_COMMS_NONE_FALSE='#' +else + BUILD_COMMS_NONE_TRUE='#' + BUILD_COMMS_NONE_FALSE= +fi + + ac_config_files="$ac_config_files Makefile" @@ -5208,6 +5239,18 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${BUILD_COMMS_MPI_TRUE}" && test -z "${BUILD_COMMS_MPI_FALSE}"; then + as_fn_error $? "conditional \"BUILD_COMMS_MPI\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_COMMS_FAKE_TRUE}" && test -z "${BUILD_COMMS_FAKE_FALSE}"; then + as_fn_error $? "conditional \"BUILD_COMMS_FAKE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_COMMS_NONE_TRUE}" && test -z "${BUILD_COMMS_NONE_FALSE}"; then + as_fn_error $? "conditional \"BUILD_COMMS_NONE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 diff --git a/configure.ac b/configure.ac index 147ce21f..22d0365e 100644 --- a/configure.ac +++ b/configure.ac @@ -71,6 +71,10 @@ case ${ac_COMMS} in ;; esac +AM_CONDITIONAL(BUILD_COMMS_MPI,[ test "X${ac_COMMS}X" == "XmpiX" ]) +AM_CONDITIONAL(BUILD_COMMS_FAKE,[ test "X${ac_COMMS}X" == "XfakeX" ]) +AM_CONDITIONAL(BUILD_COMMS_NONE,[ test "X${ac_COMMS}X" == "XnoneX" ]) + AC_CONFIG_FILES(Makefile) AC_OUTPUT From 06843d4574ea15414f13604883122331fadc98ee Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 3 Apr 2015 04:58:03 +0100 Subject: [PATCH 029/429] Rename some files to make naming consistent --- Grid_cshift.h | 16 ++++++++++++++++ Grid_fake_cshift.h => Grid_cshift_fake.h | 0 Grid_mpi_cshift.h => Grid_cshift_mpi.h | 0 Grid_none_cshift.h => Grid_cshift_none.h | 0 4 files changed, 16 insertions(+) create mode 100644 Grid_cshift.h rename Grid_fake_cshift.h => Grid_cshift_fake.h (100%) rename Grid_mpi_cshift.h => Grid_cshift_mpi.h (100%) rename Grid_none_cshift.h => Grid_cshift_none.h (100%) diff --git a/Grid_cshift.h b/Grid_cshift.h new file mode 100644 index 00000000..2df2370e --- /dev/null +++ b/Grid_cshift.h @@ -0,0 +1,16 @@ +#ifndef _GRID_CSHIFT_H_ +#define _GRID_CSHIFT_H_ +#include + +#ifdef GRID_COMMS_NONE +#include +#endif + +#ifdef GRID_COMMS_FAKE +#include +#endif + +#ifdef GRID_COMMS_MPI +#include +#endif +#endif diff --git a/Grid_fake_cshift.h b/Grid_cshift_fake.h similarity index 100% rename from Grid_fake_cshift.h rename to Grid_cshift_fake.h diff --git a/Grid_mpi_cshift.h b/Grid_cshift_mpi.h similarity index 100% rename from Grid_mpi_cshift.h rename to Grid_cshift_mpi.h diff --git a/Grid_none_cshift.h b/Grid_cshift_none.h similarity index 100% rename from Grid_none_cshift.h rename to Grid_cshift_none.h From 0c5c974e6d5a24e68424ca8121bea337e400b8f7 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 3 Apr 2015 05:29:54 +0100 Subject: [PATCH 030/429] Renamed the namespace to Grid --- Grid.h | 2 +- Grid_Cartesian.h | 8 ++++---- Grid_Communicator.h | 2 +- Grid_Lattice.h | 19 +++---------------- Grid_QCD.h | 4 ++-- Grid_aligned_allocator.h | 4 ++-- Grid_fake.cc | 2 +- Grid_init.cc | 2 +- Grid_main.cc | 12 ++++++------ Grid_math_types.h | 2 +- Grid_mpi.cc | 2 +- Grid_simd.h | 4 ++-- Grid_vComplexD.h | 2 +- Grid_vComplexF.h | 2 +- Grid_vRealD.h | 2 +- Grid_vRealF.h | 2 +- 16 files changed, 29 insertions(+), 42 deletions(-) diff --git a/Grid.h b/Grid.h index cc8b36c6..184e7e36 100644 --- a/Grid.h +++ b/Grid.h @@ -50,7 +50,7 @@ #include #include -namespace dpo { +namespace Grid { void Grid_init(int *argc,char ***argv); double usecond(void); diff --git a/Grid_Cartesian.h b/Grid_Cartesian.h index 908d08a8..ced06825 100644 --- a/Grid_Cartesian.h +++ b/Grid_Cartesian.h @@ -3,15 +3,15 @@ #include #include -namespace dpo{ +namespace Grid{ ///////////////////////////////////////////////////////////////////////////////////////// // Grid Support. Following will go into Grid.h. ///////////////////////////////////////////////////////////////////////////////////////// // Cartesian grids - // dpo::Grid - // dpo::GridCartesian - // dpo::GridCartesianRedBlack + // Grid::Grid + // Grid::GridCartesian + // Grid::GridCartesianRedBlack class SimdGrid : public CartesianCommunicator { diff --git a/Grid_Communicator.h b/Grid_Communicator.h index 19e25167..4f83da34 100644 --- a/Grid_Communicator.h +++ b/Grid_Communicator.h @@ -6,7 +6,7 @@ #ifdef GRID_COMMS_MPI #include #endif -namespace dpo { +namespace Grid { class CartesianCommunicator { public: diff --git a/Grid_Lattice.h b/Grid_Lattice.h index fcff36eb..6219235a 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -5,7 +5,7 @@ -namespace dpo { +namespace Grid { // Permute the pointers 32bitx16 = 512 static int permute_map[4][16] = { @@ -37,22 +37,9 @@ public: } -#include - -#ifdef GRID_COMMS_NONE -#include -#endif - -#ifdef GRID_COMMS_FAKE -#include -#endif - -#ifdef GRID_COMMS_MPI -#include -#endif - +#include - // overloading dpo::conformable but no conformable in dpo ...?:w + // overloading Grid::conformable but no conformable in Grid ...?:w template friend void conformable(const Lattice &lhs,const Lattice &rhs); diff --git a/Grid_QCD.h b/Grid_QCD.h index e51e2641..f6cc6087 100644 --- a/Grid_QCD.h +++ b/Grid_QCD.h @@ -1,6 +1,6 @@ #ifndef GRID_QCD_H #define GRID_QCD_H -namespace dpo{ +namespace Grid{ namespace QCD { static const int Nc=3; @@ -89,5 +89,5 @@ namespace QCD { return ret; } } //namespace QCD -} // dpo +} // Grid #endif diff --git a/Grid_aligned_allocator.h b/Grid_aligned_allocator.h index 6040c233..dbaa0ba3 100644 --- a/Grid_aligned_allocator.h +++ b/Grid_aligned_allocator.h @@ -1,6 +1,6 @@ #ifndef GRID_ALIGNED_ALLOCATOR_H #define GRID_ALIGNED_ALLOCATOR_H -namespace dpo { +namespace Grid { //////////////////////////////////////////////////////////////////// // A lattice of something, but assume the something is SIMDized. @@ -52,5 +52,5 @@ template inline bool operator!=(const alignedAllocator<_Tp>&, const alignedAllocator<_Tp>&){ return false; } -}; // namespace dpo +}; // namespace Grid #endif diff --git a/Grid_fake.cc b/Grid_fake.cc index abc54c8e..83d5475e 100644 --- a/Grid_fake.cc +++ b/Grid_fake.cc @@ -1,5 +1,5 @@ #include "Grid.h" -namespace dpo { +namespace Grid { CartesianCommunicator::CartesianCommunicator(std::vector &processors) { diff --git a/Grid_init.cc b/Grid_init.cc index 4f7d1849..3a601209 100755 --- a/Grid_init.cc +++ b/Grid_init.cc @@ -14,7 +14,7 @@ #include "Grid.h" #undef __X86_64 -namespace dpo { +namespace Grid { void Grid_init(int *argc,char ***argv) { diff --git a/Grid_main.cc b/Grid_main.cc index 795ea395..504f7778 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -7,8 +7,8 @@ #include "Grid_Lattice.h" using namespace std; -using namespace dpo; -using namespace dpo::QCD; +using namespace Grid; +using namespace Grid::QCD; int main (int argc, char ** argv) @@ -175,10 +175,10 @@ int main (int argc, char ** argv) double t0,t1,flops; double bytes; int ncall=100; - int Nc = dpo::QCD::Nc; + int Nc = Grid::QCD::Nc; flops = ncall*1.0*volume*(8*Nc*Nc*Nc); - bytes = ncall*1.0*volume*Nc*Nc *2*3*sizeof(dpo::Real); + bytes = ncall*1.0*volume*Nc*Nc *2*3*sizeof(Grid::Real); printf("%f flop and %f bytes\n",flops,bytes/ncall); FooBar = Foo * Bar; t0=usecond(); @@ -195,7 +195,7 @@ int main (int argc, char ** argv) mult(FooBar,Foo,Bar); FooBar = Foo * Bar; - bytes = ncall*1.0*volume*Nc*Nc *2*5*sizeof(dpo::Real); + bytes = ncall*1.0*volume*Nc*Nc *2*5*sizeof(Grid::Real); t0=usecond(); for(int i=0;i diff; + std::complex diff; std::vector shiftcoor = coor; shiftcoor[dir]=(shiftcoor[dir]+shift+latt_size[dir])%(latt_size[dir]/mpi_layout[dir]); diff --git a/Grid_math_types.h b/Grid_math_types.h index e5387f12..533ce424 100644 --- a/Grid_math_types.h +++ b/Grid_math_types.h @@ -1,6 +1,6 @@ #ifndef GRID_MATH_TYPES_H #define GRID_MATH_TYPES_H -namespace dpo { +namespace Grid { diff --git a/Grid_mpi.cc b/Grid_mpi.cc index 6cda0f1b..e00e3dce 100644 --- a/Grid_mpi.cc +++ b/Grid_mpi.cc @@ -1,7 +1,7 @@ #include "Grid.h" #include -namespace dpo { +namespace Grid { // Should error check all MPI calls. diff --git a/Grid_simd.h b/Grid_simd.h index bef21bcf..b5d34d4a 100644 --- a/Grid_simd.h +++ b/Grid_simd.h @@ -38,7 +38,7 @@ // -namespace dpo { +namespace Grid { typedef float RealF; typedef double RealD; @@ -57,7 +57,7 @@ namespace dpo { inline RealF localInnerProduct(const RealF & l, const RealF & r) { return l*r; } //////////////////////////////////////////////////////////////////////////////// - //Provide support functions for basic real and complex data types required by dpo + //Provide support functions for basic real and complex data types required by Grid //Single and double precision versions. Should be able to template this once only. //////////////////////////////////////////////////////////////////////////////// inline void mac (ComplexD * __restrict__ y,const ComplexD * __restrict__ a,const ComplexD *__restrict__ x){ *y = (*a) * (*x)+(*y); }; diff --git a/Grid_vComplexD.h b/Grid_vComplexD.h index 15dc00c6..f575f3ad 100644 --- a/Grid_vComplexD.h +++ b/Grid_vComplexD.h @@ -3,7 +3,7 @@ #include "Grid.h" #include "Grid_vComplexF.h" -namespace dpo { +namespace Grid { class vComplexD { protected: zvec v; diff --git a/Grid_vComplexF.h b/Grid_vComplexF.h index 0b4f5e61..6c3e9eac 100644 --- a/Grid_vComplexF.h +++ b/Grid_vComplexF.h @@ -2,7 +2,7 @@ #define VCOMPLEXF #include "Grid.h" -namespace dpo { +namespace Grid { class vComplexF { protected: cvec v; diff --git a/Grid_vRealD.h b/Grid_vRealD.h index e5d3d4c6..34150e4b 100644 --- a/Grid_vRealD.h +++ b/Grid_vRealD.h @@ -3,7 +3,7 @@ #include "Grid.h" -namespace dpo{ +namespace Grid { class vRealD { protected: dvec v; // dvec is double precision vector diff --git a/Grid_vRealF.h b/Grid_vRealF.h index db74b005..94875f7e 100644 --- a/Grid_vRealF.h +++ b/Grid_vRealF.h @@ -3,7 +3,7 @@ #include "Grid.h" -namespace dpo { +namespace Grid { class vRealF { protected: fvec v; From 154a8700f4206c8de7a5f032d6f4f7660f72c9a3 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 3 Apr 2015 05:30:58 +0100 Subject: [PATCH 031/429] Removing the Xcode project --- Grid/Grid.xcodeproj/project.pbxproj | 239 ------------------ .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 4124 -> 0 bytes .../pab.xcuserdatad/xcschemes/Grid.xcscheme | 43 ---- .../xcschemes/xcschememanagement.plist | 22 -- 5 files changed, 311 deletions(-) delete mode 100644 Grid/Grid.xcodeproj/project.pbxproj delete mode 100644 Grid/Grid.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Grid/Grid.xcodeproj/project.xcworkspace/xcuserdata/pab.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 Grid/Grid.xcodeproj/xcuserdata/pab.xcuserdatad/xcschemes/Grid.xcscheme delete mode 100644 Grid/Grid.xcodeproj/xcuserdata/pab.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/Grid/Grid.xcodeproj/project.pbxproj b/Grid/Grid.xcodeproj/project.pbxproj deleted file mode 100644 index 20cd1d1a..00000000 --- a/Grid/Grid.xcodeproj/project.pbxproj +++ /dev/null @@ -1,239 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 0BF5DA461AC370840045EA34 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0BF5DA451AC370840045EA34 /* main.cpp */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 0BF5DA401AC370840045EA34 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 0BF5DA421AC370840045EA34 /* Grid */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Grid; sourceTree = BUILT_PRODUCTS_DIR; }; - 0BF5DA451AC370840045EA34 /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 0BF5DA3F1AC370840045EA34 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 0BF5DA391AC370840045EA34 = { - isa = PBXGroup; - children = ( - 0BF5DA441AC370840045EA34 /* Grid */, - 0BF5DA431AC370840045EA34 /* Products */, - ); - sourceTree = ""; - }; - 0BF5DA431AC370840045EA34 /* Products */ = { - isa = PBXGroup; - children = ( - 0BF5DA421AC370840045EA34 /* Grid */, - ); - name = Products; - sourceTree = ""; - }; - 0BF5DA441AC370840045EA34 /* Grid */ = { - isa = PBXGroup; - children = ( - 0BF5DA451AC370840045EA34 /* main.cpp */, - ); - path = Grid; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 0BF5DA411AC370840045EA34 /* Grid */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0BF5DA491AC370840045EA34 /* Build configuration list for PBXNativeTarget "Grid" */; - buildPhases = ( - 0BF5DA3E1AC370840045EA34 /* Sources */, - 0BF5DA3F1AC370840045EA34 /* Frameworks */, - 0BF5DA401AC370840045EA34 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Grid; - productName = Grid; - productReference = 0BF5DA421AC370840045EA34 /* Grid */; - productType = "com.apple.product-type.tool"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0BF5DA3A1AC370840045EA34 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0610; - ORGANIZATIONNAME = "University of Edinburgh"; - TargetAttributes = { - 0BF5DA411AC370840045EA34 = { - CreatedOnToolsVersion = 6.1.1; - }; - }; - }; - buildConfigurationList = 0BF5DA3D1AC370840045EA34 /* Build configuration list for PBXProject "Grid" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 0BF5DA391AC370840045EA34; - productRefGroup = 0BF5DA431AC370840045EA34 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 0BF5DA411AC370840045EA34 /* Grid */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 0BF5DA3E1AC370840045EA34 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0BF5DA461AC370840045EA34 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 0BF5DA471AC370840045EA34 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - }; - name = Debug; - }; - 0BF5DA481AC370840045EA34 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - }; - name = Release; - }; - 0BF5DA4A1AC370840045EA34 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 0BF5DA4B1AC370840045EA34 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 0BF5DA3D1AC370840045EA34 /* Build configuration list for PBXProject "Grid" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0BF5DA471AC370840045EA34 /* Debug */, - 0BF5DA481AC370840045EA34 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 0BF5DA491AC370840045EA34 /* Build configuration list for PBXNativeTarget "Grid" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0BF5DA4A1AC370840045EA34 /* Debug */, - 0BF5DA4B1AC370840045EA34 /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0BF5DA3A1AC370840045EA34 /* Project object */; -} diff --git a/Grid/Grid.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Grid/Grid.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index ce76f4f5..00000000 --- a/Grid/Grid.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Grid/Grid.xcodeproj/project.xcworkspace/xcuserdata/pab.xcuserdatad/UserInterfaceState.xcuserstate b/Grid/Grid.xcodeproj/project.xcworkspace/xcuserdata/pab.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 638ce019b327e05f2249ae344a55de843e067d13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4124 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 H - - - - - - - - - - - - - - - - - - diff --git a/Grid/Grid.xcodeproj/xcuserdata/pab.xcuserdatad/xcschemes/xcschememanagement.plist b/Grid/Grid.xcodeproj/xcuserdata/pab.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 1d4ba5a6..00000000 --- a/Grid/Grid.xcodeproj/xcuserdata/pab.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - Grid.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 0BF5DA411AC370840045EA34 - - primary - - - - - From d29733069fe7c4a886f931baa553f92ffa336f5c Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 3 Apr 2015 05:33:13 +0100 Subject: [PATCH 032/429] Patch --- Grid_cshift_none.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Grid_cshift_none.h b/Grid_cshift_none.h index f16b403b..37d20fa3 100644 --- a/Grid_cshift_none.h +++ b/Grid_cshift_none.h @@ -8,4 +8,4 @@ friend Lattice Cshift(Lattice &rhs,int dimension,int shift) Cshift_local(ret,rhs,dimension,shift); } - +#endif From 18b26a7a7003824f86da0e42932659b4c73c69dd Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 3 Apr 2015 05:34:51 +0100 Subject: [PATCH 033/429] MPI added --- Grid_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Grid_config.h b/Grid_config.h index 599afe2e..8a0fdc26 100644 --- a/Grid_config.h +++ b/Grid_config.h @@ -17,7 +17,7 @@ #define GRID_COMMS_MPI 1 /* GRID_COMMS_NONE */ -#define GRID_COMMS_NONE 1 +/* #undef GRID_COMMS_NONE */ /* Define to 1 if you have the `gettimeofday' function. */ #define HAVE_GETTIMEOFDAY 1 From 0c1f8b70e9caa42f8b13c8527dbc034dd2568a78 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 3 Apr 2015 05:51:05 +0100 Subject: [PATCH 034/429] Reorg --- Makefile.am | 15 +++++++++++++-- Makefile.in | 14 ++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Makefile.am b/Makefile.am index b681e0c5..d3a7b329 100644 --- a/Makefile.am +++ b/Makefile.am @@ -10,14 +10,25 @@ libGrid_a_SOURCES = Grid_init.cc # # Include files # -include_HEADERS = Grid.h\ +include_HEADERS = Grid_config.h\ + Grid.h\ + Grid_simd.h\ Grid_vComplexD.h\ Grid_vComplexF.h\ Grid_vRealD.h\ Grid_vRealF.h\ Grid_Cartesian.h\ Grid_Lattice.h\ - Grid_config.h + Grid_Communicator.h\ + Grid_QCD.h\ + Grid_aligned_allocator.h\ + Grid_cshift.h\ + Grid_cshift_common.h\ + Grid_cshift_fake.h\ + Grid_cshift_mpi.h\ + Grid_cshift_none.h\ + Grid_math_types.h + # # Test code diff --git a/Makefile.in b/Makefile.in index 43ea6616..6983b96a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -339,14 +339,24 @@ libGrid_a_SOURCES = Grid_init.cc # # Include files # -include_HEADERS = Grid.h\ +include_HEADERS = Grid_config.h\ + Grid.h\ + Grid_simd.h\ Grid_vComplexD.h\ Grid_vComplexF.h\ Grid_vRealD.h\ Grid_vRealF.h\ Grid_Cartesian.h\ Grid_Lattice.h\ - Grid_config.h + Grid_Communicator.h\ + Grid_QCD.h\ + Grid_aligned_allocator.h\ + Grid_cshift.h\ + Grid_cshift_common.h\ + Grid_cshift_fake.h\ + Grid_cshift_mpi.h\ + Grid_cshift_none.h\ + Grid_math_types.h extra_sources = $(am__append_1) $(am__append_2) $(am__append_3) Grid_main_SOURCES = \ From 15dda435e61614a7627f1174968312ef8535c1ec Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 3 Apr 2015 09:28:58 +0100 Subject: [PATCH 035/429] TODO list for preparing this for real use and QDP++ replacement. --- TODO | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 TODO diff --git a/TODO b/TODO new file mode 100644 index 00000000..8108fbc6 --- /dev/null +++ b/TODO @@ -0,0 +1,28 @@ +* Make peekSite, pokeSite work in an MPI context. + +* Conditional execution Subset, where etc... +* Coordinate information, integers etc... +* Integer type padding/union to vector. + +* Optimise the extract/merge SIMD routines + +* Broadcast, reduction tests. + +* QDP++ regression suite and comparative benchmark + +* NERSC Lattice loading, plaquette test + +* Conformable test in Cshift routines. + +* Gamma/Dirac structures +* Fourspin, two spin project + +* Stencil operator support + +* Check for missing functionality + +* I/O support + - MPI IO? + - BinaryWriter, TextWriter etc... + - protocol buffers? + - From ad31cd0c23ce5128b2745bd524f48d59a0efe3af Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 3 Apr 2015 22:54:13 +0100 Subject: [PATCH 036/429] Clean up but no major changes --- Grid_Cartesian.h | 13 ++---- Grid_Lattice.h | 108 +++++++++++++++---------------------------- Grid_cshift_common.h | 27 ++++++----- Grid_cshift_mpi.h | 82 ++------------------------------ Grid_math_types.h | 2 +- Grid_mpi.cc | 22 +++------ Grid_vComplexD.h | 8 ++-- Grid_vComplexF.h | 7 ++- Grid_vRealD.h | 5 +- Grid_vRealF.h | 5 +- 10 files changed, 74 insertions(+), 205 deletions(-) diff --git a/Grid_Cartesian.h b/Grid_Cartesian.h index ced06825..a983639c 100644 --- a/Grid_Cartesian.h +++ b/Grid_Cartesian.h @@ -201,10 +201,8 @@ public: block = block*_rdimensions[d]; } - if ( _isites != vComplex::Nsimd()) { - printf("bad layout for grid isites %d Nsimd %d\n",_isites,vComplex::Nsimd()); - exit(0); - } + assert( _isites == vComplex::Nsimd()); + }; }; @@ -235,10 +233,8 @@ public: int ocb=CheckerBoardFromOsite(osite); if ( (source_cb+ocb)&1 ) { - printf("Checkerboard shift %d\n",(shift)/2); return (shift)/2; } else { - printf("Checkerboard shift %d\n",(shift+1)/2); return (shift+1)/2; } } @@ -314,10 +310,7 @@ public: block = block*_rdimensions[d]; } - if ( _isites != vComplex::Nsimd()) { - printf("bad layout for grid isites %d Nsimd %d\n",_isites,vComplex::Nsimd()); - exit(0); - } + assert ( _isites == vComplex::Nsimd()); }; protected: virtual int oIndex(std::vector &coor) diff --git a/Grid_Lattice.h b/Grid_Lattice.h index 6219235a..aab4fec9 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -30,9 +30,7 @@ public: Lattice(SimdGrid *grid) : _grid(grid) { _odata.reserve(_grid->oSites()); - if ( ((uint64_t)&_odata[0])&0xF) { - exit(-1); - } + assert((((uint64_t)&_odata[0])&0xF) ==0); checkerboard=0; } @@ -97,26 +95,25 @@ public: template friend void pokeSite(const sobj &s,Lattice &l,std::vector &site){ - if ( l.checkerboard != l._grid->CheckerBoard(site)){ - printf("Poking wrong checkerboard\n"); - exit(EXIT_FAILURE); - } + typedef typename vobj::scalar_type stype; + typedef typename vobj::vector_type vtype; - int o_index = l._grid->oIndex(site); - int i_index = l._grid->iIndex(site); + assert( l.checkerboard == l._grid->CheckerBoard(site)); + + int o_index = l._grid->oIndex(site); + int i_index = l._grid->iIndex(site); + + stype *v_ptr = (stype *)&l._odata[o_index]; + stype *s_ptr = (stype *)&s; + v_ptr = v_ptr + 2*i_index; - // BUGGY. This assumes complex real - Real *v_ptr = (Real *)&l._odata[o_index]; - Real *s_ptr = (Real *)&s; - v_ptr = v_ptr + 2*i_index; - - for(int i=0;i friend void peekSite(sobj &s,const Lattice &l,std::vector &site){ - // FIXME : define exceptions set and throw up. - if ( l.checkerboard != l._grid->CheckerBoard(site)){ - printf("Peeking wrong checkerboard\n"); - exit(EXIT_FAILURE); - } - int o_index = l._grid->oIndex(site); - int i_index = l._grid->iIndex(site); - - Real *v_ptr = (Real *)&l._odata[o_index]; - Real *s_ptr = (Real *)&s; - v_ptr = v_ptr + 2*i_index; - - for(int i=0;iCheckerBoard(site)); + + int o_index = l._grid->oIndex(site); + int i_index = l._grid->iIndex(site); + + stype *v_ptr = (stype *)&l._odata[o_index]; + stype *s_ptr = (stype *)&s; + v_ptr = v_ptr + 2*i_index; + + for(int i=0;i S, S M -> M, M S -> M through - all nested possibilities. - template class lhs,template class rhs> - class MultTypeSelector { - template using ltype = lhs - typedef lhs type; - }; - */ - template void conformable(const Lattice &lhs,const Lattice &rhs) { @@ -313,28 +301,6 @@ public: uint32_t vec_len = lhs._grid->oSites(); #pragma omp parallel for for(int ss=0;ss could also allocate haloes which get used for stencil code. +// +// Grid could create a neighbour index table for a given stencil. +// Could also implement CovariantCshift. +////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////// // Gather for when there is no need to SIMD split @@ -8,8 +20,6 @@ friend void Gather_plane_simple (Lattice &rhs,std::vector_rdimensions[dimension]; - // printf("Gather plane _simple mask %d\n",cbmask); - if ( !rhs._grid->CheckerBoarded(dimension) ) { int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane @@ -31,7 +41,6 @@ friend void Gather_plane_simple (Lattice &rhs,std::vector_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ @@ -39,11 +48,6 @@ friend void Gather_plane_simple (Lattice &rhs,std::vectorCheckerBoardFromOsite(o+b);// Could easily be a table lookup if ( ocb &cbmask ) { buffer[bo]=rhs._odata[so+o+b]; - // float * ptr = (float *)& rhs._odata[so+o+b]; - // if( (cbmask!=3)&&(jjj<8)){ - // printf("Gather_plane_simple %d %le bo %d\n",so+o+b,*ptr,bo); - // jjj++; - // } bo++; } @@ -215,7 +219,7 @@ friend void Copy_plane(Lattice& lhs,Lattice &rhs, int dimension,int int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane int o = 0; // relative offset to base within plane - // int jjj=0; + #pragma omp parallel for collapse(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ @@ -224,11 +228,6 @@ friend void Copy_plane(Lattice& lhs,Lattice &rhs, int dimension,int if ( ocb&cbmask ) { lhs._odata[lo+o+b]=rhs._odata[ro+o+b]; - // float *ptr =(float *) &rhs._odata[ro+o+b]; - // if((cbmask!=0x3)&&jjj<8) { - // printf("Copy_plane %d %le n,b=%d,%d mask %d ocb %d\n",ro+o+b,*ptr,n,b,cbmask,ocb); - // jjj++; - // } } } diff --git a/Grid_cshift_mpi.h b/Grid_cshift_mpi.h index 4029f152..17aff2f4 100644 --- a/Grid_cshift_mpi.h +++ b/Grid_cshift_mpi.h @@ -1,36 +1,10 @@ #ifndef _GRID_MPI_CSHIFT_H_ #define _GRID_MPI_CSHIFT_H_ +#ifndef MAX #define MAX(x,y) ((x)>(y)?(x):(y)) #define MIN(x,y) ((x)>(y)?(y):(x)) -////////////////////////////////////////////////////////////////////////////////////////// -// Must not lose sight that goal is to be able to construct really efficient -// gather to a point stencil code. CSHIFT is not the best way, so probably need -// additional stencil support. -// -// Could still do a templated syntax tree and make CSHIFT return lattice vector. -// -// Stencil based code could pre-exchange haloes and use a table lookup for neighbours -// -// Lattice could also allocate haloes which get used for stencil code. -// -// Grid could create a neighbour index table for a given stencil. -// Could also implement CovariantCshift. -////////////////////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////// -// Q. Further split this into separate sub functions? -///////////////////////////////////////////////////////////// - -// CshiftCB_local -// CshiftCB_local_permute - -// Cshift_comms_splice -// Cshift_comms -// Cshift_local -// Cshift_local_permute - +#endif friend Lattice Cshift(Lattice &rhs,int dimension,int shift) { @@ -71,16 +45,10 @@ friend void Cshift_comms(Lattice& ret,Lattice &rhs,int dimension,int sshift[1] = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,1); if ( sshift[0] == sshift[1] ) { - // printf("Cshift_comms : single pass\n"); Cshift_comms(ret,rhs,dimension,shift,0x3); } else { - // printf("Cshift_comms : two pass\n"); - // printf("call1\n"); Cshift_comms(ret,rhs,dimension,shift,0x1);// if checkerboard is unfavourable take two passes - // printf("call2\n"); Cshift_comms(ret,rhs,dimension,shift,0x2);// both with block stride loop iteration - // printf("done\n"); - } } @@ -94,11 +62,8 @@ friend void Cshift_comms_simd(Lattice& ret,Lattice &rhs,int dimensio if ( sshift[0] == sshift[1] ) { Cshift_comms_simd(ret,rhs,dimension,shift,0x3); } else { - // printf("call1 0x1 cb=even\n"); Cshift_comms_simd(ret,rhs,dimension,shift,0x1);// if checkerboard is unfavourable take two passes - // printf("call2 0x2 cb=odd\n"); Cshift_comms_simd(ret,rhs,dimension,shift,0x2);// both with block stride loop iteration - // printf("done\n"); } } @@ -120,13 +85,10 @@ friend void Cshift_comms(Lattice &ret,Lattice &rhs,int dimension,int assert(shift>=0); assert(shift_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; std::vector > send_buf(buffer_size); std::vector > recv_buf(buffer_size); - // This code could be simplified by multiple calls to single routine with extra params to - // encapsulate the difference in the code paths. int cb= (cbmask==0x2)? 1 : 0; int sshift= rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,cb); @@ -137,8 +99,9 @@ friend void Cshift_comms(Lattice &ret,Lattice &rhs,int dimension,int int comm_proc = (x+sshift)/rd; if (!offnode) { - // printf("local x %d sshift %d offnode %d rd %d cb %d\n",x,sshift,offnode,rd,cb); + Copy_plane(ret,rhs,dimension,x,sx,cbmask); + } else { int words = send_buf.size(); @@ -146,29 +109,13 @@ friend void Cshift_comms(Lattice &ret,Lattice &rhs,int dimension,int int bytes = words * sizeof(vobj); - // printf("nonlocal x %d sx %d sshift %d offnode %d rd %d cb %d cbmask %d rhscb %d comm_proc %d\n", - // x,sx,sshift,offnode,rd,cb,cbmask,rhs.checkerboard,comm_proc); - // Copy_plane(temp,rhs,dimension,x,sx,cbmask); - - // Bug found; cbmask may differ between sx plan and rx plane. Gather_plane_simple (rhs,send_buf,dimension,sx,cbmask); - // for(int i=0;i_processor; int recv_from_rank; int xmit_to_rank; grid->ShiftedRanks(dimension,comm_proc,xmit_to_rank,recv_from_rank); - // printf("bytes %d node %d sending to %d receiving from %d\n",bytes,rank,xmit_to_rank,recv_from_rank ); grid->SendToRecvFrom((void *)&send_buf[0], xmit_to_rank, (void *)&recv_buf[0], @@ -224,46 +171,29 @@ friend void Cshift_comms_simd(Lattice &ret,Lattice &rhs,int dimensi int cb = (cbmask==0x2)? 1 : 0; int sshift= grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,cb); - // printf("cshift-comms-simd: shift = %d ; sshift = %d ; cbmask %d ; simd_layout %d\n",shift,sshift,cbmask,simd_layout); std::vector comm_offnode(simd_layout); std::vector comm_proc (simd_layout); //relative processor coord in dim=dimension - // Strategy - // - //* Loop over source planes - //* if any communication needed extract and send - //* if communication needed extract and send - for(int x=0;x= ld; comm_any = comm_any | comm_offnode[s]; comm_proc[s] = shifted_x/ld; - // printf("rd %d x %d shifted %d s=%d comm_any %d\n",rd, x,shifted_x,s,comm_any); } int o = 0; int bo = x*grid->_ostride[dimension]; int sx = (x+sshift)%rd; - // Need Convenience function in _grid. Move this in if ( comm_any ) { for(int i=0;i &ret,Lattice &rhs,int dimensi recv_from_rank, bytes); - // printf("Cshift_simd comms %d %le %le\n",i,real(recv_buf_extract[i][0]),real(send_buf_extract[i][0])); - rpointers[i] = (scalar_type *)&recv_buf_extract[i][0]; } else { rpointers[i] = (scalar_type *)&send_buf_extract[i][0]; - // printf("Cshift_simd local %d %le \n",i,real(send_buf_extract[i][0])); } @@ -311,7 +238,6 @@ friend void Cshift_comms_simd(Lattice &ret,Lattice &rhs,int dimensi } else { pointers[i] = rpointers[i]; } - // printf("Cshift_simd perm %d num %d wrap %d swiz %d %le unswiz %le\n",permute_slice,num,wrap,i,real(pointers[i][0]),real(rpointers[i][0])); } Scatter_plane_merge(ret,pointers,dimension,x,cbmask); diff --git a/Grid_math_types.h b/Grid_math_types.h index 533ce424..3f7714d5 100644 --- a/Grid_math_types.h +++ b/Grid_math_types.h @@ -830,7 +830,7 @@ template inline iMatrix adj(const iMatrix & ///////////////////////////////////////////////////////////////// // Can only take the real/imag part of scalar objects, since -// lattice objects of different complexity are non-conformable. +// lattice objects of different complex nature are non-conformable. ///////////////////////////////////////////////////////////////// template inline auto real(const iScalar &z) -> iScalar { diff --git a/Grid_mpi.cc b/Grid_mpi.cc index e00e3dce..c9b91210 100644 --- a/Grid_mpi.cc +++ b/Grid_mpi.cc @@ -17,13 +17,15 @@ CartesianCommunicator::CartesianCommunicator(std::vector &processors) MPI_Cart_create(MPI_COMM_WORLD, _ndimension,&_processors[0],&periodic[0],1,&communicator); MPI_Comm_rank(communicator,&_processor); MPI_Cart_coords(communicator,_processor,_ndimension,&_processor_coor[0]); - printf("Hello world from processor ["); + for(int i=0;i<_ndimension;i++){ - printf("%d ",_processor_coor[i]); _Nprocessors*=_processors[i]; } - printf("]\n"); - fflush(stdout); + + int Size; + MPI_Comm_size(communicator,&Size); + + assert(Size==_Nprocessors); } void CartesianCommunicator::GlobalSumF(float &f){ @@ -71,15 +73,3 @@ void CartesianCommunicator::SendToRecvFrom(void *xmit, } -#if 0 - -// Could possibly do a direct block strided send? - int MPI_Type_vector( - int count, - int blocklength, - int stride, - MPI_Datatype old_type, - MPI_Datatype *newtype_p - ); - -#endif diff --git a/Grid_vComplexD.h b/Grid_vComplexD.h index f575f3ad..d1caefb1 100644 --- a/Grid_vComplexD.h +++ b/Grid_vComplexD.h @@ -48,7 +48,6 @@ namespace Grid { #endif #ifdef AVX512 ret.v = _mm512_add_pd(a.v,b.v); - //printf("%s %f\n",__func__,_mm512_reduce_mul_pd(ret.v)); #endif #ifdef QPX ret.v = vec_add(a.v,b.v); @@ -210,7 +209,7 @@ namespace Grid { #ifdef QPX #error // Not implemented yet #endif - default: exit(EXIT_FAILURE); break; + default: assert(0); break; } }; void vload(zvec& a){ @@ -265,8 +264,7 @@ friend inline void vstore(vComplexD &ret, ComplexD *a){ //Note v has a3 a2 a1 a0 #endif #ifdef QPX - printf("%s Not implemented\n",__func__); - exit(-1); + assert(0); #endif } friend inline void vprefetch(const vComplexD &v) @@ -294,7 +292,7 @@ friend inline void vstore(vComplexD &ret, ComplexD *a){ #endif #ifdef QPX - exit(0); // not implemented + assert(0); #endif return ret; } diff --git a/Grid_vComplexF.h b/Grid_vComplexF.h index 6c3e9eac..578228a3 100644 --- a/Grid_vComplexF.h +++ b/Grid_vComplexF.h @@ -193,7 +193,7 @@ namespace Grid { #ifdef QPX #error #endif - default: exit(EXIT_FAILURE); break; + default: assert(0); break; } }; @@ -235,8 +235,7 @@ friend inline void vstore(vComplexF &ret, ComplexF *a){ //Note v has a3 a2 a1 a0 #endif #ifdef QPX - printf("%s Not implemented\n",__func__); -exit(-1); + assert(0); #endif } friend inline void vprefetch(const vComplexF &v) @@ -333,7 +332,7 @@ exit(-1); ret.v = _mm512_mask_sub_ps(in.v,0xaaaa,ret.v,in.v); // Zero out 0+real 0-imag #endif #ifdef QPX - exit(0); // not implemented + assert(0); #endif return ret; } diff --git a/Grid_vRealD.h b/Grid_vRealD.h index 34150e4b..1abc0804 100644 --- a/Grid_vRealD.h +++ b/Grid_vRealD.h @@ -161,7 +161,7 @@ namespace Grid { #ifdef QPX #error #endif - default: exit(EXIT_FAILURE); break; + default: assert(0);break; } }; // gona be bye bye @@ -214,8 +214,7 @@ namespace Grid { // Note v has a7 a6 a5ba4 a3 a2 a1 a0 #endif #ifdef QPX - printf("%s Not implemented\n",__func__); - exit(-1); + assert(0); #endif } friend inline void vprefetch(const vRealD &v) diff --git a/Grid_vRealF.h b/Grid_vRealF.h index 94875f7e..22809b83 100644 --- a/Grid_vRealF.h +++ b/Grid_vRealF.h @@ -185,7 +185,7 @@ namespace Grid { #ifdef QPX #error not implemented #endif - default: exit(EXIT_FAILURE); break; + default: assert(0); break; } }; @@ -236,8 +236,7 @@ friend inline void vstore(vRealF &ret, float *a){ // Note v has a7 a6 a5ba4 a3 a2 a1 a0 #endif #ifdef QPX - printf("%s Not implemented\n",__func__); - exit(-1); + assert(0); #endif } From 02262b00195f36ad5120eb67e1786f7c42fb2fd8 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 6 Apr 2015 06:30:48 +0100 Subject: [PATCH 037/429] Bringing in LatticeInteger with the idea of implemented predicated assignment, subsets etc. c.f the QDP++ "where" syntax --- Grid_Cartesian.h | 283 ++++++++++++++++++++++++++------------- Grid_Communicator.h | 54 +++++++- Grid_Lattice.h | 93 +++++++------ Grid_QCD.h | 14 +- Grid_cshift_common.h | 12 +- Grid_cshift_fake.h | 8 +- Grid_cshift_mpi.h | 14 +- Grid_main.cc | 51 ++++--- Grid_math_types.h | 22 +--- Grid_mpi.cc | 29 +++- Grid_simd.h | 119 +++++++++++++---- Grid_vInteger.h | 307 +++++++++++++++++++++++++++++++++++++++++++ TODO | 3 +- 13 files changed, 788 insertions(+), 221 deletions(-) create mode 100644 Grid_vInteger.h diff --git a/Grid_Cartesian.h b/Grid_Cartesian.h index a983639c..004c2fa5 100644 --- a/Grid_Cartesian.h +++ b/Grid_Cartesian.h @@ -6,126 +6,236 @@ namespace Grid{ ///////////////////////////////////////////////////////////////////////////////////////// -// Grid Support. Following will go into Grid.h. +// Grid Support. ///////////////////////////////////////////////////////////////////////////////////////// - // Cartesian grids - // Grid::Grid - // Grid::GridCartesian - // Grid::GridCartesianRedBlack +// +// Cartesian grid inheritance +// Grid::GridBase +// | +// __________|___________ +// | | +// Grid::GridCartesian Grid::GridCartesianRedBlack +// +// TODO: document the following as an API guaranteed public interface + /* + * Rough map of functionality against QDP++ Layout + * + * Param | Grid | QDP++ + * ----------------------------------------- + * | | + * void | oSites, iSites, lSites | sitesOnNode + * void | gSites | vol + * | | + * gcoor | oIndex, iIndex | linearSiteIndex // no virtual node in QDP + * lcoor | | + * + * void | CheckerBoarded | - // No checkerboarded in QDP + * void | FullDimensions | lattSize + * void | GlobalDimensions | lattSize // No checkerboarded in QDP + * void | LocalDimensions | subgridLattSize + * void | VirtualLocalDimensions | subgridLattSize // no virtual node in QDP + * | | + * int x 3 | oiSiteRankToGlobal | siteCoords + * | ProcessorCoorLocalCoorToGlobalCoor | + * | | + * vector | GlobalCoorToRankIndex | nodeNumber(coord) + * vector | GlobalCoorToProcessorCoorLocalCoor| nodeCoord(coord) + * | | + * void | Processors | logicalSize // returns cart array shape + * void | ThisRank | nodeNumber(); // returns this node rank + * void | ThisProcessorCoor | // returns this node coor + * void | isBoss(void) | primaryNode(); + * | | + * | RankFromProcessorCoor | getLogicalCoorFrom(node) + * | ProcessorCoorFromRank | getNodeNumberFrom(logical_coord) + */ -class SimdGrid : public CartesianCommunicator { +class GridBase : public CartesianCommunicator { public: + // Give Lattice access + template friend class Lattice; - SimdGrid(std::vector & processor_grid) : CartesianCommunicator(processor_grid) {}; + GridBase(std::vector & processor_grid) : CartesianCommunicator(processor_grid) {}; - // Give Lattice access - template friend class Lattice; -//protected: - - // Lattice wide random support. not yet fully implemented. Need seed strategy - // and one generator per site. - //std::default_random_engine generator; - // static std::mt19937 generator( 9 ); - - // Grid information. - - // Commicator provides + //protected: + // Lattice wide random support. not yet fully implemented. Need seed strategy + // and one generator per site. + // std::default_random_engine generator; + // static std::mt19937 generator( 9 ); + + ////////////////////////////////////////////////////////////////////// + // Commicator provides information on the processor grid + ////////////////////////////////////////////////////////////////////// // unsigned long _ndimension; // std::vector _processors; // processor grid // int _processor; // linear processor rank // std::vector _processor_coor; // linear processor rank + ////////////////////////////////////////////////////////////////////// + // Physics Grid information. std::vector _simd_layout; // Which dimensions get relayed out over simd lanes. - - std::vector _fdimensions;// Global dimensions of array prior to cb removal std::vector _gdimensions;// Global dimensions of array after cb removal std::vector _ldimensions;// local dimensions of array with processor images removed std::vector _rdimensions;// Reduced local dimensions with simd lane images and processor images removed + std::vector _ostride; // Outer stride for each dimension + std::vector _istride; // Inner stride i.e. within simd lane + int _osites; // _isites*_osites = product(dimensions). + int _isites; + std::vector _slice_block; // subslice information + std::vector _slice_stride; + std::vector _slice_nblock; + // Might need these at some point // std::vector _lstart; // local start of array in gcoors. _processor_coor[d]*_ldimensions[d] // std::vector _lend; // local end of array in gcoors _processor_coor[d]*_ldimensions[d]+_ldimensions_[d]-1 - - std::vector _ostride; // Outer stride for each dimension - std::vector _istride; // Inner stride i.e. within simd lane - - int _osites; // _isites*_osites = product(dimensions). - int _isites; - - // subslice information - std::vector _slice_block; - std::vector _slice_stride; - std::vector _slice_nblock; public: - - // These routines are key. Subdivide the linearised cartesian index into - // "inner" index identifying which simd lane of object is associated with coord - // "outer" index identifying which element of _odata in class "Lattice" is associated with coord. - // Compared to, say, Blitz++ we simply need to store BOTH an inner stride and an outer - // stride per dimension. The cost of evaluating the indexing information is doubled for an n-dimensional - // coordinate. Note, however, for data parallel operations the "inner" indexing cost is not paid and all - // lanes are operated upon simultaneously. - - inline int oIndexReduced(std::vector &rcoor) - { - int idx=0; - for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*rcoor[d]; - return idx; - } - virtual int oIndex(std::vector &coor) - { - int idx=0; - for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*(coor[d]%_rdimensions[d]); - return idx; - } - inline int iIndex(std::vector &rcoor) - { - int idx=0; - for(int d=0;d<_ndimension;d++) idx+=_istride[d]*(rcoor[d]/_rdimensions[d]); - return idx; - } - inline int iCoordFromIsite(int lane,int mu) - { - std::vector coor(_ndimension); - for(int d=0;d<_ndimension;d++){ - coor[d] = lane % _simd_layout[d]; - lane = lane / _simd_layout[d]; - } - return coor[mu]; - } - - inline int oSites(void) { return _osites; }; - inline int iSites(void) { return _isites; }; - inline int CheckerBoardFromOsite (int Osite){ + //////////////////////////////////////////////////////////////// + // Checkerboarding interface is virtual and overridden by + // GridCartesian / GridRedBlackCartesian + //////////////////////////////////////////////////////////////// + virtual int CheckerBoarded(int dim)=0; + virtual int CheckerBoard(std::vector site)=0; + virtual int CheckerBoardDestination(int source_cb,int shift)=0; + virtual int CheckerBoardShift(int source_cb,int dim,int shift,int osite)=0; + inline int CheckerBoardFromOindex (int Oindex){ std::vector ocoor; - CoordFromOsite(ocoor,Osite); + oCoorFromOindex(ocoor,Oindex); int ss=0; for(int d=0;d<_ndimension;d++){ ss=ss+ocoor[d]; } return ss&0x1; } - inline void CoordFromOsite (std::vector& coor,int Osite){ + + ////////////////////////////////////////////////////////////////////////////////////////////// + // Local layout calculations + ////////////////////////////////////////////////////////////////////////////////////////////// + // These routines are key. Subdivide the linearised cartesian index into + // "inner" index identifying which simd lane of object is associated with coord + // "outer" index identifying which element of _odata in class "Lattice" is associated with coord. + // + // Compared to, say, Blitz++ we simply need to store BOTH an inner stride and an outer + // stride per dimension. The cost of evaluating the indexing information is doubled for an n-dimensional + // coordinate. Note, however, for data parallel operations the "inner" indexing cost is not paid and all + // lanes are operated upon simultaneously. + + virtual int oIndex(std::vector &coor) + { + int idx=0; + // Works with either global or local coordinates + for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*(coor[d]%_rdimensions[d]); + return idx; + } + inline int oIndexReduced(std::vector &ocoor) + { + int idx=0; + // ocoor is already reduced so can eliminate the modulo operation + // for fast indexing and inline the routine + for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*ocoor[d]; + return idx; + } + inline void oCoorFromOindex (std::vector& coor,int Oindex){ coor.resize(_ndimension); for(int d=0;d<_ndimension;d++){ - coor[d] = Osite % _rdimensions[d]; - Osite = Osite / _rdimensions[d]; + coor[d] = Oindex % _rdimensions[d]; + Oindex = Oindex / _rdimensions[d]; } } - virtual int CheckerBoarded(int dim)=0; - virtual int CheckerBoard(std::vector site)=0; - virtual int CheckerBoardDestination(int source_cb,int shift)=0; - virtual int CheckerBoardShift(int source_cb,int dim,int shift,int osite)=0; + ////////////////////////////////////////////////////////// + // SIMD lane addressing + ////////////////////////////////////////////////////////// + inline int iIndex(std::vector &lcoor) + { + int idx=0; + for(int d=0;d<_ndimension;d++) idx+=_istride[d]*(lcoor[d]/_rdimensions[d]); + return idx; + } + inline void iCoorFromIindex(std::vector &coor,int lane) + { + coor.resize(_ndimension); + for(int d=0;d<_ndimension;d++){ + coor[d] = lane % _simd_layout[d]; + lane = lane / _simd_layout[d]; + } + } + + //////////////////////////////////////////////////////////////// + // Array sizing queries + //////////////////////////////////////////////////////////////// + + inline int iSites(void) { return _isites; }; + inline int Nsimd(void) { return _isites; };// Synonymous with iSites + inline int oSites(void) { return _osites; }; + inline int lSites(void) { return _isites*_osites; }; + inline int gSites(void) { return _isites*_osites*_Nprocessors; }; + inline int Nd (void) { return _ndimension;}; + inline const std::vector &FullDimensions(void) { return _fdimensions;}; + inline const std::vector &GlobalDimensions(void) { return _gdimensions;}; + inline const std::vector &LocalDimensions(void) { return _ldimensions;}; + inline const std::vector &VirtualLocalDimensions(void) { return _ldimensions;}; + + //////////////////////////////////////////////////////////////// + // Global addressing + //////////////////////////////////////////////////////////////// + void RankIndexToGlobalCoor(int rank, int o_idx, int i_idx , std::vector &gcoor) + { + gcoor.resize(_ndimension); + std::vector coor(_ndimension); + + ProcessorCoorFromRank(rank,coor); + for(int mu=0;mu<_ndimension;mu++) gcoor[mu] = _ldimensions[mu]&coor[mu]; + + iCoorFromIindex(coor,i_idx); + for(int mu=0;mu<_ndimension;mu++) gcoor[mu] += _rdimensions[mu]&coor[mu]; + + oCoorFromOindex (coor,o_idx); + for(int mu=0;mu<_ndimension;mu++) gcoor[mu] += coor[mu]; + + } + void RankIndexCbToFullGlobalCoor(int rank, int o_idx, int i_idx, int cb,std::vector &fcoor) + { + RankIndexToGlobalCoor(rank,o_idx,i_idx ,fcoor); + if(CheckerBoarded(0)){ + fcoor[0] = fcoor[0]*2+cb; + } + } + void ProcessorCoorLocalCoorToGlobalCoor(std::vector &Pcoor,std::vector &Lcoor,std::vector &gcoor) + { + gcoor.resize(_ndimension); + for(int mu=0;mu<_ndimension;mu++) gcoor[mu] = Pcoor[mu]*_ldimensions[mu]+Lcoor[mu]; + } + void GlobalCoorToProcessorCoorLocalCoor(std::vector &pcoor,std::vector &lcoor,const std::vector &gcoor) + { + pcoor.resize(_ndimension); + lcoor.resize(_ndimension); + for(int mu=0;mu<_ndimension;mu++){ + pcoor[mu] = gcoor[mu]/_ldimensions[mu]; + lcoor[mu] = gcoor[mu]%_ldimensions[mu]; + } + } + void GlobalCoorToRankIndex(int &rank, int &o_idx, int &i_idx ,const std::vector &gcoor) + { + std::vector pcoor; + std::vector lcoor; + GlobalCoorToProcessorCoorLocalCoor(pcoor,lcoor,gcoor); + rank = RankFromProcessorCoor(pcoor); + i_idx= iIndex(lcoor); + o_idx= oIndex(lcoor); + } + }; -class GridCartesian: public SimdGrid { +class GridCartesian: public GridBase { + public: + virtual int CheckerBoarded(int dim){ return 0; } @@ -141,7 +251,7 @@ public: GridCartesian(std::vector &dimensions, std::vector &simd_layout, std::vector &processor_grid - ) : SimdGrid(processor_grid) + ) : GridBase(processor_grid) { /////////////////////// // Grid information @@ -200,14 +310,12 @@ public: _slice_nblock[d]=nblock; block = block*_rdimensions[d]; } - - assert( _isites == vComplex::Nsimd()); }; }; // Specialise this for red black grids storing half the data like a chess board. -class GridRedBlackCartesian : public SimdGrid +class GridRedBlackCartesian : public GridBase { public: virtual int CheckerBoarded(int dim){ @@ -230,7 +338,7 @@ public: // Probably faster with table lookup; // or by looping over x,y,z and multiply rather than computing checkerboard. - int ocb=CheckerBoardFromOsite(osite); + int ocb=CheckerBoardFromOindex(osite); if ( (source_cb+ocb)&1 ) { return (shift)/2; @@ -248,7 +356,7 @@ public: }; GridRedBlackCartesian(std::vector &dimensions, std::vector &simd_layout, - std::vector &processor_grid) : SimdGrid(processor_grid) + std::vector &processor_grid) : GridBase(processor_grid) { /////////////////////// // Grid information @@ -310,7 +418,6 @@ public: block = block*_rdimensions[d]; } - assert ( _isites == vComplex::Nsimd()); }; protected: virtual int oIndex(std::vector &coor) diff --git a/Grid_Communicator.h b/Grid_Communicator.h index 4f83da34..c7e71f12 100644 --- a/Grid_Communicator.h +++ b/Grid_Communicator.h @@ -22,23 +22,63 @@ class CartesianCommunicator { MPI_Comm communicator; #endif + // Constructor CartesianCommunicator(std::vector &pdimensions_in); + // Wraps MPI_Cart routines void ShiftedRanks(int dim,int shift,int & source, int & dest); - int Rank(std::vector coor); - int MyRank(void); - void GlobalSumF(float &); - void GlobalSumFVector(float *,int N); + int RankFromProcessorCoor(std::vector &coor); + void ProcessorCoorFromRank(int rank,std::vector &coor); - void GlobalSumF(double &); - void GlobalSumFVector(double *,int N); + ///////////////////////////////// + // Grid information queries + ///////////////////////////////// + int IsBoss(void) { return _processor==0; }; + int ThisRank(void) { return _processor; }; + const std::vector & ThisProcessorCoor(void) { return _processor_coor; }; + const std::vector & ProcessorGrid(void) { return _processors; }; + int ProcessorCount(void) { return _Nprocessors; }; + //////////////////////////////////////////////////////////// + // Reduction + //////////////////////////////////////////////////////////// + void GlobalSum(float &); + void GlobalSumVector(float *,int N); + + void GlobalSum(double &); + void GlobalSumVector(double *,int N); + + template void GlobalSumObj(obj &o){ + + typedef typename obj::scalar_type scalar_type; + int words = sizeof(obj)/sizeof(scalar_type); + + scalar_type * ptr = (scalar_type *)& o; + GlobalSum(ptr,words); + } + //////////////////////////////////////////////////////////// + // Face exchange + //////////////////////////////////////////////////////////// void SendToRecvFrom(void *xmit, int xmit_to_rank, void *recv, int recv_from_rank, int bytes); - + + //////////////////////////////////////////////////////////// + // Barrier + //////////////////////////////////////////////////////////// + void Barrier(void); + + //////////////////////////////////////////////////////////// + // Broadcast a buffer and composite larger + //////////////////////////////////////////////////////////// + void Broadcast(int root,void* data, int bytes); + template void Broadcast(int root,obj &data) + { + Broadcast(root,(void *)&data,sizeof(data)); + }; + }; } diff --git a/Grid_Lattice.h b/Grid_Lattice.h index aab4fec9..2aa46b97 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -20,7 +20,7 @@ template class Lattice { public: - SimdGrid *_grid; + GridBase *_grid; int checkerboard; std::vector > _odata; typedef typename vobj::scalar_type scalar_type; @@ -28,7 +28,7 @@ public: public: - Lattice(SimdGrid *grid) : _grid(grid) { + Lattice(GridBase *grid) : _grid(grid) { _odata.reserve(_grid->oSites()); assert((((uint64_t)&_odata[0])&0xF) ==0); checkerboard=0; @@ -95,56 +95,67 @@ public: template friend void pokeSite(const sobj &s,Lattice &l,std::vector &site){ - typedef typename vobj::scalar_type stype; - typedef typename vobj::vector_type vtype; + GridBase *grid=l._grid; - assert( l.checkerboard == l._grid->CheckerBoard(site)); + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; - int o_index = l._grid->oIndex(site); - int i_index = l._grid->iIndex(site); + int Nsimd = grid->Nsimd(); + + assert( l.checkerboard== l._grid->CheckerBoard(site)); + assert( sizeof(sobj)*Nsimd == sizeof(vobj)); + + int rank,odx,idx; + grid->GlobalCoorToRankIndex(rank,odx,idx,site); + + // Optional to broadcast from node 0. + grid->Broadcast(0,s); + + std::vector buf(Nsimd); + std::vector pointers(Nsimd); + for(int i=0;i - friend void peekSite(sobj &s,const Lattice &l,std::vector &site){ + friend void peekSite(sobj &s,Lattice &l,std::vector &site){ - typedef typename vobj::scalar_type stype; - typedef typename vobj::vector_type vtype; + GridBase *grid=l._grid; + + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + + int Nsimd = grid->Nsimd(); assert( l.checkerboard== l._grid->CheckerBoard(site)); + assert( sizeof(sobj)*Nsimd == sizeof(vobj)); - int o_index = l._grid->oIndex(site); - int i_index = l._grid->iIndex(site); + int rank,odx,idx; + grid->GlobalCoorToRankIndex(rank,odx,idx,site); + std::vector buf(Nsimd); + std::vector pointers(Nsimd); + for(int i=0;iBroadcast(rank,s); + return; }; - // Randomise + // FIXME Randomise; deprecate this friend void random(Lattice &l){ - Real *v_ptr = (Real *)&l._odata[0]; size_t v_len = l._grid->oSites()*sizeof(vobj); size_t d_len = v_len/sizeof(Real); @@ -154,9 +165,9 @@ public: v_ptr[i]=drand48(); } }; - + + // FIXME for debug; deprecate this friend void lex_sites(Lattice &l){ - Real *v_ptr = (Real *)&l._odata[0]; size_t o_len = l._grid->oSites(); size_t v_len = sizeof(vobj)/sizeof(vRealF); @@ -183,7 +194,6 @@ public: for(int i=0;i conj(const Lattice &lhs){ Lattice ret(lhs._grid); #pragma omp parallel for @@ -259,7 +270,7 @@ public: std::vector coor; int cbos; - full._grid->CoordFromOsite(coor,ss); + full._grid->oCoorFromOindex(coor,ss); cbos=half._grid->CheckerBoard(coor); if (cbos==cb) { @@ -277,7 +288,7 @@ public: std::vector coor; int cbos; - full._grid->CoordFromOsite(coor,ss); + full._grid->oCoorFromOindex(coor,ss); cbos=half._grid->CheckerBoard(coor); if (cbos==cb) { @@ -351,7 +362,6 @@ public: template inline auto operator * (const left &lhs,const Lattice &rhs) -> Lattice { - std::cerr <<"Oscalar * Lattice calling mult"< ret(rhs._grid); #pragma omp parallel for @@ -383,7 +393,6 @@ public: template inline auto operator * (const Lattice &lhs,const right &rhs) -> Lattice { - std::cerr <<"Lattice * Oscalar calling mult"< ret(lhs._grid); #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ diff --git a/Grid_QCD.h b/Grid_QCD.h index f6cc6087..a0f7801a 100644 --- a/Grid_QCD.h +++ b/Grid_QCD.h @@ -21,7 +21,13 @@ namespace QCD { typedef iSinglet TComplex; // This is painful. Tensor singlet complex type. typedef iSinglet vTComplex; - typedef iSinglet TReal; // This is painful. Tensor singlet complex type. + typedef iSinglet TReal; // This is painful. Tensor singlet complex type. + + + typedef iSinglet vTIntegerF; + typedef iSinglet vTIntegerD; + typedef iSinglet vTIntegerC; + typedef iSinglet vTIntegerZ; typedef iSpinMatrix SpinMatrix; typedef iColourMatrix ColourMatrix; @@ -39,9 +45,13 @@ namespace QCD { typedef iSpinVector vSpinVector; typedef iColourVector vColourVector; typedef iSpinColourVector vSpinColourVector; - typedef Lattice LatticeComplex; + + typedef Lattice LatticeIntegerF; // Predicates for "where" + typedef Lattice LatticeIntegerD; + typedef Lattice LatticeIntegerC; + typedef Lattice LatticeIntegerZ; typedef Lattice LatticeColourMatrix; typedef Lattice LatticeSpinMatrix; diff --git a/Grid_cshift_common.h b/Grid_cshift_common.h index 203bf2f5..72518d7d 100644 --- a/Grid_cshift_common.h +++ b/Grid_cshift_common.h @@ -45,7 +45,7 @@ friend void Gather_plane_simple (Lattice &rhs,std::vector_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ - int ocb=1<CheckerBoardFromOsite(o+b);// Could easily be a table lookup + int ocb=1<CheckerBoardFromOindex(o+b);// Could easily be a table lookup if ( ocb &cbmask ) { buffer[bo]=rhs._odata[so+o+b]; bo++; @@ -90,7 +90,7 @@ friend void Gather_plane_extract(Lattice &rhs,std::vector p for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ - int ocb=1<CheckerBoardFromOsite(o+b); + int ocb=1<CheckerBoardFromOindex(o+b); if ( ocb & cbmask ) { extract(rhs._odata[so+o+b],pointers); } @@ -135,7 +135,7 @@ friend void Scatter_plane_simple (Lattice &rhs,std::vector_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ - int ocb=1<CheckerBoardFromOsite(o+b);// Could easily be a table lookup + int ocb=1<CheckerBoardFromOindex(o+b);// Could easily be a table lookup if ( ocb & cbmask ) { rhs._odata[so+o+b]=buffer[bo++]; } @@ -179,7 +179,7 @@ friend void Scatter_plane_merge(Lattice &rhs,std::vector po for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ - int ocb=1<CheckerBoardFromOsite(o+b); + int ocb=1<CheckerBoardFromOindex(o+b); if ( ocb&cbmask ) { merge(rhs._odata[so+o+b],pointers); } @@ -224,7 +224,7 @@ friend void Copy_plane(Lattice& lhs,Lattice &rhs, int dimension,int for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ - int ocb=1<CheckerBoardFromOsite(o+b); + int ocb=1<CheckerBoardFromOindex(o+b); if ( ocb&cbmask ) { lhs._odata[lo+o+b]=rhs._odata[ro+o+b]; @@ -267,7 +267,7 @@ friend void Copy_plane_permute(Lattice& lhs,Lattice &rhs, int dimens for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ - int ocb=1<CheckerBoardFromOsite(o+b); + int ocb=1<CheckerBoardFromOindex(o+b); if ( ocb&cbmask ) { permute(lhs._odata[lo+o+b],rhs._odata[ro+o+b],permute_type); diff --git a/Grid_cshift_fake.h b/Grid_cshift_fake.h index 0f306b1b..8b6c293b 100644 --- a/Grid_cshift_fake.h +++ b/Grid_cshift_fake.h @@ -7,9 +7,11 @@ friend Lattice Cshift(Lattice &rhs,int dimension,int shift) { typedef typename vobj::vector_type vector_type; typedef typename vobj::scalar_type scalar_type; - const int Nsimd = vector_type::Nsimd(); Lattice ret(rhs._grid); + + GridBase *grid=rhs._grid; + const int Nsimd = grid->Nsimd(); int fd = rhs._grid->_fdimensions[dimension]; int rd = rhs._grid->_rdimensions[dimension]; @@ -43,7 +45,7 @@ friend Lattice Cshift(Lattice &rhs,int dimension,int shift) for(int x=0;x Cshift(Lattice &rhs,int dimension,int shift) o +=rhs._grid->_slice_stride[dimension]; } - for(int i=0;i &ret,Lattice &rhs,int dimension,int typedef typename vobj::vector_type vector_type; typedef typename vobj::scalar_type scalar_type; - SimdGrid *grid=rhs._grid; + GridBase *grid=rhs._grid; Lattice temp(rhs._grid); int fd = rhs._grid->_fdimensions[dimension]; @@ -130,8 +130,8 @@ friend void Cshift_comms(Lattice &ret,Lattice &rhs,int dimension,int friend void Cshift_comms_simd(Lattice &ret,Lattice &rhs,int dimension,int shift,int cbmask) { - const int Nsimd = vector_type::Nsimd(); - SimdGrid *grid=rhs._grid; + GridBase *grid=rhs._grid; + const int Nsimd = grid->Nsimd(); typedef typename vobj::vector_type vector_type; typedef typename vobj::scalar_type scalar_type; @@ -173,6 +173,7 @@ friend void Cshift_comms_simd(Lattice &ret,Lattice &rhs,int dimensi std::vector comm_offnode(simd_layout); std::vector comm_proc (simd_layout); //relative processor coord in dim=dimension + std::vector icoor(grid->Nd()); for(int x=0;x &ret,Lattice &rhs,int dimensi for(int i=0;iiCoordFromIsite(i,dimension); + + int s; + grid->iCoorFromIindex(icoor,i); + s = icoor[dimension]; if(comm_offnode[s]){ @@ -232,7 +236,7 @@ friend void Cshift_comms_simd(Lattice &ret,Lattice &rhs,int dimensi if ( x< rd-num ) permute_slice=wrap; else permute_slice = 1-wrap; - for(int i=0;i simd_layout(4); std::vector mpi_layout(4); - mpi_layout[0]=4; - mpi_layout[1]=2; - mpi_layout[2]=4; + mpi_layout[0]=2; + mpi_layout[1]=1; + mpi_layout[2]=1; mpi_layout[3]=2; #ifdef AVX512 @@ -34,7 +34,7 @@ int main (int argc, char ** argv) omp_set_num_threads(omp); #endif - for(int lat=16;lat<=16;lat+=40){ + for(int lat=8;lat<=16;lat+=40){ latt_size[0] = lat; latt_size[1] = lat; latt_size[2] = lat; @@ -166,6 +166,7 @@ int main (int argc, char ** argv) // Lattice SU(3) x SU(3) + Fine.Barrier(); FooBar = Foo * Bar; // Lattice 12x12 GEMM @@ -179,37 +180,47 @@ int main (int argc, char ** argv) flops = ncall*1.0*volume*(8*Nc*Nc*Nc); bytes = ncall*1.0*volume*Nc*Nc *2*3*sizeof(Grid::Real); - printf("%f flop and %f bytes\n",flops,bytes/ncall); + if ( Fine.IsBoss() ) { + printf("%f flop and %f bytes\n",flops,bytes/ncall); + } FooBar = Foo * Bar; + Fine.Barrier(); t0=usecond(); for(int i=0;iblack - std::cout << "Shifting odd parities to even result"<red ShiftedCheck=zero; @@ -332,8 +343,10 @@ int main (int argc, char ** argv) nrm = nrm + real(conj(diff)*diff); }} }}}} + if( Fine.IsBoss() ){ + std::cout << "LatticeColorMatrix * LatticeColorMatrix nrm diff = "<(y,b,perm); + } + friend inline void merge(vIntegerF &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(vIntegerF &y,std::vector &extracted) + { + Gextract(y,extracted); + } + }; + + + class vIntegerD : public vInteger + { + public: + static inline int Nsimd(void) { return sizeof(ivec)/sizeof(double);} + + friend inline void permute(vIntegerD &y,vIntegerD b,int perm) + { + Gpermute(y,b,perm); + } + friend inline void merge(vIntegerD &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(vIntegerD &y,std::vector &extracted) + { + Gextract(y,extracted); + } + }; + + + class vIntegerC : public vInteger + { + public: + static inline int Nsimd(void) { return sizeof(ivec)/sizeof(ComplexF);} + + friend inline void permute(vIntegerC &y,vIntegerC b,int perm) + { + Gpermute(y,b,perm); + } + friend inline void merge(vIntegerC &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(vIntegerC &y,std::vector &extracted) + { + Gextract(y,extracted); + } + }; + + class vIntegerZ : public vInteger + { + public: + static inline int Nsimd(void) { return sizeof(ivec)/sizeof(ComplexD);} + + friend inline void permute(vIntegerZ &y,vIntegerZ b,int perm) + { + Gpermute(y,b,perm); + } + friend inline void merge(vIntegerZ &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(vIntegerZ &y,std::vector &extracted) + { + Gextract(y,extracted); + } + }; + +} + +#endif diff --git a/TODO b/TODO index 8108fbc6..9febd6c3 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,9 @@ -* Make peekSite, pokeSite work in an MPI context. +* FIXME audit * Conditional execution Subset, where etc... * Coordinate information, integers etc... * Integer type padding/union to vector. +* LatticeCoordinate[mu] * Optimise the extract/merge SIMD routines From 9e597ac50a77caf5c5e8c06cd4ffbf39f9001768 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 6 Apr 2015 09:27:17 +0100 Subject: [PATCH 038/429] Removing older file --- Grid_cshift_fake.h | 248 --------------------------------------------- 1 file changed, 248 deletions(-) delete mode 100644 Grid_cshift_fake.h diff --git a/Grid_cshift_fake.h b/Grid_cshift_fake.h deleted file mode 100644 index 8b6c293b..00000000 --- a/Grid_cshift_fake.h +++ /dev/null @@ -1,248 +0,0 @@ -#ifndef _GRID_FAKE_H_ -#define _GRID_FAKE_H_ - - - -friend Lattice Cshift(Lattice &rhs,int dimension,int shift) -{ - typedef typename vobj::vector_type vector_type; - typedef typename vobj::scalar_type scalar_type; - - Lattice ret(rhs._grid); - - GridBase *grid=rhs._grid; - const int Nsimd = grid->Nsimd(); - - int fd = rhs._grid->_fdimensions[dimension]; - int rd = rhs._grid->_rdimensions[dimension]; - //int ld = rhs._grid->_ldimensions[dimension]; - //int gd = rhs._grid->_gdimensions[dimension]; - - - // Map to always positive shift modulo global full dimension. - shift = (shift+fd)%fd; - - ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); - - // the permute type - - int permute_dim =rhs._grid->_simd_layout[dimension]>1 ; - int permute_type=0; - for(int d=0;d_simd_layout[d]>1 ) permute_type++; - } - - /////////////////////////////////////////////// - // Move via a fake comms buffer - // Simd direction uses an extract/merge pair - /////////////////////////////////////////////// - int buffer_size = rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; - int words = sizeof(vobj)/sizeof(vector_type); - - std::vector > comm_buf(buffer_size); - std::vector > comm_buf_extract(Nsimd,std::vector(buffer_size*words) ); - std::vector pointers(Nsimd); - - for(int x=0;x_ostride[dimension]; // base offset for result - - if ( permute_dim ) { - - int o = 0; // relative offset to base - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); - - int sx = (x+sshift)%rd; - - // base offset for source - int so = sx*rhs._grid->_ostride[dimension]; - - int permute_slice=0; - int wrap = sshift/rd; - int num = sshift%rd; - - if ( x< rd-num ) permute_slice=wrap; - else permute_slice = 1-wrap; - - if ( permute_slice ) { - extract(rhs._odata[so+o+b],pointers); - } else { - ret._odata[ro+o+b]=rhs._odata[so+o+b]; - } - - } - o +=rhs._grid->_slice_stride[dimension]; - } - - for(int i=0;i_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); - int sx = (x+sshift)%rd; - - // base offset for source - int so = sx*rhs._grid->_ostride[dimension]; - - int permute_slice=0; - int wrap = sshift/rd; - int num = sshift%rd; - - if ( x< rd-num ) permute_slice=wrap; - else permute_slice = 1-wrap; - - if ( permute_slice ) { - merge(ret._odata[ro+o+b],pointers); - } - } - o +=rhs._grid->_slice_stride[dimension]; - } - - } else { - - int co; // comm offset - int o; - - co=0; o=0; - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - // This call in inner loop is annoying but necessary for dimension=0 - // in the case of RedBlack grids. Could optimise away with - // alternate code paths for all other cases. - int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,o+b); - int sx = (x+sshift)%rd; - int so = sx*rhs._grid->_ostride[dimension]; - - comm_buf[co++]=rhs._odata[so+o+b]; - - } - o +=rhs._grid->_slice_stride[dimension]; - } - - // Step through a copy into a comms buffer and pull back in. - // Genuine fake implementation could calculate if loops back - co=0; o=0; - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - ret._odata[ro+o+b]=comm_buf[co++]; - } - o +=rhs._grid->_slice_stride[dimension]; - } - } - } - return ret; -} - -/* - friend Lattice Cshift(Lattice &rhs,int dimension,int shift) - { - Lattice ret(rhs._grid); - - int rd = rhs._grid->_rdimensions[dimension]; - int ld = rhs._grid->_ldimensions[dimension]; - int gd = rhs._grid->_gdimensions[dimension]; - - // Map to always positive shift. - shift = (shift+gd)%gd; - - ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); - shift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift); - - // Work out whether to permute and the permute type - // ABCDEFGH -> AE BF CG DH permute - // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH - // Shift 1 BF CG DH AE 0 0 0 1 BCDEFGHA - // Shift 2 CG DH AE BF 0 0 1 1 CDEFGHAB - // Shift 3 DH AE BF CG 0 1 1 1 DEFGHABC - // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD - // Shift 5 BF CG DH AE 1 1 1 0 FGHACBDE - // Shift 6 CG DH AE BF 1 1 0 0 GHABCDEF - // Shift 7 DH AE BF CG 1 0 0 0 HABCDEFG - - int permute_dim =rhs._grid->_simd_layout[dimension]>1 ; - int permute_type=0; - for(int d=0;d_simd_layout[d]>1 ) permute_type++; - - - // loop over all work - int work =rd*rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; - - // Packed gather sequence is clean - int buffer_size = rhs._grid->_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; - - typedef typename vobj::scalar_type scalar_t; - typedef typename vobj::vector_type vector_t; - const int ns=sizeof(vobj)/sizeof(scalar_t); - const int nv=sizeof(vobj)/sizeof(vector_t); - std::vector > comm_buf(buffer_size); - - for(int x=0;x_ostride[dimension]; - int so =sx*rhs._grid->_ostride[dimension]; - - - int permute_slice=0; - if ( permute_dim ) { - permute_slice = shift/rd; - if ( x_slice_nblock[dimension];n++){ - - vector_t *optr = (vector_t *)&ret._odata[o]; - vector_t *iptr = (vector_t *)&rhs._odata[so]; - int skew = buffer_size*ns/2; - - for(int b=0;b_slice_block[dimension];b++){ - for(int n=0;n_slice_stride[dimension]; - // bo+=rhs._grid->_slice_stride[dimension]*ns/2; - - } - - } else { - int bo=0; - for(int n=0;n_slice_nblock[dimension];n++){ - for(int i=0;i_slice_block[dimension];i++){ - comm_buf[bo++] =rhs._odata[so+i]; - } - so+=rhs._grid->_slice_stride[dimension]; - } - bo=0; - for(int n=0;n_slice_nblock[dimension];n++){ - for(int i=0;i_slice_block[dimension];i++){ - ret._odata[o+i]=comm_buf[bo++]; - } - o+=rhs._grid->_slice_stride[dimension]; - } - } - } - return ret; - }; -*/ - -#endif From 982274e5a0e9f4433dd05be420e31fb98fbc4357 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 6 Apr 2015 11:26:24 +0100 Subject: [PATCH 039/429] Major rework of extract/merge/permute processing debugged and working. --- Grid.h | 3 +- Grid_Cartesian.h | 58 +++--------- Grid_Lattice.h | 20 +---- Grid_QCD.h | 12 +-- Grid_aligned_allocator.h | 3 + Grid_fake.cc => Grid_communicator_fake.cc | 0 Grid_mpi.cc => Grid_communicator_mpi.cc | 0 Grid_config.h | 3 - Grid_config.h.in | 3 - Grid_cshift_common.h | 76 +++------------- Grid_cshift_mpi.h | 14 ++- Grid_main.cc | 4 +- Grid_simd.h | 74 ++++++---------- Grid_stencil.h | 12 +++ Grid_vComplexD.h | 81 +++++------------ Grid_vComplexF.h | 92 +++++-------------- Grid_vInteger.h | 63 +------------ Grid_vRealD.h | 87 +++++------------- Grid_vRealF.h | 90 +++++-------------- Makefile.am | 8 +- Makefile.in | 29 +++--- TODO | 103 ++++++++++++++++++++++ configure | 23 +---- configure.ac | 7 +- 24 files changed, 291 insertions(+), 574 deletions(-) rename Grid_fake.cc => Grid_communicator_fake.cc (100%) rename Grid_mpi.cc => Grid_communicator_mpi.cc (100%) create mode 100644 Grid_stencil.h diff --git a/Grid.h b/Grid.h index 184e7e36..0a4024bf 100644 --- a/Grid.h +++ b/Grid.h @@ -42,11 +42,10 @@ #endif +#include #include #include #include -#include -#include #include #include diff --git a/Grid_Cartesian.h b/Grid_Cartesian.h index 004c2fa5..c891edcc 100644 --- a/Grid_Cartesian.h +++ b/Grid_Cartesian.h @@ -8,48 +8,6 @@ namespace Grid{ ///////////////////////////////////////////////////////////////////////////////////////// // Grid Support. ///////////////////////////////////////////////////////////////////////////////////////// -// -// Cartesian grid inheritance -// Grid::GridBase -// | -// __________|___________ -// | | -// Grid::GridCartesian Grid::GridCartesianRedBlack -// -// TODO: document the following as an API guaranteed public interface - - /* - * Rough map of functionality against QDP++ Layout - * - * Param | Grid | QDP++ - * ----------------------------------------- - * | | - * void | oSites, iSites, lSites | sitesOnNode - * void | gSites | vol - * | | - * gcoor | oIndex, iIndex | linearSiteIndex // no virtual node in QDP - * lcoor | | - * - * void | CheckerBoarded | - // No checkerboarded in QDP - * void | FullDimensions | lattSize - * void | GlobalDimensions | lattSize // No checkerboarded in QDP - * void | LocalDimensions | subgridLattSize - * void | VirtualLocalDimensions | subgridLattSize // no virtual node in QDP - * | | - * int x 3 | oiSiteRankToGlobal | siteCoords - * | ProcessorCoorLocalCoorToGlobalCoor | - * | | - * vector | GlobalCoorToRankIndex | nodeNumber(coord) - * vector | GlobalCoorToProcessorCoorLocalCoor| nodeCoord(coord) - * | | - * void | Processors | logicalSize // returns cart array shape - * void | ThisRank | nodeNumber(); // returns this node rank - * void | ThisProcessorCoor | // returns this node coor - * void | isBoss(void) | primaryNode(); - * | | - * | RankFromProcessorCoor | getLogicalCoorFrom(node) - * | ProcessorCoorFromRank | getNodeNumberFrom(logical_coord) - */ class GridBase : public CartesianCommunicator { public: @@ -60,7 +18,8 @@ public: GridBase(std::vector & processor_grid) : CartesianCommunicator(processor_grid) {}; - //protected: + //FIXME + // protected: // Lattice wide random support. not yet fully implemented. Need seed strategy // and one generator per site. // std::default_random_engine generator; @@ -165,7 +124,16 @@ public: lane = lane / _simd_layout[d]; } } - + inline int PermuteDim(int dimension){ + return _simd_layout[dimension]>1; + } + inline int PermuteType(int dimension){ + int permute_type=0; + for(int d=_ndimension-1;d>dimension;d--){ + if (_simd_layout[d]>1 ) permute_type++; + } + return permute_type; + } //////////////////////////////////////////////////////////////// // Array sizing queries //////////////////////////////////////////////////////////////// @@ -399,8 +367,6 @@ public: //////////////////////////////////////////////////////////////////////////////////////////// // subplane information - // It may be worth the investment of generating a more general subplane "iterator", - // and providing support for threads grabbing a unit of allocation. //////////////////////////////////////////////////////////////////////////////////////////// _slice_block.resize(_ndimension); _slice_stride.resize(_ndimension); diff --git a/Grid_Lattice.h b/Grid_Lattice.h index 2aa46b97..ebf68560 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -4,17 +4,9 @@ #include "Grid.h" - namespace Grid { -// Permute the pointers 32bitx16 = 512 -static int permute_map[4][16] = { - { 1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14}, - { 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13}, - { 4,5,6,7,0,1,2,3,12,13,14,15,8,9,10,11}, - { 9,10,11,12,13,14,15,0,1,2,3,4,5,6,7,8} -}; - + extern int GridCshiftPermuteMap[4][16]; template class Lattice @@ -37,11 +29,10 @@ public: #include - // overloading Grid::conformable but no conformable in Grid ...?:w template friend void conformable(const Lattice &lhs,const Lattice &rhs); - // Performance difference between operator * and mult is troubling. + // FIXME Performance difference between operator * and mult is troubling. // Auto move constructor seems to lose surprisingly much. // Site wise binary operations @@ -182,23 +173,20 @@ public: }} }; + // FIXME Implement a consistent seed management strategy friend void gaussian(Lattice &l){ // Zero mean, unit variance. std::normal_distribution distribution(0.0,1.0); Real *v_ptr = (Real *)&l._odata[0]; size_t v_len = l._grid->oSites()*sizeof(vobj); size_t d_len = v_len/sizeof(Real); - - // Not a parallel RNG. Could make up some seed per 4d site, seed - // per hypercube type scheme. + for(int i=0;i operator -(const Lattice &r) { Lattice ret(r._grid); #pragma omp parallel for diff --git a/Grid_QCD.h b/Grid_QCD.h index a0f7801a..3e852633 100644 --- a/Grid_QCD.h +++ b/Grid_QCD.h @@ -24,10 +24,7 @@ namespace QCD { typedef iSinglet TReal; // This is painful. Tensor singlet complex type. - typedef iSinglet vTIntegerF; - typedef iSinglet vTIntegerD; - typedef iSinglet vTIntegerC; - typedef iSinglet vTIntegerZ; + typedef iSinglet vTInteger; typedef iSpinMatrix SpinMatrix; typedef iColourMatrix ColourMatrix; @@ -46,12 +43,9 @@ namespace QCD { typedef iColourVector vColourVector; typedef iSpinColourVector vSpinColourVector; - typedef Lattice LatticeComplex; + typedef Lattice LatticeComplex; - typedef Lattice LatticeIntegerF; // Predicates for "where" - typedef Lattice LatticeIntegerD; - typedef Lattice LatticeIntegerC; - typedef Lattice LatticeIntegerZ; + typedef Lattice LatticeInteger; // Predicates for "where" typedef Lattice LatticeColourMatrix; typedef Lattice LatticeSpinMatrix; diff --git a/Grid_aligned_allocator.h b/Grid_aligned_allocator.h index dbaa0ba3..9008105a 100644 --- a/Grid_aligned_allocator.h +++ b/Grid_aligned_allocator.h @@ -1,5 +1,8 @@ #ifndef GRID_ALIGNED_ALLOCATOR_H #define GRID_ALIGNED_ALLOCATOR_H + +#include + namespace Grid { //////////////////////////////////////////////////////////////////// diff --git a/Grid_fake.cc b/Grid_communicator_fake.cc similarity index 100% rename from Grid_fake.cc rename to Grid_communicator_fake.cc diff --git a/Grid_mpi.cc b/Grid_communicator_mpi.cc similarity index 100% rename from Grid_mpi.cc rename to Grid_communicator_mpi.cc diff --git a/Grid_config.h b/Grid_config.h index 8a0fdc26..bb885708 100644 --- a/Grid_config.h +++ b/Grid_config.h @@ -10,9 +10,6 @@ /* AVX512 */ /* #undef AVX512 */ -/* GRID_COMMS_FAKE */ -/* #undef GRID_COMMS_FAKE */ - /* GRID_COMMS_MPI */ #define GRID_COMMS_MPI 1 diff --git a/Grid_config.h.in b/Grid_config.h.in index ff15a834..91948fa2 100644 --- a/Grid_config.h.in +++ b/Grid_config.h.in @@ -9,9 +9,6 @@ /* AVX512 */ #undef AVX512 -/* GRID_COMMS_FAKE */ -#undef GRID_COMMS_FAKE - /* GRID_COMMS_MPI */ #undef GRID_COMMS_MPI diff --git a/Grid_cshift_common.h b/Grid_cshift_common.h index 72518d7d..08e75cff 100644 --- a/Grid_cshift_common.h +++ b/Grid_cshift_common.h @@ -1,17 +1,5 @@ #ifndef _GRID_CSHIFT_COMMON_H_ #define _GRID_CSHIFT_COMMON_H_ -////////////////////////////////////////////////////////////////////////////////////////// -// Must not lose sight that goal is to be able to construct really efficient -// gather to a point stencil code. CSHIFT is not the best way, so probably need -// additional stencil support. -// -// Stencil based code could pre-exchange haloes and use a table lookup for neighbours -// -// Lattice could also allocate haloes which get used for stencil code. -// -// Grid could create a neighbour index table for a given stencil. -// Could also implement CovariantCshift. -////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////// // Gather for when there is no need to SIMD split @@ -57,7 +45,6 @@ friend void Gather_plane_simple (Lattice &rhs,std::vector &rhs,std::vector p } } - - ////////////////////////////////////////////////////// // Scatter for when there is no need to SIMD split ////////////////////////////////////////////////////// @@ -146,7 +131,6 @@ friend void Scatter_plane_simple (Lattice &rhs,std::vector &rhs,std::vector po } } - ////////////////////////////////////////////////////// // local to node block strided copies ////////////////////////////////////////////////////// -// if lhs is odd, rhs even?? friend void Copy_plane(Lattice& lhs,Lattice &rhs, int dimension,int lplane,int rplane,int cbmask) { int rd = rhs._grid->_rdimensions[dimension]; @@ -284,40 +266,6 @@ friend void Copy_plane_permute(Lattice& lhs,Lattice &rhs, int dimens // Local to node Cshift ////////////////////////////////////////////////////// - // Work out whether to permute - // ABCDEFGH -> AE BF CG DH permute wrap num - // - // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH 0 0 - // Shift 1 BF CG DH AE 0 0 0 1 BCDEFGHA 0 1 - // Shift 2 CG DH AE BF 0 0 1 1 CDEFGHAB 0 2 - // Shift 3 DH AE BF CG 0 1 1 1 DEFGHABC 0 3 - // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD 1 0 - // Shift 5 BF CG DH AE 1 1 1 0 FGHACBDE 1 1 - // Shift 6 CG DH AE BF 1 1 0 0 GHABCDEF 1 2 - // Shift 7 DH AE BF CG 1 0 0 0 HABCDEFG 1 3 - - // Suppose 4way simd in one dim. - // ABCDEFGH -> AECG BFDH permute wrap num - - // Shift 0 AECG BFDH 0,00 0,00 ABCDEFGH 0 0 - // Shift 1 BFDH CGEA 0,00 1,01 BCDEFGHA 0 1 - // Shift 2 CGEA DHFB 1,01 1,01 CDEFGHAB 1 0 - // Shift 3 DHFB EAGC 1,01 1,11 DEFGHABC 1 1 - // Shift 4 EAGC FBHD 1,11 1,11 EFGHABCD 2 0 - // Shift 5 FBHD GCAE 1,11 1,10 FGHABCDE 2 1 - // Shift 6 GCAE HDBF 1,10 1,10 GHABCDEF 3 0 - // Shift 7 HDBF AECG 1,10 0,00 HABCDEFG 3 1 - - // Generalisation to 8 way simd, 16 way simd required. - // - // Need log2 Nway masks. consisting of - // 1 bit 256 bit granule - // 2 bit 128 bit granule - // 4 bits 64 bit granule - // 8 bits 32 bit granules - // - // 15 bits.... - friend void Cshift_local(Lattice& ret,Lattice &rhs,int dimension,int shift) { int sshift[2]; @@ -333,35 +281,31 @@ friend void Cshift_local(Lattice& ret,Lattice &rhs,int dimension,int } } - friend Lattice Cshift_local(Lattice &ret,Lattice &rhs,int dimension,int shift,int cbmask) { - int fd = rhs._grid->_fdimensions[dimension]; - int rd = rhs._grid->_rdimensions[dimension]; - int ld = rhs._grid->_ldimensions[dimension]; - int gd = rhs._grid->_gdimensions[dimension]; - + GridBase *grid = rhs._grid; + int fd = grid->_fdimensions[dimension]; + int rd = grid->_rdimensions[dimension]; + int ld = grid->_ldimensions[dimension]; + int gd = grid->_gdimensions[dimension]; // Map to always positive shift modulo global full dimension. shift = (shift+fd)%fd; - ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); + ret.checkerboard = grid->CheckerBoardDestination(rhs.checkerboard,shift); // the permute type - int permute_dim =rhs._grid->_simd_layout[dimension]>1 ; - int permute_type=0; - for(int d=0;d_simd_layout[d]>1 ) permute_type++; - } + int permute_dim =grid->PermuteDim(dimension); + int permute_type=grid->PermuteType(dimension); for(int x=0;x_ostride[dimension]; + int bo = x * grid->_ostride[dimension]; int cb= (cbmask==0x2)? 1 : 0; - int sshift = rhs._grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,cb); + int sshift = grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,cb); int sx = (x+sshift)%rd; int permute_slice=0; diff --git a/Grid_cshift_mpi.h b/Grid_cshift_mpi.h index 75a4dc96..4ca8f6b5 100644 --- a/Grid_cshift_mpi.h +++ b/Grid_cshift_mpi.h @@ -146,10 +146,7 @@ friend void Cshift_comms_simd(Lattice &ret,Lattice &rhs,int dimensi assert(shift>=0); assert(shift_simd_layout[d]>1 ) permute_type++; - } + int permute_type=grid->PermuteType(dimension); /////////////////////////////////////////////// // Simd direction uses an extract/merge pair @@ -236,9 +233,12 @@ friend void Cshift_comms_simd(Lattice &ret,Lattice &rhs,int dimensi if ( x< rd-num ) permute_slice=wrap; else permute_slice = 1-wrap; + int toggle_bit = (Nsimd>>(permute_type+1)); + int PermuteMap; for(int i=0;i &ret,Lattice &rhs,int dimensi } } } - - - - #endif diff --git a/Grid_main.cc b/Grid_main.cc index cb45fd85..62356436 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -20,8 +20,8 @@ int main (int argc, char ** argv) std::vector mpi_layout(4); mpi_layout[0]=2; - mpi_layout[1]=1; - mpi_layout[2]=1; + mpi_layout[1]=2; + mpi_layout[2]=2; mpi_layout[3]=2; #ifdef AVX512 diff --git a/Grid_simd.h b/Grid_simd.h index ffcbff15..53cc8909 100644 --- a/Grid_simd.h +++ b/Grid_simd.h @@ -10,32 +10,6 @@ // // Vector types are arch dependent //////////////////////////////////////////////////////////////////////// - // TODO - // - // Base class to share common code between vRealF, VComplexF etc... - // - // lattice Broad cast assignment - // - // where() support - // implement with masks, and/or? Type of the mask & boolean support? - // - // Unary functions - // cos,sin, tan, acos, asin, cosh, acosh, tanh, sinh, // Scalar only arg - // exp, log, sqrt, fabs - // - // transposeColor, transposeSpin, - // adjColor, adjSpin, - // traceColor, traceSpin. - // peekColor, peekSpin + pokeColor PokeSpin - // - // copyMask. - // - // localMaxAbs - // - // norm2, - // sumMulti equivalent. - // Fourier transform equivalent. - // //////////////////////////////////////////////////////////// // SIMD Alignment controls @@ -71,9 +45,6 @@ namespace Grid { typedef std::complex ComplexD; typedef std::complex Complex; - - - inline RealF adj(const RealF & r){ return r; } inline RealF conj(const RealF & r){ return r; } inline ComplexD localInnerProduct(const ComplexD & l, const ComplexD & r) { return conj(l)*r; } @@ -122,7 +93,6 @@ namespace Grid { template<> inline void ZeroIt(RealD &arg){ arg=0; }; - #if defined (SSE2) typedef __m128 fvec; typedef __m128d dvec; @@ -162,31 +132,46 @@ namespace Grid { inline void v_prefetch0(int size, const char *ptr){}; #endif -}; - ///////////////////////////////////////////////////////////////// // Generic extract/merge/permute ///////////////////////////////////////////////////////////////// -template +template inline void Gextract(vsimd &y,std::vector &extracted){ - // Bounce off stack is painful - // temporary hack while I figure out the right interface - scalar buf[Nsimd]; - vstore(y,buf); - for(int i=0;i > buf(Nsimd); + vstore(y,&buf[0]); + for(int i=0;i +template inline void Gmerge(vsimd &y,std::vector &extracted){ - scalar buf[Nsimd]; +#if 1 + int Nsimd = extracted.size(); + std::vector buf(Nsimd); for(int i=0;i &extracted){ // Permute 3 possible on longer iVector lengths (512bit = 8 double = 16 single) // Permute 4 possible on half precision @512bit vectors. ////////////////////////////////////////////////////////// -// Should be able to make the permute/extract/merge independent of the -// vector subtype and reduce the volume of code. template inline void Gpermute(vsimd &y,vsimd b,int perm){ switch (perm){ @@ -229,6 +212,7 @@ inline void Gpermute(vsimd &y,vsimd b,int perm){ default: assert(0); break; } }; +}; #include #include diff --git a/Grid_stencil.h b/Grid_stencil.h new file mode 100644 index 00000000..d93204fc --- /dev/null +++ b/Grid_stencil.h @@ -0,0 +1,12 @@ +////////////////////////////////////////////////////////////////////////////////////////// +// Must not lose sight that goal is to be able to construct really efficient +// gather to a point stencil code. CSHIFT is not the best way, so probably need +// additional stencil support. +// +// Stencil based code could pre-exchange haloes and use a table lookup for neighbours +// +// Lattice could also allocate haloes which get used for stencil code. +// +// Grid could create a neighbour index table for a given stencil. +// Could also implement CovariantCshift. +////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Grid_vComplexD.h b/Grid_vComplexD.h index d1caefb1..330de26e 100644 --- a/Grid_vComplexD.h +++ b/Grid_vComplexD.h @@ -5,7 +5,7 @@ namespace Grid { class vComplexD { - protected: + public: zvec v; public: typedef zvec vector_type; @@ -154,64 +154,27 @@ namespace Grid { return ret; }; - ///////////////////////////////////////////////////////////////// - // Extract - ///////////////////////////////////////////////////////////////// - friend inline void extract(vComplexD &y,std::vector &extracted){ - // Bounce off stack is painful - // temporary hack while I figure out the right interface - const int Nsimd = vComplexD::Nsimd(); - std::vector buf(Nsimd); + //////////////////////////////////////////////////////////////////// + // General permute; assumes vector length is same across + // all subtypes; may not be a good assumption, but could + // add the vector width as a template param for BG/Q for example + //////////////////////////////////////////////////////////////////// + friend inline void permute(vComplexD &y,vComplexD b,int perm) + { + Gpermute(y,b,perm); + } + friend inline void merge(vComplexD &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(vComplexD &y,std::vector &extracted) + { + Gextract(y,extracted); + } - vstore(y,&buf[0]); - - for(int i=0;i &extracted){ - // Bounce off stack is painful - // temporary hack while I figure out the right interface - const int Nsimd = vComplexD::Nsimd(); - std::vector buf(Nsimd); - - for(int i=0;i1 permute -#if defined(AVX1)||defined(AVX2) - case 0: y.v = _mm256_permute2f128_pd(b.v,b.v,0x01); break; - // AB => BA i.e. ab cd =>cd ab -#endif -#ifdef SSE2 - break; -#endif -#ifdef AVX512 - // 4 complex=>2 permute - // ABCD => BADC i.e. abcd efgh => cdab ghef - // ABCD => CDAB i.e. abcd efgh => efgh abcd - case 0: y.v = _mm512_swizzle_pd(b.v,_MM_SWIZ_REG_BADC); break; - case 1: y.v = _mm512_permute4f128_ps(b.v,(_MM_PERM_ENUM)_MM_SHUFFLE(1,0,3,2)); // permute for double is not implemented - -#endif -#ifdef QPX -#error // Not implemented yet -#endif - default: assert(0); break; - } - }; + //////////////////////////////////////////////////////////////////////// + // FIXME: gonna remove these load/store, get, set, prefetch + //////////////////////////////////////////////////////////////////////// void vload(zvec& a){ this->v = a; } @@ -296,7 +259,7 @@ friend inline void vstore(vComplexD &ret, ComplexD *a){ #endif return ret; } -// REDUCE +// REDUCE FIXME must be a cleaner implementation friend inline ComplexD Reduce(const vComplexD & in) { #if defined (AVX1) || defined(AVX2) diff --git a/Grid_vComplexF.h b/Grid_vComplexF.h index 578228a3..b7fb3d6a 100644 --- a/Grid_vComplexF.h +++ b/Grid_vComplexF.h @@ -4,7 +4,9 @@ namespace Grid { class vComplexF { - protected: + // protected: + + public: cvec v; public: @@ -129,75 +131,11 @@ namespace Grid { #endif return ret; }; + - ///////////////////////////////////////////////////////////////// - // Extract - ///////////////////////////////////////////////////////////////// - friend inline void extract(vComplexF &y,std::vector &extracted){ - // Bounce off heap is painful - // temporary hack while I figure out the right interface - vComplexF vbuf; - ComplexF *buf = (ComplexF *)&vbuf; - - vstore(y,&buf[0]); - for(int i=0;i &extracted){ - // Bounce off stack is painful - // temporary hack while I figure out the right interface - const int Nsimd = vComplexF::Nsimd(); - vComplexF vbuf; - ComplexF *buf = (ComplexF *)&vbuf; - - for(int i=0;i2 permutes - // case 0 ABCD->BADC - // case 1 ABCD->CDAB - case 0: y.v = _mm256_shuffle_ps(b.v,b.v,_MM_SHUFFLE(1,0,3,2)); break; - case 1: y.v = _mm256_permute2f128_ps(b.v,b.v,0x01); break; -#endif -#ifdef SSE2 - case 0: y.v = _mm_shuffle_ps(b.v,b.v,_MM_SHUFFLE(1,0,3,2));break; -#endif -#ifdef AVX512 -//#error should permute for 512 - // 8 complex=>3 permutes - // case 0 ABCD EFGH -> BADC FEHG - // case 1 ABCD EFGH -> CDAB GHEF - // case 2 ABCD EFGH -> EFGH ABCD - case 0: y.v = _mm512_swizzle_ps(b.v,_MM_SWIZ_REG_CDAB); break; // OK - case 1: y.v = _mm512_swizzle_ps(b.v,_MM_SWIZ_REG_BADC); break; // OK - case 2: y.v = _mm512_permute4f128_ps(b.v, (_MM_PERM_ENUM)_MM_SHUFFLE(2,3,0,1)); break; // OK - -#endif -#ifdef QPX -#error -#endif - default: assert(0); break; - } - }; - - + //////////////////////////////////////////////////////////////////////// + // FIXME: gonna remove these load/store, get, set, prefetch + //////////////////////////////////////////////////////////////////////// friend inline void vset(vComplexF &ret, Complex *a){ #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_ps(a[3].imag(),a[3].real(),a[2].imag(),a[2].real(),a[1].imag(),a[1].real(),a[0].imag(),a[0].real()); @@ -358,6 +296,20 @@ friend inline void vstore(vComplexF &ret, ComplexF *a){ return *this; } + friend inline void permute(vComplexF &y,vComplexF b,int perm) + { + Gpermute(y,b,perm); + } + friend inline void merge(vComplexF &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(vComplexF &y,std::vector &extracted) + { + Gextract(y,extracted); + } + + }; inline vComplexF localInnerProduct(const vComplexF & l, const vComplexF & r) { return conj(l)*r; } @@ -371,7 +323,5 @@ friend inline void vstore(vComplexF &ret, ComplexF *a){ return l*r; } - - } #endif diff --git a/Grid_vInteger.h b/Grid_vInteger.h index 7a0c1c4f..6ddce191 100644 --- a/Grid_vInteger.h +++ b/Grid_vInteger.h @@ -235,70 +235,11 @@ friend inline void vstore(vInteger &ret, Integer *a){ } friend inline void merge(vIntegerF &y,std::vector &extracted) { - Gmerge(y,extracted); + Gmerge(y,extracted); } friend inline void extract(vIntegerF &y,std::vector &extracted) { - Gextract(y,extracted); - } - }; - - - class vIntegerD : public vInteger - { - public: - static inline int Nsimd(void) { return sizeof(ivec)/sizeof(double);} - - friend inline void permute(vIntegerD &y,vIntegerD b,int perm) - { - Gpermute(y,b,perm); - } - friend inline void merge(vIntegerD &y,std::vector &extracted) - { - Gmerge(y,extracted); - } - friend inline void extract(vIntegerD &y,std::vector &extracted) - { - Gextract(y,extracted); - } - }; - - - class vIntegerC : public vInteger - { - public: - static inline int Nsimd(void) { return sizeof(ivec)/sizeof(ComplexF);} - - friend inline void permute(vIntegerC &y,vIntegerC b,int perm) - { - Gpermute(y,b,perm); - } - friend inline void merge(vIntegerC &y,std::vector &extracted) - { - Gmerge(y,extracted); - } - friend inline void extract(vIntegerC &y,std::vector &extracted) - { - Gextract(y,extracted); - } - }; - - class vIntegerZ : public vInteger - { - public: - static inline int Nsimd(void) { return sizeof(ivec)/sizeof(ComplexD);} - - friend inline void permute(vIntegerZ &y,vIntegerZ b,int perm) - { - Gpermute(y,b,perm); - } - friend inline void merge(vIntegerZ &y,std::vector &extracted) - { - Gmerge(y,extracted); - } - friend inline void extract(vIntegerZ &y,std::vector &extracted) - { - Gextract(y,extracted); + Gextract(y,extracted); } }; diff --git a/Grid_vRealD.h b/Grid_vRealD.h index 1abc0804..13ceedbe 100644 --- a/Grid_vRealD.h +++ b/Grid_vRealD.h @@ -5,7 +5,7 @@ namespace Grid { class vRealD { - protected: + public: dvec v; // dvec is double precision vector public: @@ -99,72 +99,27 @@ namespace Grid { return ret; }; - ///////////////////////////////////////////////////////////////// - // Extract - ///////////////////////////////////////////////////////////////// - friend inline void extract(vRealD &y,std::vector &extracted){ - // Bounce off stack is painful - // temporary hack while I figure out the right interface - const int Nsimd = vRealD::Nsimd(); - RealD buf[Nsimd]; + //////////////////////////////////////////////////////////////////// + // General permute; assumes vector length is same across + // all subtypes; may not be a good assumption, but could + // add the vector width as a template param for BG/Q for example + //////////////////////////////////////////////////////////////////// + friend inline void permute(vRealD &y,vRealD b,int perm) + { + Gpermute(y,b,perm); + } + friend inline void merge(vRealD &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(vRealD &y,std::vector &extracted) + { + Gextract(y,extracted); + } - vstore(y,buf); - - for(int i=0;i &extracted){ - // Bounce off stack is painful - // temporary hack while I figure out the right interface - const int Nsimd = vRealD::Nsimd(); - RealD buf[Nsimd]; - - for(int i=0;i BA DC FE HG - // Permute 1 every ABCDEFGH -> CD AB GH EF - // Permute 2 every ABCDEFGH -> EFGH ABCD - // Permute 3 possible on longer iVector lengths (512bit = 8 double = 16 single) - // Permute 4 possible on half precision @512bit vectors. - friend inline void permute(vRealD &y,vRealD b,int perm){ - switch (perm){ - // 4 doubles=>2 permutes -#if defined(AVX1)||defined(AVX2) - case 0: y.v = _mm256_shuffle_pd(b.v,b.v,0x5); break; - case 1: y.v = _mm256_permute2f128_pd(b.v,b.v,0x01); break; -#endif -#ifdef SSE2 - case 0: y.v = _mm_shuffle_pd(b.v,b.v,0x1); break; -#endif -#ifdef AVX512 - // 8 double => 3 permutes - // Permute 0 every abcd efgh -> badc fehg - // Permute 1 every abcd efgh -> cdab ghef - // Permute 2 every abcd efgh -> efgh abcd - // NOTE: mm_512_permutex_pd not implemented - // NOTE: ignore warning - case 0: y.v = _mm512_swizzle_pd(b.v,_MM_SWIZ_REG_CDAB); break; - case 1: y.v = _mm512_swizzle_pd(b.v,_MM_SWIZ_REG_BADC); break; - case 2: y.v = _mm512_permute4f128_ps(b.v,(_MM_PERM_ENUM)_MM_SHUFFLE(1,0,3,2)); break; - -#endif -#ifdef QPX -#error -#endif - default: assert(0);break; - } - }; -// gona be bye bye + //////////////////////////////////////////////////////////////////////// + // FIXME: gonna remove these load/store, get, set, prefetch + //////////////////////////////////////////////////////////////////////// void vload(dvec& a){ this->v = a; } diff --git a/Grid_vRealF.h b/Grid_vRealF.h index 22809b83..185f4da8 100644 --- a/Grid_vRealF.h +++ b/Grid_vRealF.h @@ -5,7 +5,7 @@ namespace Grid { class vRealF { - protected: + public: fvec v; public: @@ -120,74 +120,25 @@ namespace Grid { friend inline void vzero(vRealF &ret){vsplat(ret,0.0);} - ///////////////////////////////////////////////////////////////// - // Extract - ///////////////////////////////////////////////////////////////// - friend inline void extract(vRealF &y,std::vector &extracted){ - // Bounce off stack is painful - // temporary hack while I figure out the right interface - const int Nsimd = vRealF::Nsimd(); - RealF buf[Nsimd]; + //////////////////////////////////////////////////////////////////// + // General permute; assumes vector length is same across + // all subtypes; may not be a good assumption, but could + // add the vector width as a template param for BG/Q for example + //////////////////////////////////////////////////////////////////// + friend inline void permute(vRealF &y,vRealF b,int perm) + { + Gpermute(y,b,perm); + } + friend inline void merge(vRealF &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(vRealF &y,std::vector &extracted) + { + Gextract(y,extracted); + } - vstore(y,buf); - for(int i=0;i &extracted){ - // Bounce off stack is painful - // temporary hack while I figure out the right interface - const int Nsimd = vRealF::Nsimd(); - RealF buf[Nsimd]; - - for(int i=0;i BA DC FE HG - // Permute 1 every ABCDEFGH -> CD AB GH EF - // Permute 2 every ABCDEFGH -> EFGH ABCD - // Permute 3 possible on longer iVector lengths (512bit = 8 double = 16 single) - // Permute 4 possible on half precision @512bit vectors. - ////////////////////////////////////////////////////////// - friend inline void permute(vRealF &y,vRealF b,int perm){ - switch (perm){ - // 8 floats=>3 permutes -#if defined(AVX1)||defined(AVX2) - case 0: y.v = _mm256_shuffle_ps(b.v,b.v,_MM_SHUFFLE(2,3,0,1)); break; - case 1: y.v = _mm256_shuffle_ps(b.v,b.v,_MM_SHUFFLE(1,0,3,2)); break; - case 2: y.v = _mm256_permute2f128_ps(b.v,b.v,0x01); break; -#endif -#ifdef SSE2 - case 0: y.v = _mm_shuffle_ps(b.v,b.v,_MM_SHUFFLE(2,3,0,1)); break; - case 1: y.v = _mm_shuffle_ps(b.v,b.v,_MM_SHUFFLE(1,0,3,2));break; -#endif -#ifdef AVX512 - // 16 floats=> permutes - // Permute 0 every abcd efgh ijkl mnop -> badc fehg jilk nmpo - // Permute 1 every abcd efgh ijkl mnop -> cdab ghef jkij opmn - // Permute 2 every abcd efgh ijkl mnop -> efgh abcd mnop ijkl - // Permute 3 every abcd efgh ijkl mnop -> ijkl mnop abcd efgh -//#error not implemented should do something - case 0: y.v = _mm512_swizzle_ps(b.v,_MM_SWIZ_REG_CDAB); break; - case 1: y.v = _mm512_swizzle_ps(b.v,_MM_SWIZ_REG_BADC); break; - case 2: y.v = _mm512_permute4f128_ps(b.v,(_MM_PERM_ENUM)_MM_SHUFFLE(2,3,0,1)); break; - case 3: y.v = _mm512_permute4f128_ps(b.v,(_MM_PERM_ENUM)_MM_SHUFFLE(1,0,3,2)); break; -#endif -#ifdef QPX -#error not implemented -#endif - default: assert(0); break; - } - }; ///////////////////////////////////////////////////// // Broadcast a value across Nsimd copies. @@ -207,6 +158,8 @@ namespace Grid { ret.v = {a,a,a,a}; #endif } + + friend inline void vset(vRealF &ret, float *a){ #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_ps(a[7],a[6],a[5],a[4],a[3],a[2],a[1],a[0]); @@ -224,6 +177,9 @@ namespace Grid { #endif } + //////////////////////////////////////////////////////////////////////// + // FIXME: gonna remove these load/store, get, set, prefetch + //////////////////////////////////////////////////////////////////////// friend inline void vstore(vRealF &ret, float *a){ #if defined (AVX1)|| defined (AVX2) _mm256_store_ps(a,ret.v); diff --git a/Makefile.am b/Makefile.am index d3a7b329..d11f28d5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -24,7 +24,6 @@ include_HEADERS = Grid_config.h\ Grid_aligned_allocator.h\ Grid_cshift.h\ Grid_cshift_common.h\ - Grid_cshift_fake.h\ Grid_cshift_mpi.h\ Grid_cshift_none.h\ Grid_math_types.h @@ -37,13 +36,10 @@ bin_PROGRAMS = Grid_main extra_sources= if BUILD_COMMS_MPI - extra_sources+=Grid_mpi.cc -endif -if BUILD_COMMS_FAKE - extra_sources+=Grid_fake.cc + extra_sources+=Grid_communicator_mpi.cc endif if BUILD_COMMS_NONE - extra_sources+=Grid_fake.cc + extra_sources+=Grid_communicator_fake.cc endif Grid_main_SOURCES = \ diff --git a/Makefile.in b/Makefile.in index 6983b96a..16981e52 100644 --- a/Makefile.in +++ b/Makefile.in @@ -89,9 +89,8 @@ NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = Grid_main$(EXEEXT) -@BUILD_COMMS_MPI_TRUE@am__append_1 = Grid_mpi.cc -@BUILD_COMMS_FAKE_TRUE@am__append_2 = Grid_fake.cc -@BUILD_COMMS_NONE_TRUE@am__append_3 = Grid_fake.cc +@BUILD_COMMS_MPI_TRUE@am__append_1 = Grid_communicator_mpi.cc +@BUILD_COMMS_NONE_TRUE@am__append_2 = Grid_communicator_fake.cc subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac @@ -146,12 +145,13 @@ libGrid_a_LIBADD = am_libGrid_a_OBJECTS = Grid_init.$(OBJEXT) libGrid_a_OBJECTS = $(am_libGrid_a_OBJECTS) PROGRAMS = $(bin_PROGRAMS) -am__Grid_main_SOURCES_DIST = Grid_main.cc Grid_mpi.cc Grid_fake.cc -@BUILD_COMMS_MPI_TRUE@am__objects_1 = Grid_mpi.$(OBJEXT) -@BUILD_COMMS_FAKE_TRUE@am__objects_2 = Grid_fake.$(OBJEXT) -@BUILD_COMMS_NONE_TRUE@am__objects_3 = Grid_fake.$(OBJEXT) -am__objects_4 = $(am__objects_1) $(am__objects_2) $(am__objects_3) -am_Grid_main_OBJECTS = Grid_main.$(OBJEXT) $(am__objects_4) +am__Grid_main_SOURCES_DIST = Grid_main.cc Grid_communicator_mpi.cc \ + Grid_communicator_fake.cc +@BUILD_COMMS_MPI_TRUE@am__objects_1 = Grid_communicator_mpi.$(OBJEXT) +@BUILD_COMMS_NONE_TRUE@am__objects_2 = \ +@BUILD_COMMS_NONE_TRUE@ Grid_communicator_fake.$(OBJEXT) +am__objects_3 = $(am__objects_1) $(am__objects_2) +am_Grid_main_OBJECTS = Grid_main.$(OBJEXT) $(am__objects_3) Grid_main_OBJECTS = $(am_Grid_main_OBJECTS) Grid_main_DEPENDENCIES = libGrid.a AM_V_P = $(am__v_P_@AM_V@) @@ -214,8 +214,8 @@ CTAGS = ctags CSCOPE = cscope AM_RECURSIVE_TARGETS = cscope am__DIST_COMMON = $(srcdir)/Grid_config.h.in $(srcdir)/Makefile.in \ - AUTHORS COPYING ChangeLog INSTALL NEWS README compile depcomp \ - install-sh missing + AUTHORS COPYING ChangeLog INSTALL NEWS README TODO compile \ + depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -353,12 +353,11 @@ include_HEADERS = Grid_config.h\ Grid_aligned_allocator.h\ Grid_cshift.h\ Grid_cshift_common.h\ - Grid_cshift_fake.h\ Grid_cshift_mpi.h\ Grid_cshift_none.h\ Grid_math_types.h -extra_sources = $(am__append_1) $(am__append_2) $(am__append_3) +extra_sources = $(am__append_1) $(am__append_2) Grid_main_SOURCES = \ Grid_main.cc\ $(extra_sources) @@ -506,10 +505,10 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_fake.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_communicator_fake.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_communicator_mpi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_main.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_mpi.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< diff --git a/TODO b/TODO index 9febd6c3..d2373ba1 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,7 @@ * FIXME audit +* Remove vload/store etc.. +* Replace vset with a call to merge. +* Replace vset with a call to merge. * Conditional execution Subset, where etc... * Coordinate information, integers etc... @@ -27,3 +30,103 @@ - BinaryWriter, TextWriter etc... - protocol buffers? - +// Cartesian grid inheritance +// Grid::GridBase +// | +// __________|___________ +// | | +// Grid::GridCartesian Grid::GridCartesianRedBlack +// +// TODO: document the following as an API guaranteed public interface + + /* + * Rough map of functionality against QDP++ Layout + * + * Param | Grid | QDP++ + * ----------------------------------------- + * | | + * void | oSites, iSites, lSites | sitesOnNode + * void | gSites | vol + * | | + * gcoor | oIndex, iIndex | linearSiteIndex // no virtual node in QDP + * lcoor | | + * + * void | CheckerBoarded | - // No checkerboarded in QDP + * void | FullDimensions | lattSize + * void | GlobalDimensions | lattSize // No checkerboarded in QDP + * void | LocalDimensions | subgridLattSize + * void | VirtualLocalDimensions | subgridLattSize // no virtual node in QDP + * | | + * int x 3 | oiSiteRankToGlobal | siteCoords + * | ProcessorCoorLocalCoorToGlobalCoor | + * | | + * vector | GlobalCoorToRankIndex | nodeNumber(coord) + * vector | GlobalCoorToProcessorCoorLocalCoor| nodeCoord(coord) + * | | + * void | Processors | logicalSize // returns cart array shape + * void | ThisRank | nodeNumber(); // returns this node rank + * void | ThisProcessorCoor | // returns this node coor + * void | isBoss(void) | primaryNode(); + * | | + * | RankFromProcessorCoor | getLogicalCoorFrom(node) + * | ProcessorCoorFromRank | getNodeNumberFrom(logical_coord) + */ + // Work out whether to permute + // ABCDEFGH -> AE BF CG DH permute wrap num + // + // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH 0 0 + // Shift 1 BF CG DH AE 0 0 0 1 BCDEFGHA 0 1 + // Shift 2 CG DH AE BF 0 0 1 1 CDEFGHAB 0 2 + // Shift 3 DH AE BF CG 0 1 1 1 DEFGHABC 0 3 + // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD 1 0 + // Shift 5 BF CG DH AE 1 1 1 0 FGHACBDE 1 1 + // Shift 6 CG DH AE BF 1 1 0 0 GHABCDEF 1 2 + // Shift 7 DH AE BF CG 1 0 0 0 HABCDEFG 1 3 + + // Suppose 4way simd in one dim. + // ABCDEFGH -> AECG BFDH permute wrap num + + // Shift 0 AECG BFDH 0,00 0,00 ABCDEFGH 0 0 + // Shift 1 BFDH CGEA 0,00 1,01 BCDEFGHA 0 1 + // Shift 2 CGEA DHFB 1,01 1,01 CDEFGHAB 1 0 + // Shift 3 DHFB EAGC 1,01 1,11 DEFGHABC 1 1 + // Shift 4 EAGC FBHD 1,11 1,11 EFGHABCD 2 0 + // Shift 5 FBHD GCAE 1,11 1,10 FGHABCDE 2 1 + // Shift 6 GCAE HDBF 1,10 1,10 GHABCDEF 3 0 + // Shift 7 HDBF AECG 1,10 0,00 HABCDEFG 3 1 + + // Generalisation to 8 way simd, 16 way simd required. + // + // Need log2 Nway masks. consisting of + // 1 bit 256 bit granule + // 2 bit 128 bit granule + // 4 bits 64 bit granule + // 8 bits 32 bit granules + // + // 15 bits.... + // TODO + // + // Base class to share common code between vRealF, VComplexF etc... + // + // lattice Broad cast assignment + // + // where() support + // implement with masks, and/or? Type of the mask & boolean support? + // + // Unary functions + // cos,sin, tan, acos, asin, cosh, acosh, tanh, sinh, // Scalar only arg + // exp, log, sqrt, fabs + // + // transposeColor, transposeSpin, + // adjColor, adjSpin, + // traceColor, traceSpin. + // peekColor, peekSpin + pokeColor PokeSpin + // + // copyMask. + // + // localMaxAbs + // + // norm2, + // sumMulti equivalent. + // Fourier transform equivalent. + // diff --git a/configure b/configure index cb6bab86..c6f93abc 100755 --- a/configure +++ b/configure @@ -628,8 +628,6 @@ LTLIBOBJS LIBOBJS BUILD_COMMS_NONE_FALSE BUILD_COMMS_NONE_TRUE -BUILD_COMMS_FAKE_FALSE -BUILD_COMMS_FAKE_TRUE BUILD_COMMS_MPI_FALSE BUILD_COMMS_MPI_TRUE EGREP @@ -1369,8 +1367,7 @@ Optional Features: --disable-openmp do not use OpenMP --enable-simd=SSE|AVX|AVX2|AVX512 Select instructions - --enable-comms=none|fake|mpi - Select communications + --enable-comms=none|mpi Select communications Some influential environment variables: CXX C++ compiler command @@ -5051,12 +5048,6 @@ fi case ${ac_COMMS} in - fake) - echo Configuring for FAKE communications - -$as_echo "#define GRID_COMMS_FAKE 1" >>confdefs.h - - ;; none) echo Configuring for NO communications @@ -5082,14 +5073,6 @@ else BUILD_COMMS_MPI_FALSE= fi - if test "X${ac_COMMS}X" == "XfakeX" ; then - BUILD_COMMS_FAKE_TRUE= - BUILD_COMMS_FAKE_FALSE='#' -else - BUILD_COMMS_FAKE_TRUE='#' - BUILD_COMMS_FAKE_FALSE= -fi - if test "X${ac_COMMS}X" == "XnoneX" ; then BUILD_COMMS_NONE_TRUE= BUILD_COMMS_NONE_FALSE='#' @@ -5243,10 +5226,6 @@ if test -z "${BUILD_COMMS_MPI_TRUE}" && test -z "${BUILD_COMMS_MPI_FALSE}"; then as_fn_error $? "conditional \"BUILD_COMMS_MPI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${BUILD_COMMS_FAKE_TRUE}" && test -z "${BUILD_COMMS_FAKE_FALSE}"; then - as_fn_error $? "conditional \"BUILD_COMMS_FAKE\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi if test -z "${BUILD_COMMS_NONE_TRUE}" && test -z "${BUILD_COMMS_NONE_FALSE}"; then as_fn_error $? "conditional \"BUILD_COMMS_NONE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 22d0365e..bfe745e5 100644 --- a/configure.ac +++ b/configure.ac @@ -51,13 +51,9 @@ case ${ac_SIMD} in esac -AC_ARG_ENABLE([comms],[AC_HELP_STRING([--enable-comms=none|fake|mpi],[Select communications])],[ac_COMMS=${enable_comms}],[ac_COMMS=none]) +AC_ARG_ENABLE([comms],[AC_HELP_STRING([--enable-comms=none|mpi],[Select communications])],[ac_COMMS=${enable_comms}],[ac_COMMS=none]) case ${ac_COMMS} in - fake) - echo Configuring for FAKE communications - AC_DEFINE([GRID_COMMS_FAKE],[1],[GRID_COMMS_FAKE] ) - ;; none) echo Configuring for NO communications AC_DEFINE([GRID_COMMS_NONE],[1],[GRID_COMMS_NONE] ) @@ -72,7 +68,6 @@ case ${ac_COMMS} in esac AM_CONDITIONAL(BUILD_COMMS_MPI,[ test "X${ac_COMMS}X" == "XmpiX" ]) -AM_CONDITIONAL(BUILD_COMMS_FAKE,[ test "X${ac_COMMS}X" == "XfakeX" ]) AM_CONDITIONAL(BUILD_COMMS_NONE,[ test "X${ac_COMMS}X" == "XnoneX" ]) From ce6a3a8ed4ec5fcc1e5bd8af37866dee786b0f4f Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 6 Apr 2015 11:28:00 +0100 Subject: [PATCH 040/429] Some popular configure commands --- configure-commands | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 configure-commands diff --git a/configure-commands b/configure-commands new file mode 100644 index 00000000..d22e9fdd --- /dev/null +++ b/configure-commands @@ -0,0 +1,4 @@ +CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx" --enable-comms=mpi +CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -g -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx" --enable-comms=mpi +CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -g -std=c++11" LDFLAGS= LIBS=-lmpi --enable-comms=fake +CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -g -std=c++11" LDFLAGS= LIBS=-lmpi --enable-comms=none From 81d5eabf6c5b31bbbe3d13e8cbf0891a89da8a73 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 6 Apr 2015 11:29:55 +0100 Subject: [PATCH 041/429] Remove stub files --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 0c02bc65..ac77b76b 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,10 @@ errs # http://www.gnu.org/software/automake Makefile.in +Makefile +config.log +config.status +.deps # http://www.gnu.org/software/autoconf From 31f4f4f1e11075a170efa51cb6c58045cf88530b Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 9 Apr 2015 08:06:03 +0200 Subject: [PATCH 042/429] "where" and integer comparisons logic implemented for conditional assignment. LatticeCoordinate helper to get global (reduced) coordinate. Some more work of similar type perhaps needed, but the bulk of the required structure for masked array assignment is now in place. --- Grid.h | 2 +- Grid_Lattice.h | 36 ++-- Grid_QCD.h | 27 ++- Grid_comparison.h | 264 +++++++++++++++++++++++++ Grid_cshift_common.h | 1 - Grid_main.cc | 73 ++++++- Grid_math_type_mapper.h | 83 ++++++++ Grid_math_types.h | 414 +++++++++++++++++++++++++++++----------- Grid_predicated.h | 62 ++++++ Grid_simd.h | 90 +++++---- Grid_stencil.h | 352 +++++++++++++++++++++++++++++++++- Grid_vComplexD.h | 23 ++- Grid_vComplexF.h | 67 ++++++- Grid_vInteger.h | 69 ++++--- Grid_vRealD.h | 15 +- Grid_vRealF.h | 15 +- TODO | 67 +++++-- 17 files changed, 1420 insertions(+), 240 deletions(-) create mode 100644 Grid_comparison.h create mode 100644 Grid_math_type_mapper.h create mode 100644 Grid_predicated.h diff --git a/Grid.h b/Grid.h index 0a4024bf..caa4ed5e 100644 --- a/Grid.h +++ b/Grid.h @@ -41,12 +41,12 @@ #include #endif - #include #include #include #include #include +#include #include namespace Grid { diff --git a/Grid_Lattice.h b/Grid_Lattice.h index ebf68560..01b95755 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -19,16 +19,14 @@ public: typedef typename vobj::vector_type vector_type; public: - Lattice(GridBase *grid) : _grid(grid) { _odata.reserve(_grid->oSites()); assert((((uint64_t)&_odata[0])&0xF) ==0); checkerboard=0; } - #include - + template friend void conformable(const Lattice &lhs,const Lattice &rhs); @@ -156,23 +154,23 @@ public: v_ptr[i]=drand48(); } }; - + // FIXME for debug; deprecate this friend void lex_sites(Lattice &l){ - Real *v_ptr = (Real *)&l._odata[0]; - size_t o_len = l._grid->oSites(); - size_t v_len = sizeof(vobj)/sizeof(vRealF); - size_t vec_len = vRealF::Nsimd(); + Real *v_ptr = (Real *)&l._odata[0]; + size_t o_len = l._grid->oSites(); + size_t v_len = sizeof(vobj)/sizeof(vRealF); + size_t vec_len = vRealF::Nsimd(); - for(int i=0;i &l){ // Zero mean, unit variance. @@ -195,7 +193,7 @@ public: } return ret; } - // *=,+=,-= operators + // *=,+=,-= operators inherit behvour from correspond */+/- operation template inline Lattice &operator *=(const T &r) { *this = (*this)*r; @@ -351,7 +349,6 @@ public: inline auto operator * (const left &lhs,const Lattice &rhs) -> Lattice { Lattice ret(rhs._grid); - #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ ret._odata[ss]=lhs*rhs._odata[ss]; @@ -383,7 +380,7 @@ public: { Lattice ret(lhs._grid); #pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ + for(int ss=0;ssoSites(); ss++){ ret._odata[ss]=lhs._odata[ss]*rhs; } return ret; @@ -409,5 +406,6 @@ public: return ret; } + } #endif diff --git a/Grid_QCD.h b/Grid_QCD.h index 3e852633..1d52f911 100644 --- a/Grid_QCD.h +++ b/Grid_QCD.h @@ -45,7 +45,7 @@ namespace QCD { typedef Lattice LatticeComplex; - typedef Lattice LatticeInteger; // Predicates for "where" + typedef Lattice LatticeInteger; // Predicates for "where" typedef Lattice LatticeColourMatrix; typedef Lattice LatticeSpinMatrix; @@ -92,6 +92,31 @@ namespace QCD { } return ret; } + + // FIXME for debug; deprecate this + inline void LatticeCoordinate(LatticeInteger &l,int mu){ + GridBase *grid = l._grid; + int Nsimd = grid->iSites(); + std::vector gcoor; + std::vector mergebuf(Nsimd); + std::vector mergeptr(Nsimd); + for(int o=0;ooSites();o++){ + for(int i=0;iiSites();i++){ + // RankIndexToGlobalCoor(grid->ThisRank(),o,i,gcoor); + grid->RankIndexToGlobalCoor(0,o,i,gcoor); + mergebuf[i]=gcoor[mu]; + mergeptr[i]=&mergebuf[i]; + } + merge(l._odata[o],mergeptr); + } + }; + +#include + +#if 0 + +#endif + } //namespace QCD } // Grid #endif diff --git a/Grid_comparison.h b/Grid_comparison.h new file mode 100644 index 00000000..c890d342 --- /dev/null +++ b/Grid_comparison.h @@ -0,0 +1,264 @@ +#ifndef GRID_COMPARISON_H +#define GRID_COMPARISON_H +namespace Grid { + + // Generic list of functors + template class veq { + public: + vInteger operator()(const lobj &lhs, const robj &rhs) + { + return lhs == rhs; + } + }; + template class vne { + public: + vInteger operator()(const lobj &lhs, const robj &rhs) + { + return lhs != rhs; + } + }; + template class vlt { + public: + vInteger operator()(const lobj &lhs, const robj &rhs) + { + return lhs < rhs; + } + }; + template class vle { + public: + vInteger operator()(const lobj &lhs, const robj &rhs) + { + return lhs <= rhs; + } + }; + template class vgt { + public: + vInteger operator()(const lobj &lhs, const robj &rhs) + { + return lhs > rhs; + } + }; + template class vge { + public: + vInteger operator()(const lobj &lhs, const robj &rhs) + { + return lhs >= rhs; + } + }; + + // Generic list of functors + template class seq { + public: + Integer operator()(const lobj &lhs, const robj &rhs) + { + return lhs == rhs; + } + }; + template class sne { + public: + Integer operator()(const lobj &lhs, const robj &rhs) + { + return lhs != rhs; + } + }; + template class slt { + public: + Integer operator()(const lobj &lhs, const robj &rhs) + { + return lhs < rhs; + } + }; + template class sle { + public: + Integer operator()(const lobj &lhs, const robj &rhs) + { + return lhs <= rhs; + } + }; + template class sgt { + public: + Integer operator()(const lobj &lhs, const robj &rhs) + { + return lhs > rhs; + } + }; + template class sge { + public: + Integer operator()(const lobj &lhs, const robj &rhs) + { + return lhs >= rhs; + } + }; + + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // Integer gets extra relational functions. Could also implement these for RealF, RealD etc.. + ////////////////////////////////////////////////////////////////////////////////////////////////////// + template + inline vInteger Comparison(sfunctor sop,const vInteger & lhs, const vInteger & rhs) + { + std::vector vlhs(vInteger::Nsimd()); // Use functors to reduce this to single implementation + std::vector vrhs(vInteger::Nsimd()); + vInteger ret; + extract(lhs,vlhs); + extract(rhs,vrhs); + for(int s=0;s(),lhs,rhs); + } + inline vInteger operator <= (const vInteger & lhs, const vInteger & rhs) + { + return Comparison(sle(),lhs,rhs); + } + inline vInteger operator > (const vInteger & lhs, const vInteger & rhs) + { + return Comparison(sgt(),lhs,rhs); + } + inline vInteger operator >= (const vInteger & lhs, const vInteger & rhs) + { + return Comparison(sge(),lhs,rhs); + } + inline vInteger operator == (const vInteger & lhs, const vInteger & rhs) + { + return Comparison(seq(),lhs,rhs); + } + inline vInteger operator != (const vInteger & lhs, const vInteger & rhs) + { + return Comparison(sne(),lhs,rhs); + } + + ////////////////////////////////////////////////////////////////////////// + // relational operators + // + // Support <,>,<=,>=,==,!= + // + //Query supporting bitwise &, |, ^, ! + //Query supporting logical &&, ||, + ////////////////////////////////////////////////////////////////////////// + template + inline Lattice LLComparison(vfunctor op,const Lattice &lhs,const Lattice &rhs) + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=op(lhs._odata[ss],rhs._odata[ss]); + } + return ret; + } + template + inline Lattice LSComparison(vfunctor op,const Lattice &lhs,const robj &rhs) + { + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=op(lhs._odata[ss],rhs); + } + return ret; + } + template + inline Lattice SLComparison(vfunctor op,const lobj &lhs,const Lattice &rhs) + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=op(lhs._odata[ss],rhs); + } + return ret; + } + + // Less than + template + inline Lattice operator < (const Lattice & lhs, const Lattice & rhs) { + return LLComparison(vlt(),lhs,rhs); + } + template + inline Lattice operator < (const Lattice & lhs, const robj & rhs) { + return LSComparison(vlt(),lhs,rhs); + } + template + inline Lattice operator < (const lobj & lhs, const Lattice & rhs) { + return SLComparison(vlt(),lhs,rhs); + } + + // Less than equal + template + inline Lattice operator <= (const Lattice & lhs, const Lattice & rhs) { + return LLComparison(vle(),lhs,rhs); + } + template + inline Lattice operator <= (const Lattice & lhs, const robj & rhs) { + return LSComparison(vle(),lhs,rhs); + } + template + inline Lattice operator <= (const lobj & lhs, const Lattice & rhs) { + return SLComparison(vle(),lhs,rhs); + } + + // Greater than + template + inline Lattice operator > (const Lattice & lhs, const Lattice & rhs) { + return LLComparison(vgt(),lhs,rhs); + } + template + inline Lattice operator > (const Lattice & lhs, const robj & rhs) { + return LSComparison(vgt(),lhs,rhs); + } + template + inline Lattice operator > (const lobj & lhs, const Lattice & rhs) { + return SLComparison(vgt(),lhs,rhs); + } + + + // Greater than equal + template + inline Lattice operator >= (const Lattice & lhs, const Lattice & rhs) { + return LLComparison(vge(),lhs,rhs); + } + template + inline Lattice operator >= (const Lattice & lhs, const robj & rhs) { + return LSComparison(vge(),lhs,rhs); + } + template + inline Lattice operator >= (const lobj & lhs, const Lattice & rhs) { + return SLComparison(vge(),lhs,rhs); + } + + + // equal + template + inline Lattice operator == (const Lattice & lhs, const Lattice & rhs) { + return LLComparison(veq(),lhs,rhs); + } + template + inline Lattice operator == (const Lattice & lhs, const robj & rhs) { + return LSComparison(veq(),lhs,rhs); + } + template + inline Lattice operator == (const lobj & lhs, const Lattice & rhs) { + return SLComparison(veq(),lhs,rhs); + } + + + // not equal + template + inline Lattice operator != (const Lattice & lhs, const Lattice & rhs) { + return LLComparison(vne(),lhs,rhs); + } + template + inline Lattice operator != (const Lattice & lhs, const robj & rhs) { + return LSComparison(vne(),lhs,rhs); + } + template + inline Lattice operator != (const lobj & lhs, const Lattice & rhs) { + return SLComparison(vne(),lhs,rhs); + } + + +} +#endif diff --git a/Grid_cshift_common.h b/Grid_cshift_common.h index 08e75cff..2910151c 100644 --- a/Grid_cshift_common.h +++ b/Grid_cshift_common.h @@ -265,7 +265,6 @@ friend void Copy_plane_permute(Lattice& lhs,Lattice &rhs, int dimens ////////////////////////////////////////////////////// // Local to node Cshift ////////////////////////////////////////////////////// - friend void Cshift_local(Lattice& ret,Lattice &rhs,int dimension,int shift) { int sshift[2]; diff --git a/Grid_main.cc b/Grid_main.cc index 62356436..1676a07b 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -19,10 +19,10 @@ int main (int argc, char ** argv) std::vector simd_layout(4); std::vector mpi_layout(4); - mpi_layout[0]=2; - mpi_layout[1]=2; - mpi_layout[2]=2; - mpi_layout[3]=2; + mpi_layout[0]=1; + mpi_layout[1]=1; + mpi_layout[2]=1; + mpi_layout[3]=1; #ifdef AVX512 for(int omp=128;omp<236;omp+=16){ @@ -121,12 +121,34 @@ int main (int argc, char ** argv) // Non-lattice (const objects) * Lattice ColourMatrix cm; SpinColourMatrix scm; - + vSpinColourMatrix vscm; + Complex cplx(1.0); + Integer myint=1; + double mydouble=1.0; + + // vSpinColourMatrix vscm; scMat = cMat*scMat; scm = cm * scm; // SpinColourMatrix = ColourMatrix * SpinColourMatrix scm = scm *cm; // SpinColourMatrix = SpinColourMartix * ColourMatrix scm = GammaFive * scm ; // SpinColourMatrix = SpinMatrix * SpinColourMatrix scm = scm* GammaFive ; // SpinColourMatrix = SpinColourMatrix * SpinMatrix + + scm = scm*cplx; + vscm = vscm*cplx; + scMat = scMat*cplx; + + scm = cplx*scm; + vscm = cplx*vscm; + scMat = cplx*scMat; + scm = myint*scm; + vscm = myint*vscm; + scMat = scMat*myint; + + scm = scm*mydouble; + vscm = vscm*mydouble; + scMat = scMat*mydouble; + scMat = mydouble*scMat; + cMat = mydouble*cMat; sMat = adj(sMat); // LatticeSpinMatrix adjoint sMat = iGammaFive*sMat; // SpinMatrix * LatticeSpinMatrix @@ -160,7 +182,35 @@ int main (int argc, char ** argv) */ lex_sites(Foo); + Integer mm[4]; + mm[0]=1; + mm[1]=Fine._rdimensions[0]; + mm[2]=Fine._ldimensions[0]*Fine._ldimensions[1]; + mm[3]=Fine._ldimensions[0]*Fine._ldimensions[1]*Fine._ldimensions[2]; + LatticeInteger lex(&Fine); + lex=zero; + for(int d=0;d<4;d++){ + LatticeInteger coor(&Fine); + LatticeCoordinate(coor,d); + lex = lex + coor*mm[d]; + } + Bar = zero; + Bar = where(lex<10,Foo,Bar); + { + std::vector coor(4); + for(coor[3]=0;coor[3] diff; @@ -305,7 +361,8 @@ int main (int argc, char ** argv) double nn=Ttr._internal._internal; if ( nn > 0 ) cout<<"Shift real trace fail "< >::scalar_type == ComplexD. +////////////////////////////////////////////////////////////////////////////////// + + template class GridTypeMapper { + public: + typedef typename T::scalar_type scalar_type; + typedef typename T::vector_type vector_type; + typedef typename T::tensor_reduced tensor_reduced; + }; + +////////////////////////////////////////////////////////////////////////////////// +// Recursion stops with these template specialisations +////////////////////////////////////////////////////////////////////////////////// + template<> class GridTypeMapper { + public: + typedef RealF scalar_type; + typedef RealF vector_type; + typedef RealF tensor_reduced ; + }; + template<> class GridTypeMapper { + public: + typedef RealD scalar_type; + typedef RealD vector_type; + typedef RealD tensor_reduced; + }; + template<> class GridTypeMapper { + public: + typedef ComplexF scalar_type; + typedef ComplexF vector_type; + typedef ComplexF tensor_reduced; + }; + template<> class GridTypeMapper { + public: + typedef ComplexD scalar_type; + typedef ComplexD vector_type; + typedef ComplexD tensor_reduced; + }; + + template<> class GridTypeMapper { + public: + typedef RealF scalar_type; + typedef vRealF vector_type; + typedef vRealF tensor_reduced; + }; + template<> class GridTypeMapper { + public: + typedef RealD scalar_type; + typedef vRealD vector_type; + typedef vRealD tensor_reduced; + }; + template<> class GridTypeMapper { + public: + typedef ComplexF scalar_type; + typedef vComplexF vector_type; + typedef vComplexF tensor_reduced; + }; + template<> class GridTypeMapper { + public: + typedef ComplexD scalar_type; + typedef vComplexD vector_type; + typedef vComplexD tensor_reduced; + }; + template<> class GridTypeMapper { + public: + typedef Integer scalar_type; + typedef vInteger vector_type; + typedef vInteger tensor_reduced; + }; + + // Again terminate the recursion. + inline vRealD TensorRemove(vRealD arg){ return arg;} + inline vRealF TensorRemove(vRealF arg){ return arg;} + inline vComplexF TensorRemove(vComplexF arg){ return arg;} + inline vComplexD TensorRemove(vComplexD arg){ return arg;} + inline vInteger TensorRemove(vInteger arg){ return arg;} + +} + +#endif diff --git a/Grid_math_types.h b/Grid_math_types.h index 25524966..a2a3f97c 100644 --- a/Grid_math_types.h +++ b/Grid_math_types.h @@ -1,63 +1,11 @@ #ifndef GRID_MATH_TYPES_H #define GRID_MATH_TYPES_H + +#include + namespace Grid { - -////////////////////////////////////////////////////////////////////////////////// -// Want to recurse: GridTypeMapper >::scalar_type == ComplexD. -////////////////////////////////////////////////////////////////////////////////// - - template class GridTypeMapper { - public: - typedef typename T::scalar_type scalar_type; - typedef typename T::vector_type vector_type; - }; - - template<> class GridTypeMapper { - public: - typedef RealF scalar_type; - typedef RealF vector_type; - }; - template<> class GridTypeMapper { - public: - typedef RealD scalar_type; - typedef RealD vector_type; - }; - template<> class GridTypeMapper { - public: - typedef ComplexF scalar_type; - typedef ComplexF vector_type; - }; - template<> class GridTypeMapper { - public: - typedef ComplexD scalar_type; - typedef ComplexD vector_type; - }; - - template<> class GridTypeMapper { - public: - typedef RealF scalar_type; - typedef vRealF vector_type; - }; - template<> class GridTypeMapper { - public: - typedef RealD scalar_type; - typedef vRealD vector_type; - }; - template<> class GridTypeMapper { - public: - typedef ComplexF scalar_type; - typedef vComplexF vector_type; - }; - template<> class GridTypeMapper { - public: - typedef ComplexD scalar_type; - typedef vComplexD vector_type; - }; - - - /////////////////////////////////////////////////// // Scalar, Vector, Matrix objects. // These can be composed to form tensor products of internal indices. @@ -70,9 +18,16 @@ public: typedef typename GridTypeMapper::scalar_type scalar_type; typedef typename GridTypeMapper::vector_type vector_type; + typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; + typedef iScalar tensor_reduced; + iScalar(){}; + + iScalar(scalar_type s) : _internal(s) {};// recurse down and hit the constructor for vector_type + iScalar(Zero &z){ *this = zero; }; + iScalar & operator= (const Zero &hero){ zeroit(*this); return *this; @@ -80,22 +35,27 @@ public: friend void zeroit(iScalar &that){ zeroit(that._internal); } - friend void permute(iScalar &out,iScalar &in,int permutetype){ + friend void permute(iScalar &out,const iScalar &in,int permutetype){ permute(out._internal,in._internal,permutetype); } - friend void extract(iScalar &in,std::vector &out){ + friend void extract(const iScalar &in,std::vector &out){ extract(in._internal,out); // extract advances the pointers in out } friend void merge(iScalar &in,std::vector &out){ merge(in._internal,out); // extract advances the pointers in out } + friend inline iScalar::vector_type TensorRemove(iScalar arg) + { + return TensorRemove(arg._internal); + } + // Unary negation friend inline iScalar operator -(const iScalar &r) { iScalar ret; ret._internal= -r._internal; return ret; } - // *=,+=,-= operators + // *=,+=,-= operators inherit from corresponding "*,-,+" behaviour inline iScalar &operator *=(const iScalar &r) { *this = (*this)*r; return *this; @@ -117,6 +77,9 @@ public: typedef typename GridTypeMapper::scalar_type scalar_type; typedef typename GridTypeMapper::vector_type vector_type; + typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; + typedef iScalar tensor_reduced; + iVector(Zero &z){ *this = zero; }; iVector() {}; @@ -129,12 +92,12 @@ public: zeroit(that._internal[i]); } } - friend void permute(iVector &out,iVector &in,int permutetype){ + friend void permute(iVector &out,const iVector &in,int permutetype){ for(int i=0;i &in,std::vector &out){ + friend void extract(const iVector &in,std::vector &out){ for(int i=0;i &operator *=(const iScalar &r) { *this = (*this)*r; return *this; @@ -163,10 +126,8 @@ public: *this = (*this)+r; return *this; } - }; - template class iMatrix { public: @@ -174,62 +135,64 @@ public: typedef typename GridTypeMapper::scalar_type scalar_type; typedef typename GridTypeMapper::vector_type vector_type; + typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; + typedef iScalar tensor_reduced; - iMatrix(Zero &z){ *this = zero; }; - iMatrix() {}; - iMatrix & operator= (Zero &hero){ - zeroit(*this); - return *this; - } - friend void zeroit(iMatrix &that){ - for(int i=0;i &out,iMatrix &in,int permutetype){ - for(int i=0;i & operator= (Zero &hero){ + zeroit(*this); + return *this; + } + friend void zeroit(iMatrix &that){ + for(int i=0;i &out,const iMatrix &in,int permutetype){ + for(int i=0;i &in,std::vector &out){ - for(int i=0;i &in,std::vector &out){ + for(int i=0;i &in,std::vector &out){ - for(int i=0;i &in,std::vector &out){ + for(int i=0;i operator -(const iMatrix &r) { - iMatrix ret; - for(int i=0;i - inline iMatrix &operator *=(const T &r) { - *this = (*this)*r; - return *this; - } - template - inline iMatrix &operator -=(const T &r) { - *this = (*this)-r; - return *this; - } - template - inline iMatrix &operator +=(const T &r) { - *this = (*this)+r; - return *this; - } + }} + } + // Unary negation + friend inline iMatrix operator -(const iMatrix &r) { + iMatrix ret; + for(int i=0;i + inline iMatrix &operator *=(const T &r) { + *this = (*this)*r; + return *this; + } + template + inline iMatrix &operator -=(const T &r) { + *this = (*this)-r; + return *this; + } + template + inline iMatrix &operator +=(const T &r) { + *this = (*this)+r; + return *this; + } }; @@ -642,7 +605,8 @@ iVector operator * (const iVector& lhs,const iScalar& r // mat x vec = vec // vec x scal = vec // scal x vec = vec - + // + // We can special case scalar_type ?? template inline auto operator * (const iScalar& lhs,const iScalar& rhs) -> iScalar { @@ -715,6 +679,229 @@ auto operator * (const iVector& lhs,const iScalar& rhs) -> iVector inline iScalar operator * (const iScalar& lhs,const typename iScalar::scalar_type rhs) +{ + typename iScalar::tensor_reduced srhs(rhs); + return lhs*srhs; +} +template inline iScalar operator * (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs*lhs; } + +template inline iVector operator * (const iVector& lhs,const typename iScalar::scalar_type rhs) +{ + typename iVector::tensor_reduced srhs(rhs); + return lhs*srhs; +} +template inline iVector operator * (const typename iScalar::scalar_type lhs,const iVector& rhs) { return rhs*lhs; } + +template inline iMatrix operator * (const iMatrix& lhs,const typename iScalar::scalar_type &rhs) +{ + typename iMatrix::tensor_reduced srhs(rhs); + return lhs*srhs; +} +template inline iMatrix operator * (const typename iScalar::scalar_type & lhs,const iMatrix& rhs) { return rhs*lhs; } + +//////////////////////////////////////////////////////////////////// +// Double support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator * (const iScalar& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iScalar operator * (double lhs,const iScalar& rhs) { return rhs*lhs; } + +template inline iVector operator * (const iVector& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iVector operator * (double lhs,const iVector& rhs) { return rhs*lhs; } + +template inline iMatrix operator * (const iMatrix& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iMatrix operator * (double lhs,const iMatrix& rhs) { return rhs*lhs; } + +//////////////////////////////////////////////////////////////////// +// Integer support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator * (const iScalar& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iScalar operator * (Integer lhs,const iScalar& rhs) { return rhs*lhs; } + +template inline iVector operator * (const iVector& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iVector operator * (Integer lhs,const iVector& rhs) { return rhs*lhs; } + +template inline iMatrix operator * (const iMatrix& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iMatrix operator * (Integer lhs,const iMatrix& rhs) { return rhs*lhs; } + + + +/////////////////////////////////////////////////////////////////////////////////////////////// +// addition by fundamental scalar type applies to matrix(down diag) and scalar +/////////////////////////////////////////////////////////////////////////////////////////////// +template inline iScalar operator + (const iScalar& lhs,const typename iScalar::scalar_type rhs) +{ + typename iScalar::tensor_reduced srhs(rhs); + return lhs+srhs; +} +template inline iScalar operator + (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs+lhs; } + +template inline iMatrix operator + (const iMatrix& lhs,const typename iScalar::scalar_type rhs) +{ + typename iMatrix::tensor_reduced srhs(rhs); + return lhs+srhs; +} +template inline iMatrix operator + (const typename iScalar::scalar_type lhs,const iMatrix& rhs) { return rhs+lhs; } + +//////////////////////////////////////////////////////////////////// +// Double support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator + (const iScalar& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs+srhs; +} +template inline iScalar operator + (double lhs,const iScalar& rhs) { return rhs+lhs; } + +template inline iMatrix operator + (const iMatrix& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs+srhs; +} +template inline iMatrix operator + (double lhs,const iMatrix& rhs) { return rhs+lhs; } + +//////////////////////////////////////////////////////////////////// +// Integer support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator + (const iScalar& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs+srhs; +} +template inline iScalar operator + (Integer lhs,const iScalar& rhs) { return rhs+lhs; } + +template inline iMatrix operator + (const iMatrix& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs+srhs; +} +template inline iMatrix operator + (Integer lhs,const iMatrix& rhs) { return rhs+lhs; } + + +/////////////////////////////////////////////////////////////////////////////////////////////// +// subtraction of fundamental scalar type applies to matrix(down diag) and scalar +/////////////////////////////////////////////////////////////////////////////////////////////// +template inline iScalar operator - (const iScalar& lhs,const typename iScalar::scalar_type rhs) +{ + typename iScalar::tensor_reduced srhs(rhs); + return lhs-srhs; +} +template inline iScalar operator - (const typename iScalar::scalar_type lhs,const iScalar& rhs) +{ + typename iScalar::tensor_reduced slhs(lhs); + return slhs-rhs; +} + +template inline iMatrix operator - (const iMatrix& lhs,const typename iScalar::scalar_type rhs) +{ + typename iScalar::tensor_reduced srhs(rhs); + return lhs-srhs; +} +template inline iMatrix operator - (const typename iScalar::scalar_type lhs,const iMatrix& rhs) +{ + typename iScalar::tensor_reduced slhs(lhs); + return slhs-rhs; +} + +//////////////////////////////////////////////////////////////////// +// Double support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator - (const iScalar& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs-srhs; +} +template inline iScalar operator - (double lhs,const iScalar& rhs) +{ + typename iScalar::scalar_type t(lhs); + typename iScalar::tensor_reduced slhs(t); + return slhs-rhs; +} + +template inline iMatrix operator - (const iMatrix& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs-srhs; +} +template inline iMatrix operator - (double lhs,const iMatrix& rhs) +{ + typename iScalar::scalar_type t(lhs); + typename iScalar::tensor_reduced slhs(t); + return slhs-rhs; +} + +//////////////////////////////////////////////////////////////////// +// Integer support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator - (const iScalar& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs-srhs; +} +template inline iScalar operator - (Integer lhs,const iScalar& rhs) +{ + typename iScalar::scalar_type t(lhs); + typename iScalar::tensor_reduced slhs(t); + return slhs-rhs; +} +template inline iMatrix operator - (const iMatrix& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs-srhs; +} +template inline iMatrix operator - (Integer lhs,const iMatrix& rhs) +{ + typename iScalar::scalar_type t(lhs); + typename iScalar::tensor_reduced slhs(t); + return slhs-rhs; +} + + + + /////////////////////////////////////////////////////////////////////////////////////// // localInnerProduct Scalar x Scalar -> Scalar // localInnerProduct Vector x Vector -> Scalar @@ -907,6 +1094,7 @@ inline auto trace(const iScalar &arg) -> iScalar +inline void where(Lattice &ret,const LatticeInteger &predicate,Lattice &iftrue,Lattice &iffalse) +{ + conformable(iftrue,iffalse); + conformable(iftrue,predicate); + conformable(iftrue,ret); + + GridBase *grid=iftrue._grid; + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + + const int Nsimd = grid->Nsimd(); + const int words = sizeof(vobj)/sizeof(vector_type); + + std::vector mask(Nsimd); + std::vector > truevals (Nsimd,std::vector(words) ); + std::vector > falsevals(Nsimd,std::vector(words) ); + std::vector pointers(Nsimd); + +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + + for(int s=0;s +inline Lattice where(const LatticeInteger &predicate,Lattice &iftrue,Lattice &iffalse) +{ + conformable(iftrue,iffalse); + conformable(iftrue,predicate); + + Lattice ret(iftrue._grid); + + where(ret,predicate,iftrue,iffalse); + + return ret; +} + +#endif diff --git a/Grid_simd.h b/Grid_simd.h index 53cc8909..1229d328 100644 --- a/Grid_simd.h +++ b/Grid_simd.h @@ -11,28 +11,15 @@ // Vector types are arch dependent //////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////// - // SIMD Alignment controls - //////////////////////////////////////////////////////////// -#ifdef HAVE_VAR_ATTRIBUTE_ALIGNED -#define ALIGN_DIRECTIVE(A) __attribute__ ((aligned(A))) -#else -#define ALIGN_DIRECTIVE(A) __declspec(align(A)) -#endif #ifdef SSE2 #include -#define SIMDalign ALIGN_DIRECTIVE(16) #endif - #if defined(AVX1) || defined (AVX2) #include -#define SIMDalign ALIGN_DIRECTIVE(32) #endif - #ifdef AVX512 #include -#define SIMDalign ALIGN_DIRECTIVE(64) #endif namespace Grid { @@ -137,41 +124,66 @@ namespace Grid { // Generic extract/merge/permute ///////////////////////////////////////////////////////////////// template -inline void Gextract(vsimd &y,std::vector &extracted){ -#if 1 +inline void Gextract(const vsimd &y,std::vector &extracted){ // FIXME: bounce off stack is painful // temporary hack while I figure out better way. // There are intrinsics to do this work without the storage. - int Nsimd = extracted.size(); - { - std::vector > buf(Nsimd); - vstore(y,&buf[0]); - for(int i=0;i > buf(Nsimd); + vstore(y,&buf[0]); + for(int i=0;i inline void Gmerge(vsimd &y,std::vector &extracted){ -#if 1 - int Nsimd = extracted.size(); + int Nextr=extracted.size(); + int Nsimd=vsimd::Nsimd(); + int s=Nsimd/Nextr; + std::vector buf(Nsimd); - for(int i=0;i +inline void Gextract(const vsimd &y,std::vector &extracted){ + // FIXME: bounce off stack is painful + // temporary hack while I figure out better way. + // There are intrinsics to do this work without the storage. + int Nextr=extracted.size(); + int Nsimd=vsimd::Nsimd(); + int s=Nsimd/Nextr; + + std::vector > buf(Nsimd); + + vstore(y,&buf[0]); + + for(int i=0;i +inline void Gmerge(vsimd &y,std::vector &extracted){ + int Nextr=extracted.size(); + int Nsimd=vsimd::Nsimd(); + int s=Nsimd/Nextr; + + std::vector buf(Nsimd); + for(int i=0;i &extracted){ // Permute 4 possible on half precision @512bit vectors. ////////////////////////////////////////////////////////// template -inline void Gpermute(vsimd &y,vsimd b,int perm){ +inline void Gpermute(vsimd &y,const vsimd &b,int perm){ switch (perm){ #if defined(AVX1)||defined(AVX2) // 8x32 bits=>3 permutes @@ -214,10 +226,10 @@ inline void Gpermute(vsimd &y,vsimd b,int perm){ }; }; +#include #include #include #include #include -#include #endif diff --git a/Grid_stencil.h b/Grid_stencil.h index d93204fc..4d73f436 100644 --- a/Grid_stencil.h +++ b/Grid_stencil.h @@ -8,5 +8,355 @@ // Lattice could also allocate haloes which get used for stencil code. // // Grid could create a neighbour index table for a given stencil. -// Could also implement CovariantCshift. +// +// Could also implement CovariantCshift, to fuse the loops and enhance performance. +// +// +// General stencil computation: +// +// Generic services +// 0) Prebuild neighbour tables +// 1) Compute sizes of all haloes/comms buffers; allocate them. +// +// 2) Gather all faces, and communicate. +// 3) Loop over result sites, giving nbr index/offnode info for each +// +// Could take a +// SpinProjectFaces +// start comms +// complete comms +// Reconstruct Umu +// +// Approach. +// ////////////////////////////////////////////////////////////////////////////////////////// + +namespace Grid { + + class Stencil { + public: + + Stencil(GridBase *grid, + int npoints, + int checkerboard, + std::vector directions, + std::vector distances); + + void Stencil_local (int dimension,int shift,int cbmask); + void Stencil_comms (int dimension,int shift,int cbmask); + void Stencil_comms_simd(int dimension,int shift,int cbmask); + // Will need to implement actions for + // + Copy_plane; + Copy_plane_permute; + Gather_plane; + + + + // The offsets to all neibours in stencil in each direction + int _checkerboard; + int _npoints; // Move to template param? + GridBase * _grid; + + // Store these as SIMD Integer needed + // + // std::vector< iVector > _offsets; + // std::vector< iVector > _local; + // std::vector< iVector > _comm_buf_size; + // std::vector< iVector > _permute; + + std::vector > _offsets; + std::vector > _local; + std::vector _comm_buf_size; + std::vector _permute; + + }; + + Stencil::Stencil(GridBase *grid, + int npoints, + int checkerboard, + std::vector directions, + std::vector distances){ + + _npoints = npoints; + _grid = grid; + + for(int i=0;i_fdimensions[dimension]; + int rd = _grid->_rdimensions[dimension]; + + _checkerboard = checkerboard; + + // the permute type + int simd_layout = _grid->_simd_layout[dimension]; + int comm_dim = _grid->_processors[dimension] >1 ; + int splice_dim = _grid->_simd_layout[dimension]>1 && (comm_dim); + + int sshift[2]; + + if ( !comm_dim ) { + sshift[0] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,0); + sshift[1] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,1); + + if ( sshift[0] == sshift[1] ) { + Stencil_local(dimension,shift,0x3); + } else { + Stencil_local(dimension,shift,0x1);// if checkerboard is unfavourable take two passes + Stencil_local(dimension,shift,0x2);// both with block stride loop iteration + } + } else if ( splice_dim ) { + sshift[0] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,0); + sshift[1] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,1); + + if ( sshift[0] == sshift[1] ) { + Stencil_comms_simd(dimension,shift,0x3); + } else { + Stencil_comms_simd(dimension,shift,0x1);// if checkerboard is unfavourable take two passes + Stencil_comms_simd(dimension,shift,0x2);// both with block stride loop iteration + } + } else { + // Cshift_comms(ret,rhs,dimension,shift); + sshift[0] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,0); + sshift[1] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,1); + if ( sshift[0] == sshift[1] ) { + Stencil_comms(dimension,shift,0x3); + } else { + Stencil_comms(dimension,shift,0x1);// if checkerboard is unfavourable take two passes + Stencil_comms(dimension,shift,0x2);// both with block stride loop iteration + } + } + } + } + + + void Stencil::Stencil_local (int dimension,int shift,int cbmask) + { + int fd = _grid->_fdimensions[dimension]; + int rd = _grid->_rdimensions[dimension]; + int ld = _grid->_ldimensions[dimension]; + int gd = _grid->_gdimensions[dimension]; + + // Map to always positive shift modulo global full dimension. + shift = (shift+fd)%fd; + + // the permute type + int permute_dim =_grid->PermuteDim(dimension); + int permute_type=_grid->PermuteType(dimension); + + for(int x=0;x_ostride[dimension]; + + int cb= (cbmask==0x2)? 1 : 0; + + int sshift = _grid->CheckerBoardShift(_checkerboard,dimension,shift,cb); + int sx = (x+sshift)%rd; + + int permute_slice=0; + if(permute_dim){ + int wrap = sshift/rd; + int num = sshift%rd; + if ( x< rd-num ) permute_slice=wrap; + else permute_slice = 1-wrap; + } + + if ( permute_slice ) Copy_plane_permute(dimension,x,sx,cbmask,permute_type); + else Copy_plane (dimension,x,sx,cbmask); + + } + } + + void Stencil::Stencil_comms (int dimension,int shift,int cbmask) + { + typedef typename vobj::vector_type vector_type; + typedef typename vobj::scalar_type scalar_type; + + GridBase *grid=_grid; + + int fd = _grid->_fdimensions[dimension]; + int rd = _grid->_rdimensions[dimension]; + int simd_layout = _grid->_simd_layout[dimension]; + int comm_dim = _grid->_processors[dimension] >1 ; + + assert(simd_layout==1); + assert(comm_dim==1); + assert(shift>=0); + assert(shift_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; + // FIXME: Do something with buffer_size?? + + int cb= (cbmask==0x2)? 1 : 0; + int sshift= _grid->CheckerBoardShift(_checkerboard,dimension,shift,cb); + + for(int x=0;x= rd ); + int sx = (x+sshift)%rd; + int comm_proc = (x+sshift)/rd; + + if (!offnode) { + + Copy_plane(dimension,x,sx,cbmask); + + } else { + + int words = send_buf.size(); + if (cbmask != 0x3) words=words>>1; + + int bytes = words * sizeof(vobj); + + Gather_plane_simple (dimension,sx,cbmask); + + int rank = grid->_processor; + int recv_from_rank; + int xmit_to_rank; + grid->ShiftedRanks(dimension,comm_proc,xmit_to_rank,recv_from_rank); + /* + grid->SendToRecvFrom((void *)&send_buf[0], + xmit_to_rank, + (void *)&recv_buf[0], + recv_from_rank, + bytes); + */ + Scatter_plane_simple (dimension,x,cbmask); + } + } + } + + void Stencil::Stencil_comms_simd(int dimension,int shift,int cbmask) + { + GridBase *grid=_grid; + const int Nsimd = _grid->Nsimd(); + typedef typename vobj::vector_type vector_type; + typedef typename vobj::scalar_type scalar_type; + + int fd = _grid->_fdimensions[dimension]; + int rd = _grid->_rdimensions[dimension]; + int ld = _grid->_ldimensions[dimension]; + int simd_layout = _grid->_simd_layout[dimension]; + int comm_dim = _grid->_processors[dimension] >1 ; + + assert(comm_dim==1); + assert(simd_layout==2); + assert(shift>=0); + assert(shiftPermuteType(dimension); + + /////////////////////////////////////////////// + // Simd direction uses an extract/merge pair + /////////////////////////////////////////////// + int buffer_size = _grid->_slice_nblock[dimension]*grid->_slice_block[dimension]; + // FIXME do something with buffer size + + std::vector pointers(Nsimd); // + std::vector rpointers(Nsimd); // received pointers + + /////////////////////////////////////////// + // Work out what to send where + /////////////////////////////////////////// + + int cb = (cbmask==0x2)? 1 : 0; + int sshift= _grid->CheckerBoardShift(_checkerboard,dimension,shift,cb); + + std::vector comm_offnode(simd_layout); + std::vector comm_proc (simd_layout); //relative processor coord in dim=dimension + std::vector icoor(grid->Nd()); + + for(int x=0;x= ld; + comm_any = comm_any | comm_offnode[s]; + comm_proc[s] = shifted_x/ld; + } + + int o = 0; + int bo = x*grid->_ostride[dimension]; + int sx = (x+sshift)%rd; + + if ( comm_any ) { + + for(int i=0;iiCoorFromIindex(icoor,i); + s = icoor[dimension]; + + if(comm_offnode[s]){ + + int rank = grid->_processor; + int recv_from_rank; + int xmit_to_rank; + grid->ShiftedRanks(dimension,comm_proc[s],xmit_to_rank,recv_from_rank); + + /* + grid->SendToRecvFrom((void *)&send_buf_extract[i][0], + xmit_to_rank, + (void *)&recv_buf_extract[i][0], + recv_from_rank, + bytes); + */ + + rpointers[i] = (scalar_type *)&recv_buf_extract[i][0]; + + } else { + + rpointers[i] = (scalar_type *)&send_buf_extract[i][0]; + + } + + } + + // Permute by swizzling pointers in merge + int permute_slice=0; + int lshift=sshift%ld; + int wrap =lshift/rd; + int num =lshift%rd; + + if ( x< rd-num ) permute_slice=wrap; + else permute_slice = 1-wrap; + + int toggle_bit = (Nsimd>>(permute_type+1)); + int PermuteMap; + for(int i=0;i(y,extracted); } - friend inline void extract(vComplexD &y,std::vector &extracted) + friend inline void extract(const vComplexD &y,std::vector &extracted) + { + Gextract(y,extracted); + } + friend inline void merge(vComplexD &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(const vComplexD &y,std::vector &extracted) { Gextract(y,extracted); } @@ -184,6 +198,11 @@ namespace Grid { /////////////////////// // Splat /////////////////////// + friend inline void vsplat(vComplexD &ret,ComplexD c){ + float a= real(c); + float b= imag(c); + vsplat(ret,a,b); + } friend inline void vsplat(vComplexD &ret,double rl,double ig){ #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_pd(ig,rl,ig,rl); @@ -215,7 +234,7 @@ namespace Grid { #endif } -friend inline void vstore(vComplexD &ret, ComplexD *a){ +friend inline void vstore(const vComplexD &ret, ComplexD *a){ #if defined (AVX1)|| defined (AVX2) _mm256_store_pd((double *)a,ret.v); #endif diff --git a/Grid_vComplexF.h b/Grid_vComplexF.h index b7fb3d6a..b6b7ebe9 100644 --- a/Grid_vComplexF.h +++ b/Grid_vComplexF.h @@ -20,6 +20,12 @@ namespace Grid { return (*this); } vComplexF(){}; + vComplexF(ComplexF a){ + vsplat(*this,a); + }; + vComplexF(double a){ + vsplat(*this,ComplexF(a)); + }; /////////////////////////////////////////////// // mac, mult, sub, add, adj @@ -161,7 +167,7 @@ namespace Grid { vsplat(ret,a,b); } -friend inline void vstore(vComplexF &ret, ComplexF *a){ +friend inline void vstore(const vComplexF &ret, ComplexF *a){ #if defined (AVX1)|| defined (AVX2) _mm256_store_ps((float *)a,ret.v); #endif @@ -210,27 +216,47 @@ friend inline void vstore(vComplexF &ret, ComplexF *a){ #endif } - friend inline vComplexF operator * (const Complex &a, vComplexF b){ vComplexF va; vsplat(va,a); return va*b; } friend inline vComplexF operator * (vComplexF b,const Complex &a){ + return a*b; + } + + /* + template + friend inline vComplexF operator * (vComplexF b,const real &a){ vComplexF va; - vsplat(va,a); + Complex ca(a,0); + vsplat(va,ca); return va*b; } + template + friend inline vComplexF operator * (const real &a,vComplexF b){ + return a*b; + } + friend inline vComplexF operator + (const Complex &a, vComplexF b){ vComplexF va; vsplat(va,a); return va+b; } friend inline vComplexF operator + (vComplexF b,const Complex &a){ - vComplexF va; - vsplat(va,a); - return b+va; + return a+b; } + template + friend inline vComplexF operator + (vComplexF b,const real &a){ + vComplexF va; + Complex ca(a,0); + vsplat(va,ca); + return va+b; + } + template + friend inline vComplexF operator + (const real &a,vComplexF b){ + return a+b; + } friend inline vComplexF operator - (const Complex &a, vComplexF b){ vComplexF va; vsplat(va,a); @@ -241,7 +267,24 @@ friend inline void vstore(vComplexF &ret, ComplexF *a){ vsplat(va,a); return b-va; } - // NB: Template the following on "type Complex" and then implement *,+,- for ComplexF, ComplexD, RealF, RealD above to + template + friend inline vComplexF operator - (vComplexF b,const real &a){ + vComplexF va; + Complex ca(a,0); + vsplat(va,ca); + return b-va; + } + template + friend inline vComplexF operator - (const real &a,vComplexF b){ + vComplexF va; + Complex ca(a,0); + vsplat(va,ca); + return va-b; + } + */ + + // NB: Template the following on "type Complex" and then implement *,+,- for + // ComplexF, ComplexD, RealF, RealD above to // get full generality of binops with scalars. friend inline void mac (vComplexF *__restrict__ y,const Complex *__restrict__ a,const vComplexF *__restrict__ x){ *y = (*a)*(*x)+(*y); }; friend inline void mult(vComplexF *__restrict__ y,const Complex *__restrict__ l,const vComplexF *__restrict__ r){ *y = (*l) * (*r); } @@ -304,7 +347,15 @@ friend inline void vstore(vComplexF &ret, ComplexF *a){ { Gmerge(y,extracted); } - friend inline void extract(vComplexF &y,std::vector &extracted) + friend inline void extract(const vComplexF &y,std::vector &extracted) + { + Gextract(y,extracted); + } + friend inline void merge(vComplexF &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(const vComplexF &y,std::vector &extracted) { Gextract(y,extracted); } diff --git a/Grid_vInteger.h b/Grid_vInteger.h index 6ddce191..82adbd8e 100644 --- a/Grid_vInteger.h +++ b/Grid_vInteger.h @@ -10,7 +10,7 @@ namespace Grid { typedef uint32_t Integer; - class vInteger { + class vInteger { protected: public: @@ -21,6 +21,13 @@ namespace Grid { typedef Integer scalar_type; vInteger(){}; + vInteger & operator = (const Zero & z){ + vzero(*this); + return (*this); + } + vInteger(Integer a){ + vsplat(*this,a); + }; //////////////////////////////////// // Arithmetic operator overloads +,-,* //////////////////////////////////// @@ -166,18 +173,18 @@ namespace Grid { #endif } -friend inline void vstore(vInteger &ret, Integer *a){ + friend inline void vstore(const vInteger &ret, Integer *a){ #if defined (AVX1)|| defined (AVX2) - _mm256_store_si256((__m256i*)a,ret.v); + _mm256_store_si256((__m256i*)a,ret.v); #endif #ifdef SSE2 - _mm_store_si128(a,ret.v); + _mm_store_si128(a,ret.v); #endif #ifdef AVX512 - _mm512_store_si512(a,ret.v); + _mm512_store_si512(a,ret.v); #endif #ifdef QPX - assert(0); + assert(0); #endif } @@ -185,6 +192,7 @@ friend inline void vstore(vInteger &ret, Integer *a){ { _mm_prefetch((const char*)&v.v,_MM_HINT_T0); } + // Unary negation friend inline vInteger operator -(const vInteger &r) { vInteger ret; @@ -210,9 +218,32 @@ friend inline void vstore(vInteger &ret, Integer *a){ *this = *this-r; return *this; } + + friend inline void permute(vInteger &y,const vInteger b,int perm) + { + Gpermute(y,b,perm); + } + friend inline void merge(vInteger &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(const vInteger &y,std::vector &extracted) + { + Gextract(y,extracted); + } + friend inline void merge(vInteger &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(const vInteger &y,std::vector &extracted) + { + Gextract(y,extracted); + } + + public: - static inline int Nsimd(void) { return sizeof(fvec)/sizeof(float);} - }; + static inline int Nsimd(void) { return sizeof(ivec)/sizeof(Integer);} + }; inline vInteger localInnerProduct(const vInteger & l, const vInteger & r) { return l*r; } @@ -222,27 +253,7 @@ friend inline void vstore(vInteger &ret, Integer *a){ { return l*r; } - - - class vIntegerF : public vInteger - { - public: - static inline int Nsimd(void) { return sizeof(ivec)/sizeof(float);} - - friend inline void permute(vIntegerF &y,vIntegerF b,int perm) - { - Gpermute(y,b,perm); - } - friend inline void merge(vIntegerF &y,std::vector &extracted) - { - Gmerge(y,extracted); - } - friend inline void extract(vIntegerF &y,std::vector &extracted) - { - Gextract(y,extracted); - } - }; - + } #endif diff --git a/Grid_vRealD.h b/Grid_vRealD.h index 13ceedbe..a5b59be3 100644 --- a/Grid_vRealD.h +++ b/Grid_vRealD.h @@ -13,6 +13,9 @@ namespace Grid { typedef RealD scalar_type; vRealD(){}; + vRealD(RealD a){ + vsplat(*this,a); + }; friend inline void mult(vRealD * __restrict__ y,const vRealD * __restrict__ l,const vRealD *__restrict__ r) {*y = (*l) * (*r);} friend inline void sub (vRealD * __restrict__ y,const vRealD * __restrict__ l,const vRealD *__restrict__ r) {*y = (*l) - (*r);} @@ -112,7 +115,15 @@ namespace Grid { { Gmerge(y,extracted); } - friend inline void extract(vRealD &y,std::vector &extracted) + friend inline void extract(const vRealD &y,std::vector &extracted) + { + Gextract(y,extracted); + } + friend inline void merge(vRealD &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(const vRealD &y,std::vector &extracted) { Gextract(y,extracted); } @@ -157,7 +168,7 @@ namespace Grid { #endif } - friend inline void vstore(vRealD &ret, double *a){ + friend inline void vstore(const vRealD &ret, double *a){ #if defined (AVX1)|| defined (AVX2) _mm256_store_pd(a,ret.v); #endif diff --git a/Grid_vRealF.h b/Grid_vRealF.h index 185f4da8..0fe68f43 100644 --- a/Grid_vRealF.h +++ b/Grid_vRealF.h @@ -14,6 +14,9 @@ namespace Grid { typedef RealF scalar_type; vRealF(){}; + vRealF(RealF a){ + vsplat(*this,a); + }; //////////////////////////////////// // Arithmetic operator overloads +,-,* //////////////////////////////////// @@ -133,7 +136,15 @@ namespace Grid { { Gmerge(y,extracted); } - friend inline void extract(vRealF &y,std::vector &extracted) + friend inline void extract(const vRealF &y,std::vector &extracted) + { + Gextract(y,extracted); + } + friend inline void merge(vRealF &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(const vRealF &y,std::vector &extracted) { Gextract(y,extracted); } @@ -180,7 +191,7 @@ namespace Grid { //////////////////////////////////////////////////////////////////////// // FIXME: gonna remove these load/store, get, set, prefetch //////////////////////////////////////////////////////////////////////// -friend inline void vstore(vRealF &ret, float *a){ +friend inline void vstore(const vRealF &ret, float *a){ #if defined (AVX1)|| defined (AVX2) _mm256_store_ps(a,ret.v); #endif diff --git a/TODO b/TODO index d2373ba1..fb7d177a 100644 --- a/TODO +++ b/TODO @@ -1,29 +1,68 @@ + * FIXME audit * Remove vload/store etc.. * Replace vset with a call to merge. * Replace vset with a call to merge. +* Const audit +* extract / merge extra implementation removal -* Conditional execution Subset, where etc... -* Coordinate information, integers etc... -* Integer type padding/union to vector. -* LatticeCoordinate[mu] +* Conditional execution, where etc... -----DONE, simple test +* Integer relational support -----DONE +* Coordinate information, integers etc... -----DONE +* Integer type padding/union to vector. -----DONE +* LatticeCoordinate[mu] -----DONE -* Optimise the extract/merge SIMD routines -* Broadcast, reduction tests. +* Stencil operator support -----Initial thoughts + +* Subset support, slice sums etc... -----Only need slice sum? + -----Generic cartesian subslicing? + -----Array ranges / boost extents? + -----Multigrid grid transferral. + -----Suggests generalised cartesian subblocking + sums, returning modified grid. + + Two classes of subset; +i) red black parit subsetting. + (pick checkerboard). + +ii) Need to be able to project one Grid to another Grid. + Generic concept is to subdivide (based on RD so applies to red/black or full). + Return a type on SUB-grid from CellSum TOP-grid + SUB-grid need not distribute but be replicated in some dims if that is how the + cartesian communicator works. + +iii) No general permutation map. + + +* Consider switch std::vector to boost arrays. + boost::multi_array A()... to replace multi1d, multi2d etc.. + +*? Cell definition <-> sliceSum. + ? Replicated arrays. + + + +* Check for missing functionality - partially audited against QDP++ layout + +* Optimise the extract/merge SIMD routines; Azusa?? + + -- I have collated into single location at least. + + -- Need to use _mm_*insert/extract routines. + +* Conformable test in Cshift routines. + +* Gamma/Dirac structures + +* Fourspin, two spin project + +* Broadcast, reduction tests. innerProduct, localInnerProduct * QDP++ regression suite and comparative benchmark * NERSC Lattice loading, plaquette test -* Conformable test in Cshift routines. - -* Gamma/Dirac structures -* Fourspin, two spin project - -* Stencil operator support - -* Check for missing functionality * I/O support - MPI IO? From 927c62d8a3181be9ddcce8146b8c8cf28e61e10b Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 10 Apr 2015 05:21:48 +0200 Subject: [PATCH 043/429] Patch for comms none nocompile --- Grid_communicator_fake.cc | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/Grid_communicator_fake.cc b/Grid_communicator_fake.cc index 83d5475e..2b94ea4b 100644 --- a/Grid_communicator_fake.cc +++ b/Grid_communicator_fake.cc @@ -14,20 +14,43 @@ CartesianCommunicator::CartesianCommunicator(std::vector &processors) for(int d=0;d<_ndimension;d++) _processor_coor[d] = 0; } -void CartesianCommunicator::GlobalSumF(float &){} -void CartesianCommunicator::GlobalSumFVector(float *,int N){} -void CartesianCommunicator::GlobalSumF(double &){} -void CartesianCommunicator::GlobalSumFVector(double *,int N){} +void CartesianCommunicator::GlobalSum(float &){} +void CartesianCommunicator::GlobalSumVector(float *,int N){} +void CartesianCommunicator::GlobalSum(double &){} +void CartesianCommunicator::GlobalSumVector(double *,int N){} // Basic Halo comms primitive void CartesianCommunicator::SendToRecvFrom(void *xmit, - std::vector to_coordinate, - void *recv, - std::vector from_coordinate, - int bytes) + int dest, + void *recv, + int from, + int bytes) { exit(-1); } +void CartesianCommunicator::Barrier(void) +{ +} + +void CartesianCommunicator::Broadcast(int root,void* data, int bytes) +{ +} + + +void CartesianCommunicator::ShiftedRanks(int dim,int shift,int &source,int &dest) +{ + source =1; + dest=1; +} +int CartesianCommunicator::RankFromProcessorCoor(std::vector &coor) +{ + return 1; +} +void CartesianCommunicator::ProcessorCoorFromRank(int rank, std::vector &coor) +{ +} + + } From 993419d9fbd857ab921944056d29832c6a501d4e Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 10 Apr 2015 05:22:36 +0200 Subject: [PATCH 044/429] MPI exposed incorrectly in main --- Grid.h | 1 + Grid_init.cc | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/Grid.h b/Grid.h index caa4ed5e..a0989e0b 100644 --- a/Grid.h +++ b/Grid.h @@ -52,6 +52,7 @@ namespace Grid { void Grid_init(int *argc,char ***argv); + void Grid_finalize(void); double usecond(void); void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr); void Grid_debug_handler_init(void); diff --git a/Grid_init.cc b/Grid_init.cc index 3a601209..9e8b8b96 100755 --- a/Grid_init.cc +++ b/Grid_init.cc @@ -23,6 +23,12 @@ void Grid_init(int *argc,char ***argv) #endif Grid_debug_handler_init(); } +void Grid_finalize(void) +{ +#ifdef GRID_COMMS_MPI + MPI_Finalize(); +#endif +} double usecond(void) { struct timeval tv; gettimeofday(&tv,NULL); From 6e90038bf63492c268b0c50d757a0fdcab6ab1ed Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 10 Apr 2015 05:24:01 +0200 Subject: [PATCH 045/429] Fixing nocompile --- Grid_config.h | 4 ++-- Grid_main.cc | 4 +--- Grid_stencil.h | 7 ++++--- Grid_vComplexD.h | 9 --------- Grid_vRealD.h | 9 --------- TODO | 37 ++++++++++++++++++++++++------------- 6 files changed, 31 insertions(+), 39 deletions(-) diff --git a/Grid_config.h b/Grid_config.h index bb885708..deb6c74c 100644 --- a/Grid_config.h +++ b/Grid_config.h @@ -11,10 +11,10 @@ /* #undef AVX512 */ /* GRID_COMMS_MPI */ -#define GRID_COMMS_MPI 1 +/* #undef GRID_COMMS_MPI */ /* GRID_COMMS_NONE */ -/* #undef GRID_COMMS_NONE */ +#define GRID_COMMS_NONE 1 /* Define to 1 if you have the `gettimeofday' function. */ #define HAVE_GETTIMEOFDAY 1 diff --git a/Grid_main.cc b/Grid_main.cc index 1676a07b..770de9a3 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -407,7 +407,5 @@ int main (int argc, char ** argv) } // loop for lat } // loop for omp - - MPI_Finalize(); - + Grid_finalize(); } diff --git a/Grid_stencil.h b/Grid_stencil.h index 4d73f436..e10cabaa 100644 --- a/Grid_stencil.h +++ b/Grid_stencil.h @@ -1,3 +1,5 @@ +#ifndef GRID_STENCIL_H +#define GRID_STENCIL_H ////////////////////////////////////////////////////////////////////////////////////////// // Must not lose sight that goal is to be able to construct really efficient // gather to a point stencil code. CSHIFT is not the best way, so probably need @@ -45,14 +47,12 @@ namespace Grid { void Stencil_local (int dimension,int shift,int cbmask); void Stencil_comms (int dimension,int shift,int cbmask); void Stencil_comms_simd(int dimension,int shift,int cbmask); + // Will need to implement actions for - // Copy_plane; Copy_plane_permute; Gather_plane; - - // The offsets to all neibours in stencil in each direction int _checkerboard; int _npoints; // Move to template param? @@ -360,3 +360,4 @@ namespace Grid { }; +#endif diff --git a/Grid_vComplexD.h b/Grid_vComplexD.h index 88d69ecb..3278b15e 100644 --- a/Grid_vComplexD.h +++ b/Grid_vComplexD.h @@ -186,15 +186,6 @@ namespace Grid { Gextract(y,extracted); } - //////////////////////////////////////////////////////////////////////// - // FIXME: gonna remove these load/store, get, set, prefetch - //////////////////////////////////////////////////////////////////////// - void vload(zvec& a){ - this->v = a; - } - zvec vget(){ - return this->v ; - } /////////////////////// // Splat /////////////////////// diff --git a/Grid_vRealD.h b/Grid_vRealD.h index a5b59be3..c51e41cf 100644 --- a/Grid_vRealD.h +++ b/Grid_vRealD.h @@ -128,15 +128,6 @@ namespace Grid { Gextract(y,extracted); } - //////////////////////////////////////////////////////////////////////// - // FIXME: gonna remove these load/store, get, set, prefetch - //////////////////////////////////////////////////////////////////////// - void vload(dvec& a){ - this->v = a; - } - dvec vget(){ - return this->v ; - } friend inline void vsplat(vRealD &ret,double a){ #if defined (AVX1)|| defined (AVX2) diff --git a/TODO b/TODO index fb7d177a..5297e213 100644 --- a/TODO +++ b/TODO @@ -1,12 +1,12 @@ * FIXME audit -* Remove vload/store etc.. -* Replace vset with a call to merge. -* Replace vset with a call to merge. +* Replace vset with a call to merge.; +* care in Gmerge,Gextract over set. * Const audit * extract / merge extra implementation removal -* Conditional execution, where etc... -----DONE, simple test + +* Conditional execution, where etc... -----DONE, simple test * Integer relational support -----DONE * Coordinate information, integers etc... -----DONE * Integer type padding/union to vector. -----DONE @@ -22,18 +22,32 @@ -----Suggests generalised cartesian subblocking sums, returning modified grid. - Two classes of subset; -i) red black parit subsetting. - (pick checkerboard). +i) Two classes of subset; red black parity subsetting (pick checkerboard). + cartesian sub-block subsetting + ii) Need to be able to project one Grid to another Grid. + +Interface: (?) + +Lattice coarse_data SubBlockSum (GridBase *CoarseGrid, Lattice &fine_data) + +Operation ensure either: + rd[dim] divide rd[dim] fine_data + +This will give a distributed array over mpi ranks in a given dim IF coarse gd != 1 and _processors[d]>1 +Dimension can be *replicated* on all ranks in dimension. Need a "replicated" option on GridCartesian etc.. + +This will give "slice" summation and fourier projection assistance. + Generic concept is to subdivide (based on RD so applies to red/black or full). Return a type on SUB-grid from CellSum TOP-grid SUB-grid need not distribute but be replicated in some dims if that is how the cartesian communicator works. -iii) No general permutation map. +Instead of subsetting +iii) No general permutation map. * Consider switch std::vector to boost arrays. boost::multi_array A()... to replace multi1d, multi2d etc.. @@ -41,15 +55,12 @@ iii) No general permutation map. *? Cell definition <-> sliceSum. ? Replicated arrays. - - * Check for missing functionality - partially audited against QDP++ layout * Optimise the extract/merge SIMD routines; Azusa?? - -- I have collated into single location at least. - - -- Need to use _mm_*insert/extract routines. + - I have collated into single location at least. + - Need to use _mm_*insert/extract routines. * Conformable test in Cshift routines. From 526765874844641e3c0061ddc7145a8eeba0b44a Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 10 Apr 2015 05:53:09 +0200 Subject: [PATCH 046/429] Fixing the comms=none compile --- Grid_Lattice.h | 3 ++- Grid_cshift_none.h | 1 + Grid_main.cc | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Grid_Lattice.h b/Grid_Lattice.h index 01b95755..119d6181 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -15,9 +15,10 @@ public: GridBase *_grid; int checkerboard; std::vector > _odata; +public: + typedef typename vobj::scalar_type scalar_type; typedef typename vobj::vector_type vector_type; -public: Lattice(GridBase *grid) : _grid(grid) { _odata.reserve(_grid->oSites()); diff --git a/Grid_cshift_none.h b/Grid_cshift_none.h index 37d20fa3..402e52b4 100644 --- a/Grid_cshift_none.h +++ b/Grid_cshift_none.h @@ -6,6 +6,7 @@ friend Lattice Cshift(Lattice &rhs,int dimension,int shift) Lattice ret(rhs._grid); ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); Cshift_local(ret,rhs,dimension,shift); + return ret; } #endif diff --git a/Grid_main.cc b/Grid_main.cc index 770de9a3..c51aff6d 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -195,6 +195,7 @@ int main (int argc, char ** argv) LatticeCoordinate(coor,d); lex = lex + coor*mm[d]; } + /* Bar = zero; Bar = where(lex<10,Foo,Bar); { @@ -210,7 +211,8 @@ int main (int argc, char ** argv) cout<<"bar "< Date: Fri, 10 Apr 2015 05:54:02 +0200 Subject: [PATCH 047/429] where switched back on --- Grid_main.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Grid_main.cc b/Grid_main.cc index c51aff6d..8cf0dae3 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -195,7 +195,7 @@ int main (int argc, char ** argv) LatticeCoordinate(coor,d); lex = lex + coor*mm[d]; } - /* + Bar = zero; Bar = where(lex<10,Foo,Bar); { @@ -212,7 +212,7 @@ int main (int argc, char ** argv) }} }}}} } - */ + //setCheckerboard(ShiftedCheck,rFoo); //setCheckerboard(ShiftedCheck,bFoo); From 2d54ef2a521aa6bd137ce163989de74f41f67cbb Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 14 Apr 2015 20:22:04 +0100 Subject: [PATCH 048/429] Stencil code pretty much shaken out. Beginning of inner product and norm2. --- Grid.h | 1 + Grid_Lattice.h | 12 + Grid_config.h | 4 +- Grid_cshift_common.h | 2 + Grid_main.cc | 15 +- Grid_math_types.h | 3 +- Grid_simd.h | 53 +++- Grid_stencil.h | 572 ++++++++++++++++++++--------------------- Grid_stencil_common.cc | 258 +++++++++++++++++++ Grid_vComplexD.h | 7 +- Grid_vComplexF.h | 38 +-- Makefile.am | 33 ++- Makefile.in | 53 ++-- TODO | 2 +- test_Grid_jacobi.cc | 206 +++++++++++++++ test_Grid_stencil.cc | 154 +++++++++++ 16 files changed, 1050 insertions(+), 363 deletions(-) create mode 100644 Grid_stencil_common.cc create mode 100644 test_Grid_jacobi.cc create mode 100644 test_Grid_stencil.cc diff --git a/Grid.h b/Grid.h index a0989e0b..2a1072ea 100644 --- a/Grid.h +++ b/Grid.h @@ -47,6 +47,7 @@ #include #include #include +#include #include namespace Grid { diff --git a/Grid_Lattice.h b/Grid_Lattice.h index 119d6181..1e2c820e 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -407,6 +407,18 @@ public: return ret; } + template + inline RealD norm2(const Lattice &arg){ + typedef typename vobj::scalar_type scalar; + decltype(localInnerProduct(arg._odata[0],arg._odata[0])) vnrm=zero; + + scalar nrm; + for(int ss=0;ssoSites(); ss++){ + vnrm = vnrm + localInnerProduct(arg._odata[ss],arg._odata[ss]); + } + nrm = Reduce(TensorRemove(vnrm)); + return real(nrm); + } } #endif diff --git a/Grid_config.h b/Grid_config.h index deb6c74c..bb885708 100644 --- a/Grid_config.h +++ b/Grid_config.h @@ -11,10 +11,10 @@ /* #undef AVX512 */ /* GRID_COMMS_MPI */ -/* #undef GRID_COMMS_MPI */ +#define GRID_COMMS_MPI 1 /* GRID_COMMS_NONE */ -#define GRID_COMMS_NONE 1 +/* #undef GRID_COMMS_NONE */ /* Define to 1 if you have the `gettimeofday' function. */ #define HAVE_GETTIMEOFDAY 1 diff --git a/Grid_cshift_common.h b/Grid_cshift_common.h index 2910151c..e962f6ea 100644 --- a/Grid_cshift_common.h +++ b/Grid_cshift_common.h @@ -8,6 +8,7 @@ friend void Gather_plane_simple (Lattice &rhs,std::vector_rdimensions[dimension]; + printf("Gather_plane_simple buf size %d rhs size %d \n",buffer.size(),rhs._odata.size());fflush(stdout); if ( !rhs._grid->CheckerBoarded(dimension) ) { int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane @@ -18,6 +19,7 @@ friend void Gather_plane_simple (Lattice &rhs,std::vector_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ + printf("Gather_plane_simple %d ; %d %d %d\n",bo,so,o,b);fflush(stdout); buffer[bo++]=rhs._odata[so+o+b]; } o +=rhs._grid->_slice_stride[dimension]; diff --git a/Grid_main.cc b/Grid_main.cc index 8cf0dae3..13c3d9ee 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -1,10 +1,4 @@ #include "Grid.h" -#include "Grid_vRealD.h" -#include "Grid_vRealF.h" -#include "Grid_vComplexD.h" -#include "Grid_vComplexF.h" -#include "Grid_Cartesian.h" -#include "Grid_Lattice.h" using namespace std; using namespace Grid; @@ -16,13 +10,14 @@ int main (int argc, char ** argv) Grid_init(&argc,&argv); std::vector latt_size(4); + std::vector simd_layout(4); std::vector mpi_layout(4); - mpi_layout[0]=1; - mpi_layout[1]=1; - mpi_layout[2]=1; - mpi_layout[3]=1; + mpi_layout[0]=2; + mpi_layout[1]=2; + mpi_layout[2]=2; + mpi_layout[3]=2; #ifdef AVX512 for(int omp=128;omp<236;omp+=16){ diff --git a/Grid_math_types.h b/Grid_math_types.h index a2a3f97c..e3432645 100644 --- a/Grid_math_types.h +++ b/Grid_math_types.h @@ -922,9 +922,10 @@ template inline iMatrix operator - (Integer lhs,const iMatri { typedef decltype(localInnerProduct(lhs._internal[0][0],rhs._internal[0][0])) ret_t; iScalar ret=zero; + iScalar tmp; for(int c1=0;c1 ComplexF; typedef std::complex ComplexD; - typedef std::complex Complex; + inline RealF adj(const RealF & r){ return r; } inline RealF conj(const RealF & r){ return r; } @@ -54,7 +53,7 @@ namespace Grid { inline void mult(ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) * (*r); } inline void sub (ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) - (*r); } inline void add (ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) + (*r); } - inline Complex adj(const Complex& r ){ return(conj(r)); } + inline ComplexF adj(const ComplexF& r ){ return(conj(r)); } //conj already supported for complex inline void mac (RealD * __restrict__ y,const RealD * __restrict__ a,const RealD *__restrict__ x){ *y = (*a) * (*x)+(*y);} @@ -232,4 +231,52 @@ inline void Gpermute(vsimd &y,const vsimd &b,int perm){ #include #include +namespace Grid { + + // NB: Template the following on "type Complex" and then implement *,+,- for + // ComplexF, ComplexD, RealF, RealD above to + // get full generality of binops with scalars. + inline void mac (vComplexF *__restrict__ y,const ComplexF *__restrict__ a,const vComplexF *__restrict__ x){ *y = (*a)*(*x)+(*y); }; + inline void mult(vComplexF *__restrict__ y,const ComplexF *__restrict__ l,const vComplexF *__restrict__ r){ *y = (*l) * (*r); } + inline void sub (vComplexF *__restrict__ y,const ComplexF *__restrict__ l,const vComplexF *__restrict__ r){ *y = (*l) - (*r); } + inline void add (vComplexF *__restrict__ y,const ComplexF *__restrict__ l,const vComplexF *__restrict__ r){ *y = (*l) + (*r); } + inline void mac (vComplexF *__restrict__ y,const vComplexF *__restrict__ a,const ComplexF *__restrict__ x){ *y = (*a)*(*x)+(*y); }; + inline void mult(vComplexF *__restrict__ y,const vComplexF *__restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) * (*r); } + inline void sub (vComplexF *__restrict__ y,const vComplexF *__restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) - (*r); } + inline void add (vComplexF *__restrict__ y,const vComplexF *__restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) + (*r); } + + inline void mac (vComplexD *__restrict__ y,const ComplexD *__restrict__ a,const vComplexD *__restrict__ x){ *y = (*a)*(*x)+(*y); }; + inline void mult(vComplexD *__restrict__ y,const ComplexD *__restrict__ l,const vComplexD *__restrict__ r){ *y = (*l) * (*r); } + inline void sub (vComplexD *__restrict__ y,const ComplexD *__restrict__ l,const vComplexD *__restrict__ r){ *y = (*l) - (*r); } + inline void add (vComplexD *__restrict__ y,const ComplexD *__restrict__ l,const vComplexD *__restrict__ r){ *y = (*l) + (*r); } + inline void mac (vComplexD *__restrict__ y,const vComplexD *__restrict__ a,const ComplexD *__restrict__ x){ *y = (*a)*(*x)+(*y); }; + inline void mult(vComplexD *__restrict__ y,const vComplexD *__restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) * (*r); } + inline void sub (vComplexD *__restrict__ y,const vComplexD *__restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) - (*r); } + inline void add (vComplexD *__restrict__ y,const vComplexD *__restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) + (*r); } + + inline void mac (vRealF *__restrict__ y,const RealF *__restrict__ a,const vRealF *__restrict__ x){ *y = (*a)*(*x)+(*y); }; + inline void mult(vRealF *__restrict__ y,const RealF *__restrict__ l,const vRealF *__restrict__ r){ *y = (*l) * (*r); } + inline void sub (vRealF *__restrict__ y,const RealF *__restrict__ l,const vRealF *__restrict__ r){ *y = (*l) - (*r); } + inline void add (vRealF *__restrict__ y,const RealF *__restrict__ l,const vRealF *__restrict__ r){ *y = (*l) + (*r); } + inline void mac (vRealF *__restrict__ y,const vRealF *__restrict__ a,const RealF *__restrict__ x){ *y = (*a)*(*x)+(*y); }; + inline void mult(vRealF *__restrict__ y,const vRealF *__restrict__ l,const RealF *__restrict__ r){ *y = (*l) * (*r); } + inline void sub (vRealF *__restrict__ y,const vRealF *__restrict__ l,const RealF *__restrict__ r){ *y = (*l) - (*r); } + inline void add (vRealF *__restrict__ y,const vRealF *__restrict__ l,const RealF *__restrict__ r){ *y = (*l) + (*r); } + + inline void mac (vRealD *__restrict__ y,const RealD *__restrict__ a,const vRealD *__restrict__ x){ *y = (*a)*(*x)+(*y); }; + inline void mult(vRealD *__restrict__ y,const RealD *__restrict__ l,const vRealD *__restrict__ r){ *y = (*l) * (*r); } + inline void sub (vRealD *__restrict__ y,const RealD *__restrict__ l,const vRealD *__restrict__ r){ *y = (*l) - (*r); } + inline void add (vRealD *__restrict__ y,const RealD *__restrict__ l,const vRealD *__restrict__ r){ *y = (*l) + (*r); } + inline void mac (vRealD *__restrict__ y,const vRealD *__restrict__ a,const RealD *__restrict__ x){ *y = (*a)*(*x)+(*y); }; + inline void mult(vRealD *__restrict__ y,const vRealD *__restrict__ l,const RealD *__restrict__ r){ *y = (*l) * (*r); } + inline void sub (vRealD *__restrict__ y,const vRealD *__restrict__ l,const RealD *__restrict__ r){ *y = (*l) - (*r); } + inline void add (vRealD *__restrict__ y,const vRealD *__restrict__ l,const RealD *__restrict__ r){ *y = (*l) + (*r); } + + // Default precision + typedef RealD Real; + typedef std::complex Complex; + + typedef vRealD vReal; + typedef vComplexD vComplex; +} #endif diff --git a/Grid_stencil.h b/Grid_stencil.h index e10cabaa..d8debac0 100644 --- a/Grid_stencil.h +++ b/Grid_stencil.h @@ -1,11 +1,15 @@ #ifndef GRID_STENCIL_H #define GRID_STENCIL_H + ////////////////////////////////////////////////////////////////////////////////////////// // Must not lose sight that goal is to be able to construct really efficient -// gather to a point stencil code. CSHIFT is not the best way, so probably need +// gather to a point stencil code. CSHIFT is not the best way, so need // additional stencil support. // -// Stencil based code could pre-exchange haloes and use a table lookup for neighbours +// Stencil based code will pre-exchange haloes and use a table lookup for neighbours. +// This will be done with generality to allow easier efficient implementations. +// Overlap of comms and compute could be semi-automated by tabulating off-node connected, +// and // // Lattice could also allocate haloes which get used for stencil code. // @@ -35,329 +39,313 @@ namespace Grid { - class Stencil { + struct CommsRequest { + int words; + int unified_buffer_offset; + int tag; + int to_rank; + int from_rank; + } ; + + class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal fill in. public: - Stencil(GridBase *grid, - int npoints, - int checkerboard, - std::vector directions, - std::vector distances); - - void Stencil_local (int dimension,int shift,int cbmask); - void Stencil_comms (int dimension,int shift,int cbmask); - void Stencil_comms_simd(int dimension,int shift,int cbmask); - - // Will need to implement actions for - Copy_plane; - Copy_plane_permute; - Gather_plane; - - // The offsets to all neibours in stencil in each direction int _checkerboard; int _npoints; // Move to template param? GridBase * _grid; - - // Store these as SIMD Integer needed - // - // std::vector< iVector > _offsets; - // std::vector< iVector > _local; - // std::vector< iVector > _comm_buf_size; - // std::vector< iVector > _permute; - - std::vector > _offsets; - std::vector > _local; + + // npoints of these + std::vector _directions; + std::vector _distances; std::vector _comm_buf_size; - std::vector _permute; + std::vector _permute_type; - }; + // npoints x Osites() of these + std::vector > _offsets; + std::vector > _is_local; + std::vector > _permute; - Stencil::Stencil(GridBase *grid, - int npoints, - int checkerboard, - std::vector directions, - std::vector distances){ - - _npoints = npoints; - _grid = grid; - - for(int i=0;i CommsRequests; - int fd = _grid->_fdimensions[dimension]; - int rd = _grid->_rdimensions[dimension]; + CartesianStencil(GridBase *grid, + int npoints, + int checkerboard, + const std::vector &directions, + const std::vector &distances); - _checkerboard = checkerboard; - // the permute type - int simd_layout = _grid->_simd_layout[dimension]; - int comm_dim = _grid->_processors[dimension] >1 ; - int splice_dim = _grid->_simd_layout[dimension]>1 && (comm_dim); + // Add to tables for various cases; is this mistaken. only local if 1 proc in dim + // Can this be avoided with simpler coding of comms? + void Local (int point, int dimension,int shift,int cbmask); + void Comms (int point, int dimension,int shift,int cbmask); + void CopyPlane(int point, int dimension,int lplane,int rplane,int cbmask,int permute); + void ScatterPlane (int point,int dimension,int plane,int cbmask,int offset); - int sshift[2]; + // Could allow a functional munging of the halo to another type during the comms. + // this could implement the 16bit/32bit/64bit compression. + template void HaloExchange(Lattice &source, + std::vector > &u_comm_buf) + { + // conformable(source._grid,_grid); + assert(source._grid==_grid); + if (u_comm_buf.size() != _unified_buffer_size ) u_comm_buf.resize(_unified_buffer_size); + int u_comm_offset=0; - if ( !comm_dim ) { - sshift[0] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,0); - sshift[1] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,1); + // Gather all comms buffers + typedef typename vobj::vector_type vector_type; + typedef typename vobj::scalar_type scalar_type; - if ( sshift[0] == sshift[1] ) { - Stencil_local(dimension,shift,0x3); - } else { - Stencil_local(dimension,shift,0x1);// if checkerboard is unfavourable take two passes - Stencil_local(dimension,shift,0x2);// both with block stride loop iteration - } - } else if ( splice_dim ) { - sshift[0] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,0); - sshift[1] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,1); + for(int point = 0 ; point < _npoints; point++) { + + printf("Point %d \n",point);fflush(stdout); + int dimension = _directions[point]; + int displacement = _distances[point]; - if ( sshift[0] == sshift[1] ) { - Stencil_comms_simd(dimension,shift,0x3); - } else { - Stencil_comms_simd(dimension,shift,0x1);// if checkerboard is unfavourable take two passes - Stencil_comms_simd(dimension,shift,0x2);// both with block stride loop iteration - } - } else { - // Cshift_comms(ret,rhs,dimension,shift); - sshift[0] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,0); - sshift[1] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,1); - if ( sshift[0] == sshift[1] ) { - Stencil_comms(dimension,shift,0x3); - } else { - Stencil_comms(dimension,shift,0x1);// if checkerboard is unfavourable take two passes - Stencil_comms(dimension,shift,0x2);// both with block stride loop iteration + int fd = _grid->_fdimensions[dimension]; + int rd = _grid->_rdimensions[dimension]; + + + // Map to always positive shift modulo global full dimension. + int shift = (displacement+fd)%fd; + + int checkerboard = _grid->CheckerBoardDestination(source.checkerboard,shift); + assert (checkerboard== _checkerboard); + + // the permute type + int simd_layout = _grid->_simd_layout[dimension]; + int comm_dim = _grid->_processors[dimension] >1 ; + int splice_dim = _grid->_simd_layout[dimension]>1 && (comm_dim); + + // Gather phase + int sshift [2]; + if ( comm_dim ) { + sshift[0] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,0); + sshift[1] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,1); + if ( sshift[0] == sshift[1] ) { + if (splice_dim) { + printf("splice 0x3 \n");fflush(stdout); + GatherStartCommsSimd(source,dimension,shift,0x3,u_comm_buf,u_comm_offset); + } else { + printf("NO splice 0x3 \n");fflush(stdout); + GatherStartComms(source,dimension,shift,0x3,u_comm_buf,u_comm_offset); + } + } else { + if(splice_dim){ + printf("splice 0x1,2 \n");fflush(stdout); + GatherStartCommsSimd(source,dimension,shift,0x1,u_comm_buf,u_comm_offset);// if checkerboard is unfavourable take two passes + GatherStartCommsSimd(source,dimension,shift,0x2,u_comm_buf,u_comm_offset);// both with block stride loop iteration + } else { + printf("NO splice 0x1,2 \n");fflush(stdout); + GatherStartComms(source,dimension,shift,0x1,u_comm_buf,u_comm_offset); + GatherStartComms(source,dimension,shift,0x2,u_comm_buf,u_comm_offset); + } + } } } } - } - - void Stencil::Stencil_local (int dimension,int shift,int cbmask) - { - int fd = _grid->_fdimensions[dimension]; - int rd = _grid->_rdimensions[dimension]; - int ld = _grid->_ldimensions[dimension]; - int gd = _grid->_gdimensions[dimension]; - - // Map to always positive shift modulo global full dimension. - shift = (shift+fd)%fd; - - // the permute type - int permute_dim =_grid->PermuteDim(dimension); - int permute_type=_grid->PermuteType(dimension); - - for(int x=0;x void GatherStartComms(Lattice &rhs,int dimension,int shift,int cbmask, + std::vector > &u_comm_buf, + int &u_comm_offset) + { + typedef typename vobj::vector_type vector_type; + typedef typename vobj::scalar_type scalar_type; - int o = 0; - int bo = x * _grid->_ostride[dimension]; + GridBase *grid=_grid; + assert(rhs._grid==_grid); + // conformable(_grid,rhs._grid); + + int fd = _grid->_fdimensions[dimension]; + int rd = _grid->_rdimensions[dimension]; + int simd_layout = _grid->_simd_layout[dimension]; + int comm_dim = _grid->_processors[dimension] >1 ; + assert(simd_layout==1); + assert(comm_dim==1); + assert(shift>=0); + assert(shift_slice_nblock[dimension]*_grid->_slice_block[dimension]; + + std::vector > send_buf(buffer_size); // hmm... + std::vector > recv_buf(buffer_size); int cb= (cbmask==0x2)? 1 : 0; + int sshift= _grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,cb); - int sshift = _grid->CheckerBoardShift(_checkerboard,dimension,shift,cb); - int sx = (x+sshift)%rd; - - int permute_slice=0; - if(permute_dim){ - int wrap = sshift/rd; - int num = sshift%rd; - if ( x< rd-num ) permute_slice=wrap; - else permute_slice = 1-wrap; - } - - if ( permute_slice ) Copy_plane_permute(dimension,x,sx,cbmask,permute_type); - else Copy_plane (dimension,x,sx,cbmask); - - } - } - - void Stencil::Stencil_comms (int dimension,int shift,int cbmask) - { - typedef typename vobj::vector_type vector_type; - typedef typename vobj::scalar_type scalar_type; - - GridBase *grid=_grid; - - int fd = _grid->_fdimensions[dimension]; - int rd = _grid->_rdimensions[dimension]; - int simd_layout = _grid->_simd_layout[dimension]; - int comm_dim = _grid->_processors[dimension] >1 ; - - assert(simd_layout==1); - assert(comm_dim==1); - assert(shift>=0); - assert(shift_slice_nblock[dimension]*rhs._grid->_slice_block[dimension]; - // FIXME: Do something with buffer_size?? - - int cb= (cbmask==0x2)? 1 : 0; - int sshift= _grid->CheckerBoardShift(_checkerboard,dimension,shift,cb); - - for(int x=0;x= rd ); - int sx = (x+sshift)%rd; - int comm_proc = (x+sshift)/rd; - - if (!offnode) { + for(int x=0;x= rd ); + int sx = (x+sshift)%rd; + int comm_proc = (x+sshift)/rd; - } else { - - int words = send_buf.size(); - if (cbmask != 0x3) words=words>>1; - - int bytes = words * sizeof(vobj); - - Gather_plane_simple (dimension,sx,cbmask); - - int rank = grid->_processor; - int recv_from_rank; - int xmit_to_rank; - grid->ShiftedRanks(dimension,comm_proc,xmit_to_rank,recv_from_rank); - /* - grid->SendToRecvFrom((void *)&send_buf[0], - xmit_to_rank, - (void *)&recv_buf[0], - recv_from_rank, - bytes); - */ - Scatter_plane_simple (dimension,x,cbmask); - } - } - } - - void Stencil::Stencil_comms_simd(int dimension,int shift,int cbmask) - { - GridBase *grid=_grid; - const int Nsimd = _grid->Nsimd(); - typedef typename vobj::vector_type vector_type; - typedef typename vobj::scalar_type scalar_type; - - int fd = _grid->_fdimensions[dimension]; - int rd = _grid->_rdimensions[dimension]; - int ld = _grid->_ldimensions[dimension]; - int simd_layout = _grid->_simd_layout[dimension]; - int comm_dim = _grid->_processors[dimension] >1 ; - - assert(comm_dim==1); - assert(simd_layout==2); - assert(shift>=0); - assert(shiftPermuteType(dimension); - - /////////////////////////////////////////////// - // Simd direction uses an extract/merge pair - /////////////////////////////////////////////// - int buffer_size = _grid->_slice_nblock[dimension]*grid->_slice_block[dimension]; - // FIXME do something with buffer size - - std::vector pointers(Nsimd); // - std::vector rpointers(Nsimd); // received pointers - - /////////////////////////////////////////// - // Work out what to send where - /////////////////////////////////////////// - - int cb = (cbmask==0x2)? 1 : 0; - int sshift= _grid->CheckerBoardShift(_checkerboard,dimension,shift,cb); - - std::vector comm_offnode(simd_layout); - std::vector comm_proc (simd_layout); //relative processor coord in dim=dimension - std::vector icoor(grid->Nd()); - - for(int x=0;x= ld; - comm_any = comm_any | comm_offnode[s]; - comm_proc[s] = shifted_x/ld; - } - - int o = 0; - int bo = x*grid->_ostride[dimension]; - int sx = (x+sshift)%rd; - - if ( comm_any ) { - - for(int i=0;iiCoorFromIindex(icoor,i); - s = icoor[dimension]; + printf("GatherStartComms offnode x %d\n",x);fflush(stdout); + int words = send_buf.size(); + if (cbmask != 0x3) words=words>>1; + + int bytes = words * sizeof(vobj); + + printf("Gather_plane_simple dimension %d sx %d cbmask %d\n",dimension,sx,cbmask);fflush(stdout); + Gather_plane_simple (rhs,send_buf,dimension,sx,cbmask); + + printf("GatherStartComms gathered offnode x %d\n",x);fflush(stdout); + + int rank = _grid->_processor; + int recv_from_rank; + int xmit_to_rank; + _grid->ShiftedRanks(dimension,comm_proc,xmit_to_rank,recv_from_rank); - if(comm_offnode[s]){ - - int rank = grid->_processor; - int recv_from_rank; - int xmit_to_rank; - grid->ShiftedRanks(dimension,comm_proc[s],xmit_to_rank,recv_from_rank); - - /* - grid->SendToRecvFrom((void *)&send_buf_extract[i][0], - xmit_to_rank, - (void *)&recv_buf_extract[i][0], - recv_from_rank, - bytes); - */ - - rpointers[i] = (scalar_type *)&recv_buf_extract[i][0]; - - } else { - - rpointers[i] = (scalar_type *)&send_buf_extract[i][0]; + // FIXME Implement asynchronous send & also avoid buffer copy + _grid->SendToRecvFrom((void *)&send_buf[0], + xmit_to_rank, + (void *)&recv_buf[0], + recv_from_rank, + bytes); + printf("GatherStartComms communicated offnode x %d\n",x);fflush(stdout); + printf("GatherStartComms inserting %d buf size %d\n",u_comm_offset,buffer_size);fflush(stdout); + for(int i=0;i>(permute_type+1)); - int PermuteMap; - for(int i=0;i + void GatherStartCommsSimd(Lattice &rhs,int dimension,int shift,int cbmask, + std::vector > &u_comm_buf, + int &u_comm_offset) + { + const int Nsimd = _grid->Nsimd(); + typedef typename vobj::vector_type vector_type; + typedef typename vobj::scalar_type scalar_type; + + int fd = _grid->_fdimensions[dimension]; + int rd = _grid->_rdimensions[dimension]; + int ld = _grid->_ldimensions[dimension]; + int simd_layout = _grid->_simd_layout[dimension]; + int comm_dim = _grid->_processors[dimension] >1 ; + + assert(comm_dim==1); + assert(simd_layout==2); + assert(shift>=0); + assert(shiftPermuteType(dimension); + + /////////////////////////////////////////////// + // Simd direction uses an extract/merge pair + /////////////////////////////////////////////// + int buffer_size = _grid->_slice_nblock[dimension]*_grid->_slice_block[dimension]; + int words = sizeof(vobj)/sizeof(vector_type); + + /* FIXME ALTERNATE BUFFER DETERMINATION */ + std::vector > send_buf_extract(Nsimd,std::vector(buffer_size*words) ); + std::vector > recv_buf_extract(Nsimd,std::vector(buffer_size*words) ); + int bytes = buffer_size*words*sizeof(scalar_type); + + std::vector pointers(Nsimd); // + std::vector rpointers(Nsimd); // received pointers + + /////////////////////////////////////////// + // Work out what to send where + /////////////////////////////////////////// + + int cb = (cbmask==0x2)? 1 : 0; + int sshift= _grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,cb); + + std::vector comm_offnode(simd_layout); + std::vector comm_proc (simd_layout); //relative processor coord in dim=dimension + std::vector icoor(_grid->Nd()); + + for(int x=0;x= ld; + comm_any = comm_any | comm_offnode[s]; + comm_proc[s] = shifted_x/ld; + } + + int o = 0; + int bo = x*_grid->_ostride[dimension]; + int sx = (x+sshift)%rd; + + if ( comm_any ) { + + for(int i=0;iiCoorFromIindex(icoor,i); + s = icoor[dimension]; + + if(comm_offnode[s]){ + + int rank = _grid->_processor; + int recv_from_rank; + int xmit_to_rank; + + _grid->ShiftedRanks(dimension,comm_proc[s],xmit_to_rank,recv_from_rank); + + + _grid->SendToRecvFrom((void *)&send_buf_extract[i][0], + xmit_to_rank, + (void *)&recv_buf_extract[i][0], + recv_from_rank, + bytes); + + rpointers[i] = (scalar_type *)&recv_buf_extract[i][0]; + + } else { + + rpointers[i] = (scalar_type *)&send_buf_extract[i][0]; + + } + + } + + // Permute by swizzling pointers in merge + int permute_slice=0; + int lshift=sshift%ld; + int wrap =lshift/rd; + int num =lshift%rd; + + if ( x< rd-num ) permute_slice=wrap; + else permute_slice = 1-wrap; + + int toggle_bit = (Nsimd>>(permute_type+1)); + int PermuteMap; + for(int i=0;i &directions, + const std::vector &distances) + : _offsets(npoints), + _is_local(npoints), + _comm_buf_size(npoints), + _permute_type(npoints), + _permute(npoints) + { + _npoints = npoints; + _grid = grid; + _directions = directions; + _distances = distances; + _unified_buffer_size=0; + _request_count =0; + CommsRequests.resize(0); + + int osites = _grid->oSites(); + + for(int i=0;i_fdimensions[dimension]; + int rd = _grid->_rdimensions[dimension]; + _permute_type[point]=_grid->PermuteType(dimension); + + _checkerboard = checkerboard; + + // the permute type + int simd_layout = _grid->_simd_layout[dimension]; + int comm_dim = _grid->_processors[dimension] >1 ; + int splice_dim = _grid->_simd_layout[dimension]>1 && (comm_dim); + + int sshift[2]; + + // Underlying approach. For each local site build + // up a table containing the npoint "neighbours" and whether they + // live in lattice or a comms buffer. + if ( !comm_dim ) { + sshift[0] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,0); + sshift[1] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,1); + + if ( sshift[0] == sshift[1] ) { + Local(point,dimension,shift,0x3); + } else { + Local(point,dimension,shift,0x1);// if checkerboard is unfavourable take two passes + Local(point,dimension,shift,0x2);// both with block stride loop iteration + } + } else { // All permute extract done in comms phase prior to Stencil application + // So tables are the same whether comm_dim or splice_dim + sshift[0] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,0); + sshift[1] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,1); + if ( sshift[0] == sshift[1] ) { + Comms(point,dimension,shift,0x3); + } else { + Comms(point,dimension,shift,0x1);// if checkerboard is unfavourable take two passes + Comms(point,dimension,shift,0x2);// both with block stride loop iteration + } + } + } + } + + + void CartesianStencil::Local (int point, int dimension,int shift,int cbmask) + { + int fd = _grid->_fdimensions[dimension]; + int rd = _grid->_rdimensions[dimension]; + int ld = _grid->_ldimensions[dimension]; + int gd = _grid->_gdimensions[dimension]; + + // Map to always positive shift modulo global full dimension. + shift = (shift+fd)%fd; + + // the permute type + int permute_dim =_grid->PermuteDim(dimension); + + for(int x=0;x_ostride[dimension]; + + int cb= (cbmask==0x2)? 1 : 0; + + int sshift = _grid->CheckerBoardShift(_checkerboard,dimension,shift,cb); + int sx = (x+sshift)%rd; + + int permute_slice=0; + if(permute_dim){ + int wrap = sshift/rd; + int num = sshift%rd; + if ( x< rd-num ) permute_slice=wrap; + else permute_slice = 1-wrap; + } + + CopyPlane(point,dimension,x,sx,cbmask,permute_slice); + + } + } + + void CartesianStencil::Comms (int point,int dimension,int shift,int cbmask) + { + GridBase *grid=_grid; + + int fd = _grid->_fdimensions[dimension]; + int rd = _grid->_rdimensions[dimension]; + int simd_layout = _grid->_simd_layout[dimension]; + int comm_dim = _grid->_processors[dimension] >1 ; + + assert(simd_layout==1); + assert(comm_dim==1); + assert(shift>=0); + assert(shift_slice_nblock[dimension]*_grid->_slice_block[dimension]; + _comm_buf_size[point] = buffer_size; // Size of _one_ plane. Multiple planes may be gathered and + // send to one or more remote nodes. + + int cb= (cbmask==0x2)? 1 : 0; + int sshift= _grid->CheckerBoardShift(_checkerboard,dimension,shift,cb); + + for(int x=0;x= rd ); + int sx = (x+sshift)%rd; + int comm_proc = (x+sshift)/rd; + + if (!offnode) { + + int permute_slice=0; + CopyPlane(point,dimension,x,sx,cbmask,permute_slice); + + } else { + + int words = buffer_size; + if (cbmask != 0x3) words=words>>1; + + // GatherPlaneSimple (point,dimension,sx,cbmask); + + int rank = grid->_processor; + int recv_from_rank; + int xmit_to_rank; + + CommsRequest cr; + + cr.tag = _request_count++; + cr.words = words; + cr.unified_buffer_offset = _unified_buffer_size; + _unified_buffer_size += words; + grid->ShiftedRanks(dimension,comm_proc,cr.to_rank,cr.from_rank); + + CommsRequests.push_back(cr); + + ScatterPlane(point,dimension,x,cbmask,cr.unified_buffer_offset); // permute/extract/merge is done in comms phase + + } + } + } + // Routine builds up integer table for each site in _offsets, _is_local, _permute + void CartesianStencil::CopyPlane(int point, int dimension,int lplane,int rplane,int cbmask,int permute) + { + int rd = _grid->_rdimensions[dimension]; + + if ( !_grid->CheckerBoarded(dimension) ) { + + int o = 0; // relative offset to base within plane + int ro = rplane*_grid->_ostride[dimension]; // base offset for start of plane + int lo = lplane*_grid->_ostride[dimension]; // offset in buffer + + // Simple block stride gather of SIMD objects + for(int n=0;n<_grid->_slice_nblock[dimension];n++){ + for(int b=0;b<_grid->_slice_block[dimension];b++){ + _offsets [point][lo+o+b]=ro+o+b; + _is_local[point][lo+o+b]=1; + _permute [point][lo+o+b]=permute; + } + o +=_grid->_slice_stride[dimension]; + } + + } else { + + int ro = rplane*_grid->_ostride[dimension]; // base offset for start of plane + int lo = lplane*_grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + + for(int n=0;n<_grid->_slice_nblock[dimension];n++){ + for(int b=0;b<_grid->_slice_block[dimension];b++){ + + int ocb=1<<_grid->CheckerBoardFromOindex(o+b); + + if ( ocb&cbmask ) { + _offsets [point][lo+o+b]=ro+o+b; + _is_local[point][lo+o+b]=1; + _permute [point][lo+o+b]=permute; + } + + } + o +=_grid->_slice_stride[dimension]; + } + + } + } + // Routine builds up integer table for each site in _offsets, _is_local, _permute + void CartesianStencil::ScatterPlane (int point,int dimension,int plane,int cbmask,int offset) + { + int rd = _grid->_rdimensions[dimension]; + + if ( !_grid->CheckerBoarded(dimension) ) { + + int so = plane*_grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + + // Simple block stride gather of SIMD objects + for(int n=0;n<_grid->_slice_nblock[dimension];n++){ + for(int b=0;b<_grid->_slice_block[dimension];b++){ + _offsets [point][so+o+b]=offset+(bo++); + _is_local[point][so+o+b]=0; + _permute [point][so+o+b]=0; + } + o +=_grid->_slice_stride[dimension]; + } + + } else { + + int so = plane*_grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + + for(int n=0;n<_grid->_slice_nblock[dimension];n++){ + for(int b=0;b<_grid->_slice_block[dimension];b++){ + + int ocb=1<<_grid->CheckerBoardFromOindex(o+b);// Could easily be a table lookup + if ( ocb & cbmask ) { + _offsets [point][so+o+b]=offset+(bo++); + _is_local[point][so+o+b]=0; + _permute [point][so+o+b]=0; + } + } + o +=_grid->_slice_stride[dimension]; + } + } + } +} diff --git a/Grid_vComplexD.h b/Grid_vComplexD.h index 3278b15e..f1c335e8 100644 --- a/Grid_vComplexD.h +++ b/Grid_vComplexD.h @@ -194,6 +194,8 @@ namespace Grid { float b= imag(c); vsplat(ret,a,b); } + + friend inline void vsplat(vComplexD &ret,double rl,double ig){ #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_pd(ig,rl,ig,rl); @@ -321,13 +323,14 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ { return l*r; } - inline vComplex trace(const vComplex &arg){ + inline vComplexD trace(const vComplexD &arg){ return arg; } ///////////////////////////////////////////////////////////////////////// //// Generic routine to promote object -> object //// Supports the array reordering transformation that gives me SIMD utilisation /////////////////////////////////////////////////////////////////////////// +/* template class object> inline object splat(objects){ object ret; @@ -338,6 +341,6 @@ inline object splat(objects){ } return ret; } - +*/ } #endif diff --git a/Grid_vComplexF.h b/Grid_vComplexF.h index b6b7ebe9..18cf1749 100644 --- a/Grid_vComplexF.h +++ b/Grid_vComplexF.h @@ -3,6 +3,16 @@ #include "Grid.h" namespace Grid { + + /* + inline void Print(const char *A,cvec c) { + float *fp=(float *)&c; + printf(A); + printf(" %le %le %le %le %le %le %le %le\n", + fp[0],fp[1],fp[2],fp[3],fp[4],fp[5],fp[6],fp[7]); + } + */ + class vComplexF { // protected: @@ -108,7 +118,7 @@ namespace Grid { ymm1 = _mm256_shuffle_ps(b.v,b.v,_MM_SHUFFLE(2,3,0,1)); // ymm1 <- br,bi ymm2 = _mm256_shuffle_ps(a.v,a.v,_MM_SHUFFLE(3,3,1,1)); // ymm2 <- ai,ai ymm1 = _mm256_mul_ps(ymm1,ymm2); // ymm1 <- br ai, ai bi - ret.v= _mm256_addsub_ps(ymm0,ymm1); // FIXME -- AVX2 could MAC + ret.v= _mm256_addsub_ps(ymm0,ymm1); #endif #ifdef SSE2 cvec ymm0,ymm1,ymm2; @@ -142,7 +152,7 @@ namespace Grid { //////////////////////////////////////////////////////////////////////// // FIXME: gonna remove these load/store, get, set, prefetch //////////////////////////////////////////////////////////////////////// - friend inline void vset(vComplexF &ret, Complex *a){ + friend inline void vset(vComplexF &ret, ComplexF *a){ #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_ps(a[3].imag(),a[3].real(),a[2].imag(),a[2].real(),a[1].imag(),a[1].real(),a[0].imag(),a[0].real()); #endif @@ -216,12 +226,12 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ #endif } - friend inline vComplexF operator * (const Complex &a, vComplexF b){ + friend inline vComplexF operator * (const ComplexF &a, vComplexF b){ vComplexF va; vsplat(va,a); return va*b; } - friend inline vComplexF operator * (vComplexF b,const Complex &a){ + friend inline vComplexF operator * (vComplexF b,const ComplexF &a){ return a*b; } @@ -283,22 +293,11 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ } */ - // NB: Template the following on "type Complex" and then implement *,+,- for - // ComplexF, ComplexD, RealF, RealD above to - // get full generality of binops with scalars. - friend inline void mac (vComplexF *__restrict__ y,const Complex *__restrict__ a,const vComplexF *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - friend inline void mult(vComplexF *__restrict__ y,const Complex *__restrict__ l,const vComplexF *__restrict__ r){ *y = (*l) * (*r); } - friend inline void sub (vComplexF *__restrict__ y,const Complex *__restrict__ l,const vComplexF *__restrict__ r){ *y = (*l) - (*r); } - friend inline void add (vComplexF *__restrict__ y,const Complex *__restrict__ l,const vComplexF *__restrict__ r){ *y = (*l) + (*r); } - friend inline void mac (vComplexF *__restrict__ y,const vComplexF *__restrict__ a,const Complex *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - friend inline void mult(vComplexF *__restrict__ y,const vComplexF *__restrict__ l,const Complex *__restrict__ r){ *y = (*l) * (*r); } - friend inline void sub (vComplexF *__restrict__ y,const vComplexF *__restrict__ l,const Complex *__restrict__ r){ *y = (*l) - (*r); } - friend inline void add (vComplexF *__restrict__ y,const vComplexF *__restrict__ l,const Complex *__restrict__ r){ *y = (*l) + (*r); } - /////////////////////// // Conjugate /////////////////////// + friend inline vComplexF conj(const vComplexF &in){ vComplexF ret ; vzero(ret); #if defined (AVX1)|| defined (AVX2) @@ -363,10 +362,11 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ }; - inline vComplexF localInnerProduct(const vComplexF & l, const vComplexF & r) { return conj(l)*r; } + inline vComplexF localInnerProduct(const vComplexF & l, const vComplexF & r) + { + return conj(l)*r; + } - typedef vComplexF vFComplex; - typedef vComplexF vComplex; inline void zeroit(vComplexF &z){ vzero(z);} inline vComplexF outerProduct(const vComplexF &l, const vComplexF& r) diff --git a/Makefile.am b/Makefile.am index d11f28d5..e306eb56 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,11 +1,22 @@ # additional include paths necessary to compile the C++ library AM_CXXFLAGS = -I$(top_srcdir)/ + +extra_sources= +if BUILD_COMMS_MPI + extra_sources+=Grid_communicator_mpi.cc + extra_sources+=Grid_stencil_common.cc +endif +if BUILD_COMMS_NONE + extra_sources+=Grid_communicator_fake.cc + extra_sources+=Grid_stencil_common.cc +endif + # # Libraries # lib_LIBRARIES = libGrid.a -libGrid_a_SOURCES = Grid_init.cc +libGrid_a_SOURCES = Grid_init.cc $(extra_sources) # # Include files @@ -26,24 +37,18 @@ include_HEADERS = Grid_config.h\ Grid_cshift_common.h\ Grid_cshift_mpi.h\ Grid_cshift_none.h\ + Grid_stencil.h\ Grid_math_types.h # # Test code # -bin_PROGRAMS = Grid_main - -extra_sources= -if BUILD_COMMS_MPI - extra_sources+=Grid_communicator_mpi.cc -endif -if BUILD_COMMS_NONE - extra_sources+=Grid_communicator_fake.cc -endif - -Grid_main_SOURCES = \ - Grid_main.cc\ - $(extra_sources) +bin_PROGRAMS = Grid_main test_Grid_stencil +Grid_main_SOURCES = Grid_main.cc Grid_main_LDADD = libGrid.a + +test_Grid_stencil_SOURCES = test_Grid_Stencil.cc +test_Grid_stencil_LDADD = libGrid.a + diff --git a/Makefile.in b/Makefile.in index 16981e52..11b86688 100644 --- a/Makefile.in +++ b/Makefile.in @@ -88,9 +88,11 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -bin_PROGRAMS = Grid_main$(EXEEXT) -@BUILD_COMMS_MPI_TRUE@am__append_1 = Grid_communicator_mpi.cc -@BUILD_COMMS_NONE_TRUE@am__append_2 = Grid_communicator_fake.cc +@BUILD_COMMS_MPI_TRUE@am__append_1 = Grid_communicator_mpi.cc \ +@BUILD_COMMS_MPI_TRUE@ Grid_stencil_common.cc +@BUILD_COMMS_NONE_TRUE@am__append_2 = Grid_communicator_fake.cc \ +@BUILD_COMMS_NONE_TRUE@ Grid_stencil_common.cc +bin_PROGRAMS = Grid_main$(EXEEXT) test_Grid_stencil$(EXEEXT) subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac @@ -142,18 +144,23 @@ am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libGrid_a_AR = $(AR) $(ARFLAGS) libGrid_a_LIBADD = -am_libGrid_a_OBJECTS = Grid_init.$(OBJEXT) +am__libGrid_a_SOURCES_DIST = Grid_init.cc Grid_communicator_mpi.cc \ + Grid_stencil_common.cc Grid_communicator_fake.cc +@BUILD_COMMS_MPI_TRUE@am__objects_1 = Grid_communicator_mpi.$(OBJEXT) \ +@BUILD_COMMS_MPI_TRUE@ Grid_stencil_common.$(OBJEXT) +@BUILD_COMMS_NONE_TRUE@am__objects_2 = \ +@BUILD_COMMS_NONE_TRUE@ Grid_communicator_fake.$(OBJEXT) \ +@BUILD_COMMS_NONE_TRUE@ Grid_stencil_common.$(OBJEXT) +am__objects_3 = $(am__objects_1) $(am__objects_2) +am_libGrid_a_OBJECTS = Grid_init.$(OBJEXT) $(am__objects_3) libGrid_a_OBJECTS = $(am_libGrid_a_OBJECTS) PROGRAMS = $(bin_PROGRAMS) -am__Grid_main_SOURCES_DIST = Grid_main.cc Grid_communicator_mpi.cc \ - Grid_communicator_fake.cc -@BUILD_COMMS_MPI_TRUE@am__objects_1 = Grid_communicator_mpi.$(OBJEXT) -@BUILD_COMMS_NONE_TRUE@am__objects_2 = \ -@BUILD_COMMS_NONE_TRUE@ Grid_communicator_fake.$(OBJEXT) -am__objects_3 = $(am__objects_1) $(am__objects_2) -am_Grid_main_OBJECTS = Grid_main.$(OBJEXT) $(am__objects_3) +am_Grid_main_OBJECTS = Grid_main.$(OBJEXT) Grid_main_OBJECTS = $(am_Grid_main_OBJECTS) Grid_main_DEPENDENCIES = libGrid.a +am_test_Grid_stencil_OBJECTS = test_Grid_Stencil.$(OBJEXT) +test_Grid_stencil_OBJECTS = $(am_test_Grid_stencil_OBJECTS) +test_Grid_stencil_DEPENDENCIES = libGrid.a AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false @@ -183,8 +190,10 @@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = -SOURCES = $(libGrid_a_SOURCES) $(Grid_main_SOURCES) -DIST_SOURCES = $(libGrid_a_SOURCES) $(am__Grid_main_SOURCES_DIST) +SOURCES = $(libGrid_a_SOURCES) $(Grid_main_SOURCES) \ + $(test_Grid_stencil_SOURCES) +DIST_SOURCES = $(am__libGrid_a_SOURCES_DIST) $(Grid_main_SOURCES) \ + $(test_Grid_stencil_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -329,12 +338,13 @@ top_srcdir = @top_srcdir@ # additional include paths necessary to compile the C++ library AM_CXXFLAGS = -I$(top_srcdir)/ +extra_sources = $(am__append_1) $(am__append_2) # # Libraries # lib_LIBRARIES = libGrid.a -libGrid_a_SOURCES = Grid_init.cc +libGrid_a_SOURCES = Grid_init.cc $(extra_sources) # # Include files @@ -355,14 +365,13 @@ include_HEADERS = Grid_config.h\ Grid_cshift_common.h\ Grid_cshift_mpi.h\ Grid_cshift_none.h\ + Grid_stencil.h\ Grid_math_types.h -extra_sources = $(am__append_1) $(am__append_2) -Grid_main_SOURCES = \ - Grid_main.cc\ - $(extra_sources) - +Grid_main_SOURCES = Grid_main.cc Grid_main_LDADD = libGrid.a +test_Grid_stencil_SOURCES = test_Grid_Stencil.cc +test_Grid_stencil_LDADD = libGrid.a all: Grid_config.h $(MAKE) $(AM_MAKEFLAGS) all-am @@ -499,6 +508,10 @@ Grid_main$(EXEEXT): $(Grid_main_OBJECTS) $(Grid_main_DEPENDENCIES) $(EXTRA_Grid_ @rm -f Grid_main$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(Grid_main_OBJECTS) $(Grid_main_LDADD) $(LIBS) +test_Grid_stencil$(EXEEXT): $(test_Grid_stencil_OBJECTS) $(test_Grid_stencil_DEPENDENCIES) $(EXTRA_test_Grid_stencil_DEPENDENCIES) + @rm -f test_Grid_stencil$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(test_Grid_stencil_OBJECTS) $(test_Grid_stencil_LDADD) $(LIBS) + mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -509,6 +522,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_communicator_mpi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_stencil_common.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_Grid_Stencil.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< diff --git a/TODO b/TODO index 5297e213..665e3a55 100644 --- a/TODO +++ b/TODO @@ -3,7 +3,7 @@ * Replace vset with a call to merge.; * care in Gmerge,Gextract over set. * Const audit -* extract / merge extra implementation removal +* extract / merge extra implementation removal * Conditional execution, where etc... -----DONE, simple test diff --git a/test_Grid_jacobi.cc b/test_Grid_jacobi.cc new file mode 100644 index 00000000..95e808f1 --- /dev/null +++ b/test_Grid_jacobi.cc @@ -0,0 +1,206 @@ +#include "Grid.h" + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +template +class LinearOperator { +public: + operator () (const Lattice&src,Lattice &result) {}; +}; + +template +class LinearOperatorJacobi : public LinearOperator +{ + CartesianStencil *Stencil; + GridBase *_grid; + std::vector > comm_buf; + LinearOperatorJacobi(GridCartesian *grid) + { + _grid = grid; + int npoint=9; + std::vector directions(npoint); + std::vector displacements(npoint); + for(int mu=0;mu<4;mu++){ + for(int mp=0;mp<2;mp++){ + int dir = 2*mu+mp; + directions[dir] = mu; + displacements[dir]= -1+2*mp; + } + } + directions[8] = 0; + displacements[8] = 0; + + Stencil = new CartesianStencil(grid,npoint,0,directions,displacements); + + comm_buf.resize(Stencil->_unified_buffer_size); + + } + operator () (const Lattice&src,Lattice &result) + { + const int npoint=9; + printf("calling halo exchange\n");fflush(stdout); + myStencil.HaloExchange(Foo,comm_buf); + vobj tmp; + vobj + for(int i=0;i<_grid->oSites();i++){ + for(int p=0;p_offsets [p][i]; + int local = Stencil->_is_local[p][i]; + int ptype = Stencil->_permute_type[p]; + int perm = Stencil->_permute[0][i]; + + vobj *nbr; + if ( local && perm ){ + permute(tmp,src._odata[offset],ptype); + nbr = &tmp; + } else if (local) { + nbr = &src._odata[offset]; + } else { + nbr = &comm_buf[offset]; + } + result[i] = result[i]+*nbr; + } + } + } + ~LinearOperatorJacobi() + { + delete Stencil; + } +} + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector latt_size (4); + std::vector simd_layout(4); + std::vector mpi_layout (4); + + int omp=1; + int lat=8; + + mpi_layout[0]=1; + mpi_layout[1]=2; + mpi_layout[2]=1; + mpi_layout[3]=1; + + latt_size[0] = lat; + latt_size[1] = lat; + latt_size[2] = lat; + latt_size[3] = lat; + double volume = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; + +#ifdef AVX512 + simd_layout[0] = 1; + simd_layout[1] = 2; + simd_layout[2] = 2; + simd_layout[3] = 2; +#endif +#if defined (AVX1)|| defined (AVX2) + simd_layout[0] = 1; + simd_layout[1] = 1; + simd_layout[2] = 2; + simd_layout[3] = 2; +#endif +#if defined (SSE2) + simd_layout[0] = 1; + simd_layout[1] = 1; + simd_layout[2] = 1; + simd_layout[3] = 2; +#endif + + GridCartesian Fine(latt_size,simd_layout,mpi_layout); + GridRedBlackCartesian rbFine(latt_size,simd_layout,mpi_layout); + + LatticeColourMatrix Foo(&Fine); + LatticeColourMatrix Bar(&Fine); + LatticeColourMatrix Check(&Fine); + LatticeColourMatrix Diff(&Fine); + + random(Foo); + gaussian(Bar); + + + for(int dir=0;dir<4;dir++){ + for(int disp=0;disp directions(npoint,dir); + std::vector displacements(npoint,disp); + + CartesianStencil myStencil(&Fine,npoint,0,directions,displacements); + + printf("STENCIL: osites %d %d dir %d disp %d\n",Fine.oSites(),(int)myStencil._offsets[0].size(),dir,disp); + std::vector ocoor(4); + for(int o=0;o > comm_buf(myStencil._unified_buffer_size); + printf("calling halo exchange\n");fflush(stdout); + myStencil.HaloExchange(Foo,comm_buf); + + Bar = Cshift(Foo,dir,disp); + + // Implement a stencil code that should agree with cshift! + for(int i=0;ioSites();i++){ + + int offset = myStencil._offsets [0][i]; + int local = myStencil._is_local[0][i]; + int permute_type = myStencil._permute_type[0]; + int perm =myStencil._permute[0][i]; + if ( local && perm ) + permute(Check._odata[i],Foo._odata[offset],permute_type); + else if (local) + Check._odata[i] = Foo._odata[offset]; + else + Check._odata[i] = comm_buf[offset]; + + + } + + + std::vector coor(4); + for(coor[3]=0;coor[3] 0 ){ + printf("Coor (%d %d %d %d) \t rc %d%d \t %le %le %le\n", + coor[0],coor[1],coor[2],coor[3],r,c, + nn, + real(check._internal._internal[r][c]), + real(bar._internal._internal[r][c]) + ); + } + }} + + }}}} + + } + } + + Grid_finalize(); +} diff --git a/test_Grid_stencil.cc b/test_Grid_stencil.cc new file mode 100644 index 00000000..8077562f --- /dev/null +++ b/test_Grid_stencil.cc @@ -0,0 +1,154 @@ +#include "Grid.h" + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector latt_size (4); + std::vector simd_layout(4); + std::vector mpi_layout (4); + + int omp=1; + int lat=8; + + mpi_layout[0]=1; + mpi_layout[1]=1; + mpi_layout[2]=1; + mpi_layout[3]=1; + + latt_size[0] = lat; + latt_size[1] = lat; + latt_size[2] = lat; + latt_size[3] = lat; + double volume = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; + +#ifdef AVX512 + simd_layout[0] = 1; + simd_layout[1] = 1; + simd_layout[2] = 2; + simd_layout[3] = 2; +#endif +#if defined (AVX1)|| defined (AVX2) + simd_layout[0] = 1; + simd_layout[1] = 1; + simd_layout[2] = 1; + simd_layout[3] = 2; +#endif +#if defined (SSE2) + simd_layout[0] = 1; + simd_layout[1] = 1; + simd_layout[2] = 1; + simd_layout[3] = 2; +#endif + + GridCartesian Fine(latt_size,simd_layout,mpi_layout); + GridRedBlackCartesian rbFine(latt_size,simd_layout,mpi_layout); + + LatticeColourMatrix Foo(&Fine); + LatticeColourMatrix Bar(&Fine); + LatticeColourMatrix Check(&Fine); + LatticeColourMatrix Diff(&Fine); + + random(Foo); + gaussian(Bar); + + + for(int dir=0;dir<4;dir++){ + for(int disp=0;disp directions(npoint,dir); + std::vector displacements(npoint,disp); + + CartesianStencil myStencil(&Fine,npoint,0,directions,displacements); + + printf("STENCIL: osites %d %d dir %d disp %d\n",Fine.oSites(),(int)myStencil._offsets[0].size(),dir,disp); + std::vector ocoor(4); + for(int o=0;o > comm_buf(myStencil._unified_buffer_size); + printf("calling halo exchange\n");fflush(stdout); + myStencil.HaloExchange(Foo,comm_buf); + + Bar = Cshift(Foo,dir,disp); + + // Implement a stencil code that should agree with cshift! + for(int i=0;ioSites();i++){ + + int offset = myStencil._offsets [0][i]; + int local = myStencil._is_local[0][i]; + int permute_type = myStencil._permute_type[0]; + int perm =myStencil._permute[0][i]; + if ( local && perm ) + permute(Check._odata[i],Foo._odata[offset],permute_type); + else if (local) + Check._odata[i] = Foo._odata[offset]; + else + Check._odata[i] = comm_buf[offset]; + + + } + + Real nrmC = norm2(Check); + Real nrmB = norm2(Bar); + Real nrm = norm2(Check-Bar); + printf("N2diff = %le (%le, %le) \n",nrm,nrmC,nrmB);fflush(stdout); + + Real snrmC =0; + Real snrmB =0; + Real snrm =0; + + std::vector coor(4); + for(coor[3]=0;coor[3] 0){ + printf("Coor (%d %d %d %d) \t rc %d%d \t %le %le %le\n", + coor[0],coor[1],coor[2],coor[3],r,c, + nn, + real(check._internal._internal[r][c]), + real(bar._internal._internal[r][c]) + ); + } + snrmC=snrmC+real(conj(check._internal._internal[r][c])*check._internal._internal[r][c]); + snrmB=snrmB+real(conj(bar._internal._internal[r][c])*bar._internal._internal[r][c]); + snrm=snrm+nn; + }} + + }}}} + + printf("scalar N2diff = %le (%le, %le) \n",snrm,snrmC,snrmB);fflush(stdout); + + + } + } + + Grid_finalize(); +} From f1876b7e959b0a1477e113b63b933d23f13a7c4d Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 14 Apr 2015 20:25:51 +0100 Subject: [PATCH 049/429] Modified --- TODO | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/TODO b/TODO index 665e3a55..2c8fdcf8 100644 --- a/TODO +++ b/TODO @@ -1,26 +1,35 @@ * FIXME audit + * Replace vset with a call to merge.; -* care in Gmerge,Gextract over set. + +* care in Gmerge,Gextract over vset . + * Const audit + * extract / merge extra implementation removal * Conditional execution, where etc... -----DONE, simple test + * Integer relational support -----DONE + * Coordinate information, integers etc... -----DONE + * Integer type padding/union to vector. -----DONE + * LatticeCoordinate[mu] -----DONE - -* Stencil operator support -----Initial thoughts +* Stencil operator support -----Initial thoughts, trial implementation DONE. + -----some simple tests that Stencil matches Cshift. * Subset support, slice sums etc... -----Only need slice sum? -----Generic cartesian subslicing? -----Array ranges / boost extents? - -----Multigrid grid transferral. + -----Multigrid grid transferral? -----Suggests generalised cartesian subblocking - sums, returning modified grid. + sums, returning modified grid? + -----What should interface be? i) Two classes of subset; red black parity subsetting (pick checkerboard). cartesian sub-block subsetting @@ -74,12 +83,11 @@ iii) No general permutation map. * NERSC Lattice loading, plaquette test - * I/O support - MPI IO? - BinaryWriter, TextWriter etc... - protocol buffers? - - + // Cartesian grid inheritance // Grid::GridBase // | From ab9a764bb1aa7c234729a8022ad6a835d79506f5 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 14 Apr 2015 22:40:40 +0100 Subject: [PATCH 050/429] Reduce now going through MPI. --- Grid_Communicator.h | 28 +++++++++++++--- Grid_Lattice.h | 69 ++++++++++++++++++++++++++++++++++++++-- Grid_QCD.h | 35 -------------------- Grid_communicator_mpi.cc | 9 +++--- Grid_cshift_common.h | 2 -- Grid_math_types.h | 24 +++++++------- Grid_simd.h | 8 ++--- Grid_vComplexD.h | 2 +- Grid_vComplexF.h | 2 +- Grid_vRealD.h | 2 +- Grid_vRealF.h | 2 +- TODO | 14 +++++--- 12 files changed, 123 insertions(+), 74 deletions(-) diff --git a/Grid_Communicator.h b/Grid_Communicator.h index c7e71f12..0e15765c 100644 --- a/Grid_Communicator.h +++ b/Grid_Communicator.h @@ -42,13 +42,31 @@ class CartesianCommunicator { //////////////////////////////////////////////////////////// // Reduction //////////////////////////////////////////////////////////// - void GlobalSum(float &); - void GlobalSumVector(float *,int N); + void GlobalSum(RealF &); + void GlobalSumVector(RealF *,int N); - void GlobalSum(double &); - void GlobalSumVector(double *,int N); + void GlobalSum(RealD &); + void GlobalSumVector(RealD *,int N); + + void GlobalSum(ComplexF &c) + { + GlobalSumVector((float *)&c,2); + } + void GlobalSumVector(ComplexF *c,int N) + { + GlobalSumVector((float *)c,2*N); + } + + void GlobalSum(ComplexD &c) + { + GlobalSumVector((double *)&c,2); + } + void GlobalSumVector(ComplexD *c,int N) + { + GlobalSumVector((double *)c,2*N); + } - template void GlobalSumObj(obj &o){ + template void GlobalSum(obj &o){ typedef typename obj::scalar_type scalar_type; int words = sizeof(obj)/sizeof(scalar_type); diff --git a/Grid_Lattice.h b/Grid_Lattice.h index 1e2c820e..a94a13a4 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -407,18 +407,83 @@ public: return ret; } + //////////////////////////////////////////////////////////////////////////////////////////////////// + // Reduction operations + //////////////////////////////////////////////////////////////////////////////////////////////////// template inline RealD norm2(const Lattice &arg){ typedef typename vobj::scalar_type scalar; - decltype(localInnerProduct(arg._odata[0],arg._odata[0])) vnrm=zero; + decltype(innerProduct(arg._odata[0],arg._odata[0])) vnrm=zero; scalar nrm; + //FIXME make this loop parallelisable for(int ss=0;ssoSites(); ss++){ - vnrm = vnrm + localInnerProduct(arg._odata[ss],arg._odata[ss]); + vnrm = vnrm + innerProduct(arg._odata[ss],arg._odata[ss]); } nrm = Reduce(TensorRemove(vnrm)); + arg._grid->GlobalSum(nrm); return real(nrm); } + + template + inline auto innerProduct(const Lattice &left,const Lattice &right) ->decltype(innerProduct(left._odata[0],right._odata[0])) + { + typedef typename vobj::scalar_type scalar; + decltype(innerProduct(left._odata[0],right._odata[0])) vnrm=zero; + + scalar nrm; + //FIXME make this loop parallelisable + for(int ss=0;ssoSites(); ss++){ + vnrm = vnrm + innerProduct(left._odata[ss],right._odata[ss]); + } + nrm = Reduce(TensorRemove(vnrm)); + right._grid->GlobalSum(nrm); + return nrm; + } + + ///////////////////////////////////////////////////// + // Non site reduced routines + ///////////////////////////////////////////////////// + + // localNorm2, + template + inline auto localNorm2 (const Lattice &rhs)-> Lattice + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=innerProduct(rhs,rhs); + } + return ret; + } + + // localInnerProduct + template + inline auto localInnerProduct (const Lattice &lhs,const Lattice &rhs) + -> Lattice + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=innerProduct(lhs._odata[ss],rhs._odata[ss]); + } + return ret; + } + + // outerProduct Scalar x Scalar -> Scalar + // Vector x Vector -> Matrix + template + inline auto outerProduct (const Lattice &lhs,const Lattice &rhs) -> Lattice + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=outerProduct(lhs._odata[ss],rhs._odata[ss]); + } + return ret; + } + + } #endif diff --git a/Grid_QCD.h b/Grid_QCD.h index 1d52f911..72a8ee67 100644 --- a/Grid_QCD.h +++ b/Grid_QCD.h @@ -57,41 +57,6 @@ namespace QCD { typedef Lattice LatticeSpinVector; typedef Lattice LatticeColourVector; - // localNorm2, - template - inline LatticeComplex localNorm2 (const Lattice &rhs) - { - LatticeComplex ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=trace(adj(rhs)*rhs); - } - return ret; - } - // localInnerProduct - template - inline LatticeComplex localInnerProduct (const Lattice &lhs,const Lattice &rhs) - { - LatticeComplex ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=localInnerProduct(lhs._odata[ss],rhs._odata[ss]); - } - return ret; - } - - // outerProduct Scalar x Scalar -> Scalar - // Vector x Vector -> Matrix - template - inline auto outerProduct (const Lattice &lhs,const Lattice &rhs) -> Lattice - { - Lattice ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=outerProduct(lhs._odata[ss],rhs._odata[ss]); - } - return ret; - } // FIXME for debug; deprecate this inline void LatticeCoordinate(LatticeInteger &l,int mu){ diff --git a/Grid_communicator_mpi.cc b/Grid_communicator_mpi.cc index a4943478..dba5f039 100644 --- a/Grid_communicator_mpi.cc +++ b/Grid_communicator_mpi.cc @@ -29,21 +29,20 @@ CartesianCommunicator::CartesianCommunicator(std::vector &processors) } void CartesianCommunicator::GlobalSum(float &f){ - MPI_Allreduce(&f,&f,1,MPI_FLOAT,MPI_SUM,communicator); + MPI_Allreduce(MPI_IN_PLACE,&f,1,MPI_FLOAT,MPI_SUM,communicator); } void CartesianCommunicator::GlobalSumVector(float *f,int N) { - MPI_Allreduce(f,f,N,MPI_FLOAT,MPI_SUM,communicator); + MPI_Allreduce(MPI_IN_PLACE,f,N,MPI_FLOAT,MPI_SUM,communicator); } void CartesianCommunicator::GlobalSum(double &d) { - MPI_Allreduce(&d,&d,1,MPI_DOUBLE,MPI_SUM,communicator); + MPI_Allreduce(MPI_IN_PLACE,&d,1,MPI_DOUBLE,MPI_SUM,communicator); } void CartesianCommunicator::GlobalSumVector(double *d,int N) { - MPI_Allreduce(d,d,N,MPI_DOUBLE,MPI_SUM,communicator); + MPI_Allreduce(MPI_IN_PLACE,d,N,MPI_DOUBLE,MPI_SUM,communicator); } - void CartesianCommunicator::ShiftedRanks(int dim,int shift,int &source,int &dest) { MPI_Cart_shift(communicator,dim,shift,&source,&dest); diff --git a/Grid_cshift_common.h b/Grid_cshift_common.h index e962f6ea..2910151c 100644 --- a/Grid_cshift_common.h +++ b/Grid_cshift_common.h @@ -8,7 +8,6 @@ friend void Gather_plane_simple (Lattice &rhs,std::vector_rdimensions[dimension]; - printf("Gather_plane_simple buf size %d rhs size %d \n",buffer.size(),rhs._odata.size());fflush(stdout); if ( !rhs._grid->CheckerBoarded(dimension) ) { int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane @@ -19,7 +18,6 @@ friend void Gather_plane_simple (Lattice &rhs,std::vector_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ - printf("Gather_plane_simple %d ; %d %d %d\n",bo,so,o,b);fflush(stdout); buffer[bo++]=rhs._odata[so+o+b]; } o +=rhs._grid->_slice_stride[dimension]; diff --git a/Grid_math_types.h b/Grid_math_types.h index e3432645..01fc7bf2 100644 --- a/Grid_math_types.h +++ b/Grid_math_types.h @@ -903,38 +903,38 @@ template inline iMatrix operator - (Integer lhs,const iMatri /////////////////////////////////////////////////////////////////////////////////////// - // localInnerProduct Scalar x Scalar -> Scalar - // localInnerProduct Vector x Vector -> Scalar - // localInnerProduct Matrix x Matrix -> Scalar + // innerProduct Scalar x Scalar -> Scalar + // innerProduct Vector x Vector -> Scalar + // innerProduct Matrix x Matrix -> Scalar /////////////////////////////////////////////////////////////////////////////////////// template inline - auto localInnerProduct (const iVector& lhs,const iVector& rhs) -> iScalar + auto innerProduct (const iVector& lhs,const iVector& rhs) -> iScalar { - typedef decltype(localInnerProduct(lhs._internal[0],rhs._internal[0])) ret_t; + typedef decltype(innerProduct(lhs._internal[0],rhs._internal[0])) ret_t; iScalar ret=zero; for(int c1=0;c1 inline - auto localInnerProduct (const iMatrix& lhs,const iMatrix& rhs) -> iScalar + auto innerProduct (const iMatrix& lhs,const iMatrix& rhs) -> iScalar { - typedef decltype(localInnerProduct(lhs._internal[0][0],rhs._internal[0][0])) ret_t; + typedef decltype(innerProduct(lhs._internal[0][0],rhs._internal[0][0])) ret_t; iScalar ret=zero; iScalar tmp; for(int c1=0;c1 inline - auto localInnerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar + auto innerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar { - typedef decltype(localInnerProduct(lhs._internal,rhs._internal)) ret_t; + typedef decltype(innerProduct(lhs._internal,rhs._internal)) ret_t; iScalar ret; - ret._internal = localInnerProduct(lhs._internal,rhs._internal); + ret._internal = innerProduct(lhs._internal,rhs._internal); return ret; } diff --git a/Grid_simd.h b/Grid_simd.h index 23061632..4f9f4b0d 100644 --- a/Grid_simd.h +++ b/Grid_simd.h @@ -33,10 +33,10 @@ namespace Grid { inline RealF adj(const RealF & r){ return r; } inline RealF conj(const RealF & r){ return r; } - inline ComplexD localInnerProduct(const ComplexD & l, const ComplexD & r) { return conj(l)*r; } - inline ComplexF localInnerProduct(const ComplexF & l, const ComplexF & r) { return conj(l)*r; } - inline RealD localInnerProduct(const RealD & l, const RealD & r) { return l*r; } - inline RealF localInnerProduct(const RealF & l, const RealF & r) { return l*r; } + inline ComplexD innerProduct(const ComplexD & l, const ComplexD & r) { return conj(l)*r; } + inline ComplexF innerProduct(const ComplexF & l, const ComplexF & r) { return conj(l)*r; } + inline RealD innerProduct(const RealD & l, const RealD & r) { return l*r; } + inline RealF innerProduct(const RealF & l, const RealF & r) { return l*r; } //////////////////////////////////////////////////////////////////////////////// //Provide support functions for basic real and complex data types required by Grid diff --git a/Grid_vComplexD.h b/Grid_vComplexD.h index f1c335e8..133e354b 100644 --- a/Grid_vComplexD.h +++ b/Grid_vComplexD.h @@ -313,7 +313,7 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ }; - inline vComplexD localInnerProduct(const vComplexD & l, const vComplexD & r) { return conj(l)*r; } + inline vComplexD innerProduct(const vComplexD & l, const vComplexD & r) { return conj(l)*r; } typedef vComplexD vDComplex; diff --git a/Grid_vComplexF.h b/Grid_vComplexF.h index 18cf1749..9dc5f051 100644 --- a/Grid_vComplexF.h +++ b/Grid_vComplexF.h @@ -362,7 +362,7 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ }; - inline vComplexF localInnerProduct(const vComplexF & l, const vComplexF & r) + inline vComplexF innerProduct(const vComplexF & l, const vComplexF & r) { return conj(l)*r; } diff --git a/Grid_vRealD.h b/Grid_vRealD.h index c51e41cf..84c80698 100644 --- a/Grid_vRealD.h +++ b/Grid_vRealD.h @@ -240,7 +240,7 @@ namespace Grid { static int Nsimd(void) { return sizeof(dvec)/sizeof(double);} }; - inline vRealD localInnerProduct(const vRealD & l, const vRealD & r) { return conj(l)*r; } + inline vRealD innerProduct(const vRealD & l, const vRealD & r) { return conj(l)*r; } inline void zeroit(vRealD &z){ vzero(z);} inline vRealD outerProduct(const vRealD &l, const vRealD& r) diff --git a/Grid_vRealF.h b/Grid_vRealF.h index 0fe68f43..aeb454f0 100644 --- a/Grid_vRealF.h +++ b/Grid_vRealF.h @@ -260,7 +260,7 @@ friend inline void vstore(const vRealF &ret, float *a){ public: static inline int Nsimd(void) { return sizeof(fvec)/sizeof(float);} }; - inline vRealF localInnerProduct(const vRealF & l, const vRealF & r) { return conj(l)*r; } + inline vRealF innerProduct(const vRealF & l, const vRealF & r) { return conj(l)*r; } inline void zeroit(vRealF &z){ vzero(z);} inline vRealF outerProduct(const vRealF &l, const vRealF& r) diff --git a/TODO b/TODO index 2c8fdcf8..010a06b7 100644 --- a/TODO +++ b/TODO @@ -1,15 +1,14 @@ +AUDITS: * FIXME audit - +* const audit * Replace vset with a call to merge.; - * care in Gmerge,Gextract over vset . - -* Const audit - * extract / merge extra implementation removal +FUNCTIONALITY: + * Conditional execution, where etc... -----DONE, simple test * Integer relational support -----DONE @@ -22,6 +21,11 @@ * Stencil operator support -----Initial thoughts, trial implementation DONE. -----some simple tests that Stencil matches Cshift. + -----do all permute in comms phase, so that copy permute + -----cases move into a buffer. + +* CovariantShift support -----Use a class to store gauge field? (parallel transport?) + * Subset support, slice sums etc... -----Only need slice sum? -----Generic cartesian subslicing? From cab7ef9bc22ea99982e7ff2cd1f7b342d71cf375 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 14 Apr 2015 23:20:16 +0100 Subject: [PATCH 051/429] Some bug fixes --- Grid_main.cc | 8 ++++---- Grid_math_type_mapper.h | 10 ++++++++++ Grid_math_types.h | 3 +++ Grid_simd.h | 12 +++++++++--- Grid_vComplexF.h | 4 +++- Grid_vRealD.h | 3 +++ Grid_vRealF.h | 3 +++ 7 files changed, 35 insertions(+), 8 deletions(-) diff --git a/Grid_main.cc b/Grid_main.cc index 13c3d9ee..8cac55f5 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -14,10 +14,10 @@ int main (int argc, char ** argv) std::vector simd_layout(4); std::vector mpi_layout(4); - mpi_layout[0]=2; - mpi_layout[1]=2; - mpi_layout[2]=2; - mpi_layout[3]=2; + mpi_layout[0]=1; + mpi_layout[1]=1; + mpi_layout[2]=1; + mpi_layout[3]=1; #ifdef AVX512 for(int omp=128;omp<236;omp+=16){ diff --git a/Grid_math_type_mapper.h b/Grid_math_type_mapper.h index 856f2c6b..4e7120b1 100644 --- a/Grid_math_type_mapper.h +++ b/Grid_math_type_mapper.h @@ -10,6 +10,7 @@ namespace Grid { typedef typename T::scalar_type scalar_type; typedef typename T::vector_type vector_type; typedef typename T::tensor_reduced tensor_reduced; + // enum { TensorLevel = T::TensorLevel }; }; ////////////////////////////////////////////////////////////////////////////////// @@ -20,24 +21,28 @@ namespace Grid { typedef RealF scalar_type; typedef RealF vector_type; typedef RealF tensor_reduced ; + // enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef RealD scalar_type; typedef RealD vector_type; typedef RealD tensor_reduced; + // enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef ComplexF scalar_type; typedef ComplexF vector_type; typedef ComplexF tensor_reduced; + // enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef ComplexD scalar_type; typedef ComplexD vector_type; typedef ComplexD tensor_reduced; + // enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { @@ -45,30 +50,35 @@ namespace Grid { typedef RealF scalar_type; typedef vRealF vector_type; typedef vRealF tensor_reduced; + // enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef RealD scalar_type; typedef vRealD vector_type; typedef vRealD tensor_reduced; + //enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef ComplexF scalar_type; typedef vComplexF vector_type; typedef vComplexF tensor_reduced; + //enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef ComplexD scalar_type; typedef vComplexD vector_type; typedef vComplexD tensor_reduced; + //enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef Integer scalar_type; typedef vInteger vector_type; typedef vInteger tensor_reduced; + //enum { TensorLevel = 0 }; }; // Again terminate the recursion. diff --git a/Grid_math_types.h b/Grid_math_types.h index 01fc7bf2..db90bda7 100644 --- a/Grid_math_types.h +++ b/Grid_math_types.h @@ -19,6 +19,7 @@ public: typedef typename GridTypeMapper::scalar_type scalar_type; typedef typename GridTypeMapper::vector_type vector_type; typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; + //enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; typedef iScalar tensor_reduced; @@ -78,6 +79,7 @@ public: typedef typename GridTypeMapper::scalar_type scalar_type; typedef typename GridTypeMapper::vector_type vector_type; typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; + // enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; typedef iScalar tensor_reduced; @@ -136,6 +138,7 @@ public: typedef typename GridTypeMapper::scalar_type scalar_type; typedef typename GridTypeMapper::vector_type vector_type; typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; + // enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; typedef iScalar tensor_reduced; iMatrix(Zero &z){ *this = zero; }; diff --git a/Grid_simd.h b/Grid_simd.h index 4f9f4b0d..f0cf6c08 100644 --- a/Grid_simd.h +++ b/Grid_simd.h @@ -273,10 +273,16 @@ namespace Grid { inline void add (vRealD *__restrict__ y,const vRealD *__restrict__ l,const RealD *__restrict__ r){ *y = (*l) + (*r); } // Default precision - typedef RealD Real; - typedef std::complex Complex; - +#ifdef GRID_DEFAULT_PRECISION_DOUBLE + typedef RealD Real; typedef vRealD vReal; typedef vComplexD vComplex; + typedef std::complex Complex; +#else + typedef RealF Real; + typedef vRealF vReal; + typedef vComplexF vComplex; + typedef std::complex Complex; +#endif } #endif diff --git a/Grid_vComplexF.h b/Grid_vComplexF.h index 9dc5f051..75c47248 100644 --- a/Grid_vComplexF.h +++ b/Grid_vComplexF.h @@ -373,6 +373,8 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ { return l*r; } - + inline vComplexF trace(const vComplexF &arg){ + return arg; + } } #endif diff --git a/Grid_vRealD.h b/Grid_vRealD.h index 84c80698..86f738f3 100644 --- a/Grid_vRealD.h +++ b/Grid_vRealD.h @@ -247,6 +247,9 @@ namespace Grid { { return l*r; } + inline vRealD trace(const vRealD &arg){ + return arg; + } } diff --git a/Grid_vRealF.h b/Grid_vRealF.h index aeb454f0..b7c127ce 100644 --- a/Grid_vRealF.h +++ b/Grid_vRealF.h @@ -268,6 +268,9 @@ friend inline void vstore(const vRealF &ret, float *a){ return l*r; } + inline vRealF trace(const vRealF &arg){ + return arg; + } } From fddb904b4cb9d3a21c0d537f9859308db6177326 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 15 Apr 2015 12:03:38 +0100 Subject: [PATCH 052/429] Typo in capital --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index e306eb56..1e70ac1b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -49,6 +49,6 @@ bin_PROGRAMS = Grid_main test_Grid_stencil Grid_main_SOURCES = Grid_main.cc Grid_main_LDADD = libGrid.a -test_Grid_stencil_SOURCES = test_Grid_Stencil.cc +test_Grid_stencil_SOURCES = test_Grid_stencil.cc test_Grid_stencil_LDADD = libGrid.a From 933c54d9c419183c934b0b23b819c3a083d8af90 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 16 Apr 2015 14:47:28 +0100 Subject: [PATCH 053/429] Improving the trace support to support any index tracing and simplifying implmentation in some ways --- Grid_QCD.h | 10 +- Grid_config.h | 4 +- Grid_main.cc | 21 +++- Grid_math_type_mapper.h | 41 +++++--- Grid_math_types.h | 224 ++++++++++++++++++++++++++++++++++++++-- Grid_simd.h | 24 +++-- Grid_vComplexD.h | 18 ++-- Grid_vComplexF.h | 20 ++-- Grid_vInteger.h | 14 +-- Grid_vRealD.h | 14 +-- Grid_vRealF.h | 14 +-- test_Grid_stencil.cc | 4 +- 12 files changed, 321 insertions(+), 87 deletions(-) diff --git a/Grid_QCD.h b/Grid_QCD.h index 72a8ee67..2f411f16 100644 --- a/Grid_QCD.h +++ b/Grid_QCD.h @@ -7,12 +7,11 @@ namespace QCD { static const int Ns=4; static const int CbRed =0; static const int CbBlack=1; - + // QCD iMatrix types template using iSinglet = iScalar > ; template using iSpinMatrix = iMatrix, Ns>; template using iSpinColourMatrix = iMatrix, Ns>; - template using iColourMatrix = iScalar> ; template using iSpinVector = iVector, Ns>; @@ -20,10 +19,8 @@ namespace QCD { template using iSpinColourVector = iVector, Ns>; typedef iSinglet TComplex; // This is painful. Tensor singlet complex type. - typedef iSinglet vTComplex; - typedef iSinglet TReal; // This is painful. Tensor singlet complex type. - - + typedef iSinglet vTComplex; // what if we don't know the tensor structure + typedef iSinglet TReal; // Shouldn't need these. typedef iSinglet vTInteger; typedef iSpinMatrix SpinMatrix; @@ -44,7 +41,6 @@ namespace QCD { typedef iSpinColourVector vSpinColourVector; typedef Lattice LatticeComplex; - typedef Lattice LatticeInteger; // Predicates for "where" typedef Lattice LatticeColourMatrix; diff --git a/Grid_config.h b/Grid_config.h index bb885708..5faa2157 100644 --- a/Grid_config.h +++ b/Grid_config.h @@ -73,8 +73,8 @@ /* Define to the version of this package. */ #define PACKAGE_VERSION "1.0" -/* SSE2 */ -/* #undef SSE2 */ +/* SSE4 */ +/* #undef SSE4 */ /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 diff --git a/Grid_main.cc b/Grid_main.cc index 8cac55f5..e122fcbe 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -152,6 +152,8 @@ int main (int argc, char ** argv) cMat= adj(cMat); cm=adj(cm); scm=adj(scm); + scm=transpose(scm); + scm=transposeIndex<1>(scm); // Foo = Foo+scalar; // LatticeColourMatrix+Scalar // Foo = Foo*scalar; // LatticeColourMatrix*Scalar @@ -162,6 +164,23 @@ int main (int argc, char ** argv) LatticeComplex trscMat(&Fine); trscMat = trace(scMat); // Trace + + { + TComplex c; + ColourMatrix c_m; + SpinMatrix s_m; + SpinColourMatrix sc_m; + + s_m = traceIndex<1>(sc_m); + c_m = traceIndex<2>(sc_m); + + c = traceIndex<2>(s_m); + c = traceIndex<1>(c_m); + + printf("c. Level %d\n",c_m.TensorLevel); + printf("c. Level %d\n",c_m._internal.TensorLevel); + + } FooBar = Bar; @@ -203,7 +222,7 @@ int main (int argc, char ** argv) peekSite(bar,Bar,coor); for(int r=0;r<3;r++){ for(int c=0;c<3;c++){ - cout<<"bar "< >::scalar_type == ComplexD. +// Use of a helper class like this allows us to template specialise and "dress" +// other classes such as RealD == double, ComplexD == std::complex with these +// traits. +// +// It is possible that we could do this more elegantly if I introduced a +// queryable trait in iScalar, iMatrix and iVector and used the query on vtype in +// place of the type mapper? +// +// Not sure how to do this, but probably could be done with a research effort +// to study C++11's type_traits.h file. (std::enable_if >) +// ////////////////////////////////////////////////////////////////////////////////// template class GridTypeMapper { @@ -10,7 +24,7 @@ namespace Grid { typedef typename T::scalar_type scalar_type; typedef typename T::vector_type vector_type; typedef typename T::tensor_reduced tensor_reduced; - // enum { TensorLevel = T::TensorLevel }; + enum { TensorLevel = T::TensorLevel }; }; ////////////////////////////////////////////////////////////////////////////////// @@ -21,28 +35,28 @@ namespace Grid { typedef RealF scalar_type; typedef RealF vector_type; typedef RealF tensor_reduced ; - // enum { TensorLevel = 0 }; + enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef RealD scalar_type; typedef RealD vector_type; typedef RealD tensor_reduced; - // enum { TensorLevel = 0 }; + enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef ComplexF scalar_type; typedef ComplexF vector_type; typedef ComplexF tensor_reduced; - // enum { TensorLevel = 0 }; + enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef ComplexD scalar_type; typedef ComplexD vector_type; typedef ComplexD tensor_reduced; - // enum { TensorLevel = 0 }; + enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { @@ -50,44 +64,37 @@ namespace Grid { typedef RealF scalar_type; typedef vRealF vector_type; typedef vRealF tensor_reduced; - // enum { TensorLevel = 0 }; + enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef RealD scalar_type; typedef vRealD vector_type; typedef vRealD tensor_reduced; - //enum { TensorLevel = 0 }; + enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef ComplexF scalar_type; typedef vComplexF vector_type; typedef vComplexF tensor_reduced; - //enum { TensorLevel = 0 }; + enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef ComplexD scalar_type; typedef vComplexD vector_type; typedef vComplexD tensor_reduced; - //enum { TensorLevel = 0 }; + enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef Integer scalar_type; typedef vInteger vector_type; typedef vInteger tensor_reduced; - //enum { TensorLevel = 0 }; + enum { TensorLevel = 0 }; }; - // Again terminate the recursion. - inline vRealD TensorRemove(vRealD arg){ return arg;} - inline vRealF TensorRemove(vRealF arg){ return arg;} - inline vComplexF TensorRemove(vComplexF arg){ return arg;} - inline vComplexD TensorRemove(vComplexD arg){ return arg;} - inline vInteger TensorRemove(vInteger arg){ return arg;} - } #endif diff --git a/Grid_math_types.h b/Grid_math_types.h index db90bda7..58de9c15 100644 --- a/Grid_math_types.h +++ b/Grid_math_types.h @@ -2,15 +2,76 @@ #define GRID_MATH_TYPES_H #include +#include namespace Grid { + // First some of my own traits + template struct isGridTensor { + static const bool value = true; + static const bool notvalue = false; + }; + + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + + // Match the index + template struct matchGridTensorIndex { + static const bool value = (Level==T::TensorLevel); + static const bool notvalue = (Level!=T::TensorLevel); + }; + /////////////////////////////////////////////////// // Scalar, Vector, Matrix objects. // These can be composed to form tensor products of internal indices. /////////////////////////////////////////////////// - + + // Terminates the recursion for temoval of all Grids tensors + inline vRealD TensorRemove(vRealD arg){ return arg;} + inline vRealF TensorRemove(vRealF arg){ return arg;} + inline vComplexF TensorRemove(vComplexF arg){ return arg;} + inline vComplexD TensorRemove(vComplexD arg){ return arg;} + inline vInteger TensorRemove(vInteger arg){ return arg;} + template class iScalar { public: @@ -19,9 +80,12 @@ public: typedef typename GridTypeMapper::scalar_type scalar_type; typedef typename GridTypeMapper::vector_type vector_type; typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; - //enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; typedef iScalar tensor_reduced; + enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; + + // Scalar no action + // template using tensor_reduce_level = typename iScalar::tensor_reduce_level >; iScalar(){}; @@ -79,9 +143,9 @@ public: typedef typename GridTypeMapper::scalar_type scalar_type; typedef typename GridTypeMapper::vector_type vector_type; typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; - // enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; - typedef iScalar tensor_reduced; + enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; + typedef iScalar tensor_reduced; iVector(Zero &z){ *this = zero; }; iVector() {}; @@ -137,8 +201,10 @@ public: typedef typename GridTypeMapper::scalar_type scalar_type; typedef typename GridTypeMapper::vector_type vector_type; + typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; - // enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; + + enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; typedef iScalar tensor_reduced; iMatrix(Zero &z){ *this = zero; }; @@ -1018,6 +1084,137 @@ template inline iMatrix adj(const iMatrix & }} return ret; } +///////////////////////////////////////////////////////////////// +// Transpose +///////////////////////////////////////////////////////////////// +template + inline typename std::enable_if::value, iMatrix >::type + transpose(iMatrix arg) + { + iMatrix ret; + for(int i=0;i + inline typename std::enable_if::notvalue, iMatrix >::type + transpose(iMatrix arg) + { + iMatrix ret; + for(int i=0;i + inline typename std::enable_if::value, iScalar >::type + transpose(iScalar arg) + { + iScalar ret; + ret._internal = transpose(arg._internal); // NB recurses + return ret; + } + +template + inline typename std::enable_if::notvalue, iScalar >::type + transpose(iScalar arg) + { + iScalar ret; + ret._internal = arg._internal; // NB recursion stops + return ret; + } + + + +/* + * No need to implement transpose on the primitive types + * Not sure that this idiom is any more elegant that the trace idiom below however! +inline ComplexD transpose(ComplexD &rhs){ return rhs;} +inline ComplexF transpose(ComplexF &rhs){ return rhs;} +inline RealD transpose(RealD &rhs){ return rhs;} +inline RealF transpose(RealF &rhs){ return rhs;} + */ + +//////////////////////////////////////////////////////////////////////////////////////////// +// Transpose a specific index +//////////////////////////////////////////////////////////////////////////////////////////// +template inline + typename std::enable_if,Level>::value, iMatrix >::type +transposeIndex (const iMatrix &arg) +{ + iMatrix ret; + for(int i=0;i inline +typename std::enable_if,Level>::notvalue, iMatrix >::type +transposeIndex (const iMatrix &arg) +{ + iMatrix ret; + for(int i=0;i(arg._internal[i][j]); + }} + return ret; +} +template inline +typename std::enable_if,Level>::notvalue, iScalar >::type +transposeIndex (const iScalar &arg) +{ + return transposeIndex(arg._internal); +} +//////////////////////////////// +// Trace a specific index +//////////////////////////////// + +template inline ComplexF traceIndex(const ComplexF arg) { return arg;} +template inline ComplexD traceIndex(const ComplexD arg) { return arg;} +template inline RealF traceIndex(const RealF arg) { return arg;} +template inline RealD traceIndex(const RealD arg) { return arg;} + +template inline +auto traceIndex(const iScalar &arg) -> iScalar(arg._internal)) > +{ + iScalar(arg._internal))> ret; + ret._internal = traceIndex(arg._internal); + return ret; +} + +// If we hit the right index, return scalar and trace it with no further recursion +template inline +auto traceIndex(const iMatrix &arg) -> + typename std::enable_if,Level>::value, // Index matches + iScalar >::type // return scalar +{ + iScalar ret; + zeroit(ret._internal); + for(int i=0;i inline +auto traceIndex(const iMatrix &arg) -> + typename std::enable_if,Level>::notvalue,// No index match + iMatrix(arg._internal[0][0])),N> >::type // return matrix +{ + iMatrix(arg._internal[0][0])),N> ret; + for(int i=0;i(arg._internal[i][j]); + }} + return ret; +} ///////////////////////////////////////////////////////////////// // Can only take the real/imag part of scalar objects, since @@ -1075,17 +1272,24 @@ template inline auto imag(const iVector &z) -> iVect // Trace of scalar and matrix ///////////////////////////////// -inline Complex trace( const Complex &arg){ +inline ComplexF trace( const ComplexF &arg){ return arg; } -//inline vComplex trace(const vComplex &arg){ -// return arg; -//} +inline ComplexD trace( const ComplexD &arg){ + return arg; +} +inline RealF trace( const RealF &arg){ + return arg; +} +inline RealD trace( const RealD &arg){ + return arg; +} + template inline auto trace(const iMatrix &arg) -> iScalar { iScalar ret; - ZeroIt(ret._internal); + zeroit(ret._internal); for(int i=0;i #endif #if defined(AVX1) || defined (AVX2) @@ -33,6 +33,12 @@ namespace Grid { inline RealF adj(const RealF & r){ return r; } inline RealF conj(const RealF & r){ return r; } + inline RealF real(const RealF & r){ return r; } + + inline RealD adj(const RealD & r){ return r; } + inline RealD conj(const RealD & r){ return r; } + inline RealD real(const RealD & r){ return r; } + inline ComplexD innerProduct(const ComplexD & l, const ComplexD & r) { return conj(l)*r; } inline ComplexF innerProduct(const ComplexF & l, const ComplexF & r) { return conj(l)*r; } inline RealD innerProduct(const RealD & l, const RealD & r) { return l*r; } @@ -60,8 +66,6 @@ namespace Grid { inline void mult(RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) * (*r);} inline void sub (RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) - (*r);} inline void add (RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) + (*r);} - inline RealD adj(const RealD & r){ return r; } // No-op for real - inline RealD conj(const RealD & r){ return r; } inline void mac (RealF * __restrict__ y,const RealF * __restrict__ a,const RealF *__restrict__ x){ *y = (*a) * (*x)+(*y); } inline void mult(RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) * (*r); } @@ -72,14 +76,14 @@ namespace Grid { class Zero{}; static Zero zero; - template inline void ZeroIt(itype &arg){ arg=zero;}; - template<> inline void ZeroIt(ComplexF &arg){ arg=0; }; - template<> inline void ZeroIt(ComplexD &arg){ arg=0; }; - template<> inline void ZeroIt(RealF &arg){ arg=0; }; - template<> inline void ZeroIt(RealD &arg){ arg=0; }; + template inline void zeroit(itype &arg){ arg=zero;}; + template<> inline void zeroit(ComplexF &arg){ arg=0; }; + template<> inline void zeroit(ComplexD &arg){ arg=0; }; + template<> inline void zeroit(RealF &arg){ arg=0; }; + template<> inline void zeroit(RealD &arg){ arg=0; }; -#if defined (SSE2) +#if defined (SSE4) typedef __m128 fvec; typedef __m128d dvec; typedef __m128 cvec; @@ -202,7 +206,7 @@ inline void Gpermute(vsimd &y,const vsimd &b,int perm){ case 1: y.v = _mm256_shuffle_ps(b.v,b.v,_MM_SHUFFLE(1,0,3,2)); break; case 0: y.v = _mm256_permute2f128_ps(b.v,b.v,0x01); break; #endif -#ifdef SSE2 +#ifdef SSE4 case 1: y.v = _mm_shuffle_ps(b.v,b.v,_MM_SHUFFLE(2,3,0,1)); break; case 0: y.v = _mm_shuffle_ps(b.v,b.v,_MM_SHUFFLE(1,0,3,2));break; #endif diff --git a/Grid_vComplexD.h b/Grid_vComplexD.h index 133e354b..ffcff3a9 100644 --- a/Grid_vComplexD.h +++ b/Grid_vComplexD.h @@ -49,7 +49,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_add_pd(a.v,b.v); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_add_pd(a.v,b.v); #endif #ifdef AVX512 @@ -67,7 +67,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_sub_pd(a.v,b.v); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_sub_pd(a.v,b.v); #endif #ifdef AVX512 @@ -114,7 +114,7 @@ namespace Grid { ymm1 = _mm256_mul_pd(ymm1,ymm2); // ymm1 <- br ai, ai bi ret.v= _mm256_addsub_pd(ymm0,ymm1); #endif -#ifdef SSE2 +#ifdef SSE4 zvec ymm0,ymm1,ymm2; ymm0 = _mm_shuffle_pd(a.v,a.v,0x0); // ymm0 <- ar ar, ymm0 = _mm_mul_pd(ymm0,b.v); // ymm0 <- ar bi, ar br @@ -200,14 +200,14 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_pd(ig,rl,ig,rl); #endif -#ifdef SSE2 - ret.v = _mm_set_pd(a,b); +#ifdef SSE4 + ret.v = _mm_set_pd(ig,rl); #endif #ifdef AVX512 ret.v = _mm512_set_pd(ig,rl,ig,rl,ig,rl,ig,rl); #endif #ifdef QPX - ret.v = {a,b,a,b}; + ret.v = {ig,rl,ig,rl}; #endif } @@ -215,7 +215,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_pd(a[1].imag(),a[1].real(),a[0].imag(),a[0].real()); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_set_pd(a[0].imag(),a[0].real()); #endif #ifdef AVX512 @@ -231,7 +231,7 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ #if defined (AVX1)|| defined (AVX2) _mm256_store_pd((double *)a,ret.v); #endif -#ifdef SSE2 +#ifdef SSE4 _mm_store_pd((double *)a,ret.v); #endif #ifdef AVX512 @@ -257,7 +257,7 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ __m256d tmp = _mm256_addsub_pd(ret.v,_mm256_shuffle_pd(in.v,in.v,0x5)); ret.v=_mm256_shuffle_pd(tmp,tmp,0x5); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_addsub_pd(ret.v,in.v); #endif #ifdef AVX512 diff --git a/Grid_vComplexF.h b/Grid_vComplexF.h index 75c47248..42fe5163 100644 --- a/Grid_vComplexF.h +++ b/Grid_vComplexF.h @@ -63,7 +63,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_add_ps(a.v,b.v); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_add_ps(a.v,b.v); #endif #ifdef AVX512 @@ -81,7 +81,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_sub_ps(a.v,b.v); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_sub_ps(a.v,b.v); #endif #ifdef AVX512 @@ -120,7 +120,7 @@ namespace Grid { ymm1 = _mm256_mul_ps(ymm1,ymm2); // ymm1 <- br ai, ai bi ret.v= _mm256_addsub_ps(ymm0,ymm1); #endif -#ifdef SSE2 +#ifdef SSE4 cvec ymm0,ymm1,ymm2; ymm0 = _mm_shuffle_ps(a.v,a.v,_MM_SHUFFLE(2,2,0,0)); // ymm0 <- ar ar, ymm0 = _mm_mul_ps(ymm0,b.v); // ymm0 <- ar bi, ar br @@ -156,8 +156,8 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_ps(a[3].imag(),a[3].real(),a[2].imag(),a[2].real(),a[1].imag(),a[1].real(),a[0].imag(),a[0].real()); #endif -#ifdef SSE2 - ret.v = _mm_set_ps(a[1].imag, a[1].real(),a[0].imag(),a[0].real()); +#ifdef SSE4 + ret.v = _mm_set_ps(a[1].imag(), a[1].real(),a[0].imag(),a[0].real()); #endif #ifdef AVX512 ret.v = _mm512_set_ps(a[7].imag(),a[7].real(),a[6].imag(),a[6].real(),a[5].imag(),a[5].real(),a[4].imag(),a[4].real(),a[3].imag(),a[3].real(),a[2].imag(),a[2].real(),a[1].imag(),a[1].real(),a[0].imag(),a[0].real()); @@ -181,7 +181,7 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ #if defined (AVX1)|| defined (AVX2) _mm256_store_ps((float *)a,ret.v); #endif -#ifdef SSE2 +#ifdef SSE4 _mm_store_ps((float *)a,ret.v); #endif #ifdef AVX512 @@ -201,7 +201,7 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_ps(b,a,b,a,b,a,b,a); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_set_ps(a,b,a,b); #endif #ifdef AVX512 @@ -213,7 +213,11 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ } friend inline ComplexF Reduce(const vComplexF & in) { +#ifdef SSE4 +#error +#endif #if defined (AVX1) || defined(AVX2) + // FIXME this is inefficient and use __attribute__ ((aligned(32))) float c_[8]; _mm256_store_ps(c_,in.v); return ComplexF(c_[0]+c_[2]+c_[4]+c_[6],c_[1]+c_[3]+c_[5]+c_[7]); @@ -305,7 +309,7 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ tmp = _mm256_addsub_ps(ret.v,_mm256_shuffle_ps(in.v,in.v,_MM_SHUFFLE(2,3,0,1))); // ymm1 <- br,bi ret.v=_mm256_shuffle_ps(tmp,tmp,_MM_SHUFFLE(2,3,0,1)); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_addsub_ps(ret.v,in.v); #endif #ifdef AVX512 diff --git a/Grid_vInteger.h b/Grid_vInteger.h index 82adbd8e..672d4938 100644 --- a/Grid_vInteger.h +++ b/Grid_vInteger.h @@ -48,7 +48,7 @@ namespace Grid { #if defined (AVX2) ret.v = _mm256_add_epi32(a.v,b.v); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_add_epi32(a.v,b.v); #endif #ifdef AVX512 @@ -78,7 +78,7 @@ namespace Grid { #if defined (AVX2) ret.v = _mm256_sub_epi32(a.v,b.v); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_sub_epi32(a.v,b.v); #endif #ifdef AVX512 @@ -108,7 +108,7 @@ namespace Grid { #if defined (AVX2) ret.v = _mm256_mul_epi32(a.v,b.v); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_mul_epi32(a.v,b.v); #endif #ifdef AVX512 @@ -147,7 +147,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set1_epi32(a); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_set1_epi32(a); #endif #ifdef AVX512 @@ -161,7 +161,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_epi32(a[7],a[6],a[5],a[4],a[3],a[2],a[1],a[0]); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_set_epi32(a[0],a[1],a[2],a[3]); #endif #ifdef AVX512 @@ -177,8 +177,8 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) _mm256_store_si256((__m256i*)a,ret.v); #endif -#ifdef SSE2 - _mm_store_si128(a,ret.v); +#ifdef SSE4 + _mm_store_si128((__m128i *)a,ret.v); #endif #ifdef AVX512 _mm512_store_si512(a,ret.v); diff --git a/Grid_vRealD.h b/Grid_vRealD.h index 86f738f3..0f88f7da 100644 --- a/Grid_vRealD.h +++ b/Grid_vRealD.h @@ -24,7 +24,7 @@ namespace Grid { friend inline vRealD conj(const vRealD &in){ return in; } friend inline void mac (vRealD &y,const vRealD a,const vRealD x){ -#if defined (AVX1) || defined (SSE2) +#if defined (AVX1) || defined (SSE4) y = a*x+y; #endif #ifdef AVX2 // AVX 2 introduced FMA support. FMA4 eliminates a copy, but AVX only has FMA3 @@ -55,7 +55,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_add_pd(a.v,b.v); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_add_pd(a.v,b.v); #endif #ifdef AVX512 @@ -72,7 +72,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_sub_pd(a.v,b.v); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_sub_pd(a.v,b.v); #endif #ifdef AVX512 @@ -90,7 +90,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_mul_pd(a.v,b.v); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_mul_pd(a.v,b.v); #endif #ifdef AVX512 @@ -133,7 +133,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_pd(a,a,a,a); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_set_pd(a,a); #endif #ifdef AVX512 @@ -147,7 +147,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_pd(a[3],a[2],a[1],a[0]); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_set_pd(a[0],a[1]); #endif #ifdef AVX512 @@ -163,7 +163,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) _mm256_store_pd(a,ret.v); #endif -#ifdef SSE2 +#ifdef SSE4 _mm_store_pd(a,ret.v); #endif #ifdef AVX512 diff --git a/Grid_vRealF.h b/Grid_vRealF.h index b7c127ce..78c37177 100644 --- a/Grid_vRealF.h +++ b/Grid_vRealF.h @@ -26,7 +26,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_add_ps(a.v,b.v); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_add_ps(a.v,b.v); #endif #ifdef AVX512 @@ -48,7 +48,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_sub_ps(a.v,b.v); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_sub_ps(a.v,b.v); #endif #ifdef AVX512 @@ -70,7 +70,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_mul_ps(a.v,b.v); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_mul_ps(a.v,b.v); #endif #ifdef AVX512 @@ -96,7 +96,7 @@ namespace Grid { friend inline vRealF conj(const vRealF &in){ return in; } friend inline void mac (vRealF &y,const vRealF a,const vRealF x){ -#if defined (AVX1) || defined (SSE2) +#if defined (AVX1) || defined (SSE4) y = a*x+y; #endif #ifdef AVX2 // AVX 2 introduced FMA support. FMA4 eliminates a copy, but AVX only has FMA3 @@ -158,7 +158,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_ps(a,a,a,a,a,a,a,a); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_set_ps(a,a,a,a); #endif #ifdef AVX512 @@ -175,7 +175,7 @@ namespace Grid { #if defined (AVX1)|| defined (AVX2) ret.v = _mm256_set_ps(a[7],a[6],a[5],a[4],a[3],a[2],a[1],a[0]); #endif -#ifdef SSE2 +#ifdef SSE4 ret.v = _mm_set_ps(a[0],a[1],a[2],a[3]); #endif #ifdef AVX512 @@ -195,7 +195,7 @@ friend inline void vstore(const vRealF &ret, float *a){ #if defined (AVX1)|| defined (AVX2) _mm256_store_ps(a,ret.v); #endif -#ifdef SSE2 +#ifdef SSE4 _mm_store_ps(a,ret.v); #endif #ifdef AVX512 diff --git a/test_Grid_stencil.cc b/test_Grid_stencil.cc index 8077562f..fd2a9503 100644 --- a/test_Grid_stencil.cc +++ b/test_Grid_stencil.cc @@ -29,14 +29,14 @@ int main (int argc, char ** argv) #ifdef AVX512 simd_layout[0] = 1; - simd_layout[1] = 1; + simd_layout[1] = 2; simd_layout[2] = 2; simd_layout[3] = 2; #endif #if defined (AVX1)|| defined (AVX2) simd_layout[0] = 1; simd_layout[1] = 1; - simd_layout[2] = 1; + simd_layout[2] = 2; simd_layout[3] = 2; #endif #if defined (SSE2) From 1972eea128295b5091cf28339c5322d0baa1f82b Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 16 Apr 2015 14:48:21 +0100 Subject: [PATCH 054/429] spin trace type work --- Grid_config.h.in | 4 ++-- Makefile.in | 6 +++--- TODO | 17 ++++++++++------- configure | 6 +++--- configure.ac | 6 +++--- 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/Grid_config.h.in b/Grid_config.h.in index 91948fa2..660edd5d 100644 --- a/Grid_config.h.in +++ b/Grid_config.h.in @@ -72,8 +72,8 @@ /* Define to the version of this package. */ #undef PACKAGE_VERSION -/* SSE2 */ -#undef SSE2 +/* SSE4 */ +#undef SSE4 /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS diff --git a/Makefile.in b/Makefile.in index 11b86688..ce8b74be 100644 --- a/Makefile.in +++ b/Makefile.in @@ -158,7 +158,7 @@ PROGRAMS = $(bin_PROGRAMS) am_Grid_main_OBJECTS = Grid_main.$(OBJEXT) Grid_main_OBJECTS = $(am_Grid_main_OBJECTS) Grid_main_DEPENDENCIES = libGrid.a -am_test_Grid_stencil_OBJECTS = test_Grid_Stencil.$(OBJEXT) +am_test_Grid_stencil_OBJECTS = test_Grid_stencil.$(OBJEXT) test_Grid_stencil_OBJECTS = $(am_test_Grid_stencil_OBJECTS) test_Grid_stencil_DEPENDENCIES = libGrid.a AM_V_P = $(am__v_P_@AM_V@) @@ -370,7 +370,7 @@ include_HEADERS = Grid_config.h\ Grid_main_SOURCES = Grid_main.cc Grid_main_LDADD = libGrid.a -test_Grid_stencil_SOURCES = test_Grid_Stencil.cc +test_Grid_stencil_SOURCES = test_Grid_stencil.cc test_Grid_stencil_LDADD = libGrid.a all: Grid_config.h $(MAKE) $(AM_MAKEFLAGS) all-am @@ -523,7 +523,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_stencil_common.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_Grid_Stencil.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_Grid_stencil.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< diff --git a/TODO b/TODO index 010a06b7..5f21f520 100644 --- a/TODO +++ b/TODO @@ -7,18 +7,16 @@ AUDITS: * extract / merge extra implementation removal +BUILD: +* Test infrastructure +* subdirs lib, tests ?? + FUNCTIONALITY: - * Conditional execution, where etc... -----DONE, simple test - * Integer relational support -----DONE - * Coordinate information, integers etc... -----DONE - * Integer type padding/union to vector. -----DONE - * LatticeCoordinate[mu] -----DONE - * Stencil operator support -----Initial thoughts, trial implementation DONE. -----some simple tests that Stencil matches Cshift. -----do all permute in comms phase, so that copy permute @@ -27,6 +25,12 @@ FUNCTIONALITY: * CovariantShift support -----Use a class to store gauge field? (parallel transport?) +POST-SFW call: + +* TraceColor, TraceSpin. +* How to define simple matrix operations, such as flavour matrices? + + * Subset support, slice sums etc... -----Only need slice sum? -----Generic cartesian subslicing? -----Array ranges / boost extents? @@ -34,7 +38,6 @@ FUNCTIONALITY: -----Suggests generalised cartesian subblocking sums, returning modified grid? -----What should interface be? - i) Two classes of subset; red black parity subsetting (pick checkerboard). cartesian sub-block subsetting diff --git a/configure b/configure index c6f93abc..1adf726f 100755 --- a/configure +++ b/configure @@ -5009,10 +5009,10 @@ fi case ${ac_SIMD} in - SSE2) - echo Configuring for SSE2 + SSE4) + echo Configuring for SSE4 -$as_echo "#define SSE2 1" >>confdefs.h +$as_echo "#define SSE4 1" >>confdefs.h ;; AVX) diff --git a/configure.ac b/configure.ac index bfe745e5..83405ca8 100644 --- a/configure.ac +++ b/configure.ac @@ -29,9 +29,9 @@ AC_CHECK_FUNCS([gettimeofday]) AC_ARG_ENABLE([simd],[AC_HELP_STRING([--enable-simd=SSE|AVX|AVX2|AVX512],[Select instructions])],[ac_SIMD=${enable_simd}],[ac_SIMD=AVX2]) case ${ac_SIMD} in - SSE2) - echo Configuring for SSE2 - AC_DEFINE([SSE2],[1],[SSE2] ) + SSE4) + echo Configuring for SSE4 + AC_DEFINE([SSE4],[1],[SSE4] ) ;; AVX) echo Configuring for AVX From 6b04dd4a5d7aac3e88be18409c7a7fdcd773dd18 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 16 Apr 2015 15:20:19 +0100 Subject: [PATCH 055/429] Better code --- Grid_Lattice.h | 4 +- Grid_math_types.h | 105 ++++++++++++++++++++++++---------------------- 2 files changed, 57 insertions(+), 52 deletions(-) diff --git a/Grid_Lattice.h b/Grid_Lattice.h index a94a13a4..8075df94 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -156,7 +156,8 @@ public: } }; - // FIXME for debug; deprecate this + // FIXME for debug; deprecate this; made obscelete by + // LatticeCoordinate(); friend void lex_sites(Lattice &l){ Real *v_ptr = (Real *)&l._odata[0]; size_t o_len = l._grid->oSites(); @@ -211,6 +212,7 @@ public: return *this; } + // FIXME trace type structure is weird inline friend Lattice > _trace(const Lattice &lhs){ Lattice > ret(lhs._grid); #pragma omp parallel for diff --git a/Grid_math_types.h b/Grid_math_types.h index 58de9c15..9a9f1274 100644 --- a/Grid_math_types.h +++ b/Grid_math_types.h @@ -1059,6 +1059,23 @@ template inline iScalar conj(const iScalar&r) ret._internal = conj(r._internal); return ret; } +template inline iVector conj(const iVector&r) +{ + iVector ret; + for(int i=0;i inline iMatrix conj(const iMatrix&r) +{ + iMatrix ret; + for(int i=0;i inline iScalar adj(const iScalar&r) @@ -1085,8 +1102,14 @@ template inline iMatrix adj(const iMatrix & return ret; } ///////////////////////////////////////////////////////////////// -// Transpose +// Transpose all indices ///////////////////////////////////////////////////////////////// + +inline ComplexD transpose(ComplexD &rhs){ return rhs;} +inline ComplexF transpose(ComplexF &rhs){ return rhs;} +inline RealD transpose(RealD &rhs){ return rhs;} +inline RealF transpose(RealF &rhs){ return rhs;} + template inline typename std::enable_if::value, iMatrix >::type transpose(iMatrix arg) @@ -1128,19 +1151,9 @@ template return ret; } - - -/* - * No need to implement transpose on the primitive types - * Not sure that this idiom is any more elegant that the trace idiom below however! -inline ComplexD transpose(ComplexD &rhs){ return rhs;} -inline ComplexF transpose(ComplexF &rhs){ return rhs;} -inline RealD transpose(RealD &rhs){ return rhs;} -inline RealF transpose(RealF &rhs){ return rhs;} - */ - //////////////////////////////////////////////////////////////////////////////////////////// -// Transpose a specific index +// Transpose a specific index; instructive to compare this style of recursion termination +// to that of adj; which is easiers? //////////////////////////////////////////////////////////////////////////////////////////// template inline typename std::enable_if,Level>::value, iMatrix >::type @@ -1171,15 +1184,40 @@ transposeIndex (const iScalar &arg) { return transposeIndex(arg._internal); } -//////////////////////////////// -// Trace a specific index -//////////////////////////////// + +////////////////////////////////////////////////////////////////// +// Traces: both all indices and a specific index +///////////////////////////////////////////////////////////////// + +inline ComplexF trace( const ComplexF &arg){ return arg;} +inline ComplexD trace( const ComplexD &arg){ return arg;} +inline RealF trace( const RealF &arg){ return arg;} +inline RealD trace( const RealD &arg){ return arg;} template inline ComplexF traceIndex(const ComplexF arg) { return arg;} template inline ComplexD traceIndex(const ComplexD arg) { return arg;} template inline RealF traceIndex(const RealF arg) { return arg;} template inline RealD traceIndex(const RealD arg) { return arg;} +template +inline auto trace(const iMatrix &arg) -> iScalar +{ + iScalar ret; + zeroit(ret._internal); + for(int i=0;i +inline auto trace(const iScalar &arg) -> iScalar +{ + iScalar ret; + ret._internal=trace(arg._internal); + return ret; +} + +// Specific indices. template inline auto traceIndex(const iScalar &arg) -> iScalar(arg._internal)) > { @@ -1268,41 +1306,6 @@ template inline auto imag(const iVector &z) -> iVect return ret; } - ///////////////////////////////// - // Trace of scalar and matrix - ///////////////////////////////// - -inline ComplexF trace( const ComplexF &arg){ - return arg; -} -inline ComplexD trace( const ComplexD &arg){ - return arg; -} -inline RealF trace( const RealF &arg){ - return arg; -} -inline RealD trace( const RealD &arg){ - return arg; -} - -template -inline auto trace(const iMatrix &arg) -> iScalar -{ - iScalar ret; - zeroit(ret._internal); - for(int i=0;i -inline auto trace(const iScalar &arg) -> iScalar -{ - iScalar ret; - ret._internal=trace(arg._internal); - return ret; -} - }; #endif From 3b9110b5db1f9d6d695f713a281ed27f41619c67 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 16 Apr 2015 17:22:52 +0100 Subject: [PATCH 056/429] SSE flag changed --- Grid_main.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Grid_main.cc b/Grid_main.cc index e122fcbe..291cde25 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -48,7 +48,7 @@ int main (int argc, char ** argv) simd_layout[2] = 2; simd_layout[3] = 2; #endif -#if defined (SSE2) +#if defined (SSE4) simd_layout[0] = 1; simd_layout[1] = 1; simd_layout[2] = 1; From 1408a3c0f9fe3f117dd42008cc257991fc2e8e3a Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 12:17:13 +0100 Subject: [PATCH 057/429] Got traceIndex, transposeIndex fully working. Need to think about peekIndex interface and () based indexing. --- Grid_summation.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 Grid_summation.h diff --git a/Grid_summation.h b/Grid_summation.h new file mode 100644 index 00000000..dff2df61 --- /dev/null +++ b/Grid_summation.h @@ -0,0 +1,12 @@ +#ifndef GRID_SUMMATION_H +#define GRID_SUMMATION_H + +template +inline void sumBlocks(Lattice &coarseData,const Lattice Date: Sat, 18 Apr 2015 12:21:37 +0100 Subject: [PATCH 058/429] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 42537417..74c03a33 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,8 @@ array indices to both MPI tasks and SIMD processing elements. The transformation is based on the observation that Cartesian array processing involves identical processing to be performed on different regions of the Cartesian array. -The library will (eventually) both geometrically decompose into MPI tasks and across SIMD lanes. +The library will both geometrically decompose into MPI tasks and across SIMD lanes. +Local vector loops are parallelised with OpenMP pragmas. Data parallel array operations can then be specified with a SINGLE data parallel paradigm, but optimally use MPI, OpenMP and SIMD parallelism under the hood. This is a significant simplification @@ -30,7 +31,7 @@ The corresponding scalar types are named RealF, RealD, ComplexF, ComplexD -MPI parallelism is UNIMPLEMENTED and for now only OpenMP and SIMD parallelism is present in the library. +MPI, OpenMP, and SIMD parallelism are present in the library. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here From 5d1b866e7a473d894883425bb9d097e6bb3c3690 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 12:40:55 +0100 Subject: [PATCH 059/429] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 74c03a33..80714d76 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ MPI, OpenMP, and SIMD parallelism are present in the library. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here -is are examples: +are examples: ./configure CXX=clang++ CXXFLAGS="-std=c++11 -O3 -mavx" --enable-simd=AVX1 From e25f10566c83f4d1bf5ccc9ecd3b850b5fc57ab4 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 14:36:01 +0100 Subject: [PATCH 060/429] peekIndex update --- Grid_Lattice.h | 170 ++++++++++++++++++++++++---- Grid_QCD.h | 73 ++++++++---- Grid_main.cc | 85 +++++++++++--- Grid_math_types.h | 263 ++++++++++++++++++++++++++++++++++++++++--- Grid_simd.h | 1 + Grid_vRealD.h | 5 +- Grid_vRealF.h | 4 +- TODO | 58 +++++++--- test_Grid_stencil.cc | 12 +- 9 files changed, 562 insertions(+), 109 deletions(-) diff --git a/Grid_Lattice.h b/Grid_Lattice.h index 8075df94..b595ae0a 100644 --- a/Grid_Lattice.h +++ b/Grid_Lattice.h @@ -6,7 +6,23 @@ namespace Grid { - extern int GridCshiftPermuteMap[4][16]; +// TODO: Indexing () +// mac,real,imag +// +// Functionality required: +// -=,+=,*=,() +// add,+,sub,-,mult,mac,* +// adj,conj +// real,imag +// transpose,transposeIndex +// trace,traceIndex +// peekIndex +// innerProduct,outerProduct, +// localNorm2 +// localInnerProduct +// + +extern int GridCshiftPermuteMap[4][16]; template class Lattice @@ -41,6 +57,9 @@ public: template friend void mult(Lattice &ret,const Lattice &lhs,const Lattice &rhs); + template + friend void mac(Lattice &ret,const Lattice &lhs,const Lattice &rhs); + template friend void sub(Lattice &ret,const Lattice &lhs,const Lattice &rhs); @@ -212,26 +231,6 @@ public: return *this; } - // FIXME trace type structure is weird - inline friend Lattice > _trace(const Lattice &lhs){ - Lattice > ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = trace(lhs._odata[ss]); - } - return ret; - }; - - inline friend Lattice > > trace(const Lattice &lhs){ - Lattice > > ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = trace(lhs._odata[ss]); - } - return ret; - }; - - inline friend Lattice adj(const Lattice &lhs){ Lattice ret(lhs._grid); #pragma omp parallel for @@ -241,6 +240,16 @@ public: return ret; }; + inline friend Lattice transpose(const Lattice &lhs){ + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = transpose(lhs._odata[ss]); + } + return ret; + }; + + inline friend Lattice conj(const Lattice &lhs){ Lattice ret(lhs._grid); #pragma omp parallel for @@ -304,6 +313,17 @@ public: mult(&ret._odata[ss],&lhs._odata[ss],&rhs._odata[ss]); } } + + template + void mac(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ + conformable(lhs,rhs); + uint32_t vec_len = lhs._grid->oSites(); +#pragma omp parallel for + for(int ss=0;ss void sub(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); @@ -409,6 +429,82 @@ public: return ret; } + //////////////////////////////////////////////////////////////////////////////////////////////////// + // Trace + //////////////////////////////////////////////////////////////////////////////////////////////////// + template + inline auto trace(const Lattice &lhs) + -> Lattice + { + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = trace(lhs._odata[ss]); + } + return ret; + }; + + //////////////////////////////////////////////////////////////////////////////////////////////////// + // Index level dependent operations + //////////////////////////////////////////////////////////////////////////////////////////////////// + template + inline auto traceIndex(const Lattice &lhs) + -> Lattice(lhs._odata[0]))> + { + Lattice(lhs._odata[0]))> ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = traceIndex(lhs._odata[ss]); + } + return ret; + }; + template + inline auto transposeIndex(const Lattice &lhs) + -> Lattice(lhs._odata[0]))> + { + Lattice(lhs._odata[0]))> ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = transposeIndex(lhs._odata[ss]); + } + return ret; + }; + + // Fixme; this is problematic since the number of args is variable and + // may mismatch... + template + inline auto peekIndex(const Lattice &lhs) + -> Lattice(lhs._odata[0]))> + { + Lattice(lhs._odata[0]))> ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = peekIndex(lhs._odata[ss]); + } + return ret; + }; + template + inline auto peekIndex(const Lattice &lhs,int i) + -> Lattice(lhs._odata[0],i))> + { + Lattice(lhs._odata[0],i))> ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = peekIndex(lhs._odata[ss],i); + } + return ret; + }; + template + inline auto peekIndex(const Lattice &lhs,int i,int j) + -> Lattice(lhs._odata[0],i,j))> + { + Lattice(lhs._odata[0],i,j))> ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = peekIndex(lhs._odata[ss],i,j); + } + return ret; + }; //////////////////////////////////////////////////////////////////////////////////////////////////// // Reduction operations //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -416,14 +512,16 @@ public: inline RealD norm2(const Lattice &arg){ typedef typename vobj::scalar_type scalar; + typedef typename vobj::vector_type vector; decltype(innerProduct(arg._odata[0],arg._odata[0])) vnrm=zero; - scalar nrm; //FIXME make this loop parallelisable + vnrm=zero; for(int ss=0;ssoSites(); ss++){ vnrm = vnrm + innerProduct(arg._odata[ss],arg._odata[ss]); } - nrm = Reduce(TensorRemove(vnrm)); + vector vvnrm =TensorRemove(vnrm) ; + nrm = Reduce(vvnrm); arg._grid->GlobalSum(nrm); return real(nrm); } @@ -439,7 +537,7 @@ public: for(int ss=0;ssoSites(); ss++){ vnrm = vnrm + innerProduct(left._odata[ss],right._odata[ss]); } - nrm = Reduce(TensorRemove(vnrm)); + nrm = Reduce(vnrm); right._grid->GlobalSum(nrm); return nrm; } @@ -455,10 +553,32 @@ public: Lattice ret(rhs._grid); #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=innerProduct(rhs,rhs); + ret._odata[ss]=innerProduct(rhs._odata[ss],rhs._odata[ss]); } return ret; } + + template + inline auto real(const Lattice &z) -> Lattice + { + Lattice ret(z._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = real(z._odata[ss]); + } + return ret; + } + + template + inline auto imag(const Lattice &z) -> Lattice + { + Lattice ret(z._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = imag(z._odata[ss]); + } + return ret; + } // localInnerProduct template diff --git a/Grid_QCD.h b/Grid_QCD.h index 2f411f16..6f85d692 100644 --- a/Grid_QCD.h +++ b/Grid_QCD.h @@ -5,57 +5,80 @@ namespace QCD { static const int Nc=3; static const int Ns=4; + static const int Nd=4; + static const int CbRed =0; static const int CbBlack=1; + ////////////////////////////////////////////////////////////////////////////// // QCD iMatrix types - template using iSinglet = iScalar > ; - template using iSpinMatrix = iMatrix, Ns>; - template using iSpinColourMatrix = iMatrix, Ns>; - template using iColourMatrix = iScalar> ; + // Index conventions: Lorentz x Spin x Colour + // + // ChrisK very keen to add extra space for Gparity doubling. + // + // Also add domain wall index, in a way where Wilson operator + // naturally distributes across the 5th dimensions. + ////////////////////////////////////////////////////////////////////////////// + template using iSinglet = iScalar > >; + template using iSpinMatrix = iScalar, Ns> >; + template using iSpinColourMatrix = iScalar, Ns> >; + template using iColourMatrix = iScalar > > ; + template using iLorentzColourMatrix = iVector >, Nd > ; - template using iSpinVector = iVector, Ns>; - template using iColourVector = iScalar >; - template using iSpinColourVector = iVector, Ns>; - typedef iSinglet TComplex; // This is painful. Tensor singlet complex type. - typedef iSinglet vTComplex; // what if we don't know the tensor structure - typedef iSinglet TReal; // Shouldn't need these. - typedef iSinglet vTInteger; + template using iSpinVector = iScalar, Ns> >; + template using iColourVector = iScalar > >; + template using iSpinColourVector = iScalar, Ns> >; - typedef iSpinMatrix SpinMatrix; - typedef iColourMatrix ColourMatrix; - typedef iSpinColourMatrix SpinColourMatrix; + typedef iSpinMatrix SpinMatrix; + typedef iColourMatrix ColourMatrix; + typedef iSpinColourMatrix SpinColourMatrix; + typedef iLorentzColourMatrix LorentzColourMatrix; typedef iSpinVector SpinVector; typedef iColourVector ColourVector; typedef iSpinColourVector SpinColourVector; - typedef iSpinMatrix vSpinMatrix; - typedef iColourMatrix vColourMatrix; - typedef iSpinColourMatrix vSpinColourMatrix; + typedef iSpinMatrix vSpinMatrix; + typedef iColourMatrix vColourMatrix; + typedef iSpinColourMatrix vSpinColourMatrix; + typedef iLorentzColourMatrix vLorentzColourMatrix; typedef iSpinVector vSpinVector; typedef iColourVector vColourVector; typedef iSpinColourVector vSpinColourVector; - typedef Lattice LatticeComplex; + typedef iSinglet TComplex; // This is painful. Tensor singlet complex type. + typedef iSinglet vTComplex; // what if we don't know the tensor structure + typedef iSinglet TReal; // Shouldn't need these; can I make it work without? + typedef iSinglet vTReal; + typedef iSinglet vTInteger; + typedef iSinglet TInteger; + + typedef Lattice LatticeReal; + typedef Lattice LatticeComplex; typedef Lattice LatticeInteger; // Predicates for "where" typedef Lattice LatticeColourMatrix; typedef Lattice LatticeSpinMatrix; - typedef Lattice LatticePropagator; - typedef LatticePropagator LatticeSpinColourMatrix; + typedef Lattice LatticeSpinColourMatrix; - typedef Lattice LatticeFermion; typedef Lattice LatticeSpinColourVector; typedef Lattice LatticeSpinVector; typedef Lattice LatticeColourVector; + /////////////////////////////////////////// + // Physical names for things + /////////////////////////////////////////// + typedef Lattice LatticeFermion; + typedef Lattice LatticePropagator; + typedef Lattice LatticeGaugeField; - // FIXME for debug; deprecate this - inline void LatticeCoordinate(LatticeInteger &l,int mu){ + + + + inline void LatticeCoordinate(LatticeInteger &l,int mu){ GridBase *grid = l._grid; int Nsimd = grid->iSites(); std::vector gcoor; @@ -63,8 +86,8 @@ namespace QCD { std::vector mergeptr(Nsimd); for(int o=0;ooSites();o++){ for(int i=0;iiSites();i++){ - // RankIndexToGlobalCoor(grid->ThisRank(),o,i,gcoor); - grid->RankIndexToGlobalCoor(0,o,i,gcoor); + grid->RankIndexToGlobalCoor(grid->ThisRank(),o,i,gcoor); + // grid->RankIndexToGlobalCoor(0,o,i,gcoor); mergebuf[i]=gcoor[mu]; mergeptr[i]=&mergebuf[i]; } diff --git a/Grid_main.cc b/Grid_main.cc index 291cde25..0d6c5039 100644 --- a/Grid_main.cc +++ b/Grid_main.cc @@ -84,6 +84,8 @@ int main (int argc, char ** argv) LatticeSpinColourMatrix scMat(&Fine); LatticeComplex scalar(&Fine); + LatticeReal rscalar(&Fine); + LatticeReal iscalar(&Fine); SpinMatrix GammaFive; iSpinMatrix iGammaFive; @@ -110,6 +112,44 @@ int main (int argc, char ** argv) cMat = outerProduct(cVec,cVec); scalar = localInnerProduct(cVec,cVec); + + scalar += scalar; + scalar -= scalar; + scalar *= scalar; + add(scalar,scalar,scalar); + sub(scalar,scalar,scalar); + mult(scalar,scalar,scalar); + mac(scalar,scalar,scalar); + scalar = scalar+scalar; + scalar = scalar-scalar; + scalar = scalar*scalar; + + scalar=outerProduct(scalar,scalar); + + scalar=adj(scalar); + + // rscalar=real(scalar); + // iscalar=imag(scalar); + // scalar =cmplx(rscalar,iscalar); + + scalar=transpose(scalar); + scalar=transposeIndex<1>(scalar); + scalar=traceIndex<1>(scalar); + scalar=peekIndex<1>(cVec,0); + scalar=trace(scalar); + scalar=localInnerProduct(cVec,cVec); + scalar=localNorm2(cVec); + +// -=,+=,*=,() +// add,+,sub,-,mult,mac,* +// adj,conj +// real,imag +// transpose,transposeIndex +// trace,traceIndex +// peekIndex +// innerProduct,outerProduct, +// localNorm2 +// localInnerProduct scMat = sMat*scMat; // LatticeSpinColourMatrix = LatticeSpinMatrix * LatticeSpinColourMatrix @@ -171,15 +211,21 @@ int main (int argc, char ** argv) SpinMatrix s_m; SpinColourMatrix sc_m; - s_m = traceIndex<1>(sc_m); - c_m = traceIndex<2>(sc_m); + s_m = traceIndex<1>(sc_m); // Map to traceColour + c_m = traceIndex<2>(sc_m); // map to traceSpin - c = traceIndex<2>(s_m); + c = traceIndex<2>(s_m); c = traceIndex<1>(c_m); + + s_m = peekIndex<1>(scm,0,0); + c_m = peekIndex<2>(scm,1,2); printf("c. Level %d\n",c_m.TensorLevel); - printf("c. Level %d\n",c_m._internal.TensorLevel); - + printf("c. Level %d\n",c_m().TensorLevel); + printf("c. Level %d\n",c_m()().TensorLevel); + + c_m()() = scm()(0,0); //ColourComponents of CM <= ColourComponents of SpinColourMatrix + scm()(1,1) = cm()(); //ColourComponents of CM <= ColourComponents of SpinColourMatrix } FooBar = Bar; @@ -244,6 +290,9 @@ int main (int argc, char ** argv) int ncall=100; int Nc = Grid::QCD::Nc; + LatticeGaugeField U(&Fine); + // LatticeColourMatrix Uy = U(yDir); + flops = ncall*1.0*volume*(8*Nc*Nc*Nc); bytes = ncall*1.0*volume*Nc*Nc *2*3*sizeof(Grid::Real); if ( Fine.IsBoss() ) { @@ -373,38 +422,38 @@ int main (int argc, char ** argv) mdiff = shifted1-shifted2; amdiff=adj(mdiff); ColourMatrix prod = amdiff*mdiff; - TReal Ttr=real(trace(prod)); - double nn=Ttr._internal._internal; + Real Ttr=real(trace(prod)); + double nn=Ttr; if ( nn > 0 ) cout<<"Shift real trace fail "< 0 ) cout<<"Shift fail (shifted1/shifted2-ref) "< 0 ) cout<<"Shift rb fail (shifted3/shifted2-ref) "< #include +// +// Indexing; want to be able to dereference and +// obtain either an lvalue or an rvalue. +// namespace Grid { // First some of my own traits @@ -58,6 +62,16 @@ namespace Grid { static const bool value = (Level==T::TensorLevel); static const bool notvalue = (Level!=T::TensorLevel); }; + // What is the vtype + template struct isComplex { + static const bool value = false; + }; + template<> struct isComplex { + static const bool value = true; + }; + template<> struct isComplex { + static const bool value = true; + }; /////////////////////////////////////////////////// @@ -65,12 +79,7 @@ namespace Grid { // These can be composed to form tensor products of internal indices. /////////////////////////////////////////////////// - // Terminates the recursion for temoval of all Grids tensors - inline vRealD TensorRemove(vRealD arg){ return arg;} - inline vRealF TensorRemove(vRealF arg){ return arg;} - inline vComplexF TensorRemove(vComplexF arg){ return arg;} - inline vComplexD TensorRemove(vComplexD arg){ return arg;} - inline vInteger TensorRemove(vInteger arg){ return arg;} + template class iScalar { @@ -109,10 +118,6 @@ public: friend void merge(iScalar &in,std::vector &out){ merge(in._internal,out); // extract advances the pointers in out } - friend inline iScalar::vector_type TensorRemove(iScalar arg) - { - return TensorRemove(arg._internal); - } // Unary negation friend inline iScalar operator -(const iScalar &r) { @@ -133,7 +138,23 @@ public: *this = (*this)+r; return *this; } + + inline vtype & operator ()(void) { + return _internal; + } + + operator ComplexD () const { return(TensorRemove(_internal)); }; + operator RealD () const { return(real(TensorRemove(_internal))); } + }; +/////////////////////////////////////////////////////////// +// Allows to turn scalar>>> back to double. +/////////////////////////////////////////////////////////// +template inline typename std::enable_if::notvalue, T>::type TensorRemove(T arg) { return arg;} +template inline auto TensorRemove(iScalar arg) -> decltype(TensorRemove(arg._internal)) +{ + return TensorRemove(arg._internal); +} template class iVector { @@ -148,7 +169,8 @@ public: typedef iScalar tensor_reduced; iVector(Zero &z){ *this = zero; }; - iVector() {}; + iVector() {};// Empty constructure + iVector & operator= (Zero &hero){ zeroit(*this); return *this; @@ -192,6 +214,9 @@ public: *this = (*this)+r; return *this; } + inline vtype & operator ()(int i) { + return _internal[i]; + } }; template class iMatrix @@ -262,6 +287,9 @@ public: *this = (*this)+r; return *this; } + inline vtype & operator ()(int i,int j) { + return _internal[i][j]; + } }; @@ -801,6 +829,33 @@ template inline iMatrix operator * (const iMatrix& lhs, } template inline iMatrix operator * (double lhs,const iMatrix& rhs) { return rhs*lhs; } +//////////////////////////////////////////////////////////////////// +// Complex support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator * (const iScalar& lhs,ComplexD rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iScalar operator * (ComplexD lhs,const iScalar& rhs) { return rhs*lhs; } + +template inline iVector operator * (const iVector& lhs,ComplexD rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iVector operator * (ComplexD lhs,const iVector& rhs) { return rhs*lhs; } + +template inline iMatrix operator * (const iMatrix& lhs,ComplexD rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iMatrix operator * (ComplexD lhs,const iMatrix& rhs) { return rhs*lhs; } + //////////////////////////////////////////////////////////////////// // Integer support; cast to "scalar_type" through constructor //////////////////////////////////////////////////////////////////// @@ -1101,6 +1156,9 @@ template inline iMatrix adj(const iMatrix & }} return ret; } + + + ///////////////////////////////////////////////////////////////// // Transpose all indices ///////////////////////////////////////////////////////////////// @@ -1133,7 +1191,7 @@ template return ret; } -template +template inline typename std::enable_if::value, iScalar >::type transpose(iScalar arg) { @@ -1142,7 +1200,7 @@ template return ret; } -template +template inline typename std::enable_if::notvalue, iScalar >::type transpose(iScalar arg) { @@ -1151,6 +1209,7 @@ template return ret; } + //////////////////////////////////////////////////////////////////////////////////////////// // Transpose a specific index; instructive to compare this style of recursion termination // to that of adj; which is easiers? @@ -1182,7 +1241,15 @@ template inline typename std::enable_if,Level>::notvalue, iScalar >::type transposeIndex (const iScalar &arg) { - return transposeIndex(arg._internal); + iScalar ret; + ret._internal=transposeIndex(arg._internal); + return ret; +} +template inline +typename std::enable_if,Level>::value, iScalar >::type +transposeIndex (const iScalar &arg) +{ + return arg; } ////////////////////////////////////////////////////////////////// @@ -1216,8 +1283,10 @@ inline auto trace(const iScalar &arg) -> iScalar inline auto traceIndex(const iScalar &arg) -> iScalar(arg._internal)) > { @@ -1225,6 +1294,25 @@ auto traceIndex(const iScalar &arg) -> iScalar ret._internal = traceIndex(arg._internal); return ret; } +*/ +template inline auto +traceIndex (const iScalar &arg) -> +typename +std::enable_if,Level>::notvalue, + iScalar(arg._internal))> >::type + +{ + iScalar(arg._internal))> ret; + ret._internal=traceIndex(arg._internal); + return ret; +} +template inline auto +traceIndex (const iScalar &arg) -> +typename std::enable_if,Level>::value, + iScalar >::type +{ + return arg; +} // If we hit the right index, return scalar and trace it with no further recursion template inline @@ -1254,6 +1342,149 @@ auto traceIndex(const iMatrix &arg) -> return ret; } +////////////////////////////////////////////////////////////////////////////// +// Peek on a specific index; returns a scalar in that index, tensor inherits rest +////////////////////////////////////////////////////////////////////////////// +// If we hit the right index, return scalar with no further recursion + +//template inline ComplexF peekIndex(const ComplexF arg) { return arg;} +//template inline ComplexD peekIndex(const ComplexD arg) { return arg;} +//template inline RealF peekIndex(const RealF arg) { return arg;} +//template inline RealD peekIndex(const RealD arg) { return arg;} + +// Scalar peek, no indices +template inline + auto peekIndex(const iScalar &arg) -> + typename std::enable_if,Level>::value, // Index matches + iScalar >::type // return scalar +{ + return arg; +} +// Vector peek, one index +template inline + auto peekIndex(const iVector &arg,int i) -> + typename std::enable_if,Level>::value, // Index matches + iScalar >::type // return scalar +{ + iScalar ret; // return scalar + ret._internal = arg._internal[i]; + return ret; +} +// Matrix peek, two indices +template inline + auto peekIndex(const iMatrix &arg,int i,int j) -> + typename std::enable_if,Level>::value, // Index matches + iScalar >::type // return scalar +{ + iScalar ret; // return scalar + ret._internal = arg._internal[i][j]; + return ret; +} + +///////////// +// No match peek for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue +///////////// +// scalar +template inline + auto peekIndex(const iScalar &arg) -> // Scalar 0 index + typename std::enable_if,Level>::notvalue, // Index does NOT match + iScalar(arg._internal))> >::type +{ + iScalar(arg._internal))> ret; + ret._internal= peekIndex(arg._internal); + return ret; +} +template inline + auto peekIndex(const iScalar &arg,int i) -> // Scalar 1 index + typename std::enable_if,Level>::notvalue, // Index does NOT match + iScalar(arg._internal,i))> >::type +{ + iScalar(arg._internal,i))> ret; + ret._internal=peekIndex(arg._internal,i); + return ret; +} +template inline + auto peekIndex(const iScalar &arg,int i,int j) -> // Scalar, 2 index + typename std::enable_if,Level>::notvalue, // Index does NOT match + iScalar(arg._internal,i,j))> >::type +{ + iScalar(arg._internal,i,j))> ret; + ret._internal=peekIndex(arg._internal,i,j); + return ret; +} +// vector +template inline +auto peekIndex(const iVector &arg) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iVector(arg._internal[0])),N> >::type +{ + iVector(arg._internal[0])),N> ret; + for(int ii=0;ii(arg._internal[ii]); + } + return ret; +} +template inline + auto peekIndex(const iVector &arg,int i) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iVector(arg._internal[0],i)),N> >::type +{ + iVector(arg._internal[0],i)),N> ret; + for(int ii=0;ii(arg._internal[ii],i); + } + return ret; +} +template inline + auto peekIndex(const iVector &arg,int i,int j) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iVector(arg._internal[0],i,j)),N> >::type +{ + iVector(arg._internal[0],i,j)),N> ret; + for(int ii=0;ii(arg._internal[ii],i,j); + } + return ret; +} +// matrix +template inline +auto peekIndex(const iMatrix &arg) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iMatrix(arg._internal[0][0])),N> >::type +{ + iMatrix(arg._internal[0][0])),N> ret; + for(int ii=0;ii(arg._internal[ii][jj]);// Could avoid this because peeking a scalar is dumb + }} + return ret; +} +template inline + auto peekIndex(const iMatrix &arg,int i) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iMatrix(arg._internal[0],i)),N> >::type +{ + iMatrix(arg._internal[0],i)),N> ret; + for(int ii=0;ii(arg._internal[ii][jj],i); + }} + return ret; +} +template inline + auto peekIndex(const iMatrix &arg,int i,int j) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iMatrix(arg._internal[0][0],i,j)),N> >::type +{ + iMatrix(arg._internal[0][0],i,j)),N> ret; + for(int ii=0;ii(arg._internal[ii][jj],i,j); + }} + return ret; +} + + ///////////////////////////////////////////////////////////////// // Can only take the real/imag part of scalar objects, since // lattice objects of different complex nature are non-conformable. diff --git a/Grid_simd.h b/Grid_simd.h index ae05c3b2..dbde0fd7 100644 --- a/Grid_simd.h +++ b/Grid_simd.h @@ -235,6 +235,7 @@ inline void Gpermute(vsimd &y,const vsimd &b,int perm){ #include #include + namespace Grid { // NB: Template the following on "type Complex" and then implement *,+,- for diff --git a/Grid_vRealD.h b/Grid_vRealD.h index 0f88f7da..0eb6d9c1 100644 --- a/Grid_vRealD.h +++ b/Grid_vRealD.h @@ -240,7 +240,7 @@ namespace Grid { static int Nsimd(void) { return sizeof(dvec)/sizeof(double);} }; - inline vRealD innerProduct(const vRealD & l, const vRealD & r) { return conj(l)*r; } + inline vRealD innerProduct(const vRealD & l, const vRealD & r) { return conj(l)*r; } inline void zeroit(vRealD &z){ vzero(z);} inline vRealD outerProduct(const vRealD &l, const vRealD& r) @@ -250,6 +250,9 @@ namespace Grid { inline vRealD trace(const vRealD &arg){ return arg; } + inline vRealD real(const vRealD &arg){ + return arg; + } } diff --git a/Grid_vRealF.h b/Grid_vRealF.h index 78c37177..7831a6c7 100644 --- a/Grid_vRealF.h +++ b/Grid_vRealF.h @@ -267,10 +267,12 @@ friend inline void vstore(const vRealF &ret, float *a){ { return l*r; } - inline vRealF trace(const vRealF &arg){ return arg; } + inline vRealF real(const vRealF &arg){ + return arg; + } } diff --git a/TODO b/TODO index 5f21f520..33032277 100644 --- a/TODO +++ b/TODO @@ -1,36 +1,60 @@ - -AUDITS: -* FIXME audit -* const audit -* Replace vset with a call to merge.; -* care in Gmerge,Gextract over vset . -* extract / merge extra implementation removal - - -BUILD: -* Test infrastructure -* subdirs lib, tests ?? - FUNCTIONALITY: * Conditional execution, where etc... -----DONE, simple test * Integer relational support -----DONE * Coordinate information, integers etc... -----DONE * Integer type padding/union to vector. -----DONE * LatticeCoordinate[mu] -----DONE + +AUDITS: +// Lattice support audit Tested in Grid_main.cc +// +// -=,+=,*= Y +// add,+,sub,-,mult,mac,* Y +// innerProduct,norm2 Y +// localInnerProduct,outerProduct, Y +// adj,conj Y +// transpose, Y +// trace Y +// +// transposeIndex Y +// traceIndex Y +// peekIndex N; #args +// +// real,imag missing, semantic thought needed on real/im support. +// perhaps I just keep everything complex? +// + +* FIXME audit +* const audit +* Replace vset with a call to merge.; +* care in Gmerge,Gextract over vset . +* extract / merge extra implementation removal + +BUILD: +* Test infrastructure +* subdirs lib, tests ?? + +* How to do U[mu] ... lorentz part of type structure or not. more like chroma if not. +* Passing a Grid into construct iVector?? +* + * Stencil operator support -----Initial thoughts, trial implementation DONE. -----some simple tests that Stencil matches Cshift. -----do all permute in comms phase, so that copy permute -----cases move into a buffer. + -----allow transform in/out buffers spproj * CovariantShift support -----Use a class to store gauge field? (parallel transport?) +POST-SFW call April 16: -POST-SFW call: +* TraceColor, TraceSpin. ----- DONE (traceIndex<1>,traceIndex<2>, transposeIndex<1>,transposeIndex<2>) + ----- Implement mapping between traceColour and traceSpin and traceIndex<1/2>. + +* expose traceIndex, peekIndex, transposeIndex etc at the Lattice Level -- DONE -* TraceColor, TraceSpin. * How to define simple matrix operations, such as flavour matrices? - * Subset support, slice sums etc... -----Only need slice sum? -----Generic cartesian subslicing? -----Array ranges / boost extents? @@ -38,10 +62,10 @@ POST-SFW call: -----Suggests generalised cartesian subblocking sums, returning modified grid? -----What should interface be? + i) Two classes of subset; red black parity subsetting (pick checkerboard). cartesian sub-block subsetting - ii) Need to be able to project one Grid to another Grid. Interface: (?) diff --git a/test_Grid_stencil.cc b/test_Grid_stencil.cc index fd2a9503..3ed32f3a 100644 --- a/test_Grid_stencil.cc +++ b/test_Grid_stencil.cc @@ -107,7 +107,7 @@ int main (int argc, char ** argv) Real nrmC = norm2(Check); Real nrmB = norm2(Bar); - Real nrm = norm2(Check-Bar); + Real nrm = norm2(Check-Bar); printf("N2diff = %le (%le, %le) \n",nrm,nrmC,nrmB);fflush(stdout); Real snrmC =0; @@ -127,18 +127,18 @@ int main (int argc, char ** argv) for(int r=0;r<3;r++){ for(int c=0;c<3;c++){ - diff =check._internal._internal[r][c]-bar._internal._internal[r][c]; + diff =check()()(r,c)-bar()()(r,c); double nn=real(conj(diff)*diff); if ( nn > 0){ printf("Coor (%d %d %d %d) \t rc %d%d \t %le %le %le\n", coor[0],coor[1],coor[2],coor[3],r,c, nn, - real(check._internal._internal[r][c]), - real(bar._internal._internal[r][c]) + real(check()()(r,c)), + real(bar()()(r,c)) ); } - snrmC=snrmC+real(conj(check._internal._internal[r][c])*check._internal._internal[r][c]); - snrmB=snrmB+real(conj(bar._internal._internal[r][c])*bar._internal._internal[r][c]); + snrmC=snrmC+real(conj(check()()(r,c))*check()()(r,c)); + snrmB=snrmB+real(conj(bar()()(r,c))*bar()()(r,c)); snrm=snrm+nn; }} From 3e3df092bbdcbea363735c8175b978504857c6e1 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 14:55:00 +0100 Subject: [PATCH 061/429] Reorg of build structure --- Grid.h => lib/Grid.h | 0 Grid_Cartesian.h => lib/Grid_Cartesian.h | 0 .../Grid_Communicator.h | 0 Grid_Lattice.h => lib/Grid_Lattice.h | 0 Grid_QCD.h => lib/Grid_QCD.h | 0 .../Grid_aligned_allocator.h | 0 .../Grid_communicator_fake.cc | 0 .../Grid_communicator_mpi.cc | 0 Grid_comparison.h => lib/Grid_comparison.h | 0 Grid_config.h => lib/Grid_config.h | 0 Grid_config.h.in => lib/Grid_config.h.in | 0 Grid_cshift.h => lib/Grid_cshift.h | 0 .../Grid_cshift_common.h | 0 Grid_cshift_mpi.h => lib/Grid_cshift_mpi.h | 0 Grid_cshift_none.h => lib/Grid_cshift_none.h | 0 Grid_init.cc => lib/Grid_init.cc | 0 .../Grid_math_type_mapper.h | 0 Grid_math_types.h => lib/Grid_math_types.h | 0 Grid_predicated.h => lib/Grid_predicated.h | 0 Grid_simd.h => lib/Grid_simd.h | 0 Grid_stencil.h => lib/Grid_stencil.h | 0 .../Grid_stencil_common.cc | 0 Grid_summation.h => lib/Grid_summation.h | 0 Grid_vComplexD.h => lib/Grid_vComplexD.h | 0 Grid_vComplexF.h => lib/Grid_vComplexF.h | 0 Grid_vInteger.h => lib/Grid_vInteger.h | 0 Grid_vRealD.h => lib/Grid_vRealD.h | 0 Grid_vRealF.h => lib/Grid_vRealF.h | 0 lib/Makefile.am | 44 +++++++++++++++++++ Grid_main.cc => tests/Grid_main.cc | 0 tests/Makefile.am | 15 +++++++ .../test_Grid_jacobi.cc | 0 .../test_Grid_stencil.cc | 0 33 files changed, 59 insertions(+) rename Grid.h => lib/Grid.h (100%) rename Grid_Cartesian.h => lib/Grid_Cartesian.h (100%) rename Grid_Communicator.h => lib/Grid_Communicator.h (100%) rename Grid_Lattice.h => lib/Grid_Lattice.h (100%) rename Grid_QCD.h => lib/Grid_QCD.h (100%) rename Grid_aligned_allocator.h => lib/Grid_aligned_allocator.h (100%) rename Grid_communicator_fake.cc => lib/Grid_communicator_fake.cc (100%) rename Grid_communicator_mpi.cc => lib/Grid_communicator_mpi.cc (100%) rename Grid_comparison.h => lib/Grid_comparison.h (100%) rename Grid_config.h => lib/Grid_config.h (100%) rename Grid_config.h.in => lib/Grid_config.h.in (100%) rename Grid_cshift.h => lib/Grid_cshift.h (100%) rename Grid_cshift_common.h => lib/Grid_cshift_common.h (100%) rename Grid_cshift_mpi.h => lib/Grid_cshift_mpi.h (100%) rename Grid_cshift_none.h => lib/Grid_cshift_none.h (100%) rename Grid_init.cc => lib/Grid_init.cc (100%) rename Grid_math_type_mapper.h => lib/Grid_math_type_mapper.h (100%) rename Grid_math_types.h => lib/Grid_math_types.h (100%) rename Grid_predicated.h => lib/Grid_predicated.h (100%) rename Grid_simd.h => lib/Grid_simd.h (100%) rename Grid_stencil.h => lib/Grid_stencil.h (100%) rename Grid_stencil_common.cc => lib/Grid_stencil_common.cc (100%) rename Grid_summation.h => lib/Grid_summation.h (100%) rename Grid_vComplexD.h => lib/Grid_vComplexD.h (100%) rename Grid_vComplexF.h => lib/Grid_vComplexF.h (100%) rename Grid_vInteger.h => lib/Grid_vInteger.h (100%) rename Grid_vRealD.h => lib/Grid_vRealD.h (100%) rename Grid_vRealF.h => lib/Grid_vRealF.h (100%) create mode 100644 lib/Makefile.am rename Grid_main.cc => tests/Grid_main.cc (100%) create mode 100644 tests/Makefile.am rename test_Grid_jacobi.cc => tests/test_Grid_jacobi.cc (100%) rename test_Grid_stencil.cc => tests/test_Grid_stencil.cc (100%) diff --git a/Grid.h b/lib/Grid.h similarity index 100% rename from Grid.h rename to lib/Grid.h diff --git a/Grid_Cartesian.h b/lib/Grid_Cartesian.h similarity index 100% rename from Grid_Cartesian.h rename to lib/Grid_Cartesian.h diff --git a/Grid_Communicator.h b/lib/Grid_Communicator.h similarity index 100% rename from Grid_Communicator.h rename to lib/Grid_Communicator.h diff --git a/Grid_Lattice.h b/lib/Grid_Lattice.h similarity index 100% rename from Grid_Lattice.h rename to lib/Grid_Lattice.h diff --git a/Grid_QCD.h b/lib/Grid_QCD.h similarity index 100% rename from Grid_QCD.h rename to lib/Grid_QCD.h diff --git a/Grid_aligned_allocator.h b/lib/Grid_aligned_allocator.h similarity index 100% rename from Grid_aligned_allocator.h rename to lib/Grid_aligned_allocator.h diff --git a/Grid_communicator_fake.cc b/lib/Grid_communicator_fake.cc similarity index 100% rename from Grid_communicator_fake.cc rename to lib/Grid_communicator_fake.cc diff --git a/Grid_communicator_mpi.cc b/lib/Grid_communicator_mpi.cc similarity index 100% rename from Grid_communicator_mpi.cc rename to lib/Grid_communicator_mpi.cc diff --git a/Grid_comparison.h b/lib/Grid_comparison.h similarity index 100% rename from Grid_comparison.h rename to lib/Grid_comparison.h diff --git a/Grid_config.h b/lib/Grid_config.h similarity index 100% rename from Grid_config.h rename to lib/Grid_config.h diff --git a/Grid_config.h.in b/lib/Grid_config.h.in similarity index 100% rename from Grid_config.h.in rename to lib/Grid_config.h.in diff --git a/Grid_cshift.h b/lib/Grid_cshift.h similarity index 100% rename from Grid_cshift.h rename to lib/Grid_cshift.h diff --git a/Grid_cshift_common.h b/lib/Grid_cshift_common.h similarity index 100% rename from Grid_cshift_common.h rename to lib/Grid_cshift_common.h diff --git a/Grid_cshift_mpi.h b/lib/Grid_cshift_mpi.h similarity index 100% rename from Grid_cshift_mpi.h rename to lib/Grid_cshift_mpi.h diff --git a/Grid_cshift_none.h b/lib/Grid_cshift_none.h similarity index 100% rename from Grid_cshift_none.h rename to lib/Grid_cshift_none.h diff --git a/Grid_init.cc b/lib/Grid_init.cc similarity index 100% rename from Grid_init.cc rename to lib/Grid_init.cc diff --git a/Grid_math_type_mapper.h b/lib/Grid_math_type_mapper.h similarity index 100% rename from Grid_math_type_mapper.h rename to lib/Grid_math_type_mapper.h diff --git a/Grid_math_types.h b/lib/Grid_math_types.h similarity index 100% rename from Grid_math_types.h rename to lib/Grid_math_types.h diff --git a/Grid_predicated.h b/lib/Grid_predicated.h similarity index 100% rename from Grid_predicated.h rename to lib/Grid_predicated.h diff --git a/Grid_simd.h b/lib/Grid_simd.h similarity index 100% rename from Grid_simd.h rename to lib/Grid_simd.h diff --git a/Grid_stencil.h b/lib/Grid_stencil.h similarity index 100% rename from Grid_stencil.h rename to lib/Grid_stencil.h diff --git a/Grid_stencil_common.cc b/lib/Grid_stencil_common.cc similarity index 100% rename from Grid_stencil_common.cc rename to lib/Grid_stencil_common.cc diff --git a/Grid_summation.h b/lib/Grid_summation.h similarity index 100% rename from Grid_summation.h rename to lib/Grid_summation.h diff --git a/Grid_vComplexD.h b/lib/Grid_vComplexD.h similarity index 100% rename from Grid_vComplexD.h rename to lib/Grid_vComplexD.h diff --git a/Grid_vComplexF.h b/lib/Grid_vComplexF.h similarity index 100% rename from Grid_vComplexF.h rename to lib/Grid_vComplexF.h diff --git a/Grid_vInteger.h b/lib/Grid_vInteger.h similarity index 100% rename from Grid_vInteger.h rename to lib/Grid_vInteger.h diff --git a/Grid_vRealD.h b/lib/Grid_vRealD.h similarity index 100% rename from Grid_vRealD.h rename to lib/Grid_vRealD.h diff --git a/Grid_vRealF.h b/lib/Grid_vRealF.h similarity index 100% rename from Grid_vRealF.h rename to lib/Grid_vRealF.h diff --git a/lib/Makefile.am b/lib/Makefile.am new file mode 100644 index 00000000..8cb9a0be --- /dev/null +++ b/lib/Makefile.am @@ -0,0 +1,44 @@ +# additional include paths necessary to compile the C++ library +AM_CXXFLAGS = -I$(top_srcdir)/ + + +extra_sources= +if BUILD_COMMS_MPI + extra_sources+=Grid_communicator_mpi.cc + extra_sources+=Grid_stencil_common.cc +endif +if BUILD_COMMS_NONE + extra_sources+=Grid_communicator_fake.cc + extra_sources+=Grid_stencil_common.cc +endif + +# +# Libraries +# +lib_LIBRARIES = libGrid.a +libGrid_a_SOURCES = Grid_init.cc $(extra_sources) + +# +# Include files +# +include_HEADERS = Grid_config.h\ + Grid.h\ + Grid_simd.h\ + Grid_vComplexD.h\ + Grid_vComplexF.h\ + Grid_vRealD.h\ + Grid_vRealF.h\ + Grid_Cartesian.h\ + Grid_Lattice.h\ + Grid_Communicator.h\ + Grid_QCD.h\ + Grid_aligned_allocator.h\ + Grid_cshift.h\ + Grid_cshift_common.h\ + Grid_cshift_mpi.h\ + Grid_cshift_none.h\ + Grid_stencil.h\ + Grid_math_types.h + + + diff --git a/Grid_main.cc b/tests/Grid_main.cc similarity index 100% rename from Grid_main.cc rename to tests/Grid_main.cc diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 00000000..2bf8cd1a --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,15 @@ +# additional include paths necessary to compile the C++ library +AM_CXXFLAGS = -I$(top_srcdir)/lib +AM_LDFLAGS = -L$(top_srcdir)/lib + +# +# Test code +# +bin_PROGRAMS = Grid_main test_Grid_stencil + +Grid_main_SOURCES = Grid_main.cc +Grid_main_LDADD = -lGrid + +test_Grid_stencil_SOURCES = test_Grid_stencil.cc +test_Grid_stencil_LDADD = -lGrid + diff --git a/test_Grid_jacobi.cc b/tests/test_Grid_jacobi.cc similarity index 100% rename from test_Grid_jacobi.cc rename to tests/test_Grid_jacobi.cc diff --git a/test_Grid_stencil.cc b/tests/test_Grid_stencil.cc similarity index 100% rename from test_Grid_stencil.cc rename to tests/test_Grid_stencil.cc From 388b735fd036a1990fd66e1bc5831811c727bc07 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 14:56:05 +0100 Subject: [PATCH 062/429] Build reorg --- Makefile.am | 52 +------- Makefile.in | 311 +++++-------------------------------------- configure | 12 +- configure.ac | 6 +- lib/Grid_config.h | 4 +- lib/Grid_config.h.in | 2 +- 6 files changed, 51 insertions(+), 336 deletions(-) diff --git a/Makefile.am b/Makefile.am index 1e70ac1b..a55b2b92 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,54 +1,4 @@ # additional include paths necessary to compile the C++ library AM_CXXFLAGS = -I$(top_srcdir)/ - - -extra_sources= -if BUILD_COMMS_MPI - extra_sources+=Grid_communicator_mpi.cc - extra_sources+=Grid_stencil_common.cc -endif -if BUILD_COMMS_NONE - extra_sources+=Grid_communicator_fake.cc - extra_sources+=Grid_stencil_common.cc -endif - -# -# Libraries -# -lib_LIBRARIES = libGrid.a -libGrid_a_SOURCES = Grid_init.cc $(extra_sources) - -# -# Include files -# -include_HEADERS = Grid_config.h\ - Grid.h\ - Grid_simd.h\ - Grid_vComplexD.h\ - Grid_vComplexF.h\ - Grid_vRealD.h\ - Grid_vRealF.h\ - Grid_Cartesian.h\ - Grid_Lattice.h\ - Grid_Communicator.h\ - Grid_QCD.h\ - Grid_aligned_allocator.h\ - Grid_cshift.h\ - Grid_cshift_common.h\ - Grid_cshift_mpi.h\ - Grid_cshift_none.h\ - Grid_stencil.h\ - Grid_math_types.h - - -# -# Test code -# -bin_PROGRAMS = Grid_main test_Grid_stencil - -Grid_main_SOURCES = Grid_main.cc -Grid_main_LDADD = libGrid.a - -test_Grid_stencil_SOURCES = test_Grid_stencil.cc -test_Grid_stencil_LDADD = libGrid.a +SUBDIRS = lib tests diff --git a/Makefile.in b/Makefile.in index ce8b74be..3ca9a01f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -15,7 +15,6 @@ @SET_MAKE@ - VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ @@ -92,16 +91,13 @@ POST_UNINSTALL = : @BUILD_COMMS_MPI_TRUE@ Grid_stencil_common.cc @BUILD_COMMS_NONE_TRUE@am__append_2 = Grid_communicator_fake.cc \ @BUILD_COMMS_NONE_TRUE@ Grid_stencil_common.cc -bin_PROGRAMS = Grid_main$(EXEEXT) test_Grid_stencil$(EXEEXT) -subdir = . +subdir = lib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ - $(am__configure_deps) $(include_HEADERS) $(am__DIST_COMMON) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno config.status.lineno +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = Grid_config.h CONFIG_CLEAN_FILES = @@ -133,8 +129,7 @@ am__uninstall_files_from_dir = { \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ - "$(DESTDIR)$(includedir)" +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" LIBRARIES = $(lib_LIBRARIES) AR = ar ARFLAGS = cru @@ -154,13 +149,6 @@ am__libGrid_a_SOURCES_DIST = Grid_init.cc Grid_communicator_mpi.cc \ am__objects_3 = $(am__objects_1) $(am__objects_2) am_libGrid_a_OBJECTS = Grid_init.$(OBJEXT) $(am__objects_3) libGrid_a_OBJECTS = $(am_libGrid_a_OBJECTS) -PROGRAMS = $(bin_PROGRAMS) -am_Grid_main_OBJECTS = Grid_main.$(OBJEXT) -Grid_main_OBJECTS = $(am_Grid_main_OBJECTS) -Grid_main_DEPENDENCIES = libGrid.a -am_test_Grid_stencil_OBJECTS = test_Grid_stencil.$(OBJEXT) -test_Grid_stencil_OBJECTS = $(am_test_Grid_stencil_OBJECTS) -test_Grid_stencil_DEPENDENCIES = libGrid.a AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false @@ -190,10 +178,8 @@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = -SOURCES = $(libGrid_a_SOURCES) $(Grid_main_SOURCES) \ - $(test_Grid_stencil_SOURCES) -DIST_SOURCES = $(am__libGrid_a_SOURCES_DIST) $(Grid_main_SOURCES) \ - $(test_Grid_stencil_SOURCES) +SOURCES = $(libGrid_a_SOURCES) +DIST_SOURCES = $(am__libGrid_a_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -220,28 +206,9 @@ am__define_uniq_tagged_files = \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags -CSCOPE = cscope -AM_RECURSIVE_TARGETS = cscope am__DIST_COMMON = $(srcdir)/Grid_config.h.in $(srcdir)/Makefile.in \ - AUTHORS COPYING ChangeLog INSTALL NEWS README TODO compile \ - depcomp install-sh missing + $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - if test -d "$(distdir)"; then \ - find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -rf "$(distdir)" \ - || { sleep 5 && rm -rf "$(distdir)"; }; \ - else :; fi -am__post_remove_distdir = $(am__remove_distdir) -DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best -DIST_TARGETS = dist-gzip -distuninstallcheck_listfiles = find . -type f -print -am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ - | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' -distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ @@ -368,47 +335,39 @@ include_HEADERS = Grid_config.h\ Grid_stencil.h\ Grid_math_types.h -Grid_main_SOURCES = Grid_main.cc -Grid_main_LDADD = libGrid.a -test_Grid_stencil_SOURCES = test_Grid_stencil.cc -test_Grid_stencil_LDADD = libGrid.a all: Grid_config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cc .o .obj -am--refresh: Makefile - @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ - $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/Makefile'; \ $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu Makefile + $(AUTOMAKE) --gnu lib/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ - echo ' $(SHELL) ./config.status'; \ - $(SHELL) ./config.status;; \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) - $(am__cd) $(srcdir) && $(AUTOCONF) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) - $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): Grid_config.h: stamp-h1 @@ -417,7 +376,7 @@ Grid_config.h: stamp-h1 stamp-h1: $(srcdir)/Grid_config.h.in $(top_builddir)/config.status @rm -f stamp-h1 - cd $(top_builddir) && $(SHELL) ./config.status Grid_config.h + cd $(top_builddir) && $(SHELL) ./config.status lib/Grid_config.h $(srcdir)/Grid_config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 @@ -461,56 +420,6 @@ libGrid.a: $(libGrid_a_OBJECTS) $(libGrid_a_DEPENDENCIES) $(EXTRA_libGrid_a_DEPE $(AM_V_at)-rm -f libGrid.a $(AM_V_AR)$(libGrid_a_AR) libGrid.a $(libGrid_a_OBJECTS) $(libGrid_a_LIBADD) $(AM_V_at)$(RANLIB) libGrid.a -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ - fi; \ - for p in $$list; do echo "$$p $$p"; done | \ - sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p \ - ; then echo "$$p"; echo "$$p"; else :; fi; \ - done | \ - sed -e 'p;s,.*/,,;n;h' \ - -e 's|.*|.|' \ - -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ - sed 'N;N;N;s,\n, ,g' | \ - $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ - { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ - if ($$2 == $$4) files[d] = files[d] " " $$1; \ - else { print "f", $$3 "/" $$4, $$1; } } \ - END { for (d in files) print "f", d, files[d] }' | \ - while read type dir files; do \ - if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ - test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - files=`for p in $$list; do echo "$$p"; done | \ - sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' \ - `; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(bindir)" && rm -f $$files - -clean-binPROGRAMS: - -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) - -Grid_main$(EXEEXT): $(Grid_main_OBJECTS) $(Grid_main_DEPENDENCIES) $(EXTRA_Grid_main_DEPENDENCIES) - @rm -f Grid_main$(EXEEXT) - $(AM_V_CXXLD)$(CXXLINK) $(Grid_main_OBJECTS) $(Grid_main_LDADD) $(LIBS) - -test_Grid_stencil$(EXEEXT): $(test_Grid_stencil_OBJECTS) $(test_Grid_stencil_DEPENDENCIES) $(EXTRA_test_Grid_stencil_DEPENDENCIES) - @rm -f test_Grid_stencil$(EXEEXT) - $(AM_V_CXXLD)$(CXXLINK) $(test_Grid_stencil_OBJECTS) $(test_Grid_stencil_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -521,9 +430,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_communicator_fake.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_communicator_mpi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_init.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_stencil_common.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_Grid_stencil.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -593,12 +500,6 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" -cscope: cscope.files - test ! -s cscope.files \ - || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) -clean-cscope: - -rm -f cscope.files -cscope.files: clean-cscope cscopelist cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) @@ -617,11 +518,8 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) - $(am__remove_distdir) - test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -651,142 +549,11 @@ distdir: $(DISTFILES) || exit 1; \ fi; \ done - -test -n "$(am__skip_mode_fix)" \ - || find "$(distdir)" -type d ! -perm -755 \ - -exec chmod u+rwx,go+rx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r "$(distdir)" -dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__post_remove_distdir) - -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 - $(am__post_remove_distdir) - -dist-lzip: distdir - tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz - $(am__post_remove_distdir) - -dist-xz: distdir - tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz - $(am__post_remove_distdir) - -dist-tarZ: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 - @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__post_remove_distdir) - -dist-shar: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 - @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__post_remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) - $(am__post_remove_distdir) - -dist dist-all: - $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' - $(am__post_remove_distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ - *.tar.bz2*) \ - bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lz*) \ - lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ - *.tar.xz*) \ - xz -dc $(distdir).tar.xz | $(am__untar) ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac - chmod -R a-w $(distdir) - chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst - chmod a-w $(distdir) - test -d $(distdir)/_build || exit 0; \ - dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ - && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build/sub \ - && ../../configure \ - $(AM_DISTCHECK_CONFIGURE_FLAGS) \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=../.. --prefix="$$dc_install_base" \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ - distuninstallcheck \ - && chmod -R a-w "$$dc_install_base" \ - && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ - distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ - } || { rm -rf "$$dc_destdir"; exit 1; }) \ - && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ - && cd "$$am__cwd" \ - || exit 1 - $(am__post_remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' -distuninstallcheck: - @test -n '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: trying to run $@ with an empty' \ - '$$(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - $(am__cd) '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left after uninstall:" ; \ - if test -n "$(DESTDIR)"; then \ - echo " (check DESTDIR support)"; \ - fi ; \ - $(distuninstallcheck_listfiles) ; \ - exit 1; } >&2 -distcleancheck: distclean - @if test '$(srcdir)' = . ; then \ - echo "ERROR: distcleancheck can only run from a VPATH build" ; \ - exit 1 ; \ - fi - @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left in build directory after distclean:" ; \ - $(distcleancheck_listfiles) ; \ - exit 1; } >&2 check-am: all-am check: check-am -all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(HEADERS) Grid_config.h +all-am: Makefile $(LIBRARIES) $(HEADERS) Grid_config.h installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \ + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -821,11 +588,9 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-binPROGRAMS clean-generic clean-libLIBRARIES \ - mostlyclean-am +clean-am: clean-generic clean-libLIBRARIES mostlyclean-am distclean: distclean-am - -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ @@ -849,7 +614,7 @@ install-dvi: install-dvi-am install-dvi-am: -install-exec-am: install-binPROGRAMS install-libLIBRARIES +install-exec-am: install-libLIBRARIES install-html: install-html-am @@ -872,8 +637,6 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf $(top_srcdir)/autom4te.cache -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -890,29 +653,23 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ - uninstall-libLIBRARIES +uninstall-am: uninstall-includeHEADERS uninstall-libLIBRARIES .MAKE: all install-am install-strip -.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \ - clean-binPROGRAMS clean-cscope clean-generic \ - clean-libLIBRARIES cscope cscopelist-am ctags ctags-am dist \ - dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ - dist-xz dist-zip distcheck distclean distclean-compile \ - distclean-generic distclean-hdr distclean-tags distcleancheck \ - distdir distuninstallcheck dvi dvi-am html html-am info \ - info-am install install-am install-binPROGRAMS install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am \ - install-includeHEADERS install-info install-info-am \ - install-libLIBRARIES install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libLIBRARIES cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-hdr \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-includeHEADERS install-info \ + install-info-am install-libLIBRARIES install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-binPROGRAMS uninstall-includeHEADERS \ - uninstall-libLIBRARIES + uninstall-am uninstall-includeHEADERS uninstall-libLIBRARIES .PRECIOUS: Makefile diff --git a/configure b/configure index 1adf726f..fc0b6453 100755 --- a/configure +++ b/configure @@ -585,7 +585,7 @@ PACKAGE_STRING='Grid 1.0' PACKAGE_BUGREPORT='paboyle@ph.ed.ac.uk' PACKAGE_URL='' -ac_unique_file="Grid.h" +ac_unique_file="lib/Grid.h" # Factoring default headers for most tests. ac_includes_default="\ #include @@ -2920,7 +2920,7 @@ fi -ac_config_headers="$ac_config_headers Grid_config.h" +ac_config_headers="$ac_config_headers lib/Grid_config.h" # Checks for programs. @@ -5085,6 +5085,10 @@ fi ac_config_files="$ac_config_files Makefile" +ac_config_files="$ac_config_files lib/Makefile" + +ac_config_files="$ac_config_files tests/Makefile" + cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure @@ -5822,9 +5826,11 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 for ac_config_target in $ac_config_targets do case $ac_config_target in - "Grid_config.h") CONFIG_HEADERS="$CONFIG_HEADERS Grid_config.h" ;; + "lib/Grid_config.h") CONFIG_HEADERS="$CONFIG_HEADERS lib/Grid_config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; + "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac diff --git a/configure.ac b/configure.ac index 83405ca8..07c1974e 100644 --- a/configure.ac +++ b/configure.ac @@ -2,8 +2,8 @@ AC_INIT([Grid], [1.0], [paboyle@ph.ed.ac.uk]) AM_INIT_AUTOMAKE AC_CONFIG_MACRO_DIR([m4]) -AC_CONFIG_SRCDIR([Grid.h]) -AC_CONFIG_HEADERS([Grid_config.h]) +AC_CONFIG_SRCDIR([lib/Grid.h]) +AC_CONFIG_HEADERS([lib/Grid_config.h]) # Checks for programs. AC_PROG_CXX @@ -72,4 +72,6 @@ AM_CONDITIONAL(BUILD_COMMS_NONE,[ test "X${ac_COMMS}X" == "XnoneX" ]) AC_CONFIG_FILES(Makefile) +AC_CONFIG_FILES(lib/Makefile) +AC_CONFIG_FILES(tests/Makefile) AC_OUTPUT diff --git a/lib/Grid_config.h b/lib/Grid_config.h index 5faa2157..cb676b54 100644 --- a/lib/Grid_config.h +++ b/lib/Grid_config.h @@ -1,5 +1,5 @@ -/* Grid_config.h. Generated from Grid_config.h.in by configure. */ -/* Grid_config.h.in. Generated from configure.ac by autoheader. */ +/* lib/Grid_config.h. Generated from Grid_config.h.in by configure. */ +/* lib/Grid_config.h.in. Generated from configure.ac by autoheader. */ /* AVX */ #define AVX1 1 diff --git a/lib/Grid_config.h.in b/lib/Grid_config.h.in index 660edd5d..467ee6e4 100644 --- a/lib/Grid_config.h.in +++ b/lib/Grid_config.h.in @@ -1,4 +1,4 @@ -/* Grid_config.h.in. Generated from configure.ac by autoheader. */ +/* lib/Grid_config.h.in. Generated from configure.ac by autoheader. */ /* AVX */ #undef AVX1 From f678be5f94e5a4f698ee42eec91dd7bea9bc1800 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 16:17:41 +0100 Subject: [PATCH 063/429] Shaken out the peekIndex support. Hardwire constants "SpinIndex, ColourIndex" and LorentzIndex in Grid_QCD.h --- lib/Grid_Lattice.h | 28 ++++++++++ lib/Grid_QCD.h | 11 +++- lib/Grid_math_types.h | 119 ++++++++++++++++++++++++++++++++++++++++++ tests/Grid_main.cc | 12 ++++- 4 files changed, 166 insertions(+), 4 deletions(-) diff --git a/lib/Grid_Lattice.h b/lib/Grid_Lattice.h index b595ae0a..b9f544b5 100644 --- a/lib/Grid_Lattice.h +++ b/lib/Grid_Lattice.h @@ -505,6 +505,34 @@ public: } return ret; }; + //////////////////////////////////////////////////////////////////////////////////////////////////// + // Poke internal indices of a Lattice object + //////////////////////////////////////////////////////////////////////////////////////////////////// + template inline + void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0]))> & rhs) + { +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + pokeIndex(lhs._odata[ss],rhs._odata[ss]); + } + } + template inline + void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0],0))> & rhs,int i) + { +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + pokeIndex(lhs._odata[ss],rhs._odata[ss],i); + } + } + template inline + void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0],0,0))> & rhs,int i,int j) + { +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + pokeIndex(lhs._odata[ss],rhs._odata[ss],i,j); + } + } + //////////////////////////////////////////////////////////////////////////////////////////////////// // Reduction operations //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/lib/Grid_QCD.h b/lib/Grid_QCD.h index 6f85d692..c8473c28 100644 --- a/lib/Grid_QCD.h +++ b/lib/Grid_QCD.h @@ -1,6 +1,7 @@ #ifndef GRID_QCD_H #define GRID_QCD_H namespace Grid{ + namespace QCD { static const int Nc=3; @@ -13,12 +14,18 @@ namespace QCD { ////////////////////////////////////////////////////////////////////////////// // QCD iMatrix types // Index conventions: Lorentz x Spin x Colour - // + ////////////////////////////////////////////////////////////////////////////// + static const int ColourIndex = 1; + static const int SpinIndex = 2; + static const int LorentzIndex= 3; + // ChrisK very keen to add extra space for Gparity doubling. // // Also add domain wall index, in a way where Wilson operator // naturally distributes across the 5th dimensions. - ////////////////////////////////////////////////////////////////////////////// + // + // That probably makes for GridRedBlack4dCartesian grid. + template using iSinglet = iScalar > >; template using iSpinMatrix = iScalar, Ns> >; template using iSpinColourMatrix = iScalar, Ns> >; diff --git a/lib/Grid_math_types.h b/lib/Grid_math_types.h index 0153f46b..3429d7f6 100644 --- a/lib/Grid_math_types.h +++ b/lib/Grid_math_types.h @@ -1485,6 +1485,125 @@ template inline } +////////////////////////////////////////////////////////////////////////////// +// Poke a specific index; +////////////////////////////////////////////////////////////////////////////// + +// Scalar poke +template inline + void pokeIndex(iScalar &ret, + const typename std::enable_if,Level>::value,iScalar >::type &arg) +{ + ret._internal = arg._internal; +} +// Vector poke, one index +template inline + void pokeIndex(iVector &ret, + const typename std::enable_if,Level>::value,iScalar >::type &arg,int i) +{ + ret._internal[i] = arg._internal; +} +// Vector poke, two indices +template inline + void pokeIndex(iMatrix &ret, + const typename std::enable_if,Level>::value,iScalar >::type &arg,int i,int j) +{ + ret._internal[i][j] = arg._internal; +} + +///////////// +// No match poke for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue +///////////// +// scalar +template inline + void pokeIndex(iScalar &ret, + const typename std::enable_if,Level>::notvalue,iScalar(ret._internal))> >::type &arg) + +{ + pokeIndex(ret._internal,arg._internal); +} +template inline + void pokeIndex(iScalar &ret, + const typename std::enable_if,Level>::notvalue,iScalar(ret._internal,0))> >::type &arg, + int i) + +{ + pokeIndex(ret._internal,arg._internal,i); +} +template inline + void pokeIndex(iScalar &ret, + const typename std::enable_if,Level>::notvalue,iScalar(ret._internal,0,0))> >::type &arg, + int i,int j) + +{ + pokeIndex(ret._internal,arg._internal,i,j); +} + +// Vector +template inline + void pokeIndex(iVector &ret, + const typename std::enable_if,Level>::notvalue,iVector(ret._internal)),N> >::type &arg) + +{ + for(int ii=0;ii(ret._internal[ii],arg._internal[ii]); + } +} +template inline + void pokeIndex(iVector &ret, + const typename std::enable_if,Level>::notvalue,iVector(ret._internal,0)),N> >::type &arg, + int i) + +{ + for(int ii=0;ii(ret._internal[ii],arg._internal[ii],i); + } +} +template inline + void pokeIndex(iVector &ret, + const typename std::enable_if,Level>::notvalue,iVector(ret._internal,0,0)),N> >::type &arg, + int i,int j) + +{ + for(int ii=0;ii(ret._internal[ii],arg._internal[ii],i,j); + } +} + +// Matrix +template inline + void pokeIndex(iMatrix &ret, + const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal)),N> >::type &arg) + +{ + for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj]); + }} +} +template inline + void pokeIndex(iMatrix &ret, + const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal,0)),N> >::type &arg, + int i) + +{ + for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj],i); + }} +} +template inline + void pokeIndex(iMatrix &ret, + const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal,0,0)),N> >::type &arg, + int i,int j) + +{ + for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj],i,j); + }} +} + ///////////////////////////////////////////////////////////////// // Can only take the real/imag part of scalar objects, since // lattice objects of different complex nature are non-conformable. diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index 0d6c5039..d6032dd9 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -131,11 +131,14 @@ int main (int argc, char ** argv) // rscalar=real(scalar); // iscalar=imag(scalar); // scalar =cmplx(rscalar,iscalar); + pokeIndex<1>(cVec,scalar,1); + scalar=transpose(scalar); scalar=transposeIndex<1>(scalar); scalar=traceIndex<1>(scalar); scalar=peekIndex<1>(cVec,0); + scalar=trace(scalar); scalar=localInnerProduct(cVec,cVec); scalar=localNorm2(cVec); @@ -205,7 +208,7 @@ int main (int argc, char ** argv) LatticeComplex trscMat(&Fine); trscMat = trace(scMat); // Trace - { + { // Peek-ology and Poke-ology, with a little app-ology TComplex c; ColourMatrix c_m; SpinMatrix s_m; @@ -224,9 +227,14 @@ int main (int argc, char ** argv) printf("c. Level %d\n",c_m().TensorLevel); printf("c. Level %d\n",c_m()().TensorLevel); - c_m()() = scm()(0,0); //ColourComponents of CM <= ColourComponents of SpinColourMatrix + c_m()() = scm()(0,0); //ColourComponents of CM <= ColourComponents of SpinColourMatrix scm()(1,1) = cm()(); //ColourComponents of CM <= ColourComponents of SpinColourMatrix + c = scm()(1,1)(1,2); + scm()(1,1)(2,1) = c; + + pokeIndex<1> (c_m,c,0,0); } + FooBar = Bar; From 1674f899e0a87487f1b00c78b911ee45978acb2d Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 16:42:47 +0100 Subject: [PATCH 064/429] Cleaing up --- lib/Grid_Communicator.h | 1 + lib/Grid_QCD.h | 57 ++++++++++++++++++++++++++++++++++++++++- tests/Grid_main.cc | 3 ++- 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/lib/Grid_Communicator.h b/lib/Grid_Communicator.h index 0e15765c..845c0123 100644 --- a/lib/Grid_Communicator.h +++ b/lib/Grid_Communicator.h @@ -1,5 +1,6 @@ #ifndef GRID_COMMUNICATOR_H #define GRID_COMMUNICATOR_H + /////////////////////////////////// // Processor layout information /////////////////////////////////// diff --git a/lib/Grid_QCD.h b/lib/Grid_QCD.h index c8473c28..51ef1774 100644 --- a/lib/Grid_QCD.h +++ b/lib/Grid_QCD.h @@ -18,6 +18,7 @@ namespace QCD { static const int ColourIndex = 1; static const int SpinIndex = 2; static const int LorentzIndex= 3; + // ChrisK very keen to add extra space for Gparity doubling. // @@ -83,8 +84,62 @@ namespace QCD { typedef Lattice LatticeGaugeField; - + ////////////////////////////////////////////////////////////////////////////// + // Peek and Poke named after physics attributes + ////////////////////////////////////////////////////////////////////////////// + //spin + template auto peekSpin(const vobj &rhs,int i) -> decltype(peekIndex(rhs,0)) + { + return peekIndex(rhs,i); + } + template auto peekSpin(const vobj &rhs,int i,int j) -> decltype(peekIndex(rhs,0,0)) + { + return peekIndex(rhs,i,j); + } + template auto peekSpin(const Lattice &rhs,int i) -> decltype(peekIndex(rhs,0)) + { + return peekIndex(rhs,i); + } + template auto peekSpin(const Lattice &rhs,int i,int j) -> decltype(peekIndex(rhs,0,0)) + { + return peekIndex(rhs,i,j); + } + //colour + template auto peekColour(const vobj &rhs,int i) -> decltype(peekIndex(rhs,0)) + { + return peekIndex(rhs,i); + } + template auto peekColour(const vobj &rhs,int i,int j) -> decltype(peekIndex(rhs,0,0)) + { + return peekIndex(rhs,i,j); + } + template auto peekColour(const Lattice &rhs,int i) -> decltype(peekIndex(rhs,0)) + { + return peekIndex(rhs,i); + } + template auto peekColour(const Lattice &rhs,int i,int j) -> decltype(peekIndex(rhs,0,0)) + { + return peekIndex(rhs,i,j); + } + //lorentz + template auto peekLorentz(const vobj &rhs,int i) -> decltype(peekIndex(rhs,0)) + { + return peekIndex(rhs,i); + } + template auto peekLorentz(const vobj &rhs,int i,int j) -> decltype(peekIndex(rhs,0,0)) + { + return peekIndex(rhs,i,j); + } + template auto peekLorentz(const Lattice &rhs,int i) -> decltype(peekIndex(rhs,0)) + { + return peekIndex(rhs,i); + } + template auto peekLorentz(const Lattice &rhs,int i,int j) -> decltype(peekIndex(rhs,0,0)) + { + return peekIndex(rhs,i,j); + } + // FIXME this is rather generic and should find a way to place it earlier. inline void LatticeCoordinate(LatticeInteger &l,int mu){ GridBase *grid = l._grid; int Nsimd = grid->iSites(); diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index d6032dd9..e58d20e2 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -222,6 +222,7 @@ int main (int argc, char ** argv) s_m = peekIndex<1>(scm,0,0); c_m = peekIndex<2>(scm,1,2); + c_m = peekSpin(scm,1,2); printf("c. Level %d\n",c_m.TensorLevel); printf("c. Level %d\n",c_m().TensorLevel); @@ -299,7 +300,7 @@ int main (int argc, char ** argv) int Nc = Grid::QCD::Nc; LatticeGaugeField U(&Fine); - // LatticeColourMatrix Uy = U(yDir); + LatticeColourMatrix Uy = peekLorentz(U,1); flops = ncall*1.0*volume*(8*Nc*Nc*Nc); bytes = ncall*1.0*volume*Nc*Nc *2*3*sizeof(Grid::Real); From 18a885d195f330a7b5b5d48530cd8743a4081374 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 17:07:09 +0100 Subject: [PATCH 065/429] Renaming --- lib/{Grid_Cartesian.h => Grid_cartesian.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/{Grid_Cartesian.h => Grid_cartesian.h} (100%) diff --git a/lib/Grid_Cartesian.h b/lib/Grid_cartesian.h similarity index 100% rename from lib/Grid_Cartesian.h rename to lib/Grid_cartesian.h From ac181abc95ebf08d50be04c5709457fc5e45c6af Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 17:07:37 +0100 Subject: [PATCH 066/429] Rename --- lib/{Grid_Communicator.h => Grid_communicator.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/{Grid_Communicator.h => Grid_communicator.h} (100%) diff --git a/lib/Grid_Communicator.h b/lib/Grid_communicator.h similarity index 100% rename from lib/Grid_Communicator.h rename to lib/Grid_communicator.h From 2c9e5aa0544581bbb07a2389dbc3f9a39fb31506 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 17:09:24 +0100 Subject: [PATCH 067/429] Clean up capitalisation --- lib/{Grid_Lattice.h => Grid_lattice.h} | 0 lib/{Grid_math_type_mapper.h => Grid_math_types_mapper.h} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename lib/{Grid_Lattice.h => Grid_lattice.h} (100%) rename lib/{Grid_math_type_mapper.h => Grid_math_types_mapper.h} (100%) diff --git a/lib/Grid_Lattice.h b/lib/Grid_lattice.h similarity index 100% rename from lib/Grid_Lattice.h rename to lib/Grid_lattice.h diff --git a/lib/Grid_math_type_mapper.h b/lib/Grid_math_types_mapper.h similarity index 100% rename from lib/Grid_math_type_mapper.h rename to lib/Grid_math_types_mapper.h From 08f20da1030cde852108c5b98c36b58204285ec4 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 17:09:48 +0100 Subject: [PATCH 068/429] Clean up caps. --- lib/Grid.h | 4 ++-- lib/Grid_cartesian.h | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/Grid.h b/lib/Grid.h index 2a1072ea..50fe3102 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -44,8 +44,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include diff --git a/lib/Grid_cartesian.h b/lib/Grid_cartesian.h index c891edcc..bfb78018 100644 --- a/lib/Grid_cartesian.h +++ b/lib/Grid_cartesian.h @@ -2,7 +2,8 @@ #define GRID_CARTESIAN_H #include -#include +#include + namespace Grid{ ///////////////////////////////////////////////////////////////////////////////////////// From f7d80aac7fc6e8d6ddb8caee60e56b34c5a51194 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 17:10:45 +0100 Subject: [PATCH 069/429] Rename --- lib/Grid_math_types.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Grid_math_types.h b/lib/Grid_math_types.h index 3429d7f6..1042a95b 100644 --- a/lib/Grid_math_types.h +++ b/lib/Grid_math_types.h @@ -1,9 +1,10 @@ #ifndef GRID_MATH_TYPES_H #define GRID_MATH_TYPES_H -#include #include +#include + // // Indexing; want to be able to dereference and // obtain either an lvalue or an rvalue. From 8195d302dc24c1f132488d1922a7b7f3bcc07c7f Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 18:36:48 +0100 Subject: [PATCH 070/429] Reorganise to keep files smaller --- TODO | 129 +++--- lib/Grid.h | 6 +- lib/Grid_cartesian.h | 398 +----------------- lib/Grid_cartesian_base.h | 200 +++++++++ lib/Grid_cartesian_full.h | 95 +++++ lib/Grid_cartesian_red_black.h | 121 ++++++ lib/Grid_cshift_mpi.h | 4 +- lib/Grid_cshift_none.h | 4 +- lib/Grid_lattice.h | 3 - lib/Grid_math.h | 649 ++++++++++++++++++++++++++++ lib/Grid_math_arith.h | 745 +++++++++++++++++++++++++++++++++ lib/Grid_math_tensors.h | 224 ++++++++++ lib/Grid_math_traits.h | 165 ++++++++ lib/Grid_vComplexD.h | 6 +- lib/Grid_vComplexF.h | 5 +- lib/Grid_vInteger.h | 6 +- lib/Grid_vRealD.h | 6 +- lib/Grid_vRealF.h | 5 +- lib/Makefile.am | 29 +- 19 files changed, 2308 insertions(+), 492 deletions(-) create mode 100644 lib/Grid_cartesian_base.h create mode 100644 lib/Grid_cartesian_full.h create mode 100644 lib/Grid_cartesian_red_black.h create mode 100644 lib/Grid_math.h create mode 100644 lib/Grid_math_arith.h create mode 100644 lib/Grid_math_tensors.h create mode 100644 lib/Grid_math_traits.h diff --git a/TODO b/TODO index 33032277..bfe506f7 100644 --- a/TODO +++ b/TODO @@ -4,6 +4,70 @@ FUNCTIONALITY: * Coordinate information, integers etc... -----DONE * Integer type padding/union to vector. -----DONE * LatticeCoordinate[mu] -----DONE +* expose traceIndex, peekIndex, transposeIndex etc at the Lattice Level -- DONE +* TraceColor, TraceSpin. ----- DONE (traceIndex<1>,traceIndex<2>, transposeIndex<1>,transposeIndex<2>) + ----- Implement mapping between traceColour and traceSpin and traceIndex<1/2>. +* How to do U[mu] ... lorentz part of type structure or not. more like chroma if not. -- DONE + +* subdirs lib, tests ?? ----- DONE + +Not done, or just incomplete + +* Consider switch std::vector to boost arrays. + boost::multi_array A()... to replace multi1d, multi2d etc.. + + +* How to define simple matrix operations, such as flavour matrices? + +* Dirac, Pauli, SU subgroup, etc.. * Gamma/Dirac structures +* Fourspin, two spin project + +* su3 exponentiation, log etc.. [Jamie's code?] + +* Stencil operator support -----Initial thoughts, trial implementation DONE. + -----some simple tests that Stencil matches Cshift. + -----do all permute in comms phase, so that copy permute + -----cases move into a buffer. + -----allow transform in/out buffers spproj + +* CovariantShift support -----Use a class to store gauge field? (parallel transport?) + +* Subset support, slice sums etc... -----Only need slice sum? + -----Generic cartesian subslicing? + -----Array ranges / boost extents? + -----Multigrid grid transferral? + -----Suggests generalised cartesian subblocking + sums, returning modified grid? + -----What should interface be? + +* Grid transferral + * pickCheckerboard, pickSubPlane, pickSubBlock, + * sumSubPlane, sumSubBlocks + +* rb4d support. + +* Check for missing functionality - partially audited against QDP++ layout + +* Optimise the extract/merge SIMD routines; Azusa?? + + - I have collated into single location at least. + - Need to use _mm_*insert/extract routines. + +* Conformable test in Cshift routines. + + + +* Broadcast, reduction tests. innerProduct, localInnerProduct + +* QDP++ regression suite and comparative benchmark + +* I/O support + +* NERSC Lattice loading, plaquette test + + - MPI IO? + - BinaryWriter, TextWriter etc... + - protocol buffers? AUDITS: // Lattice support audit Tested in Grid_main.cc @@ -18,7 +82,7 @@ AUDITS: // // transposeIndex Y // traceIndex Y -// peekIndex N; #args +// peekIndex Y // // real,imag missing, semantic thought needed on real/im support. // perhaps I just keep everything complex? @@ -29,47 +93,15 @@ AUDITS: * Replace vset with a call to merge.; * care in Gmerge,Gextract over vset . * extract / merge extra implementation removal - -BUILD: * Test infrastructure -* subdirs lib, tests ?? -* How to do U[mu] ... lorentz part of type structure or not. more like chroma if not. -* Passing a Grid into construct iVector?? -* - -* Stencil operator support -----Initial thoughts, trial implementation DONE. - -----some simple tests that Stencil matches Cshift. - -----do all permute in comms phase, so that copy permute - -----cases move into a buffer. - -----allow transform in/out buffers spproj - -* CovariantShift support -----Use a class to store gauge field? (parallel transport?) - -POST-SFW call April 16: - -* TraceColor, TraceSpin. ----- DONE (traceIndex<1>,traceIndex<2>, transposeIndex<1>,transposeIndex<2>) - ----- Implement mapping between traceColour and traceSpin and traceIndex<1/2>. - -* expose traceIndex, peekIndex, transposeIndex etc at the Lattice Level -- DONE - -* How to define simple matrix operations, such as flavour matrices? - -* Subset support, slice sums etc... -----Only need slice sum? - -----Generic cartesian subslicing? - -----Array ranges / boost extents? - -----Multigrid grid transferral? - -----Suggests generalised cartesian subblocking - sums, returning modified grid? - -----What should interface be? - -i) Two classes of subset; red black parity subsetting (pick checkerboard). +[ More on subsets and grid transfers ] +i) Three classes of subset; red black parity subsetting (pick checkerboard). cartesian sub-block subsetting + rbNd ii) Need to be able to project one Grid to another Grid. -Interface: (?) - Lattice coarse_data SubBlockSum (GridBase *CoarseGrid, Lattice &fine_data) Operation ensure either: @@ -89,35 +121,12 @@ Instead of subsetting iii) No general permutation map. -* Consider switch std::vector to boost arrays. - boost::multi_array A()... to replace multi1d, multi2d etc.. -*? Cell definition <-> sliceSum. + ? Cell definition <-> sliceSum. ? Replicated arrays. -* Check for missing functionality - partially audited against QDP++ layout -* Optimise the extract/merge SIMD routines; Azusa?? - - I have collated into single location at least. - - Need to use _mm_*insert/extract routines. - -* Conformable test in Cshift routines. - -* Gamma/Dirac structures - -* Fourspin, two spin project - -* Broadcast, reduction tests. innerProduct, localInnerProduct - -* QDP++ regression suite and comparative benchmark - -* NERSC Lattice loading, plaquette test - -* I/O support - - MPI IO? - - BinaryWriter, TextWriter etc... - - protocol buffers? // Cartesian grid inheritance // Grid::GridBase diff --git a/lib/Grid.h b/lib/Grid.h index 50fe3102..c340d678 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -7,8 +7,8 @@ // -#ifndef GRID_V3_H -#define GRID_V3_H +#ifndef GRID_H +#define GRID_H #include #include @@ -43,7 +43,7 @@ #include #include -#include +#include #include #include #include diff --git a/lib/Grid_cartesian.h b/lib/Grid_cartesian.h index bfb78018..dbac98a8 100644 --- a/lib/Grid_cartesian.h +++ b/lib/Grid_cartesian.h @@ -1,400 +1,8 @@ #ifndef GRID_CARTESIAN_H #define GRID_CARTESIAN_H -#include -#include +#include +#include +#include -namespace Grid{ - -///////////////////////////////////////////////////////////////////////////////////////// -// Grid Support. -///////////////////////////////////////////////////////////////////////////////////////// - -class GridBase : public CartesianCommunicator { -public: - - // Give Lattice access - template friend class Lattice; - - GridBase(std::vector & processor_grid) : CartesianCommunicator(processor_grid) {}; - - - //FIXME - // protected: - // Lattice wide random support. not yet fully implemented. Need seed strategy - // and one generator per site. - // std::default_random_engine generator; - // static std::mt19937 generator( 9 ); - - ////////////////////////////////////////////////////////////////////// - // Commicator provides information on the processor grid - ////////////////////////////////////////////////////////////////////// - // unsigned long _ndimension; - // std::vector _processors; // processor grid - // int _processor; // linear processor rank - // std::vector _processor_coor; // linear processor rank - ////////////////////////////////////////////////////////////////////// - - // Physics Grid information. - std::vector _simd_layout; // Which dimensions get relayed out over simd lanes. - std::vector _fdimensions;// Global dimensions of array prior to cb removal - std::vector _gdimensions;// Global dimensions of array after cb removal - std::vector _ldimensions;// local dimensions of array with processor images removed - std::vector _rdimensions;// Reduced local dimensions with simd lane images and processor images removed - std::vector _ostride; // Outer stride for each dimension - std::vector _istride; // Inner stride i.e. within simd lane - int _osites; // _isites*_osites = product(dimensions). - int _isites; - std::vector _slice_block; // subslice information - std::vector _slice_stride; - std::vector _slice_nblock; - - // Might need these at some point - // std::vector _lstart; // local start of array in gcoors. _processor_coor[d]*_ldimensions[d] - // std::vector _lend; // local end of array in gcoors _processor_coor[d]*_ldimensions[d]+_ldimensions_[d]-1 - -public: - - //////////////////////////////////////////////////////////////// - // Checkerboarding interface is virtual and overridden by - // GridCartesian / GridRedBlackCartesian - //////////////////////////////////////////////////////////////// - virtual int CheckerBoarded(int dim)=0; - virtual int CheckerBoard(std::vector site)=0; - virtual int CheckerBoardDestination(int source_cb,int shift)=0; - virtual int CheckerBoardShift(int source_cb,int dim,int shift,int osite)=0; - inline int CheckerBoardFromOindex (int Oindex){ - std::vector ocoor; - oCoorFromOindex(ocoor,Oindex); - int ss=0; - for(int d=0;d<_ndimension;d++){ - ss=ss+ocoor[d]; - } - return ss&0x1; - } - - ////////////////////////////////////////////////////////////////////////////////////////////// - // Local layout calculations - ////////////////////////////////////////////////////////////////////////////////////////////// - // These routines are key. Subdivide the linearised cartesian index into - // "inner" index identifying which simd lane of object is associated with coord - // "outer" index identifying which element of _odata in class "Lattice" is associated with coord. - // - // Compared to, say, Blitz++ we simply need to store BOTH an inner stride and an outer - // stride per dimension. The cost of evaluating the indexing information is doubled for an n-dimensional - // coordinate. Note, however, for data parallel operations the "inner" indexing cost is not paid and all - // lanes are operated upon simultaneously. - - virtual int oIndex(std::vector &coor) - { - int idx=0; - // Works with either global or local coordinates - for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*(coor[d]%_rdimensions[d]); - return idx; - } - inline int oIndexReduced(std::vector &ocoor) - { - int idx=0; - // ocoor is already reduced so can eliminate the modulo operation - // for fast indexing and inline the routine - for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*ocoor[d]; - return idx; - } - inline void oCoorFromOindex (std::vector& coor,int Oindex){ - coor.resize(_ndimension); - for(int d=0;d<_ndimension;d++){ - coor[d] = Oindex % _rdimensions[d]; - Oindex = Oindex / _rdimensions[d]; - } - } - - ////////////////////////////////////////////////////////// - // SIMD lane addressing - ////////////////////////////////////////////////////////// - inline int iIndex(std::vector &lcoor) - { - int idx=0; - for(int d=0;d<_ndimension;d++) idx+=_istride[d]*(lcoor[d]/_rdimensions[d]); - return idx; - } - inline void iCoorFromIindex(std::vector &coor,int lane) - { - coor.resize(_ndimension); - for(int d=0;d<_ndimension;d++){ - coor[d] = lane % _simd_layout[d]; - lane = lane / _simd_layout[d]; - } - } - inline int PermuteDim(int dimension){ - return _simd_layout[dimension]>1; - } - inline int PermuteType(int dimension){ - int permute_type=0; - for(int d=_ndimension-1;d>dimension;d--){ - if (_simd_layout[d]>1 ) permute_type++; - } - return permute_type; - } - //////////////////////////////////////////////////////////////// - // Array sizing queries - //////////////////////////////////////////////////////////////// - - inline int iSites(void) { return _isites; }; - inline int Nsimd(void) { return _isites; };// Synonymous with iSites - inline int oSites(void) { return _osites; }; - inline int lSites(void) { return _isites*_osites; }; - inline int gSites(void) { return _isites*_osites*_Nprocessors; }; - inline int Nd (void) { return _ndimension;}; - inline const std::vector &FullDimensions(void) { return _fdimensions;}; - inline const std::vector &GlobalDimensions(void) { return _gdimensions;}; - inline const std::vector &LocalDimensions(void) { return _ldimensions;}; - inline const std::vector &VirtualLocalDimensions(void) { return _ldimensions;}; - - //////////////////////////////////////////////////////////////// - // Global addressing - //////////////////////////////////////////////////////////////// - void RankIndexToGlobalCoor(int rank, int o_idx, int i_idx , std::vector &gcoor) - { - gcoor.resize(_ndimension); - std::vector coor(_ndimension); - - ProcessorCoorFromRank(rank,coor); - for(int mu=0;mu<_ndimension;mu++) gcoor[mu] = _ldimensions[mu]&coor[mu]; - - iCoorFromIindex(coor,i_idx); - for(int mu=0;mu<_ndimension;mu++) gcoor[mu] += _rdimensions[mu]&coor[mu]; - - oCoorFromOindex (coor,o_idx); - for(int mu=0;mu<_ndimension;mu++) gcoor[mu] += coor[mu]; - - } - void RankIndexCbToFullGlobalCoor(int rank, int o_idx, int i_idx, int cb,std::vector &fcoor) - { - RankIndexToGlobalCoor(rank,o_idx,i_idx ,fcoor); - if(CheckerBoarded(0)){ - fcoor[0] = fcoor[0]*2+cb; - } - } - void ProcessorCoorLocalCoorToGlobalCoor(std::vector &Pcoor,std::vector &Lcoor,std::vector &gcoor) - { - gcoor.resize(_ndimension); - for(int mu=0;mu<_ndimension;mu++) gcoor[mu] = Pcoor[mu]*_ldimensions[mu]+Lcoor[mu]; - } - void GlobalCoorToProcessorCoorLocalCoor(std::vector &pcoor,std::vector &lcoor,const std::vector &gcoor) - { - pcoor.resize(_ndimension); - lcoor.resize(_ndimension); - for(int mu=0;mu<_ndimension;mu++){ - pcoor[mu] = gcoor[mu]/_ldimensions[mu]; - lcoor[mu] = gcoor[mu]%_ldimensions[mu]; - } - } - void GlobalCoorToRankIndex(int &rank, int &o_idx, int &i_idx ,const std::vector &gcoor) - { - std::vector pcoor; - std::vector lcoor; - GlobalCoorToProcessorCoorLocalCoor(pcoor,lcoor,gcoor); - rank = RankFromProcessorCoor(pcoor); - i_idx= iIndex(lcoor); - o_idx= oIndex(lcoor); - } - -}; - -class GridCartesian: public GridBase { - -public: - - virtual int CheckerBoarded(int dim){ - return 0; - } - virtual int CheckerBoard(std::vector site){ - return 0; - } - virtual int CheckerBoardDestination(int cb,int shift){ - return 0; - } - virtual int CheckerBoardShift(int source_cb,int dim,int shift, int osite){ - return shift; - } - GridCartesian(std::vector &dimensions, - std::vector &simd_layout, - std::vector &processor_grid - ) : GridBase(processor_grid) - { - /////////////////////// - // Grid information - /////////////////////// - _ndimension = dimensions.size(); - - _fdimensions.resize(_ndimension); - _gdimensions.resize(_ndimension); - _ldimensions.resize(_ndimension); - _rdimensions.resize(_ndimension); - _simd_layout.resize(_ndimension); - - _ostride.resize(_ndimension); - _istride.resize(_ndimension); - - _osites = 1; - _isites = 1; - for(int d=0;d<_ndimension;d++){ - _fdimensions[d] = dimensions[d]; // Global dimensions - _gdimensions[d] = _fdimensions[d]; // Global dimensions - _simd_layout[d] = simd_layout[d]; - - //FIXME check for exact division - - // Use a reduced simd grid - _ldimensions[d]= _gdimensions[d]/_processors[d]; //local dimensions - _rdimensions[d]= _ldimensions[d]/_simd_layout[d]; //overdecomposition - _osites *= _rdimensions[d]; - _isites *= _simd_layout[d]; - - // Addressing support - if ( d==0 ) { - _ostride[d] = 1; - _istride[d] = 1; - } else { - _ostride[d] = _ostride[d-1]*_rdimensions[d-1]; - _istride[d] = _istride[d-1]*_simd_layout[d-1]; - } - } - - /////////////////////// - // subplane information - /////////////////////// - _slice_block.resize(_ndimension); - _slice_stride.resize(_ndimension); - _slice_nblock.resize(_ndimension); - - int block =1; - int nblock=1; - for(int d=0;d<_ndimension;d++) nblock*=_rdimensions[d]; - - for(int d=0;d<_ndimension;d++){ - nblock/=_rdimensions[d]; - _slice_block[d] =block; - _slice_stride[d]=_ostride[d]*_rdimensions[d]; - _slice_nblock[d]=nblock; - block = block*_rdimensions[d]; - } - - }; -}; - -// Specialise this for red black grids storing half the data like a chess board. -class GridRedBlackCartesian : public GridBase -{ -public: - virtual int CheckerBoarded(int dim){ - if( dim==0) return 1; - else return 0; - } - virtual int CheckerBoard(std::vector site){ - return (site[0]+site[1]+site[2]+site[3])&0x1; - } - - // Depending on the cb of site, we toggle source cb. - // for block #b, element #e = (b, e) - // we need - virtual int CheckerBoardShift(int source_cb,int dim,int shift,int osite){ - - if(dim != 0) return shift; - - int fulldim =_fdimensions[0]; - shift = (shift+fulldim)%fulldim; - - // Probably faster with table lookup; - // or by looping over x,y,z and multiply rather than computing checkerboard. - int ocb=CheckerBoardFromOindex(osite); - - if ( (source_cb+ocb)&1 ) { - return (shift)/2; - } else { - return (shift+1)/2; - } - } - - virtual int CheckerBoardDestination(int source_cb,int shift){ - if ((shift+_fdimensions[0])&0x1) { - return 1-source_cb; - } else { - return source_cb; - } - }; - GridRedBlackCartesian(std::vector &dimensions, - std::vector &simd_layout, - std::vector &processor_grid) : GridBase(processor_grid) - { - /////////////////////// - // Grid information - /////////////////////// - _ndimension = dimensions.size(); - - _fdimensions.resize(_ndimension); - _gdimensions.resize(_ndimension); - _ldimensions.resize(_ndimension); - _rdimensions.resize(_ndimension); - _simd_layout.resize(_ndimension); - - _ostride.resize(_ndimension); - _istride.resize(_ndimension); - - _osites = 1; - _isites = 1; - for(int d=0;d<_ndimension;d++){ - _fdimensions[d] = dimensions[d]; - _gdimensions[d] = _fdimensions[d]; - if (d==0) _gdimensions[0] = _gdimensions[0]/2; // Remove a checkerboard - _ldimensions[d] = _gdimensions[d]/_processors[d]; - - // Use a reduced simd grid - _simd_layout[d] = simd_layout[d]; - _rdimensions[d]= _ldimensions[d]/_simd_layout[d]; - - _osites *= _rdimensions[d]; - _isites *= _simd_layout[d]; - - // Addressing support - if ( d==0 ) { - _ostride[d] = 1; - _istride[d] = 1; - } else { - _ostride[d] = _ostride[d-1]*_rdimensions[d-1]; - _istride[d] = _istride[d-1]*_simd_layout[d-1]; - } - } - - //////////////////////////////////////////////////////////////////////////////////////////// - // subplane information - //////////////////////////////////////////////////////////////////////////////////////////// - _slice_block.resize(_ndimension); - _slice_stride.resize(_ndimension); - _slice_nblock.resize(_ndimension); - - int block =1; - int nblock=1; - for(int d=0;d<_ndimension;d++) nblock*=_rdimensions[d]; - - for(int d=0;d<_ndimension;d++){ - nblock/=_rdimensions[d]; - _slice_block[d] =block; - _slice_stride[d]=_ostride[d]*_rdimensions[d]; - _slice_nblock[d]=nblock; - block = block*_rdimensions[d]; - } - - }; -protected: - virtual int oIndex(std::vector &coor) - { - int idx=_ostride[0]*((coor[0]/2)%_rdimensions[0]); - for(int d=1;d<_ndimension;d++) idx+=_ostride[d]*(coor[d]%_rdimensions[d]); - return idx; - }; - -}; - -} #endif diff --git a/lib/Grid_cartesian_base.h b/lib/Grid_cartesian_base.h new file mode 100644 index 00000000..2731d9a5 --- /dev/null +++ b/lib/Grid_cartesian_base.h @@ -0,0 +1,200 @@ +#ifndef GRID_CARTESIAN_BASE_H +#define GRID_CARTESIAN_BASE_H + +#include +#include + +namespace Grid{ + +class GridBase : public CartesianCommunicator { +public: + + // Give Lattice access + template friend class Lattice; + + GridBase(std::vector & processor_grid) : CartesianCommunicator(processor_grid) {}; + + + //FIXME + // protected: + // Lattice wide random support. not yet fully implemented. Need seed strategy + // and one generator per site. + // std::default_random_engine generator; + // static std::mt19937 generator( 9 ); + + ////////////////////////////////////////////////////////////////////// + // Commicator provides information on the processor grid + ////////////////////////////////////////////////////////////////////// + // unsigned long _ndimension; + // std::vector _processors; // processor grid + // int _processor; // linear processor rank + // std::vector _processor_coor; // linear processor rank + ////////////////////////////////////////////////////////////////////// + + // Physics Grid information. + std::vector _simd_layout; // Which dimensions get relayed out over simd lanes. + std::vector _fdimensions;// Global dimensions of array prior to cb removal + std::vector _gdimensions;// Global dimensions of array after cb removal + std::vector _ldimensions;// local dimensions of array with processor images removed + std::vector _rdimensions;// Reduced local dimensions with simd lane images and processor images removed + std::vector _ostride; // Outer stride for each dimension + std::vector _istride; // Inner stride i.e. within simd lane + int _osites; // _isites*_osites = product(dimensions). + int _isites; + std::vector _slice_block; // subslice information + std::vector _slice_stride; + std::vector _slice_nblock; + + // Might need these at some point + // std::vector _lstart; // local start of array in gcoors. _processor_coor[d]*_ldimensions[d] + // std::vector _lend; // local end of array in gcoors _processor_coor[d]*_ldimensions[d]+_ldimensions_[d]-1 + +public: + + //////////////////////////////////////////////////////////////// + // Checkerboarding interface is virtual and overridden by + // GridCartesian / GridRedBlackCartesian + //////////////////////////////////////////////////////////////// + virtual int CheckerBoarded(int dim)=0; + virtual int CheckerBoard(std::vector site)=0; + virtual int CheckerBoardDestination(int source_cb,int shift)=0; + virtual int CheckerBoardShift(int source_cb,int dim,int shift,int osite)=0; + inline int CheckerBoardFromOindex (int Oindex){ + std::vector ocoor; + oCoorFromOindex(ocoor,Oindex); + int ss=0; + for(int d=0;d<_ndimension;d++){ + ss=ss+ocoor[d]; + } + return ss&0x1; + } + + ////////////////////////////////////////////////////////////////////////////////////////////// + // Local layout calculations + ////////////////////////////////////////////////////////////////////////////////////////////// + // These routines are key. Subdivide the linearised cartesian index into + // "inner" index identifying which simd lane of object is associated with coord + // "outer" index identifying which element of _odata in class "Lattice" is associated with coord. + // + // Compared to, say, Blitz++ we simply need to store BOTH an inner stride and an outer + // stride per dimension. The cost of evaluating the indexing information is doubled for an n-dimensional + // coordinate. Note, however, for data parallel operations the "inner" indexing cost is not paid and all + // lanes are operated upon simultaneously. + + virtual int oIndex(std::vector &coor) + { + int idx=0; + // Works with either global or local coordinates + for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*(coor[d]%_rdimensions[d]); + return idx; + } + inline int oIndexReduced(std::vector &ocoor) + { + int idx=0; + // ocoor is already reduced so can eliminate the modulo operation + // for fast indexing and inline the routine + for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*ocoor[d]; + return idx; + } + inline void oCoorFromOindex (std::vector& coor,int Oindex){ + coor.resize(_ndimension); + for(int d=0;d<_ndimension;d++){ + coor[d] = Oindex % _rdimensions[d]; + Oindex = Oindex / _rdimensions[d]; + } + } + + ////////////////////////////////////////////////////////// + // SIMD lane addressing + ////////////////////////////////////////////////////////// + inline int iIndex(std::vector &lcoor) + { + int idx=0; + for(int d=0;d<_ndimension;d++) idx+=_istride[d]*(lcoor[d]/_rdimensions[d]); + return idx; + } + inline void iCoorFromIindex(std::vector &coor,int lane) + { + coor.resize(_ndimension); + for(int d=0;d<_ndimension;d++){ + coor[d] = lane % _simd_layout[d]; + lane = lane / _simd_layout[d]; + } + } + inline int PermuteDim(int dimension){ + return _simd_layout[dimension]>1; + } + inline int PermuteType(int dimension){ + int permute_type=0; + for(int d=_ndimension-1;d>dimension;d--){ + if (_simd_layout[d]>1 ) permute_type++; + } + return permute_type; + } + //////////////////////////////////////////////////////////////// + // Array sizing queries + //////////////////////////////////////////////////////////////// + + inline int iSites(void) { return _isites; }; + inline int Nsimd(void) { return _isites; };// Synonymous with iSites + inline int oSites(void) { return _osites; }; + inline int lSites(void) { return _isites*_osites; }; + inline int gSites(void) { return _isites*_osites*_Nprocessors; }; + inline int Nd (void) { return _ndimension;}; + inline const std::vector &FullDimensions(void) { return _fdimensions;}; + inline const std::vector &GlobalDimensions(void) { return _gdimensions;}; + inline const std::vector &LocalDimensions(void) { return _ldimensions;}; + inline const std::vector &VirtualLocalDimensions(void) { return _ldimensions;}; + + //////////////////////////////////////////////////////////////// + // Global addressing + //////////////////////////////////////////////////////////////// + void RankIndexToGlobalCoor(int rank, int o_idx, int i_idx , std::vector &gcoor) + { + gcoor.resize(_ndimension); + std::vector coor(_ndimension); + + ProcessorCoorFromRank(rank,coor); + for(int mu=0;mu<_ndimension;mu++) gcoor[mu] = _ldimensions[mu]&coor[mu]; + + iCoorFromIindex(coor,i_idx); + for(int mu=0;mu<_ndimension;mu++) gcoor[mu] += _rdimensions[mu]&coor[mu]; + + oCoorFromOindex (coor,o_idx); + for(int mu=0;mu<_ndimension;mu++) gcoor[mu] += coor[mu]; + + } + void RankIndexCbToFullGlobalCoor(int rank, int o_idx, int i_idx, int cb,std::vector &fcoor) + { + RankIndexToGlobalCoor(rank,o_idx,i_idx ,fcoor); + if(CheckerBoarded(0)){ + fcoor[0] = fcoor[0]*2+cb; + } + } + void ProcessorCoorLocalCoorToGlobalCoor(std::vector &Pcoor,std::vector &Lcoor,std::vector &gcoor) + { + gcoor.resize(_ndimension); + for(int mu=0;mu<_ndimension;mu++) gcoor[mu] = Pcoor[mu]*_ldimensions[mu]+Lcoor[mu]; + } + void GlobalCoorToProcessorCoorLocalCoor(std::vector &pcoor,std::vector &lcoor,const std::vector &gcoor) + { + pcoor.resize(_ndimension); + lcoor.resize(_ndimension); + for(int mu=0;mu<_ndimension;mu++){ + pcoor[mu] = gcoor[mu]/_ldimensions[mu]; + lcoor[mu] = gcoor[mu]%_ldimensions[mu]; + } + } + void GlobalCoorToRankIndex(int &rank, int &o_idx, int &i_idx ,const std::vector &gcoor) + { + std::vector pcoor; + std::vector lcoor; + GlobalCoorToProcessorCoorLocalCoor(pcoor,lcoor,gcoor); + rank = RankFromProcessorCoor(pcoor); + i_idx= iIndex(lcoor); + o_idx= oIndex(lcoor); + } + +}; +} +#endif diff --git a/lib/Grid_cartesian_full.h b/lib/Grid_cartesian_full.h new file mode 100644 index 00000000..383bf14f --- /dev/null +++ b/lib/Grid_cartesian_full.h @@ -0,0 +1,95 @@ +#ifndef GRID_CARTESIAN_FULL_H +#define GRID_CARTESIAN_FULL_H + +namespace Grid{ + +///////////////////////////////////////////////////////////////////////////////////////// +// Grid Support. +///////////////////////////////////////////////////////////////////////////////////////// + + +class GridCartesian: public GridBase { + +public: + + virtual int CheckerBoarded(int dim){ + return 0; + } + virtual int CheckerBoard(std::vector site){ + return 0; + } + virtual int CheckerBoardDestination(int cb,int shift){ + return 0; + } + virtual int CheckerBoardShift(int source_cb,int dim,int shift, int osite){ + return shift; + } + GridCartesian(std::vector &dimensions, + std::vector &simd_layout, + std::vector &processor_grid + ) : GridBase(processor_grid) + { + /////////////////////// + // Grid information + /////////////////////// + _ndimension = dimensions.size(); + + _fdimensions.resize(_ndimension); + _gdimensions.resize(_ndimension); + _ldimensions.resize(_ndimension); + _rdimensions.resize(_ndimension); + _simd_layout.resize(_ndimension); + + _ostride.resize(_ndimension); + _istride.resize(_ndimension); + + _osites = 1; + _isites = 1; + for(int d=0;d<_ndimension;d++){ + _fdimensions[d] = dimensions[d]; // Global dimensions + _gdimensions[d] = _fdimensions[d]; // Global dimensions + _simd_layout[d] = simd_layout[d]; + + //FIXME check for exact division + + // Use a reduced simd grid + _ldimensions[d]= _gdimensions[d]/_processors[d]; //local dimensions + _rdimensions[d]= _ldimensions[d]/_simd_layout[d]; //overdecomposition + _osites *= _rdimensions[d]; + _isites *= _simd_layout[d]; + + // Addressing support + if ( d==0 ) { + _ostride[d] = 1; + _istride[d] = 1; + } else { + _ostride[d] = _ostride[d-1]*_rdimensions[d-1]; + _istride[d] = _istride[d-1]*_simd_layout[d-1]; + } + } + + /////////////////////// + // subplane information + /////////////////////// + _slice_block.resize(_ndimension); + _slice_stride.resize(_ndimension); + _slice_nblock.resize(_ndimension); + + int block =1; + int nblock=1; + for(int d=0;d<_ndimension;d++) nblock*=_rdimensions[d]; + + for(int d=0;d<_ndimension;d++){ + nblock/=_rdimensions[d]; + _slice_block[d] =block; + _slice_stride[d]=_ostride[d]*_rdimensions[d]; + _slice_nblock[d]=nblock; + block = block*_rdimensions[d]; + } + + }; +}; + + +} +#endif diff --git a/lib/Grid_cartesian_red_black.h b/lib/Grid_cartesian_red_black.h new file mode 100644 index 00000000..e85fd3f7 --- /dev/null +++ b/lib/Grid_cartesian_red_black.h @@ -0,0 +1,121 @@ +#ifndef GRID_CARTESIAN_RED_BLACK_H +#define GRID_CARTESIAN_RED_BLACK_H + + +namespace Grid { + +// Specialise this for red black grids storing half the data like a chess board. +class GridRedBlackCartesian : public GridBase +{ +public: + virtual int CheckerBoarded(int dim){ + if( dim==0) return 1; + else return 0; + } + virtual int CheckerBoard(std::vector site){ + return (site[0]+site[1]+site[2]+site[3])&0x1; + } + + // Depending on the cb of site, we toggle source cb. + // for block #b, element #e = (b, e) + // we need + virtual int CheckerBoardShift(int source_cb,int dim,int shift,int osite){ + + if(dim != 0) return shift; + + int fulldim =_fdimensions[0]; + shift = (shift+fulldim)%fulldim; + + // Probably faster with table lookup; + // or by looping over x,y,z and multiply rather than computing checkerboard. + int ocb=CheckerBoardFromOindex(osite); + + if ( (source_cb+ocb)&1 ) { + return (shift)/2; + } else { + return (shift+1)/2; + } + } + + virtual int CheckerBoardDestination(int source_cb,int shift){ + if ((shift+_fdimensions[0])&0x1) { + return 1-source_cb; + } else { + return source_cb; + } + }; + GridRedBlackCartesian(std::vector &dimensions, + std::vector &simd_layout, + std::vector &processor_grid) : GridBase(processor_grid) + { + /////////////////////// + // Grid information + /////////////////////// + _ndimension = dimensions.size(); + + _fdimensions.resize(_ndimension); + _gdimensions.resize(_ndimension); + _ldimensions.resize(_ndimension); + _rdimensions.resize(_ndimension); + _simd_layout.resize(_ndimension); + + _ostride.resize(_ndimension); + _istride.resize(_ndimension); + + _osites = 1; + _isites = 1; + for(int d=0;d<_ndimension;d++){ + _fdimensions[d] = dimensions[d]; + _gdimensions[d] = _fdimensions[d]; + if (d==0) _gdimensions[0] = _gdimensions[0]/2; // Remove a checkerboard + _ldimensions[d] = _gdimensions[d]/_processors[d]; + + // Use a reduced simd grid + _simd_layout[d] = simd_layout[d]; + _rdimensions[d]= _ldimensions[d]/_simd_layout[d]; + + _osites *= _rdimensions[d]; + _isites *= _simd_layout[d]; + + // Addressing support + if ( d==0 ) { + _ostride[d] = 1; + _istride[d] = 1; + } else { + _ostride[d] = _ostride[d-1]*_rdimensions[d-1]; + _istride[d] = _istride[d-1]*_simd_layout[d-1]; + } + } + + //////////////////////////////////////////////////////////////////////////////////////////// + // subplane information + //////////////////////////////////////////////////////////////////////////////////////////// + _slice_block.resize(_ndimension); + _slice_stride.resize(_ndimension); + _slice_nblock.resize(_ndimension); + + int block =1; + int nblock=1; + for(int d=0;d<_ndimension;d++) nblock*=_rdimensions[d]; + + for(int d=0;d<_ndimension;d++){ + nblock/=_rdimensions[d]; + _slice_block[d] =block; + _slice_stride[d]=_ostride[d]*_rdimensions[d]; + _slice_nblock[d]=nblock; + block = block*_rdimensions[d]; + } + + }; +protected: + virtual int oIndex(std::vector &coor) + { + int idx=_ostride[0]*((coor[0]/2)%_rdimensions[0]); + for(int d=1;d<_ndimension;d++) idx+=_ostride[d]*(coor[d]%_rdimensions[d]); + return idx; + }; + +}; + +} +#endif diff --git a/lib/Grid_cshift_mpi.h b/lib/Grid_cshift_mpi.h index 4ca8f6b5..f51becf3 100644 --- a/lib/Grid_cshift_mpi.h +++ b/lib/Grid_cshift_mpi.h @@ -1,5 +1,5 @@ -#ifndef _GRID_MPI_CSHIFT_H_ -#define _GRID_MPI_CSHIFT_H_ +#ifndef _GRID_CSHIFT_MPI_H_ +#define _GRID_CSHIFT_MPI_H_ #ifndef MAX #define MAX(x,y) ((x)>(y)?(x):(y)) diff --git a/lib/Grid_cshift_none.h b/lib/Grid_cshift_none.h index 402e52b4..7f4f7bc1 100644 --- a/lib/Grid_cshift_none.h +++ b/lib/Grid_cshift_none.h @@ -1,5 +1,5 @@ -#ifndef _GRID_NONE_CSHIFT_H_ -#define _GRID_NONE_CSHIFT_H_ +#ifndef _GRID_CSHIFT_NONE_H_ +#define _GRID_CSHIFT_NONE_H_ friend Lattice Cshift(Lattice &rhs,int dimension,int shift) { diff --git a/lib/Grid_lattice.h b/lib/Grid_lattice.h index b9f544b5..be95caa0 100644 --- a/lib/Grid_lattice.h +++ b/lib/Grid_lattice.h @@ -1,9 +1,6 @@ #ifndef GRID_LATTICE_H #define GRID_LATTICE_H -#include "Grid.h" - - namespace Grid { // TODO: Indexing () diff --git a/lib/Grid_math.h b/lib/Grid_math.h new file mode 100644 index 00000000..bad20054 --- /dev/null +++ b/lib/Grid_math.h @@ -0,0 +1,649 @@ +#ifndef GRID_MATH_H +#define GRID_MATH_H + +#include +#include +#include + +// +// Indexing; want to be able to dereference and +// obtain either an lvalue or an rvalue. +// +namespace Grid { + + + + + /////////////////////////////////////////////////////////////////////////////////////// + // innerProduct Scalar x Scalar -> Scalar + // innerProduct Vector x Vector -> Scalar + // innerProduct Matrix x Matrix -> Scalar + /////////////////////////////////////////////////////////////////////////////////////// + template inline + auto innerProduct (const iVector& lhs,const iVector& rhs) -> iScalar + { + typedef decltype(innerProduct(lhs._internal[0],rhs._internal[0])) ret_t; + iScalar ret=zero; + for(int c1=0;c1 inline + auto innerProduct (const iMatrix& lhs,const iMatrix& rhs) -> iScalar + { + typedef decltype(innerProduct(lhs._internal[0][0],rhs._internal[0][0])) ret_t; + iScalar ret=zero; + iScalar tmp; + for(int c1=0;c1 inline + auto innerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar + { + typedef decltype(innerProduct(lhs._internal,rhs._internal)) ret_t; + iScalar ret; + ret._internal = innerProduct(lhs._internal,rhs._internal); + return ret; + } + + /////////////////////////////////////////////////////////////////////////////////////// + // outerProduct Scalar x Scalar -> Scalar + // Vector x Vector -> Matrix + /////////////////////////////////////////////////////////////////////////////////////// + +template inline +auto outerProduct (const iVector& lhs,const iVector& rhs) -> iMatrix +{ + typedef decltype(outerProduct(lhs._internal[0],rhs._internal[0])) ret_t; + iMatrix ret; + for(int c1=0;c1 inline +auto outerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar +{ + typedef decltype(outerProduct(lhs._internal,rhs._internal)) ret_t; + iScalar ret; + ret._internal = outerProduct(lhs._internal,rhs._internal); + return ret; +} + +inline ComplexF outerProduct(const ComplexF &l, const ComplexF& r) +{ + return l*r; +} +inline ComplexD outerProduct(const ComplexD &l, const ComplexD& r) +{ + return l*r; +} +inline RealF outerProduct(const RealF &l, const RealF& r) +{ + return l*r; +} +inline RealD outerProduct(const RealD &l, const RealD& r) +{ + return l*r; +} + /////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////// CONJ /////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + +// Conj function for scalar, vector, matrix +template inline iScalar conj(const iScalar&r) +{ + iScalar ret; + ret._internal = conj(r._internal); + return ret; +} +template inline iVector conj(const iVector&r) +{ + iVector ret; + for(int i=0;i inline iMatrix conj(const iMatrix&r) +{ + iMatrix ret; + for(int i=0;i inline iScalar adj(const iScalar&r) +{ + iScalar ret; + ret._internal = adj(r._internal); + return ret; +} +template inline iVector adj(const iVector&r) +{ + iVector ret; + for(int i=0;i inline iMatrix adj(const iMatrix &arg) +{ + iMatrix ret; + for(int c1=0;c1 + inline typename std::enable_if::value, iMatrix >::type + transpose(iMatrix arg) + { + iMatrix ret; + for(int i=0;i + inline typename std::enable_if::notvalue, iMatrix >::type + transpose(iMatrix arg) + { + iMatrix ret; + for(int i=0;i + inline typename std::enable_if::value, iScalar >::type + transpose(iScalar arg) + { + iScalar ret; + ret._internal = transpose(arg._internal); // NB recurses + return ret; + } + +template + inline typename std::enable_if::notvalue, iScalar >::type + transpose(iScalar arg) + { + iScalar ret; + ret._internal = arg._internal; // NB recursion stops + return ret; + } + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Transpose a specific index; instructive to compare this style of recursion termination +// to that of adj; which is easiers? +//////////////////////////////////////////////////////////////////////////////////////////// +template inline + typename std::enable_if,Level>::value, iMatrix >::type +transposeIndex (const iMatrix &arg) +{ + iMatrix ret; + for(int i=0;i inline +typename std::enable_if,Level>::notvalue, iMatrix >::type +transposeIndex (const iMatrix &arg) +{ + iMatrix ret; + for(int i=0;i(arg._internal[i][j]); + }} + return ret; +} +template inline +typename std::enable_if,Level>::notvalue, iScalar >::type +transposeIndex (const iScalar &arg) +{ + iScalar ret; + ret._internal=transposeIndex(arg._internal); + return ret; +} +template inline +typename std::enable_if,Level>::value, iScalar >::type +transposeIndex (const iScalar &arg) +{ + return arg; +} + +////////////////////////////////////////////////////////////////// +// Traces: both all indices and a specific index +///////////////////////////////////////////////////////////////// + +inline ComplexF trace( const ComplexF &arg){ return arg;} +inline ComplexD trace( const ComplexD &arg){ return arg;} +inline RealF trace( const RealF &arg){ return arg;} +inline RealD trace( const RealD &arg){ return arg;} + +template inline ComplexF traceIndex(const ComplexF arg) { return arg;} +template inline ComplexD traceIndex(const ComplexD arg) { return arg;} +template inline RealF traceIndex(const RealF arg) { return arg;} +template inline RealD traceIndex(const RealD arg) { return arg;} + +template +inline auto trace(const iMatrix &arg) -> iScalar +{ + iScalar ret; + zeroit(ret._internal); + for(int i=0;i +inline auto trace(const iScalar &arg) -> iScalar +{ + iScalar ret; + ret._internal=trace(arg._internal); + return ret; +} +//////////////////////////////////////////////////////////////////////////////////////////////////////// +// Trace Specific indices. +//////////////////////////////////////////////////////////////////////////////////////////////////////// +/* +template inline +auto traceIndex(const iScalar &arg) -> iScalar(arg._internal)) > +{ + iScalar(arg._internal))> ret; + ret._internal = traceIndex(arg._internal); + return ret; +} +*/ +template inline auto +traceIndex (const iScalar &arg) -> +typename +std::enable_if,Level>::notvalue, + iScalar(arg._internal))> >::type + +{ + iScalar(arg._internal))> ret; + ret._internal=traceIndex(arg._internal); + return ret; +} +template inline auto +traceIndex (const iScalar &arg) -> +typename std::enable_if,Level>::value, + iScalar >::type +{ + return arg; +} + +// If we hit the right index, return scalar and trace it with no further recursion +template inline +auto traceIndex(const iMatrix &arg) -> + typename std::enable_if,Level>::value, // Index matches + iScalar >::type // return scalar +{ + iScalar ret; + zeroit(ret._internal); + for(int i=0;i inline +auto traceIndex(const iMatrix &arg) -> + typename std::enable_if,Level>::notvalue,// No index match + iMatrix(arg._internal[0][0])),N> >::type // return matrix +{ + iMatrix(arg._internal[0][0])),N> ret; + for(int i=0;i(arg._internal[i][j]); + }} + return ret; +} + +////////////////////////////////////////////////////////////////////////////// +// Peek on a specific index; returns a scalar in that index, tensor inherits rest +////////////////////////////////////////////////////////////////////////////// +// If we hit the right index, return scalar with no further recursion + +//template inline ComplexF peekIndex(const ComplexF arg) { return arg;} +//template inline ComplexD peekIndex(const ComplexD arg) { return arg;} +//template inline RealF peekIndex(const RealF arg) { return arg;} +//template inline RealD peekIndex(const RealD arg) { return arg;} + +// Scalar peek, no indices +template inline + auto peekIndex(const iScalar &arg) -> + typename std::enable_if,Level>::value, // Index matches + iScalar >::type // return scalar +{ + return arg; +} +// Vector peek, one index +template inline + auto peekIndex(const iVector &arg,int i) -> + typename std::enable_if,Level>::value, // Index matches + iScalar >::type // return scalar +{ + iScalar ret; // return scalar + ret._internal = arg._internal[i]; + return ret; +} +// Matrix peek, two indices +template inline + auto peekIndex(const iMatrix &arg,int i,int j) -> + typename std::enable_if,Level>::value, // Index matches + iScalar >::type // return scalar +{ + iScalar ret; // return scalar + ret._internal = arg._internal[i][j]; + return ret; +} + +///////////// +// No match peek for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue +///////////// +// scalar +template inline + auto peekIndex(const iScalar &arg) -> // Scalar 0 index + typename std::enable_if,Level>::notvalue, // Index does NOT match + iScalar(arg._internal))> >::type +{ + iScalar(arg._internal))> ret; + ret._internal= peekIndex(arg._internal); + return ret; +} +template inline + auto peekIndex(const iScalar &arg,int i) -> // Scalar 1 index + typename std::enable_if,Level>::notvalue, // Index does NOT match + iScalar(arg._internal,i))> >::type +{ + iScalar(arg._internal,i))> ret; + ret._internal=peekIndex(arg._internal,i); + return ret; +} +template inline + auto peekIndex(const iScalar &arg,int i,int j) -> // Scalar, 2 index + typename std::enable_if,Level>::notvalue, // Index does NOT match + iScalar(arg._internal,i,j))> >::type +{ + iScalar(arg._internal,i,j))> ret; + ret._internal=peekIndex(arg._internal,i,j); + return ret; +} +// vector +template inline +auto peekIndex(const iVector &arg) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iVector(arg._internal[0])),N> >::type +{ + iVector(arg._internal[0])),N> ret; + for(int ii=0;ii(arg._internal[ii]); + } + return ret; +} +template inline + auto peekIndex(const iVector &arg,int i) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iVector(arg._internal[0],i)),N> >::type +{ + iVector(arg._internal[0],i)),N> ret; + for(int ii=0;ii(arg._internal[ii],i); + } + return ret; +} +template inline + auto peekIndex(const iVector &arg,int i,int j) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iVector(arg._internal[0],i,j)),N> >::type +{ + iVector(arg._internal[0],i,j)),N> ret; + for(int ii=0;ii(arg._internal[ii],i,j); + } + return ret; +} +// matrix +template inline +auto peekIndex(const iMatrix &arg) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iMatrix(arg._internal[0][0])),N> >::type +{ + iMatrix(arg._internal[0][0])),N> ret; + for(int ii=0;ii(arg._internal[ii][jj]);// Could avoid this because peeking a scalar is dumb + }} + return ret; +} +template inline + auto peekIndex(const iMatrix &arg,int i) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iMatrix(arg._internal[0],i)),N> >::type +{ + iMatrix(arg._internal[0],i)),N> ret; + for(int ii=0;ii(arg._internal[ii][jj],i); + }} + return ret; +} +template inline + auto peekIndex(const iMatrix &arg,int i,int j) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iMatrix(arg._internal[0][0],i,j)),N> >::type +{ + iMatrix(arg._internal[0][0],i,j)),N> ret; + for(int ii=0;ii(arg._internal[ii][jj],i,j); + }} + return ret; +} + + +////////////////////////////////////////////////////////////////////////////// +// Poke a specific index; +////////////////////////////////////////////////////////////////////////////// + +// Scalar poke +template inline + void pokeIndex(iScalar &ret, + const typename std::enable_if,Level>::value,iScalar >::type &arg) +{ + ret._internal = arg._internal; +} +// Vector poke, one index +template inline + void pokeIndex(iVector &ret, + const typename std::enable_if,Level>::value,iScalar >::type &arg,int i) +{ + ret._internal[i] = arg._internal; +} +// Vector poke, two indices +template inline + void pokeIndex(iMatrix &ret, + const typename std::enable_if,Level>::value,iScalar >::type &arg,int i,int j) +{ + ret._internal[i][j] = arg._internal; +} + +///////////// +// No match poke for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue +///////////// +// scalar +template inline + void pokeIndex(iScalar &ret, + const typename std::enable_if,Level>::notvalue,iScalar(ret._internal))> >::type &arg) + +{ + pokeIndex(ret._internal,arg._internal); +} +template inline + void pokeIndex(iScalar &ret, + const typename std::enable_if,Level>::notvalue,iScalar(ret._internal,0))> >::type &arg, + int i) + +{ + pokeIndex(ret._internal,arg._internal,i); +} +template inline + void pokeIndex(iScalar &ret, + const typename std::enable_if,Level>::notvalue,iScalar(ret._internal,0,0))> >::type &arg, + int i,int j) + +{ + pokeIndex(ret._internal,arg._internal,i,j); +} + +// Vector +template inline + void pokeIndex(iVector &ret, + const typename std::enable_if,Level>::notvalue,iVector(ret._internal)),N> >::type &arg) + +{ + for(int ii=0;ii(ret._internal[ii],arg._internal[ii]); + } +} +template inline + void pokeIndex(iVector &ret, + const typename std::enable_if,Level>::notvalue,iVector(ret._internal,0)),N> >::type &arg, + int i) + +{ + for(int ii=0;ii(ret._internal[ii],arg._internal[ii],i); + } +} +template inline + void pokeIndex(iVector &ret, + const typename std::enable_if,Level>::notvalue,iVector(ret._internal,0,0)),N> >::type &arg, + int i,int j) + +{ + for(int ii=0;ii(ret._internal[ii],arg._internal[ii],i,j); + } +} + +// Matrix +template inline + void pokeIndex(iMatrix &ret, + const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal)),N> >::type &arg) + +{ + for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj]); + }} +} +template inline + void pokeIndex(iMatrix &ret, + const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal,0)),N> >::type &arg, + int i) + +{ + for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj],i); + }} +} +template inline + void pokeIndex(iMatrix &ret, + const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal,0,0)),N> >::type &arg, + int i,int j) + +{ + for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj],i,j); + }} +} + +///////////////////////////////////////////////////////////////// +// Can only take the real/imag part of scalar objects, since +// lattice objects of different complex nature are non-conformable. +///////////////////////////////////////////////////////////////// +template inline auto real(const iScalar &z) -> iScalar +{ + iScalar ret; + ret._internal = real(z._internal); + return ret; +} +template inline auto real(const iMatrix &z) -> iMatrix +{ + iMatrix ret; + for(int c1=0;c1 inline auto real(const iVector &z) -> iVector +{ + iVector ret; + for(int c1=0;c1 inline auto imag(const iScalar &z) -> iScalar +{ + iScalar ret; + ret._internal = imag(z._internal); + return ret; +} +template inline auto imag(const iMatrix &z) -> iMatrix +{ + iMatrix ret; + for(int c1=0;c1 inline auto imag(const iVector &z) -> iVector +{ + iVector ret; + for(int c1=0;c1 inline void add(iScalar * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iScalar * __restrict__ rhs) + { + add(&ret->_internal,&lhs->_internal,&rhs->_internal); + } + template inline void add(iVector * __restrict__ ret, + const iVector * __restrict__ lhs, + const iVector * __restrict__ rhs) + { + for(int c=0;c_internal[c]=lhs->_internal[c]+rhs->_internal[c]; + } + return; + } + + template inline void add(iMatrix * __restrict__ ret, + const iMatrix * __restrict__ lhs, + const iMatrix * __restrict__ rhs) + { + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal[c1][c2]); + }} + return; + } + template inline void add(iMatrix * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iMatrix * __restrict__ rhs) + { + for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); + }} + return; + } + template inline void add(iMatrix * __restrict__ ret, + const iMatrix * __restrict__ lhs, + const iScalar * __restrict__ rhs) + { + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); + else + ret->_internal[c1][c2]=lhs->_internal[c1][c2]; + }} + return; + } + + // Need to figure multi-precision. + template Mytype timesI(Mytype &r) + { + iScalar i; + i._internal = Complex(0,1); + return r*i; + } + + // + operator for scalar, vector, matrix + template + //inline auto operator + (iScalar& lhs,iScalar&& rhs) -> iScalar + inline auto operator + (const iScalar& lhs,const iScalar& rhs) -> iScalar + { + typedef iScalar ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; + } + template + inline auto operator + (const iVector& lhs,const iVector& rhs) ->iVector + { + typedef iVector ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; + } + template + inline auto operator + (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix + { + typedef iMatrix ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; + } + template +inline auto operator + (const iScalar& lhs,const iMatrix& rhs)->iMatrix + { + typedef iMatrix ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; + } + + template + inline auto operator + (const iMatrix& lhs,const iScalar& rhs)->iMatrix + { + typedef iMatrix ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; + } + + + /////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////// SUB /////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + + +// SUB is simple for now; cannot mix types and straightforward template +// Scalar +/- Scalar +// Vector +/- Vector +// Matrix +/- Matrix +// Matrix /- scalar +template inline void sub(iScalar * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iScalar * __restrict__ rhs) +{ + sub(&ret->_internal,&lhs->_internal,&rhs->_internal); +} + +template inline void sub(iVector * __restrict__ ret, + const iVector * __restrict__ lhs, + const iVector * __restrict__ rhs) +{ + for(int c=0;c_internal[c]=lhs->_internal[c]-rhs->_internal[c]; + } + return; +} +template inline void sub(iMatrix * __restrict__ ret, + const iMatrix * __restrict__ lhs, + const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal[c1][c2]); + }} + return; +} +template inline void sub(iMatrix * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); + } else { + // Fails -- need unary minus. Catalogue other unops? + ret->_internal[c1][c2]=zero; + ret->_internal[c1][c2]=ret->_internal[c1][c2]-rhs->_internal[c1][c2]; + + } + }} + return; +} +template inline void sub(iMatrix * __restrict__ ret, + const iMatrix * __restrict__ lhs, + const iScalar * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); + else + ret->_internal[c1][c2]=lhs->_internal[c1][c2]; + }} + return; +} + +template void vprefetch(const iScalar &vv) +{ + vprefetch(vv._internal); +} +template void vprefetch(const iVector &vv) +{ + for(int i=0;i void vprefetch(const iMatrix &vv) +{ + for(int i=0;i inline auto +operator - (const iScalar& lhs, const iScalar& rhs) -> iScalar +{ + typedef iScalar ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator - (const iVector& lhs,const iVector& rhs) ->iVector +{ + typedef iVector ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator - (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix +{ + typedef iMatrix ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator - (const iScalar& lhs,const iMatrix& rhs)->iMatrix +{ + typedef iMatrix ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator - (const iMatrix& lhs,const iScalar& rhs)->iMatrix +{ + typedef iMatrix ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////// MAC /////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// + + /////////////////////////// + // Legal multiplication table + /////////////////////////// + // scal x scal = scal + // mat x mat = mat + // mat x scal = mat + // scal x mat = mat + // mat x vec = vec + // vec x scal = vec + // scal x vec = vec + /////////////////////////// +template +inline void mac(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs) +{ + mac(&ret->_internal,&lhs->_internal,&rhs->_internal); +} +template +inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); + }}} + return; +} +template +inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ + for(int c1=0;c1_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); + }} + return; +} +template +inline void mac(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ + for(int c1=0;c1_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); + }} + return; +} +template +inline void mac(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) +{ + for(int c1=0;c1_internal[c1],&lhs->_internal[c1][c2],&rhs->_internal[c2]); + }} + return; +} +template +inline void mac(iVector * __restrict__ ret,const iScalar * __restrict__ lhs,const iVector * __restrict__ rhs) +{ + for(int c1=0;c1_internal[c1],&lhs->_internal,&rhs->_internal[c1]); + } + return; +} +template +inline void mac(iVector * __restrict__ ret,const iVector * __restrict__ lhs,const iScalar * __restrict__ rhs) +{ + for(int c1=0;c1_internal[c1],&lhs->_internal[c1],&rhs->_internal); + } + return; +} + + /////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////// MUL /////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + + +template +inline void mult(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs){ + mult(&ret->_internal,&lhs->_internal,&rhs->_internal); +} + +template +inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][0],&rhs->_internal[0][c2]); + for(int c3=1;c3_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); + } + }} + return; +} +template +inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); + }} + return; +} + +template +inline void mult(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); + }} + return; +} +// Matrix left multiplies vector +template +inline void mult(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) +{ + for(int c1=0;c1_internal[c1],&lhs->_internal[c1][0],&rhs->_internal[0]); + for(int c2=1;c2_internal[c1],&lhs->_internal[c1][c2],&rhs->_internal[c2]); + } + } + return; +} +template +inline void mult(iVector * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iVector * __restrict__ rhs){ + for(int c1=0;c1_internal[c1],&lhs->_internal,&rhs->_internal[c1]); + } +} +template +inline void mult(iVector * __restrict__ ret, + const iVector * __restrict__ rhs, + const iScalar * __restrict__ lhs){ + mult(ret,lhs,rhs); +} + + + +template inline +iVector operator * (const iMatrix& lhs,const iVector& rhs) +{ + iVector ret; + mult(&ret,&lhs,&rhs); + return ret; +} + +template inline +iVector operator * (const iScalar& lhs,const iVector& rhs) +{ + iVector ret; + mult(&ret,&lhs,&rhs); + return ret; +} + +template inline +iVector operator * (const iVector& lhs,const iScalar& rhs) +{ + iVector ret; + mult(&ret,&lhs,&rhs); + return ret; +} + + ////////////////////////////////////////////////////////////////// + // Glue operators to mult routines. Must resolve return type cleverly from typeof(internal) + // since nesting matrix x matrix-> matrix + // while matrix x matrix-> matrix + // so return type depends on argument types in nasty way. + ////////////////////////////////////////////////////////////////// + // scal x scal = scal + // mat x mat = mat + // mat x scal = mat + // scal x mat = mat + // mat x vec = vec + // vec x scal = vec + // scal x vec = vec + // + // We can special case scalar_type ?? +template +inline auto operator * (const iScalar& lhs,const iScalar& rhs) -> iScalar +{ + typedef iScalar ret_t; + ret_t ret; + mult(&ret,&lhs,&rhs); + return ret; +} +template inline +auto operator * (const iMatrix& lhs,const iMatrix& rhs) -> iMatrix +{ + typedef decltype(lhs._internal[0][0]*rhs._internal[0][0]) ret_t; + iMatrix ret; + mult(&ret,&lhs,&rhs); + return ret; +} +template inline +auto operator * (const iMatrix& lhs,const iScalar& rhs) -> iMatrix +{ + typedef decltype(lhs._internal[0][0]*rhs._internal) ret_t; + + iMatrix ret; + for(int c1=0;c1 inline +auto operator * (const iScalar& lhs,const iMatrix& rhs) -> iMatrix +{ + typedef decltype(lhs._internal*rhs._internal[0][0]) ret_t; + iMatrix ret; + for(int c1=0;c1 inline +auto operator * (const iMatrix& lhs,const iVector& rhs) -> iVector +{ + typedef decltype(lhs._internal[0][0]*rhs._internal[0]) ret_t; + iVector ret; + for(int c1=0;c1 inline +auto operator * (const iScalar& lhs,const iVector& rhs) -> iVector +{ + typedef decltype(lhs._internal*rhs._internal[0]) ret_t; + iVector ret; + for(int c1=0;c1 inline +auto operator * (const iVector& lhs,const iScalar& rhs) -> iVector +{ + typedef decltype(lhs._internal[0]*rhs._internal) ret_t; + iVector ret; + for(int c1=0;c1 inline iScalar operator * (const iScalar& lhs,const typename iScalar::scalar_type rhs) +{ + typename iScalar::tensor_reduced srhs(rhs); + return lhs*srhs; +} +template inline iScalar operator * (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs*lhs; } + +template inline iVector operator * (const iVector& lhs,const typename iScalar::scalar_type rhs) +{ + typename iVector::tensor_reduced srhs(rhs); + return lhs*srhs; +} +template inline iVector operator * (const typename iScalar::scalar_type lhs,const iVector& rhs) { return rhs*lhs; } + +template inline iMatrix operator * (const iMatrix& lhs,const typename iScalar::scalar_type &rhs) +{ + typename iMatrix::tensor_reduced srhs(rhs); + return lhs*srhs; +} +template inline iMatrix operator * (const typename iScalar::scalar_type & lhs,const iMatrix& rhs) { return rhs*lhs; } + +//////////////////////////////////////////////////////////////////// +// Double support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator * (const iScalar& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iScalar operator * (double lhs,const iScalar& rhs) { return rhs*lhs; } + +template inline iVector operator * (const iVector& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iVector operator * (double lhs,const iVector& rhs) { return rhs*lhs; } + +template inline iMatrix operator * (const iMatrix& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iMatrix operator * (double lhs,const iMatrix& rhs) { return rhs*lhs; } + +//////////////////////////////////////////////////////////////////// +// Complex support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator * (const iScalar& lhs,ComplexD rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iScalar operator * (ComplexD lhs,const iScalar& rhs) { return rhs*lhs; } + +template inline iVector operator * (const iVector& lhs,ComplexD rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iVector operator * (ComplexD lhs,const iVector& rhs) { return rhs*lhs; } + +template inline iMatrix operator * (const iMatrix& lhs,ComplexD rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iMatrix operator * (ComplexD lhs,const iMatrix& rhs) { return rhs*lhs; } + +//////////////////////////////////////////////////////////////////// +// Integer support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator * (const iScalar& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iScalar operator * (Integer lhs,const iScalar& rhs) { return rhs*lhs; } + +template inline iVector operator * (const iVector& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iVector operator * (Integer lhs,const iVector& rhs) { return rhs*lhs; } + +template inline iMatrix operator * (const iMatrix& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iMatrix operator * (Integer lhs,const iMatrix& rhs) { return rhs*lhs; } + + + +/////////////////////////////////////////////////////////////////////////////////////////////// +// addition by fundamental scalar type applies to matrix(down diag) and scalar +/////////////////////////////////////////////////////////////////////////////////////////////// +template inline iScalar operator + (const iScalar& lhs,const typename iScalar::scalar_type rhs) +{ + typename iScalar::tensor_reduced srhs(rhs); + return lhs+srhs; +} +template inline iScalar operator + (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs+lhs; } + +template inline iMatrix operator + (const iMatrix& lhs,const typename iScalar::scalar_type rhs) +{ + typename iMatrix::tensor_reduced srhs(rhs); + return lhs+srhs; +} +template inline iMatrix operator + (const typename iScalar::scalar_type lhs,const iMatrix& rhs) { return rhs+lhs; } + +//////////////////////////////////////////////////////////////////// +// Double support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator + (const iScalar& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs+srhs; +} +template inline iScalar operator + (double lhs,const iScalar& rhs) { return rhs+lhs; } + +template inline iMatrix operator + (const iMatrix& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs+srhs; +} +template inline iMatrix operator + (double lhs,const iMatrix& rhs) { return rhs+lhs; } + + +// Integer support cast to scalar type through constructor + + +template inline iScalar operator + (const iScalar& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs+srhs; +} + +template inline iScalar operator + (Integer lhs,const iScalar& rhs) { return rhs+lhs; } + +template inline iMatrix operator + (const iMatrix& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs+srhs; +} +template inline iMatrix operator + (Integer lhs,const iMatrix& rhs) { return rhs+lhs; } + + +/////////////////////////////////////////////////////////////////////////////////////////////// +// subtraction of fundamental scalar type applies to matrix(down diag) and scalar +/////////////////////////////////////////////////////////////////////////////////////////////// +template inline iScalar operator - (const iScalar& lhs,const typename iScalar::scalar_type rhs) +{ + typename iScalar::tensor_reduced srhs(rhs); + return lhs-srhs; +} +template inline iScalar operator - (const typename iScalar::scalar_type lhs,const iScalar& rhs) +{ + typename iScalar::tensor_reduced slhs(lhs); + return slhs-rhs; +} + +template inline iMatrix operator - (const iMatrix& lhs,const typename iScalar::scalar_type rhs) +{ + typename iScalar::tensor_reduced srhs(rhs); + return lhs-srhs; +} +template inline iMatrix operator - (const typename iScalar::scalar_type lhs,const iMatrix& rhs) +{ + typename iScalar::tensor_reduced slhs(lhs); + return slhs-rhs; +} + +//////////////////////////////////////////////////////////////////// +// Double support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator - (const iScalar& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs-srhs; +} +template inline iScalar operator - (double lhs,const iScalar& rhs) +{ + typename iScalar::scalar_type t(lhs); + typename iScalar::tensor_reduced slhs(t); + return slhs-rhs; +} + +template inline iMatrix operator - (const iMatrix& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs-srhs; +} +template inline iMatrix operator - (double lhs,const iMatrix& rhs) +{ + typename iScalar::scalar_type t(lhs); + typename iScalar::tensor_reduced slhs(t); + return slhs-rhs; +} + +//////////////////////////////////////////////////////////////////// +// Integer support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator - (const iScalar& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs-srhs; +} +template inline iScalar operator - (Integer lhs,const iScalar& rhs) +{ + typename iScalar::scalar_type t(lhs); + typename iScalar::tensor_reduced slhs(t); + return slhs-rhs; +} +template inline iMatrix operator - (const iMatrix& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs-srhs; +} +template inline iMatrix operator - (Integer lhs,const iMatrix& rhs) +{ + typename iScalar::scalar_type t(lhs); + typename iScalar::tensor_reduced slhs(t); + return slhs-rhs; +} + +} +#endif + diff --git a/lib/Grid_math_tensors.h b/lib/Grid_math_tensors.h new file mode 100644 index 00000000..98b9d22e --- /dev/null +++ b/lib/Grid_math_tensors.h @@ -0,0 +1,224 @@ +#ifndef GRID_MATH_TENSORS_H +#define GRID_MATH_TENSORS_H + +namespace Grid { + +/////////////////////////////////////////////////// +// Scalar, Vector, Matrix objects. +// These can be composed to form tensor products of internal indices. +/////////////////////////////////////////////////// + +template class iScalar +{ +public: + vtype _internal; + + typedef typename GridTypeMapper::scalar_type scalar_type; + typedef typename GridTypeMapper::vector_type vector_type; + typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; + typedef iScalar tensor_reduced; + + enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; + + // Scalar no action + // template using tensor_reduce_level = typename iScalar::tensor_reduce_level >; + + iScalar(){}; + + iScalar(scalar_type s) : _internal(s) {};// recurse down and hit the constructor for vector_type + + iScalar(Zero &z){ *this = zero; }; + + iScalar & operator= (const Zero &hero){ + zeroit(*this); + return *this; + } + friend void zeroit(iScalar &that){ + zeroit(that._internal); + } + friend void permute(iScalar &out,const iScalar &in,int permutetype){ + permute(out._internal,in._internal,permutetype); + } + friend void extract(const iScalar &in,std::vector &out){ + extract(in._internal,out); // extract advances the pointers in out + } + friend void merge(iScalar &in,std::vector &out){ + merge(in._internal,out); // extract advances the pointers in out + } + + // Unary negation + friend inline iScalar operator -(const iScalar &r) { + iScalar ret; + ret._internal= -r._internal; + return ret; + } + // *=,+=,-= operators inherit from corresponding "*,-,+" behaviour + inline iScalar &operator *=(const iScalar &r) { + *this = (*this)*r; + return *this; + } + inline iScalar &operator -=(const iScalar &r) { + *this = (*this)-r; + return *this; + } + inline iScalar &operator +=(const iScalar &r) { + *this = (*this)+r; + return *this; + } + + inline vtype & operator ()(void) { + return _internal; + } + + operator ComplexD () const { return(TensorRemove(_internal)); }; + operator RealD () const { return(real(TensorRemove(_internal))); } + +}; +/////////////////////////////////////////////////////////// +// Allows to turn scalar>>> back to double. +/////////////////////////////////////////////////////////// +template inline typename std::enable_if::notvalue, T>::type TensorRemove(T arg) { return arg;} +template inline auto TensorRemove(iScalar arg) -> decltype(TensorRemove(arg._internal)) +{ + return TensorRemove(arg._internal); +} + +template class iVector +{ +public: + vtype _internal[N]; + + typedef typename GridTypeMapper::scalar_type scalar_type; + typedef typename GridTypeMapper::vector_type vector_type; + typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; + + enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; + typedef iScalar tensor_reduced; + + iVector(Zero &z){ *this = zero; }; + iVector() {};// Empty constructure + + iVector & operator= (Zero &hero){ + zeroit(*this); + return *this; + } + friend void zeroit(iVector &that){ + for(int i=0;i &out,const iVector &in,int permutetype){ + for(int i=0;i &in,std::vector &out){ + for(int i=0;i &in,std::vector &out){ + for(int i=0;i operator -(const iVector &r) { + iVector ret; + for(int i=0;i &operator *=(const iScalar &r) { + *this = (*this)*r; + return *this; + } + inline iVector &operator -=(const iVector &r) { + *this = (*this)-r; + return *this; + } + inline iVector &operator +=(const iVector &r) { + *this = (*this)+r; + return *this; + } + inline vtype & operator ()(int i) { + return _internal[i]; + } +}; + +template class iMatrix +{ +public: + vtype _internal[N][N]; + + typedef typename GridTypeMapper::scalar_type scalar_type; + typedef typename GridTypeMapper::vector_type vector_type; + + typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; + + enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; + typedef iScalar tensor_reduced; + + iMatrix(Zero &z){ *this = zero; }; + iMatrix() {}; + iMatrix & operator= (Zero &hero){ + zeroit(*this); + return *this; + } + friend void zeroit(iMatrix &that){ + for(int i=0;i &out,const iMatrix &in,int permutetype){ + for(int i=0;i &in,std::vector &out){ + for(int i=0;i &in,std::vector &out){ + for(int i=0;i operator -(const iMatrix &r) { + iMatrix ret; + for(int i=0;i + inline iMatrix &operator *=(const T &r) { + *this = (*this)*r; + return *this; + } + template + inline iMatrix &operator -=(const T &r) { + *this = (*this)-r; + return *this; + } + template + inline iMatrix &operator +=(const T &r) { + *this = (*this)+r; + return *this; + } + inline vtype & operator ()(int i,int j) { + return _internal[i][j]; + } + +}; + +} +#endif diff --git a/lib/Grid_math_traits.h b/lib/Grid_math_traits.h new file mode 100644 index 00000000..8ecc2712 --- /dev/null +++ b/lib/Grid_math_traits.h @@ -0,0 +1,165 @@ +#ifndef GRID_MATH_TRAITS_H +#define GRID_MATH_TRAITS_H + +#include + +namespace Grid { + +////////////////////////////////////////////////////////////////////////////////// +// Want to recurse: GridTypeMapper >::scalar_type == ComplexD. +// Use of a helper class like this allows us to template specialise and "dress" +// other classes such as RealD == double, ComplexD == std::complex with these +// traits. +// +// It is possible that we could do this more elegantly if I introduced a +// queryable trait in iScalar, iMatrix and iVector and used the query on vtype in +// place of the type mapper? +// +// Not sure how to do this, but probably could be done with a research effort +// to study C++11's type_traits.h file. (std::enable_if >) +// +////////////////////////////////////////////////////////////////////////////////// + + template class GridTypeMapper { + public: + typedef typename T::scalar_type scalar_type; + typedef typename T::vector_type vector_type; + typedef typename T::tensor_reduced tensor_reduced; + enum { TensorLevel = T::TensorLevel }; + }; + +////////////////////////////////////////////////////////////////////////////////// +// Recursion stops with these template specialisations +////////////////////////////////////////////////////////////////////////////////// + template<> class GridTypeMapper { + public: + typedef RealF scalar_type; + typedef RealF vector_type; + typedef RealF tensor_reduced ; + enum { TensorLevel = 0 }; + }; + template<> class GridTypeMapper { + public: + typedef RealD scalar_type; + typedef RealD vector_type; + typedef RealD tensor_reduced; + enum { TensorLevel = 0 }; + }; + template<> class GridTypeMapper { + public: + typedef ComplexF scalar_type; + typedef ComplexF vector_type; + typedef ComplexF tensor_reduced; + enum { TensorLevel = 0 }; + }; + template<> class GridTypeMapper { + public: + typedef ComplexD scalar_type; + typedef ComplexD vector_type; + typedef ComplexD tensor_reduced; + enum { TensorLevel = 0 }; + }; + + template<> class GridTypeMapper { + public: + typedef RealF scalar_type; + typedef vRealF vector_type; + typedef vRealF tensor_reduced; + enum { TensorLevel = 0 }; + }; + template<> class GridTypeMapper { + public: + typedef RealD scalar_type; + typedef vRealD vector_type; + typedef vRealD tensor_reduced; + enum { TensorLevel = 0 }; + }; + template<> class GridTypeMapper { + public: + typedef ComplexF scalar_type; + typedef vComplexF vector_type; + typedef vComplexF tensor_reduced; + enum { TensorLevel = 0 }; + }; + template<> class GridTypeMapper { + public: + typedef ComplexD scalar_type; + typedef vComplexD vector_type; + typedef vComplexD tensor_reduced; + enum { TensorLevel = 0 }; + }; + template<> class GridTypeMapper { + public: + typedef Integer scalar_type; + typedef vInteger vector_type; + typedef vInteger tensor_reduced; + enum { TensorLevel = 0 }; + }; + + // First some of my own traits + template struct isGridTensor { + static const bool value = true; + static const bool notvalue = false; + }; + + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + + // Match the index + template struct matchGridTensorIndex { + static const bool value = (Level==T::TensorLevel); + static const bool notvalue = (Level!=T::TensorLevel); + }; + // What is the vtype + template struct isComplex { + static const bool value = false; + }; + template<> struct isComplex { + static const bool value = true; + }; + template<> struct isComplex { + static const bool value = true; + }; + + +} + +#endif diff --git a/lib/Grid_vComplexD.h b/lib/Grid_vComplexD.h index ffcff3a9..313eef4a 100644 --- a/lib/Grid_vComplexD.h +++ b/lib/Grid_vComplexD.h @@ -1,7 +1,5 @@ -#ifndef VCOMPLEXD_H -#define VCOMPLEXD_H -#include "Grid.h" -#include "Grid_vComplexF.h" +#ifndef GRID_VCOMPLEXD_H +#define GRID_VCOMPLEXD_H namespace Grid { class vComplexD { diff --git a/lib/Grid_vComplexF.h b/lib/Grid_vComplexF.h index 42fe5163..9fac656c 100644 --- a/lib/Grid_vComplexF.h +++ b/lib/Grid_vComplexF.h @@ -1,6 +1,5 @@ -#ifndef VCOMPLEXF -#define VCOMPLEXF -#include "Grid.h" +#ifndef GRID_VCOMPLEXF +#define GRID_VCOMPLEXF namespace Grid { diff --git a/lib/Grid_vInteger.h b/lib/Grid_vInteger.h index 672d4938..5dc77444 100644 --- a/lib/Grid_vInteger.h +++ b/lib/Grid_vInteger.h @@ -1,7 +1,5 @@ -#ifndef VINTEGER_H -#define VINTEGER_H - -#include "Grid.h" +#ifndef GRID_VINTEGER_H +#define GRID_VINTEGER_H namespace Grid { diff --git a/lib/Grid_vRealD.h b/lib/Grid_vRealD.h index 0eb6d9c1..ab848916 100644 --- a/lib/Grid_vRealD.h +++ b/lib/Grid_vRealD.h @@ -1,7 +1,5 @@ -#ifndef VREALD_H -#define VREALD_H - -#include "Grid.h" +#ifndef GRID_VREALD_H +#define GRID_VREALD_H namespace Grid { class vRealD { diff --git a/lib/Grid_vRealF.h b/lib/Grid_vRealF.h index 7831a6c7..7d71c528 100644 --- a/lib/Grid_vRealF.h +++ b/lib/Grid_vRealF.h @@ -1,7 +1,6 @@ -#ifndef VREALF_H -#define VREALF_H +#ifndef GRID_VREALF_H +#define GRID_VREALF_H -#include "Grid.h" namespace Grid { class vRealF { diff --git a/lib/Makefile.am b/lib/Makefile.am index 8cb9a0be..93625c68 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -23,22 +23,33 @@ libGrid_a_SOURCES = Grid_init.cc $(extra_sources) # include_HEADERS = Grid_config.h\ Grid.h\ - Grid_simd.h\ - Grid_vComplexD.h\ - Grid_vComplexF.h\ - Grid_vRealD.h\ - Grid_vRealF.h\ - Grid_Cartesian.h\ - Grid_Lattice.h\ - Grid_Communicator.h\ Grid_QCD.h\ Grid_aligned_allocator.h\ + Grid_cartesian.h\ + Grid_cartesian_base.h\ + Grid_cartesian_full.h\ + Grid_cartesian_red_black.h\ + Grid_communicator.h\ + Grid_comparison.h\ + Grid_config.h\ Grid_cshift.h\ Grid_cshift_common.h\ Grid_cshift_mpi.h\ Grid_cshift_none.h\ + Grid_lattice.h\ + Grid_math.h\ + Grid_math_arith.h\ + Grid_math_tensors.h\ + Grid_math_traits.h\ + Grid_predicated.h\ + Grid_simd.h\ Grid_stencil.h\ - Grid_math_types.h + Grid_summation.h\ + Grid_vComplexD.h\ + Grid_vComplexF.h\ + Grid_vInteger.h\ + Grid_vRealD.h\ + Grid_vRealF.h From 3931ad65c8a0ad6f137d5b50fb274cf62e0ba4ca Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 18:37:22 +0100 Subject: [PATCH 071/429] Reorg --- lib/Grid_math_types.h | 1662 ----------------------------------------- 1 file changed, 1662 deletions(-) delete mode 100644 lib/Grid_math_types.h diff --git a/lib/Grid_math_types.h b/lib/Grid_math_types.h deleted file mode 100644 index 1042a95b..00000000 --- a/lib/Grid_math_types.h +++ /dev/null @@ -1,1662 +0,0 @@ -#ifndef GRID_MATH_TYPES_H -#define GRID_MATH_TYPES_H - -#include - -#include - -// -// Indexing; want to be able to dereference and -// obtain either an lvalue or an rvalue. -// -namespace Grid { - - // First some of my own traits - template struct isGridTensor { - static const bool value = true; - static const bool notvalue = false; - }; - - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - - // Match the index - template struct matchGridTensorIndex { - static const bool value = (Level==T::TensorLevel); - static const bool notvalue = (Level!=T::TensorLevel); - }; - // What is the vtype - template struct isComplex { - static const bool value = false; - }; - template<> struct isComplex { - static const bool value = true; - }; - template<> struct isComplex { - static const bool value = true; - }; - - -/////////////////////////////////////////////////// -// Scalar, Vector, Matrix objects. -// These can be composed to form tensor products of internal indices. -/////////////////////////////////////////////////// - - - -template class iScalar -{ -public: - vtype _internal; - - typedef typename GridTypeMapper::scalar_type scalar_type; - typedef typename GridTypeMapper::vector_type vector_type; - typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; - typedef iScalar tensor_reduced; - - enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; - - // Scalar no action - // template using tensor_reduce_level = typename iScalar::tensor_reduce_level >; - - iScalar(){}; - - iScalar(scalar_type s) : _internal(s) {};// recurse down and hit the constructor for vector_type - - iScalar(Zero &z){ *this = zero; }; - - iScalar & operator= (const Zero &hero){ - zeroit(*this); - return *this; - } - friend void zeroit(iScalar &that){ - zeroit(that._internal); - } - friend void permute(iScalar &out,const iScalar &in,int permutetype){ - permute(out._internal,in._internal,permutetype); - } - friend void extract(const iScalar &in,std::vector &out){ - extract(in._internal,out); // extract advances the pointers in out - } - friend void merge(iScalar &in,std::vector &out){ - merge(in._internal,out); // extract advances the pointers in out - } - - // Unary negation - friend inline iScalar operator -(const iScalar &r) { - iScalar ret; - ret._internal= -r._internal; - return ret; - } - // *=,+=,-= operators inherit from corresponding "*,-,+" behaviour - inline iScalar &operator *=(const iScalar &r) { - *this = (*this)*r; - return *this; - } - inline iScalar &operator -=(const iScalar &r) { - *this = (*this)-r; - return *this; - } - inline iScalar &operator +=(const iScalar &r) { - *this = (*this)+r; - return *this; - } - - inline vtype & operator ()(void) { - return _internal; - } - - operator ComplexD () const { return(TensorRemove(_internal)); }; - operator RealD () const { return(real(TensorRemove(_internal))); } - -}; -/////////////////////////////////////////////////////////// -// Allows to turn scalar>>> back to double. -/////////////////////////////////////////////////////////// -template inline typename std::enable_if::notvalue, T>::type TensorRemove(T arg) { return arg;} -template inline auto TensorRemove(iScalar arg) -> decltype(TensorRemove(arg._internal)) -{ - return TensorRemove(arg._internal); -} - -template class iVector -{ -public: - vtype _internal[N]; - - typedef typename GridTypeMapper::scalar_type scalar_type; - typedef typename GridTypeMapper::vector_type vector_type; - typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; - - enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; - typedef iScalar tensor_reduced; - - iVector(Zero &z){ *this = zero; }; - iVector() {};// Empty constructure - - iVector & operator= (Zero &hero){ - zeroit(*this); - return *this; - } - friend void zeroit(iVector &that){ - for(int i=0;i &out,const iVector &in,int permutetype){ - for(int i=0;i &in,std::vector &out){ - for(int i=0;i &in,std::vector &out){ - for(int i=0;i operator -(const iVector &r) { - iVector ret; - for(int i=0;i &operator *=(const iScalar &r) { - *this = (*this)*r; - return *this; - } - inline iVector &operator -=(const iVector &r) { - *this = (*this)-r; - return *this; - } - inline iVector &operator +=(const iVector &r) { - *this = (*this)+r; - return *this; - } - inline vtype & operator ()(int i) { - return _internal[i]; - } -}; - -template class iMatrix -{ -public: - vtype _internal[N][N]; - - typedef typename GridTypeMapper::scalar_type scalar_type; - typedef typename GridTypeMapper::vector_type vector_type; - - typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; - - enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; - typedef iScalar tensor_reduced; - - iMatrix(Zero &z){ *this = zero; }; - iMatrix() {}; - iMatrix & operator= (Zero &hero){ - zeroit(*this); - return *this; - } - friend void zeroit(iMatrix &that){ - for(int i=0;i &out,const iMatrix &in,int permutetype){ - for(int i=0;i &in,std::vector &out){ - for(int i=0;i &in,std::vector &out){ - for(int i=0;i operator -(const iMatrix &r) { - iMatrix ret; - for(int i=0;i - inline iMatrix &operator *=(const T &r) { - *this = (*this)*r; - return *this; - } - template - inline iMatrix &operator -=(const T &r) { - *this = (*this)-r; - return *this; - } - template - inline iMatrix &operator +=(const T &r) { - *this = (*this)+r; - return *this; - } - inline vtype & operator ()(int i,int j) { - return _internal[i][j]; - } - -}; - - - /////////////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////// ADD /////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////////////// - - -// ADD is simple for now; cannot mix types and straightforward template -// Scalar +/- Scalar -// Vector +/- Vector -// Matrix +/- Matrix -template inline void add(iScalar * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iScalar * __restrict__ rhs) -{ - add(&ret->_internal,&lhs->_internal,&rhs->_internal); -} -template inline void add(iVector * __restrict__ ret, - const iVector * __restrict__ lhs, - const iVector * __restrict__ rhs) -{ - for(int c=0;c_internal[c]=lhs->_internal[c]+rhs->_internal[c]; - } - return; -} -template inline void add(iMatrix * __restrict__ ret, - const iMatrix * __restrict__ lhs, - const iMatrix * __restrict__ rhs) -{ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal[c1][c2]); - }} - return; -} -template inline void add(iMatrix * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iMatrix * __restrict__ rhs) -{ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); - }} - return; -} -template inline void add(iMatrix * __restrict__ ret, - const iMatrix * __restrict__ lhs, - const iScalar * __restrict__ rhs) -{ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); - else - ret->_internal[c1][c2]=lhs->_internal[c1][c2]; - }} - return; -} -// Need to figure multi-precision. -template Mytype timesI(Mytype &r) -{ - iScalar i; - i._internal = Complex(0,1); - return r*i; -} - - // + operator for scalar, vector, matrix -template -//inline auto operator + (iScalar& lhs,iScalar&& rhs) -> iScalar -inline auto operator + (const iScalar& lhs,const iScalar& rhs) -> iScalar -{ - typedef iScalar ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator + (const iVector& lhs,const iVector& rhs) ->iVector -{ - typedef iVector ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator + (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator + (const iScalar& lhs,const iMatrix& rhs)->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator + (const iMatrix& lhs,const iScalar& rhs)->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; -} - - - /////////////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////// SUB /////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////////////// - - -// SUB is simple for now; cannot mix types and straightforward template -// Scalar +/- Scalar -// Vector +/- Vector -// Matrix +/- Matrix -// Matrix /- scalar -template inline void sub(iScalar * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iScalar * __restrict__ rhs) -{ - sub(&ret->_internal,&lhs->_internal,&rhs->_internal); -} - -template inline void sub(iVector * __restrict__ ret, - const iVector * __restrict__ lhs, - const iVector * __restrict__ rhs) -{ - for(int c=0;c_internal[c]=lhs->_internal[c]-rhs->_internal[c]; - } - return; -} -template inline void sub(iMatrix * __restrict__ ret, - const iMatrix * __restrict__ lhs, - const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal[c1][c2]); - }} - return; -} -template inline void sub(iMatrix * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); - } else { - // Fails -- need unary minus. Catalogue other unops? - ret->_internal[c1][c2]=zero; - ret->_internal[c1][c2]=ret->_internal[c1][c2]-rhs->_internal[c1][c2]; - - } - }} - return; -} -template inline void sub(iMatrix * __restrict__ ret, - const iMatrix * __restrict__ lhs, - const iScalar * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); - else - ret->_internal[c1][c2]=lhs->_internal[c1][c2]; - }} - return; -} - -template void vprefetch(const iScalar &vv) -{ - vprefetch(vv._internal); -} -template void vprefetch(const iVector &vv) -{ - for(int i=0;i void vprefetch(const iMatrix &vv) -{ - for(int i=0;i inline auto -operator - (const iScalar& lhs, const iScalar& rhs) -> iScalar -{ - typedef iScalar ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator - (const iVector& lhs,const iVector& rhs) ->iVector -{ - typedef iVector ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator - (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator - (const iScalar& lhs,const iMatrix& rhs)->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator - (const iMatrix& lhs,const iScalar& rhs)->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////// MAC /////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////// - - /////////////////////////// - // Legal multiplication table - /////////////////////////// - // scal x scal = scal - // mat x mat = mat - // mat x scal = mat - // scal x mat = mat - // mat x vec = vec - // vec x scal = vec - // scal x vec = vec - /////////////////////////// -template -inline void mac(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs) -{ - mac(&ret->_internal,&lhs->_internal,&rhs->_internal); -} -template -inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); - }}} - return; -} -template -inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ - for(int c1=0;c1_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); - }} - return; -} -template -inline void mac(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ - for(int c1=0;c1_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); - }} - return; -} -template -inline void mac(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) -{ - for(int c1=0;c1_internal[c1],&lhs->_internal[c1][c2],&rhs->_internal[c2]); - }} - return; -} -template -inline void mac(iVector * __restrict__ ret,const iScalar * __restrict__ lhs,const iVector * __restrict__ rhs) -{ - for(int c1=0;c1_internal[c1],&lhs->_internal,&rhs->_internal[c1]); - } - return; -} -template -inline void mac(iVector * __restrict__ ret,const iVector * __restrict__ lhs,const iScalar * __restrict__ rhs) -{ - for(int c1=0;c1_internal[c1],&lhs->_internal[c1],&rhs->_internal); - } - return; -} - - /////////////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////// MUL /////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////////////// - - -template -inline void mult(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs){ - mult(&ret->_internal,&lhs->_internal,&rhs->_internal); -} - -template -inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][0],&rhs->_internal[0][c2]); - for(int c3=1;c3_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); - } - }} - return; -} -template -inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); - }} - return; -} - -template -inline void mult(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); - }} - return; -} -// Matrix left multiplies vector -template -inline void mult(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) -{ - for(int c1=0;c1_internal[c1],&lhs->_internal[c1][0],&rhs->_internal[0]); - for(int c2=1;c2_internal[c1],&lhs->_internal[c1][c2],&rhs->_internal[c2]); - } - } - return; -} -template -inline void mult(iVector * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iVector * __restrict__ rhs){ - for(int c1=0;c1_internal[c1],&lhs->_internal,&rhs->_internal[c1]); - } -} -template -inline void mult(iVector * __restrict__ ret, - const iVector * __restrict__ rhs, - const iScalar * __restrict__ lhs){ - mult(ret,lhs,rhs); -} - - - -template inline -iVector operator * (const iMatrix& lhs,const iVector& rhs) -{ - iVector ret; - mult(&ret,&lhs,&rhs); - return ret; -} - -template inline -iVector operator * (const iScalar& lhs,const iVector& rhs) -{ - iVector ret; - mult(&ret,&lhs,&rhs); - return ret; -} - -template inline -iVector operator * (const iVector& lhs,const iScalar& rhs) -{ - iVector ret; - mult(&ret,&lhs,&rhs); - return ret; -} - - ////////////////////////////////////////////////////////////////// - // Glue operators to mult routines. Must resolve return type cleverly from typeof(internal) - // since nesting matrix x matrix-> matrix - // while matrix x matrix-> matrix - // so return type depends on argument types in nasty way. - ////////////////////////////////////////////////////////////////// - // scal x scal = scal - // mat x mat = mat - // mat x scal = mat - // scal x mat = mat - // mat x vec = vec - // vec x scal = vec - // scal x vec = vec - // - // We can special case scalar_type ?? -template -inline auto operator * (const iScalar& lhs,const iScalar& rhs) -> iScalar -{ - typedef iScalar ret_t; - ret_t ret; - mult(&ret,&lhs,&rhs); - return ret; -} -template inline -auto operator * (const iMatrix& lhs,const iMatrix& rhs) -> iMatrix -{ - typedef decltype(lhs._internal[0][0]*rhs._internal[0][0]) ret_t; - iMatrix ret; - mult(&ret,&lhs,&rhs); - return ret; -} -template inline -auto operator * (const iMatrix& lhs,const iScalar& rhs) -> iMatrix -{ - typedef decltype(lhs._internal[0][0]*rhs._internal) ret_t; - - iMatrix ret; - for(int c1=0;c1 inline -auto operator * (const iScalar& lhs,const iMatrix& rhs) -> iMatrix -{ - typedef decltype(lhs._internal*rhs._internal[0][0]) ret_t; - iMatrix ret; - for(int c1=0;c1 inline -auto operator * (const iMatrix& lhs,const iVector& rhs) -> iVector -{ - typedef decltype(lhs._internal[0][0]*rhs._internal[0]) ret_t; - iVector ret; - for(int c1=0;c1 inline -auto operator * (const iScalar& lhs,const iVector& rhs) -> iVector -{ - typedef decltype(lhs._internal*rhs._internal[0]) ret_t; - iVector ret; - for(int c1=0;c1 inline -auto operator * (const iVector& lhs,const iScalar& rhs) -> iVector -{ - typedef decltype(lhs._internal[0]*rhs._internal) ret_t; - iVector ret; - for(int c1=0;c1 inline iScalar operator * (const iScalar& lhs,const typename iScalar::scalar_type rhs) -{ - typename iScalar::tensor_reduced srhs(rhs); - return lhs*srhs; -} -template inline iScalar operator * (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs*lhs; } - -template inline iVector operator * (const iVector& lhs,const typename iScalar::scalar_type rhs) -{ - typename iVector::tensor_reduced srhs(rhs); - return lhs*srhs; -} -template inline iVector operator * (const typename iScalar::scalar_type lhs,const iVector& rhs) { return rhs*lhs; } - -template inline iMatrix operator * (const iMatrix& lhs,const typename iScalar::scalar_type &rhs) -{ - typename iMatrix::tensor_reduced srhs(rhs); - return lhs*srhs; -} -template inline iMatrix operator * (const typename iScalar::scalar_type & lhs,const iMatrix& rhs) { return rhs*lhs; } - -//////////////////////////////////////////////////////////////////// -// Double support; cast to "scalar_type" through constructor -//////////////////////////////////////////////////////////////////// -template inline iScalar operator * (const iScalar& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iScalar operator * (double lhs,const iScalar& rhs) { return rhs*lhs; } - -template inline iVector operator * (const iVector& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iVector operator * (double lhs,const iVector& rhs) { return rhs*lhs; } - -template inline iMatrix operator * (const iMatrix& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iMatrix operator * (double lhs,const iMatrix& rhs) { return rhs*lhs; } - -//////////////////////////////////////////////////////////////////// -// Complex support; cast to "scalar_type" through constructor -//////////////////////////////////////////////////////////////////// -template inline iScalar operator * (const iScalar& lhs,ComplexD rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iScalar operator * (ComplexD lhs,const iScalar& rhs) { return rhs*lhs; } - -template inline iVector operator * (const iVector& lhs,ComplexD rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iVector operator * (ComplexD lhs,const iVector& rhs) { return rhs*lhs; } - -template inline iMatrix operator * (const iMatrix& lhs,ComplexD rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iMatrix operator * (ComplexD lhs,const iMatrix& rhs) { return rhs*lhs; } - -//////////////////////////////////////////////////////////////////// -// Integer support; cast to "scalar_type" through constructor -//////////////////////////////////////////////////////////////////// -template inline iScalar operator * (const iScalar& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iScalar operator * (Integer lhs,const iScalar& rhs) { return rhs*lhs; } - -template inline iVector operator * (const iVector& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iVector operator * (Integer lhs,const iVector& rhs) { return rhs*lhs; } - -template inline iMatrix operator * (const iMatrix& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iMatrix operator * (Integer lhs,const iMatrix& rhs) { return rhs*lhs; } - - - -/////////////////////////////////////////////////////////////////////////////////////////////// -// addition by fundamental scalar type applies to matrix(down diag) and scalar -/////////////////////////////////////////////////////////////////////////////////////////////// -template inline iScalar operator + (const iScalar& lhs,const typename iScalar::scalar_type rhs) -{ - typename iScalar::tensor_reduced srhs(rhs); - return lhs+srhs; -} -template inline iScalar operator + (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs+lhs; } - -template inline iMatrix operator + (const iMatrix& lhs,const typename iScalar::scalar_type rhs) -{ - typename iMatrix::tensor_reduced srhs(rhs); - return lhs+srhs; -} -template inline iMatrix operator + (const typename iScalar::scalar_type lhs,const iMatrix& rhs) { return rhs+lhs; } - -//////////////////////////////////////////////////////////////////// -// Double support; cast to "scalar_type" through constructor -//////////////////////////////////////////////////////////////////// -template inline iScalar operator + (const iScalar& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs+srhs; -} -template inline iScalar operator + (double lhs,const iScalar& rhs) { return rhs+lhs; } - -template inline iMatrix operator + (const iMatrix& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs+srhs; -} -template inline iMatrix operator + (double lhs,const iMatrix& rhs) { return rhs+lhs; } - -//////////////////////////////////////////////////////////////////// -// Integer support; cast to "scalar_type" through constructor -//////////////////////////////////////////////////////////////////// -template inline iScalar operator + (const iScalar& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs+srhs; -} -template inline iScalar operator + (Integer lhs,const iScalar& rhs) { return rhs+lhs; } - -template inline iMatrix operator + (const iMatrix& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs+srhs; -} -template inline iMatrix operator + (Integer lhs,const iMatrix& rhs) { return rhs+lhs; } - - -/////////////////////////////////////////////////////////////////////////////////////////////// -// subtraction of fundamental scalar type applies to matrix(down diag) and scalar -/////////////////////////////////////////////////////////////////////////////////////////////// -template inline iScalar operator - (const iScalar& lhs,const typename iScalar::scalar_type rhs) -{ - typename iScalar::tensor_reduced srhs(rhs); - return lhs-srhs; -} -template inline iScalar operator - (const typename iScalar::scalar_type lhs,const iScalar& rhs) -{ - typename iScalar::tensor_reduced slhs(lhs); - return slhs-rhs; -} - -template inline iMatrix operator - (const iMatrix& lhs,const typename iScalar::scalar_type rhs) -{ - typename iScalar::tensor_reduced srhs(rhs); - return lhs-srhs; -} -template inline iMatrix operator - (const typename iScalar::scalar_type lhs,const iMatrix& rhs) -{ - typename iScalar::tensor_reduced slhs(lhs); - return slhs-rhs; -} - -//////////////////////////////////////////////////////////////////// -// Double support; cast to "scalar_type" through constructor -//////////////////////////////////////////////////////////////////// -template inline iScalar operator - (const iScalar& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs-srhs; -} -template inline iScalar operator - (double lhs,const iScalar& rhs) -{ - typename iScalar::scalar_type t(lhs); - typename iScalar::tensor_reduced slhs(t); - return slhs-rhs; -} - -template inline iMatrix operator - (const iMatrix& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs-srhs; -} -template inline iMatrix operator - (double lhs,const iMatrix& rhs) -{ - typename iScalar::scalar_type t(lhs); - typename iScalar::tensor_reduced slhs(t); - return slhs-rhs; -} - -//////////////////////////////////////////////////////////////////// -// Integer support; cast to "scalar_type" through constructor -//////////////////////////////////////////////////////////////////// -template inline iScalar operator - (const iScalar& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs-srhs; -} -template inline iScalar operator - (Integer lhs,const iScalar& rhs) -{ - typename iScalar::scalar_type t(lhs); - typename iScalar::tensor_reduced slhs(t); - return slhs-rhs; -} -template inline iMatrix operator - (const iMatrix& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs-srhs; -} -template inline iMatrix operator - (Integer lhs,const iMatrix& rhs) -{ - typename iScalar::scalar_type t(lhs); - typename iScalar::tensor_reduced slhs(t); - return slhs-rhs; -} - - - - - /////////////////////////////////////////////////////////////////////////////////////// - // innerProduct Scalar x Scalar -> Scalar - // innerProduct Vector x Vector -> Scalar - // innerProduct Matrix x Matrix -> Scalar - /////////////////////////////////////////////////////////////////////////////////////// - template inline - auto innerProduct (const iVector& lhs,const iVector& rhs) -> iScalar - { - typedef decltype(innerProduct(lhs._internal[0],rhs._internal[0])) ret_t; - iScalar ret=zero; - for(int c1=0;c1 inline - auto innerProduct (const iMatrix& lhs,const iMatrix& rhs) -> iScalar - { - typedef decltype(innerProduct(lhs._internal[0][0],rhs._internal[0][0])) ret_t; - iScalar ret=zero; - iScalar tmp; - for(int c1=0;c1 inline - auto innerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar - { - typedef decltype(innerProduct(lhs._internal,rhs._internal)) ret_t; - iScalar ret; - ret._internal = innerProduct(lhs._internal,rhs._internal); - return ret; - } - - /////////////////////////////////////////////////////////////////////////////////////// - // outerProduct Scalar x Scalar -> Scalar - // Vector x Vector -> Matrix - /////////////////////////////////////////////////////////////////////////////////////// - -template inline -auto outerProduct (const iVector& lhs,const iVector& rhs) -> iMatrix -{ - typedef decltype(outerProduct(lhs._internal[0],rhs._internal[0])) ret_t; - iMatrix ret; - for(int c1=0;c1 inline -auto outerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar -{ - typedef decltype(outerProduct(lhs._internal,rhs._internal)) ret_t; - iScalar ret; - ret._internal = outerProduct(lhs._internal,rhs._internal); - return ret; -} - -inline ComplexF outerProduct(const ComplexF &l, const ComplexF& r) -{ - return l*r; -} -inline ComplexD outerProduct(const ComplexD &l, const ComplexD& r) -{ - return l*r; -} -inline RealF outerProduct(const RealF &l, const RealF& r) -{ - return l*r; -} -inline RealD outerProduct(const RealD &l, const RealD& r) -{ - return l*r; -} - /////////////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////// CONJ /////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////////////// - -// Conj function for scalar, vector, matrix -template inline iScalar conj(const iScalar&r) -{ - iScalar ret; - ret._internal = conj(r._internal); - return ret; -} -template inline iVector conj(const iVector&r) -{ - iVector ret; - for(int i=0;i inline iMatrix conj(const iMatrix&r) -{ - iMatrix ret; - for(int i=0;i inline iScalar adj(const iScalar&r) -{ - iScalar ret; - ret._internal = adj(r._internal); - return ret; -} -template inline iVector adj(const iVector&r) -{ - iVector ret; - for(int i=0;i inline iMatrix adj(const iMatrix &arg) -{ - iMatrix ret; - for(int c1=0;c1 - inline typename std::enable_if::value, iMatrix >::type - transpose(iMatrix arg) - { - iMatrix ret; - for(int i=0;i - inline typename std::enable_if::notvalue, iMatrix >::type - transpose(iMatrix arg) - { - iMatrix ret; - for(int i=0;i - inline typename std::enable_if::value, iScalar >::type - transpose(iScalar arg) - { - iScalar ret; - ret._internal = transpose(arg._internal); // NB recurses - return ret; - } - -template - inline typename std::enable_if::notvalue, iScalar >::type - transpose(iScalar arg) - { - iScalar ret; - ret._internal = arg._internal; // NB recursion stops - return ret; - } - - -//////////////////////////////////////////////////////////////////////////////////////////// -// Transpose a specific index; instructive to compare this style of recursion termination -// to that of adj; which is easiers? -//////////////////////////////////////////////////////////////////////////////////////////// -template inline - typename std::enable_if,Level>::value, iMatrix >::type -transposeIndex (const iMatrix &arg) -{ - iMatrix ret; - for(int i=0;i inline -typename std::enable_if,Level>::notvalue, iMatrix >::type -transposeIndex (const iMatrix &arg) -{ - iMatrix ret; - for(int i=0;i(arg._internal[i][j]); - }} - return ret; -} -template inline -typename std::enable_if,Level>::notvalue, iScalar >::type -transposeIndex (const iScalar &arg) -{ - iScalar ret; - ret._internal=transposeIndex(arg._internal); - return ret; -} -template inline -typename std::enable_if,Level>::value, iScalar >::type -transposeIndex (const iScalar &arg) -{ - return arg; -} - -////////////////////////////////////////////////////////////////// -// Traces: both all indices and a specific index -///////////////////////////////////////////////////////////////// - -inline ComplexF trace( const ComplexF &arg){ return arg;} -inline ComplexD trace( const ComplexD &arg){ return arg;} -inline RealF trace( const RealF &arg){ return arg;} -inline RealD trace( const RealD &arg){ return arg;} - -template inline ComplexF traceIndex(const ComplexF arg) { return arg;} -template inline ComplexD traceIndex(const ComplexD arg) { return arg;} -template inline RealF traceIndex(const RealF arg) { return arg;} -template inline RealD traceIndex(const RealD arg) { return arg;} - -template -inline auto trace(const iMatrix &arg) -> iScalar -{ - iScalar ret; - zeroit(ret._internal); - for(int i=0;i -inline auto trace(const iScalar &arg) -> iScalar -{ - iScalar ret; - ret._internal=trace(arg._internal); - return ret; -} -//////////////////////////////////////////////////////////////////////////////////////////////////////// -// Trace Specific indices. -//////////////////////////////////////////////////////////////////////////////////////////////////////// -/* -template inline -auto traceIndex(const iScalar &arg) -> iScalar(arg._internal)) > -{ - iScalar(arg._internal))> ret; - ret._internal = traceIndex(arg._internal); - return ret; -} -*/ -template inline auto -traceIndex (const iScalar &arg) -> -typename -std::enable_if,Level>::notvalue, - iScalar(arg._internal))> >::type - -{ - iScalar(arg._internal))> ret; - ret._internal=traceIndex(arg._internal); - return ret; -} -template inline auto -traceIndex (const iScalar &arg) -> -typename std::enable_if,Level>::value, - iScalar >::type -{ - return arg; -} - -// If we hit the right index, return scalar and trace it with no further recursion -template inline -auto traceIndex(const iMatrix &arg) -> - typename std::enable_if,Level>::value, // Index matches - iScalar >::type // return scalar -{ - iScalar ret; - zeroit(ret._internal); - for(int i=0;i inline -auto traceIndex(const iMatrix &arg) -> - typename std::enable_if,Level>::notvalue,// No index match - iMatrix(arg._internal[0][0])),N> >::type // return matrix -{ - iMatrix(arg._internal[0][0])),N> ret; - for(int i=0;i(arg._internal[i][j]); - }} - return ret; -} - -////////////////////////////////////////////////////////////////////////////// -// Peek on a specific index; returns a scalar in that index, tensor inherits rest -////////////////////////////////////////////////////////////////////////////// -// If we hit the right index, return scalar with no further recursion - -//template inline ComplexF peekIndex(const ComplexF arg) { return arg;} -//template inline ComplexD peekIndex(const ComplexD arg) { return arg;} -//template inline RealF peekIndex(const RealF arg) { return arg;} -//template inline RealD peekIndex(const RealD arg) { return arg;} - -// Scalar peek, no indices -template inline - auto peekIndex(const iScalar &arg) -> - typename std::enable_if,Level>::value, // Index matches - iScalar >::type // return scalar -{ - return arg; -} -// Vector peek, one index -template inline - auto peekIndex(const iVector &arg,int i) -> - typename std::enable_if,Level>::value, // Index matches - iScalar >::type // return scalar -{ - iScalar ret; // return scalar - ret._internal = arg._internal[i]; - return ret; -} -// Matrix peek, two indices -template inline - auto peekIndex(const iMatrix &arg,int i,int j) -> - typename std::enable_if,Level>::value, // Index matches - iScalar >::type // return scalar -{ - iScalar ret; // return scalar - ret._internal = arg._internal[i][j]; - return ret; -} - -///////////// -// No match peek for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue -///////////// -// scalar -template inline - auto peekIndex(const iScalar &arg) -> // Scalar 0 index - typename std::enable_if,Level>::notvalue, // Index does NOT match - iScalar(arg._internal))> >::type -{ - iScalar(arg._internal))> ret; - ret._internal= peekIndex(arg._internal); - return ret; -} -template inline - auto peekIndex(const iScalar &arg,int i) -> // Scalar 1 index - typename std::enable_if,Level>::notvalue, // Index does NOT match - iScalar(arg._internal,i))> >::type -{ - iScalar(arg._internal,i))> ret; - ret._internal=peekIndex(arg._internal,i); - return ret; -} -template inline - auto peekIndex(const iScalar &arg,int i,int j) -> // Scalar, 2 index - typename std::enable_if,Level>::notvalue, // Index does NOT match - iScalar(arg._internal,i,j))> >::type -{ - iScalar(arg._internal,i,j))> ret; - ret._internal=peekIndex(arg._internal,i,j); - return ret; -} -// vector -template inline -auto peekIndex(const iVector &arg) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iVector(arg._internal[0])),N> >::type -{ - iVector(arg._internal[0])),N> ret; - for(int ii=0;ii(arg._internal[ii]); - } - return ret; -} -template inline - auto peekIndex(const iVector &arg,int i) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iVector(arg._internal[0],i)),N> >::type -{ - iVector(arg._internal[0],i)),N> ret; - for(int ii=0;ii(arg._internal[ii],i); - } - return ret; -} -template inline - auto peekIndex(const iVector &arg,int i,int j) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iVector(arg._internal[0],i,j)),N> >::type -{ - iVector(arg._internal[0],i,j)),N> ret; - for(int ii=0;ii(arg._internal[ii],i,j); - } - return ret; -} -// matrix -template inline -auto peekIndex(const iMatrix &arg) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iMatrix(arg._internal[0][0])),N> >::type -{ - iMatrix(arg._internal[0][0])),N> ret; - for(int ii=0;ii(arg._internal[ii][jj]);// Could avoid this because peeking a scalar is dumb - }} - return ret; -} -template inline - auto peekIndex(const iMatrix &arg,int i) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iMatrix(arg._internal[0],i)),N> >::type -{ - iMatrix(arg._internal[0],i)),N> ret; - for(int ii=0;ii(arg._internal[ii][jj],i); - }} - return ret; -} -template inline - auto peekIndex(const iMatrix &arg,int i,int j) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iMatrix(arg._internal[0][0],i,j)),N> >::type -{ - iMatrix(arg._internal[0][0],i,j)),N> ret; - for(int ii=0;ii(arg._internal[ii][jj],i,j); - }} - return ret; -} - - -////////////////////////////////////////////////////////////////////////////// -// Poke a specific index; -////////////////////////////////////////////////////////////////////////////// - -// Scalar poke -template inline - void pokeIndex(iScalar &ret, - const typename std::enable_if,Level>::value,iScalar >::type &arg) -{ - ret._internal = arg._internal; -} -// Vector poke, one index -template inline - void pokeIndex(iVector &ret, - const typename std::enable_if,Level>::value,iScalar >::type &arg,int i) -{ - ret._internal[i] = arg._internal; -} -// Vector poke, two indices -template inline - void pokeIndex(iMatrix &ret, - const typename std::enable_if,Level>::value,iScalar >::type &arg,int i,int j) -{ - ret._internal[i][j] = arg._internal; -} - -///////////// -// No match poke for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue -///////////// -// scalar -template inline - void pokeIndex(iScalar &ret, - const typename std::enable_if,Level>::notvalue,iScalar(ret._internal))> >::type &arg) - -{ - pokeIndex(ret._internal,arg._internal); -} -template inline - void pokeIndex(iScalar &ret, - const typename std::enable_if,Level>::notvalue,iScalar(ret._internal,0))> >::type &arg, - int i) - -{ - pokeIndex(ret._internal,arg._internal,i); -} -template inline - void pokeIndex(iScalar &ret, - const typename std::enable_if,Level>::notvalue,iScalar(ret._internal,0,0))> >::type &arg, - int i,int j) - -{ - pokeIndex(ret._internal,arg._internal,i,j); -} - -// Vector -template inline - void pokeIndex(iVector &ret, - const typename std::enable_if,Level>::notvalue,iVector(ret._internal)),N> >::type &arg) - -{ - for(int ii=0;ii(ret._internal[ii],arg._internal[ii]); - } -} -template inline - void pokeIndex(iVector &ret, - const typename std::enable_if,Level>::notvalue,iVector(ret._internal,0)),N> >::type &arg, - int i) - -{ - for(int ii=0;ii(ret._internal[ii],arg._internal[ii],i); - } -} -template inline - void pokeIndex(iVector &ret, - const typename std::enable_if,Level>::notvalue,iVector(ret._internal,0,0)),N> >::type &arg, - int i,int j) - -{ - for(int ii=0;ii(ret._internal[ii],arg._internal[ii],i,j); - } -} - -// Matrix -template inline - void pokeIndex(iMatrix &ret, - const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal)),N> >::type &arg) - -{ - for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj]); - }} -} -template inline - void pokeIndex(iMatrix &ret, - const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal,0)),N> >::type &arg, - int i) - -{ - for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj],i); - }} -} -template inline - void pokeIndex(iMatrix &ret, - const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal,0,0)),N> >::type &arg, - int i,int j) - -{ - for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj],i,j); - }} -} - -///////////////////////////////////////////////////////////////// -// Can only take the real/imag part of scalar objects, since -// lattice objects of different complex nature are non-conformable. -///////////////////////////////////////////////////////////////// -template inline auto real(const iScalar &z) -> iScalar -{ - iScalar ret; - ret._internal = real(z._internal); - return ret; -} -template inline auto real(const iMatrix &z) -> iMatrix -{ - iMatrix ret; - for(int c1=0;c1 inline auto real(const iVector &z) -> iVector -{ - iVector ret; - for(int c1=0;c1 inline auto imag(const iScalar &z) -> iScalar -{ - iScalar ret; - ret._internal = imag(z._internal); - return ret; -} -template inline auto imag(const iMatrix &z) -> iMatrix -{ - iMatrix ret; - for(int c1=0;c1 inline auto imag(const iVector &z) -> iVector -{ - iVector ret; - for(int c1=0;c1 Date: Sat, 18 Apr 2015 18:37:56 +0100 Subject: [PATCH 072/429] Cleanup --- lib/Grid_math_types_mapper.h | 100 ----------------------------------- 1 file changed, 100 deletions(-) delete mode 100644 lib/Grid_math_types_mapper.h diff --git a/lib/Grid_math_types_mapper.h b/lib/Grid_math_types_mapper.h deleted file mode 100644 index 7f6d85f5..00000000 --- a/lib/Grid_math_types_mapper.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef GRID_MATH_TYPE_MAPPER_H -#define GRID_MATH_TYPE_MAPPER_H - -namespace Grid { - - -////////////////////////////////////////////////////////////////////////////////// -// Want to recurse: GridTypeMapper >::scalar_type == ComplexD. -// Use of a helper class like this allows us to template specialise and "dress" -// other classes such as RealD == double, ComplexD == std::complex with these -// traits. -// -// It is possible that we could do this more elegantly if I introduced a -// queryable trait in iScalar, iMatrix and iVector and used the query on vtype in -// place of the type mapper? -// -// Not sure how to do this, but probably could be done with a research effort -// to study C++11's type_traits.h file. (std::enable_if >) -// -////////////////////////////////////////////////////////////////////////////////// - - template class GridTypeMapper { - public: - typedef typename T::scalar_type scalar_type; - typedef typename T::vector_type vector_type; - typedef typename T::tensor_reduced tensor_reduced; - enum { TensorLevel = T::TensorLevel }; - }; - -////////////////////////////////////////////////////////////////////////////////// -// Recursion stops with these template specialisations -////////////////////////////////////////////////////////////////////////////////// - template<> class GridTypeMapper { - public: - typedef RealF scalar_type; - typedef RealF vector_type; - typedef RealF tensor_reduced ; - enum { TensorLevel = 0 }; - }; - template<> class GridTypeMapper { - public: - typedef RealD scalar_type; - typedef RealD vector_type; - typedef RealD tensor_reduced; - enum { TensorLevel = 0 }; - }; - template<> class GridTypeMapper { - public: - typedef ComplexF scalar_type; - typedef ComplexF vector_type; - typedef ComplexF tensor_reduced; - enum { TensorLevel = 0 }; - }; - template<> class GridTypeMapper { - public: - typedef ComplexD scalar_type; - typedef ComplexD vector_type; - typedef ComplexD tensor_reduced; - enum { TensorLevel = 0 }; - }; - - template<> class GridTypeMapper { - public: - typedef RealF scalar_type; - typedef vRealF vector_type; - typedef vRealF tensor_reduced; - enum { TensorLevel = 0 }; - }; - template<> class GridTypeMapper { - public: - typedef RealD scalar_type; - typedef vRealD vector_type; - typedef vRealD tensor_reduced; - enum { TensorLevel = 0 }; - }; - template<> class GridTypeMapper { - public: - typedef ComplexF scalar_type; - typedef vComplexF vector_type; - typedef vComplexF tensor_reduced; - enum { TensorLevel = 0 }; - }; - template<> class GridTypeMapper { - public: - typedef ComplexD scalar_type; - typedef vComplexD vector_type; - typedef vComplexD tensor_reduced; - enum { TensorLevel = 0 }; - }; - template<> class GridTypeMapper { - public: - typedef Integer scalar_type; - typedef vInteger vector_type; - typedef vInteger tensor_reduced; - enum { TensorLevel = 0 }; - }; - -} - -#endif From 520af214af0f3ec7a11716c17f22af5aa205a968 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 18:47:43 +0100 Subject: [PATCH 073/429] splitting into smaller, multiple files for readability and easy find. --- lib/Grid_math.h | 647 +------------------------------------- lib/Grid_math_inner.h | 41 +++ lib/Grid_math_outer.h | 47 +++ lib/Grid_math_peek.h | 149 +++++++++ lib/Grid_math_poke.h | 126 ++++++++ lib/Grid_math_reality.h | 115 +++++++ lib/Grid_math_trace.h | 95 ++++++ lib/Grid_math_transpose.h | 101 ++++++ 8 files changed, 681 insertions(+), 640 deletions(-) create mode 100644 lib/Grid_math_inner.h create mode 100644 lib/Grid_math_outer.h create mode 100644 lib/Grid_math_peek.h create mode 100644 lib/Grid_math_poke.h create mode 100644 lib/Grid_math_reality.h create mode 100644 lib/Grid_math_trace.h create mode 100644 lib/Grid_math_transpose.h diff --git a/lib/Grid_math.h b/lib/Grid_math.h index bad20054..b1e04c19 100644 --- a/lib/Grid_math.h +++ b/lib/Grid_math.h @@ -4,646 +4,13 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include -// -// Indexing; want to be able to dereference and -// obtain either an lvalue or an rvalue. -// -namespace Grid { - - - - - /////////////////////////////////////////////////////////////////////////////////////// - // innerProduct Scalar x Scalar -> Scalar - // innerProduct Vector x Vector -> Scalar - // innerProduct Matrix x Matrix -> Scalar - /////////////////////////////////////////////////////////////////////////////////////// - template inline - auto innerProduct (const iVector& lhs,const iVector& rhs) -> iScalar - { - typedef decltype(innerProduct(lhs._internal[0],rhs._internal[0])) ret_t; - iScalar ret=zero; - for(int c1=0;c1 inline - auto innerProduct (const iMatrix& lhs,const iMatrix& rhs) -> iScalar - { - typedef decltype(innerProduct(lhs._internal[0][0],rhs._internal[0][0])) ret_t; - iScalar ret=zero; - iScalar tmp; - for(int c1=0;c1 inline - auto innerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar - { - typedef decltype(innerProduct(lhs._internal,rhs._internal)) ret_t; - iScalar ret; - ret._internal = innerProduct(lhs._internal,rhs._internal); - return ret; - } - - /////////////////////////////////////////////////////////////////////////////////////// - // outerProduct Scalar x Scalar -> Scalar - // Vector x Vector -> Matrix - /////////////////////////////////////////////////////////////////////////////////////// - -template inline -auto outerProduct (const iVector& lhs,const iVector& rhs) -> iMatrix -{ - typedef decltype(outerProduct(lhs._internal[0],rhs._internal[0])) ret_t; - iMatrix ret; - for(int c1=0;c1 inline -auto outerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar -{ - typedef decltype(outerProduct(lhs._internal,rhs._internal)) ret_t; - iScalar ret; - ret._internal = outerProduct(lhs._internal,rhs._internal); - return ret; -} - -inline ComplexF outerProduct(const ComplexF &l, const ComplexF& r) -{ - return l*r; -} -inline ComplexD outerProduct(const ComplexD &l, const ComplexD& r) -{ - return l*r; -} -inline RealF outerProduct(const RealF &l, const RealF& r) -{ - return l*r; -} -inline RealD outerProduct(const RealD &l, const RealD& r) -{ - return l*r; -} - /////////////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////// CONJ /////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////////////// - -// Conj function for scalar, vector, matrix -template inline iScalar conj(const iScalar&r) -{ - iScalar ret; - ret._internal = conj(r._internal); - return ret; -} -template inline iVector conj(const iVector&r) -{ - iVector ret; - for(int i=0;i inline iMatrix conj(const iMatrix&r) -{ - iMatrix ret; - for(int i=0;i inline iScalar adj(const iScalar&r) -{ - iScalar ret; - ret._internal = adj(r._internal); - return ret; -} -template inline iVector adj(const iVector&r) -{ - iVector ret; - for(int i=0;i inline iMatrix adj(const iMatrix &arg) -{ - iMatrix ret; - for(int c1=0;c1 - inline typename std::enable_if::value, iMatrix >::type - transpose(iMatrix arg) - { - iMatrix ret; - for(int i=0;i - inline typename std::enable_if::notvalue, iMatrix >::type - transpose(iMatrix arg) - { - iMatrix ret; - for(int i=0;i - inline typename std::enable_if::value, iScalar >::type - transpose(iScalar arg) - { - iScalar ret; - ret._internal = transpose(arg._internal); // NB recurses - return ret; - } - -template - inline typename std::enable_if::notvalue, iScalar >::type - transpose(iScalar arg) - { - iScalar ret; - ret._internal = arg._internal; // NB recursion stops - return ret; - } - - -//////////////////////////////////////////////////////////////////////////////////////////// -// Transpose a specific index; instructive to compare this style of recursion termination -// to that of adj; which is easiers? -//////////////////////////////////////////////////////////////////////////////////////////// -template inline - typename std::enable_if,Level>::value, iMatrix >::type -transposeIndex (const iMatrix &arg) -{ - iMatrix ret; - for(int i=0;i inline -typename std::enable_if,Level>::notvalue, iMatrix >::type -transposeIndex (const iMatrix &arg) -{ - iMatrix ret; - for(int i=0;i(arg._internal[i][j]); - }} - return ret; -} -template inline -typename std::enable_if,Level>::notvalue, iScalar >::type -transposeIndex (const iScalar &arg) -{ - iScalar ret; - ret._internal=transposeIndex(arg._internal); - return ret; -} -template inline -typename std::enable_if,Level>::value, iScalar >::type -transposeIndex (const iScalar &arg) -{ - return arg; -} - -////////////////////////////////////////////////////////////////// -// Traces: both all indices and a specific index -///////////////////////////////////////////////////////////////// - -inline ComplexF trace( const ComplexF &arg){ return arg;} -inline ComplexD trace( const ComplexD &arg){ return arg;} -inline RealF trace( const RealF &arg){ return arg;} -inline RealD trace( const RealD &arg){ return arg;} - -template inline ComplexF traceIndex(const ComplexF arg) { return arg;} -template inline ComplexD traceIndex(const ComplexD arg) { return arg;} -template inline RealF traceIndex(const RealF arg) { return arg;} -template inline RealD traceIndex(const RealD arg) { return arg;} - -template -inline auto trace(const iMatrix &arg) -> iScalar -{ - iScalar ret; - zeroit(ret._internal); - for(int i=0;i -inline auto trace(const iScalar &arg) -> iScalar -{ - iScalar ret; - ret._internal=trace(arg._internal); - return ret; -} -//////////////////////////////////////////////////////////////////////////////////////////////////////// -// Trace Specific indices. -//////////////////////////////////////////////////////////////////////////////////////////////////////// -/* -template inline -auto traceIndex(const iScalar &arg) -> iScalar(arg._internal)) > -{ - iScalar(arg._internal))> ret; - ret._internal = traceIndex(arg._internal); - return ret; -} -*/ -template inline auto -traceIndex (const iScalar &arg) -> -typename -std::enable_if,Level>::notvalue, - iScalar(arg._internal))> >::type - -{ - iScalar(arg._internal))> ret; - ret._internal=traceIndex(arg._internal); - return ret; -} -template inline auto -traceIndex (const iScalar &arg) -> -typename std::enable_if,Level>::value, - iScalar >::type -{ - return arg; -} - -// If we hit the right index, return scalar and trace it with no further recursion -template inline -auto traceIndex(const iMatrix &arg) -> - typename std::enable_if,Level>::value, // Index matches - iScalar >::type // return scalar -{ - iScalar ret; - zeroit(ret._internal); - for(int i=0;i inline -auto traceIndex(const iMatrix &arg) -> - typename std::enable_if,Level>::notvalue,// No index match - iMatrix(arg._internal[0][0])),N> >::type // return matrix -{ - iMatrix(arg._internal[0][0])),N> ret; - for(int i=0;i(arg._internal[i][j]); - }} - return ret; -} - -////////////////////////////////////////////////////////////////////////////// -// Peek on a specific index; returns a scalar in that index, tensor inherits rest -////////////////////////////////////////////////////////////////////////////// -// If we hit the right index, return scalar with no further recursion - -//template inline ComplexF peekIndex(const ComplexF arg) { return arg;} -//template inline ComplexD peekIndex(const ComplexD arg) { return arg;} -//template inline RealF peekIndex(const RealF arg) { return arg;} -//template inline RealD peekIndex(const RealD arg) { return arg;} - -// Scalar peek, no indices -template inline - auto peekIndex(const iScalar &arg) -> - typename std::enable_if,Level>::value, // Index matches - iScalar >::type // return scalar -{ - return arg; -} -// Vector peek, one index -template inline - auto peekIndex(const iVector &arg,int i) -> - typename std::enable_if,Level>::value, // Index matches - iScalar >::type // return scalar -{ - iScalar ret; // return scalar - ret._internal = arg._internal[i]; - return ret; -} -// Matrix peek, two indices -template inline - auto peekIndex(const iMatrix &arg,int i,int j) -> - typename std::enable_if,Level>::value, // Index matches - iScalar >::type // return scalar -{ - iScalar ret; // return scalar - ret._internal = arg._internal[i][j]; - return ret; -} - -///////////// -// No match peek for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue -///////////// -// scalar -template inline - auto peekIndex(const iScalar &arg) -> // Scalar 0 index - typename std::enable_if,Level>::notvalue, // Index does NOT match - iScalar(arg._internal))> >::type -{ - iScalar(arg._internal))> ret; - ret._internal= peekIndex(arg._internal); - return ret; -} -template inline - auto peekIndex(const iScalar &arg,int i) -> // Scalar 1 index - typename std::enable_if,Level>::notvalue, // Index does NOT match - iScalar(arg._internal,i))> >::type -{ - iScalar(arg._internal,i))> ret; - ret._internal=peekIndex(arg._internal,i); - return ret; -} -template inline - auto peekIndex(const iScalar &arg,int i,int j) -> // Scalar, 2 index - typename std::enable_if,Level>::notvalue, // Index does NOT match - iScalar(arg._internal,i,j))> >::type -{ - iScalar(arg._internal,i,j))> ret; - ret._internal=peekIndex(arg._internal,i,j); - return ret; -} -// vector -template inline -auto peekIndex(const iVector &arg) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iVector(arg._internal[0])),N> >::type -{ - iVector(arg._internal[0])),N> ret; - for(int ii=0;ii(arg._internal[ii]); - } - return ret; -} -template inline - auto peekIndex(const iVector &arg,int i) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iVector(arg._internal[0],i)),N> >::type -{ - iVector(arg._internal[0],i)),N> ret; - for(int ii=0;ii(arg._internal[ii],i); - } - return ret; -} -template inline - auto peekIndex(const iVector &arg,int i,int j) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iVector(arg._internal[0],i,j)),N> >::type -{ - iVector(arg._internal[0],i,j)),N> ret; - for(int ii=0;ii(arg._internal[ii],i,j); - } - return ret; -} -// matrix -template inline -auto peekIndex(const iMatrix &arg) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iMatrix(arg._internal[0][0])),N> >::type -{ - iMatrix(arg._internal[0][0])),N> ret; - for(int ii=0;ii(arg._internal[ii][jj]);// Could avoid this because peeking a scalar is dumb - }} - return ret; -} -template inline - auto peekIndex(const iMatrix &arg,int i) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iMatrix(arg._internal[0],i)),N> >::type -{ - iMatrix(arg._internal[0],i)),N> ret; - for(int ii=0;ii(arg._internal[ii][jj],i); - }} - return ret; -} -template inline - auto peekIndex(const iMatrix &arg,int i,int j) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iMatrix(arg._internal[0][0],i,j)),N> >::type -{ - iMatrix(arg._internal[0][0],i,j)),N> ret; - for(int ii=0;ii(arg._internal[ii][jj],i,j); - }} - return ret; -} - - -////////////////////////////////////////////////////////////////////////////// -// Poke a specific index; -////////////////////////////////////////////////////////////////////////////// - -// Scalar poke -template inline - void pokeIndex(iScalar &ret, - const typename std::enable_if,Level>::value,iScalar >::type &arg) -{ - ret._internal = arg._internal; -} -// Vector poke, one index -template inline - void pokeIndex(iVector &ret, - const typename std::enable_if,Level>::value,iScalar >::type &arg,int i) -{ - ret._internal[i] = arg._internal; -} -// Vector poke, two indices -template inline - void pokeIndex(iMatrix &ret, - const typename std::enable_if,Level>::value,iScalar >::type &arg,int i,int j) -{ - ret._internal[i][j] = arg._internal; -} - -///////////// -// No match poke for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue -///////////// -// scalar -template inline - void pokeIndex(iScalar &ret, - const typename std::enable_if,Level>::notvalue,iScalar(ret._internal))> >::type &arg) - -{ - pokeIndex(ret._internal,arg._internal); -} -template inline - void pokeIndex(iScalar &ret, - const typename std::enable_if,Level>::notvalue,iScalar(ret._internal,0))> >::type &arg, - int i) - -{ - pokeIndex(ret._internal,arg._internal,i); -} -template inline - void pokeIndex(iScalar &ret, - const typename std::enable_if,Level>::notvalue,iScalar(ret._internal,0,0))> >::type &arg, - int i,int j) - -{ - pokeIndex(ret._internal,arg._internal,i,j); -} - -// Vector -template inline - void pokeIndex(iVector &ret, - const typename std::enable_if,Level>::notvalue,iVector(ret._internal)),N> >::type &arg) - -{ - for(int ii=0;ii(ret._internal[ii],arg._internal[ii]); - } -} -template inline - void pokeIndex(iVector &ret, - const typename std::enable_if,Level>::notvalue,iVector(ret._internal,0)),N> >::type &arg, - int i) - -{ - for(int ii=0;ii(ret._internal[ii],arg._internal[ii],i); - } -} -template inline - void pokeIndex(iVector &ret, - const typename std::enable_if,Level>::notvalue,iVector(ret._internal,0,0)),N> >::type &arg, - int i,int j) - -{ - for(int ii=0;ii(ret._internal[ii],arg._internal[ii],i,j); - } -} - -// Matrix -template inline - void pokeIndex(iMatrix &ret, - const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal)),N> >::type &arg) - -{ - for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj]); - }} -} -template inline - void pokeIndex(iMatrix &ret, - const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal,0)),N> >::type &arg, - int i) - -{ - for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj],i); - }} -} -template inline - void pokeIndex(iMatrix &ret, - const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal,0,0)),N> >::type &arg, - int i,int j) - -{ - for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj],i,j); - }} -} - -///////////////////////////////////////////////////////////////// -// Can only take the real/imag part of scalar objects, since -// lattice objects of different complex nature are non-conformable. -///////////////////////////////////////////////////////////////// -template inline auto real(const iScalar &z) -> iScalar -{ - iScalar ret; - ret._internal = real(z._internal); - return ret; -} -template inline auto real(const iMatrix &z) -> iMatrix -{ - iMatrix ret; - for(int c1=0;c1 inline auto real(const iVector &z) -> iVector -{ - iVector ret; - for(int c1=0;c1 inline auto imag(const iScalar &z) -> iScalar -{ - iScalar ret; - ret._internal = imag(z._internal); - return ret; -} -template inline auto imag(const iMatrix &z) -> iMatrix -{ - iMatrix ret; - for(int c1=0;c1 inline auto imag(const iVector &z) -> iVector -{ - iVector ret; - for(int c1=0;c1 Scalar + // innerProduct Vector x Vector -> Scalar + // innerProduct Matrix x Matrix -> Scalar + /////////////////////////////////////////////////////////////////////////////////////// + template inline + auto innerProduct (const iVector& lhs,const iVector& rhs) -> iScalar + { + typedef decltype(innerProduct(lhs._internal[0],rhs._internal[0])) ret_t; + iScalar ret=zero; + for(int c1=0;c1 inline + auto innerProduct (const iMatrix& lhs,const iMatrix& rhs) -> iScalar + { + typedef decltype(innerProduct(lhs._internal[0][0],rhs._internal[0][0])) ret_t; + iScalar ret=zero; + iScalar tmp; + for(int c1=0;c1 inline + auto innerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar + { + typedef decltype(innerProduct(lhs._internal,rhs._internal)) ret_t; + iScalar ret; + ret._internal = innerProduct(lhs._internal,rhs._internal); + return ret; + } + +} +#endif diff --git a/lib/Grid_math_outer.h b/lib/Grid_math_outer.h new file mode 100644 index 00000000..816f6ad8 --- /dev/null +++ b/lib/Grid_math_outer.h @@ -0,0 +1,47 @@ +#ifndef GRID_MATH_OUTER_H +#define GRID_MATH_OUTER_H +namespace Grid { + /////////////////////////////////////////////////////////////////////////////////////// + // outerProduct Scalar x Scalar -> Scalar + // Vector x Vector -> Matrix + /////////////////////////////////////////////////////////////////////////////////////// + +template inline +auto outerProduct (const iVector& lhs,const iVector& rhs) -> iMatrix +{ + typedef decltype(outerProduct(lhs._internal[0],rhs._internal[0])) ret_t; + iMatrix ret; + for(int c1=0;c1 inline +auto outerProduct (const iScalar& lhs,const iScalar& rhs) -> iScalar +{ + typedef decltype(outerProduct(lhs._internal,rhs._internal)) ret_t; + iScalar ret; + ret._internal = outerProduct(lhs._internal,rhs._internal); + return ret; +} + +inline ComplexF outerProduct(const ComplexF &l, const ComplexF& r) +{ + return l*r; +} +inline ComplexD outerProduct(const ComplexD &l, const ComplexD& r) +{ + return l*r; +} +inline RealF outerProduct(const RealF &l, const RealF& r) +{ + return l*r; +} +inline RealD outerProduct(const RealD &l, const RealD& r) +{ + return l*r; +} + +} +#endif diff --git a/lib/Grid_math_peek.h b/lib/Grid_math_peek.h new file mode 100644 index 00000000..b76fa84d --- /dev/null +++ b/lib/Grid_math_peek.h @@ -0,0 +1,149 @@ +#ifndef GRID_MATH_PEEK_H +#define GRID_MATH_PEEK_H +namespace Grid { + +////////////////////////////////////////////////////////////////////////////// +// Peek on a specific index; returns a scalar in that index, tensor inherits rest +////////////////////////////////////////////////////////////////////////////// +// If we hit the right index, return scalar with no further recursion + +//template inline ComplexF peekIndex(const ComplexF arg) { return arg;} +//template inline ComplexD peekIndex(const ComplexD arg) { return arg;} +//template inline RealF peekIndex(const RealF arg) { return arg;} +//template inline RealD peekIndex(const RealD arg) { return arg;} + +// Scalar peek, no indices +template inline + auto peekIndex(const iScalar &arg) -> + typename std::enable_if,Level>::value, // Index matches + iScalar >::type // return scalar +{ + return arg; +} +// Vector peek, one index +template inline + auto peekIndex(const iVector &arg,int i) -> + typename std::enable_if,Level>::value, // Index matches + iScalar >::type // return scalar +{ + iScalar ret; // return scalar + ret._internal = arg._internal[i]; + return ret; +} +// Matrix peek, two indices +template inline + auto peekIndex(const iMatrix &arg,int i,int j) -> + typename std::enable_if,Level>::value, // Index matches + iScalar >::type // return scalar +{ + iScalar ret; // return scalar + ret._internal = arg._internal[i][j]; + return ret; +} + +///////////// +// No match peek for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue +///////////// +// scalar +template inline + auto peekIndex(const iScalar &arg) -> // Scalar 0 index + typename std::enable_if,Level>::notvalue, // Index does NOT match + iScalar(arg._internal))> >::type +{ + iScalar(arg._internal))> ret; + ret._internal= peekIndex(arg._internal); + return ret; +} +template inline + auto peekIndex(const iScalar &arg,int i) -> // Scalar 1 index + typename std::enable_if,Level>::notvalue, // Index does NOT match + iScalar(arg._internal,i))> >::type +{ + iScalar(arg._internal,i))> ret; + ret._internal=peekIndex(arg._internal,i); + return ret; +} +template inline + auto peekIndex(const iScalar &arg,int i,int j) -> // Scalar, 2 index + typename std::enable_if,Level>::notvalue, // Index does NOT match + iScalar(arg._internal,i,j))> >::type +{ + iScalar(arg._internal,i,j))> ret; + ret._internal=peekIndex(arg._internal,i,j); + return ret; +} +// vector +template inline +auto peekIndex(const iVector &arg) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iVector(arg._internal[0])),N> >::type +{ + iVector(arg._internal[0])),N> ret; + for(int ii=0;ii(arg._internal[ii]); + } + return ret; +} +template inline + auto peekIndex(const iVector &arg,int i) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iVector(arg._internal[0],i)),N> >::type +{ + iVector(arg._internal[0],i)),N> ret; + for(int ii=0;ii(arg._internal[ii],i); + } + return ret; +} +template inline + auto peekIndex(const iVector &arg,int i,int j) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iVector(arg._internal[0],i,j)),N> >::type +{ + iVector(arg._internal[0],i,j)),N> ret; + for(int ii=0;ii(arg._internal[ii],i,j); + } + return ret; +} +// matrix +template inline +auto peekIndex(const iMatrix &arg) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iMatrix(arg._internal[0][0])),N> >::type +{ + iMatrix(arg._internal[0][0])),N> ret; + for(int ii=0;ii(arg._internal[ii][jj]);// Could avoid this because peeking a scalar is dumb + }} + return ret; +} +template inline + auto peekIndex(const iMatrix &arg,int i) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iMatrix(arg._internal[0],i)),N> >::type +{ + iMatrix(arg._internal[0],i)),N> ret; + for(int ii=0;ii(arg._internal[ii][jj],i); + }} + return ret; +} +template inline + auto peekIndex(const iMatrix &arg,int i,int j) -> + typename std::enable_if,Level>::notvalue, // Index does not match + iMatrix(arg._internal[0][0],i,j)),N> >::type +{ + iMatrix(arg._internal[0][0],i,j)),N> ret; + for(int ii=0;ii(arg._internal[ii][jj],i,j); + }} + return ret; +} + + +} +#endif diff --git a/lib/Grid_math_poke.h b/lib/Grid_math_poke.h new file mode 100644 index 00000000..3f1cb89e --- /dev/null +++ b/lib/Grid_math_poke.h @@ -0,0 +1,126 @@ +#ifndef GRID_MATH_POKE_H +#define GRID_MATH_POKE_H +namespace Grid { + +////////////////////////////////////////////////////////////////////////////// +// Poke a specific index; +////////////////////////////////////////////////////////////////////////////// + +// Scalar poke +template inline + void pokeIndex(iScalar &ret, + const typename std::enable_if,Level>::value,iScalar >::type &arg) +{ + ret._internal = arg._internal; +} +// Vector poke, one index +template inline + void pokeIndex(iVector &ret, + const typename std::enable_if,Level>::value,iScalar >::type &arg,int i) +{ + ret._internal[i] = arg._internal; +} +// Vector poke, two indices +template inline + void pokeIndex(iMatrix &ret, + const typename std::enable_if,Level>::value,iScalar >::type &arg,int i,int j) +{ + ret._internal[i][j] = arg._internal; +} + +///////////// +// No match poke for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue +///////////// +// scalar +template inline + void pokeIndex(iScalar &ret, + const typename std::enable_if,Level>::notvalue,iScalar(ret._internal))> >::type &arg) + +{ + pokeIndex(ret._internal,arg._internal); +} +template inline + void pokeIndex(iScalar &ret, + const typename std::enable_if,Level>::notvalue,iScalar(ret._internal,0))> >::type &arg, + int i) + +{ + pokeIndex(ret._internal,arg._internal,i); +} +template inline + void pokeIndex(iScalar &ret, + const typename std::enable_if,Level>::notvalue,iScalar(ret._internal,0,0))> >::type &arg, + int i,int j) + +{ + pokeIndex(ret._internal,arg._internal,i,j); +} + +// Vector +template inline + void pokeIndex(iVector &ret, + const typename std::enable_if,Level>::notvalue,iVector(ret._internal)),N> >::type &arg) + +{ + for(int ii=0;ii(ret._internal[ii],arg._internal[ii]); + } +} +template inline + void pokeIndex(iVector &ret, + const typename std::enable_if,Level>::notvalue,iVector(ret._internal,0)),N> >::type &arg, + int i) + +{ + for(int ii=0;ii(ret._internal[ii],arg._internal[ii],i); + } +} +template inline + void pokeIndex(iVector &ret, + const typename std::enable_if,Level>::notvalue,iVector(ret._internal,0,0)),N> >::type &arg, + int i,int j) + +{ + for(int ii=0;ii(ret._internal[ii],arg._internal[ii],i,j); + } +} + +// Matrix +template inline + void pokeIndex(iMatrix &ret, + const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal)),N> >::type &arg) + +{ + for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj]); + }} +} +template inline + void pokeIndex(iMatrix &ret, + const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal,0)),N> >::type &arg, + int i) + +{ + for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj],i); + }} +} +template inline + void pokeIndex(iMatrix &ret, + const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal,0,0)),N> >::type &arg, + int i,int j) + +{ + for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj],i,j); + }} +} + + +} +#endif diff --git a/lib/Grid_math_reality.h b/lib/Grid_math_reality.h new file mode 100644 index 00000000..1f676c11 --- /dev/null +++ b/lib/Grid_math_reality.h @@ -0,0 +1,115 @@ +#ifndef GRID_MATH_REALITY_H +#define GRID_MATH_REALITY_H +namespace Grid { + + /////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////// CONJ /////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + +// Conj function for scalar, vector, matrix +template inline iScalar conj(const iScalar&r) +{ + iScalar ret; + ret._internal = conj(r._internal); + return ret; +} +template inline iVector conj(const iVector&r) +{ + iVector ret; + for(int i=0;i inline iMatrix conj(const iMatrix&r) +{ + iMatrix ret; + for(int i=0;i inline iScalar adj(const iScalar&r) +{ + iScalar ret; + ret._internal = adj(r._internal); + return ret; +} +template inline iVector adj(const iVector&r) +{ + iVector ret; + for(int i=0;i inline iMatrix adj(const iMatrix &arg) +{ + iMatrix ret; + for(int c1=0;c1 inline auto real(const iScalar &z) -> iScalar +{ + iScalar ret; + ret._internal = real(z._internal); + return ret; +} +template inline auto real(const iMatrix &z) -> iMatrix +{ + iMatrix ret; + for(int c1=0;c1 inline auto real(const iVector &z) -> iVector +{ + iVector ret; + for(int c1=0;c1 inline auto imag(const iScalar &z) -> iScalar +{ + iScalar ret; + ret._internal = imag(z._internal); + return ret; +} +template inline auto imag(const iMatrix &z) -> iMatrix +{ + iMatrix ret; + for(int c1=0;c1 inline auto imag(const iVector &z) -> iVector +{ + iVector ret; + for(int c1=0;c1 inline ComplexF traceIndex(const ComplexF arg) { return arg;} +template inline ComplexD traceIndex(const ComplexD arg) { return arg;} +template inline RealF traceIndex(const RealF arg) { return arg;} +template inline RealD traceIndex(const RealD arg) { return arg;} + +template +inline auto trace(const iMatrix &arg) -> iScalar +{ + iScalar ret; + zeroit(ret._internal); + for(int i=0;i +inline auto trace(const iScalar &arg) -> iScalar +{ + iScalar ret; + ret._internal=trace(arg._internal); + return ret; +} +//////////////////////////////////////////////////////////////////////////////////////////////////////// +// Trace Specific indices. +//////////////////////////////////////////////////////////////////////////////////////////////////////// +/* +template inline +auto traceIndex(const iScalar &arg) -> iScalar(arg._internal)) > +{ + iScalar(arg._internal))> ret; + ret._internal = traceIndex(arg._internal); + return ret; +} +*/ +template inline auto +traceIndex (const iScalar &arg) -> +typename +std::enable_if,Level>::notvalue, + iScalar(arg._internal))> >::type + +{ + iScalar(arg._internal))> ret; + ret._internal=traceIndex(arg._internal); + return ret; +} +template inline auto +traceIndex (const iScalar &arg) -> +typename std::enable_if,Level>::value, + iScalar >::type +{ + return arg; +} + +// If we hit the right index, return scalar and trace it with no further recursion +template inline +auto traceIndex(const iMatrix &arg) -> + typename std::enable_if,Level>::value, // Index matches + iScalar >::type // return scalar +{ + iScalar ret; + zeroit(ret._internal); + for(int i=0;i inline +auto traceIndex(const iMatrix &arg) -> + typename std::enable_if,Level>::notvalue,// No index match + iMatrix(arg._internal[0][0])),N> >::type // return matrix +{ + iMatrix(arg._internal[0][0])),N> ret; + for(int i=0;i(arg._internal[i][j]); + }} + return ret; +} + +} +#endif diff --git a/lib/Grid_math_transpose.h b/lib/Grid_math_transpose.h new file mode 100644 index 00000000..76f80b1b --- /dev/null +++ b/lib/Grid_math_transpose.h @@ -0,0 +1,101 @@ +#ifndef GRID_MATH_TRANSPOSE_H +#define GRID_MATH_TRANSPOSE_H +namespace Grid { + + + +///////////////////////////////////////////////////////////////// +// Transpose all indices +///////////////////////////////////////////////////////////////// + +inline ComplexD transpose(ComplexD &rhs){ return rhs;} +inline ComplexF transpose(ComplexF &rhs){ return rhs;} +inline RealD transpose(RealD &rhs){ return rhs;} +inline RealF transpose(RealF &rhs){ return rhs;} + +template + inline typename std::enable_if::value, iMatrix >::type + transpose(iMatrix arg) + { + iMatrix ret; + for(int i=0;i + inline typename std::enable_if::notvalue, iMatrix >::type + transpose(iMatrix arg) + { + iMatrix ret; + for(int i=0;i + inline typename std::enable_if::value, iScalar >::type + transpose(iScalar arg) + { + iScalar ret; + ret._internal = transpose(arg._internal); // NB recurses + return ret; + } + +template + inline typename std::enable_if::notvalue, iScalar >::type + transpose(iScalar arg) + { + iScalar ret; + ret._internal = arg._internal; // NB recursion stops + return ret; + } + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Transpose a specific index; instructive to compare this style of recursion termination +// to that of adj; which is easiers? +//////////////////////////////////////////////////////////////////////////////////////////// +template inline + typename std::enable_if,Level>::value, iMatrix >::type +transposeIndex (const iMatrix &arg) +{ + iMatrix ret; + for(int i=0;i inline +typename std::enable_if,Level>::notvalue, iMatrix >::type +transposeIndex (const iMatrix &arg) +{ + iMatrix ret; + for(int i=0;i(arg._internal[i][j]); + }} + return ret; +} +template inline +typename std::enable_if,Level>::notvalue, iScalar >::type +transposeIndex (const iScalar &arg) +{ + iScalar ret; + ret._internal=transposeIndex(arg._internal); + return ret; +} +template inline +typename std::enable_if,Level>::value, iScalar >::type +transposeIndex (const iScalar &arg) +{ + return arg; +} + +} +#endif From 0fce5237923bbb41b7b60ad63b669cdacd2b8e1e Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 18:54:30 +0100 Subject: [PATCH 074/429] Split up into multiple files --- lib/Grid_math_arith.h | 744 +---------------------------------- lib/Grid_math_arith_add.h | 122 ++++++ lib/Grid_math_arith_mac.h | 81 ++++ lib/Grid_math_arith_mul.h | 189 +++++++++ lib/Grid_math_arith_scalar.h | 258 ++++++++++++ lib/Grid_math_arith_sub.h | 134 +++++++ 6 files changed, 789 insertions(+), 739 deletions(-) create mode 100644 lib/Grid_math_arith_add.h create mode 100644 lib/Grid_math_arith_mac.h create mode 100644 lib/Grid_math_arith_mul.h create mode 100644 lib/Grid_math_arith_scalar.h create mode 100644 lib/Grid_math_arith_sub.h diff --git a/lib/Grid_math_arith.h b/lib/Grid_math_arith.h index aebaaee0..e7b6b4ac 100644 --- a/lib/Grid_math_arith.h +++ b/lib/Grid_math_arith.h @@ -1,745 +1,11 @@ #ifndef GRID_MATH_ARITH_H #define GRID_MATH_ARITH_H -namespace Grid { +#include +#include +#include +#include +#include - - /////////////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////// ADD /////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////////////// - - -// ADD is simple for now; cannot mix types and straightforward template -// Scalar +/- Scalar -// Vector +/- Vector -// Matrix +/- Matrix - template inline void add(iScalar * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iScalar * __restrict__ rhs) - { - add(&ret->_internal,&lhs->_internal,&rhs->_internal); - } - template inline void add(iVector * __restrict__ ret, - const iVector * __restrict__ lhs, - const iVector * __restrict__ rhs) - { - for(int c=0;c_internal[c]=lhs->_internal[c]+rhs->_internal[c]; - } - return; - } - - template inline void add(iMatrix * __restrict__ ret, - const iMatrix * __restrict__ lhs, - const iMatrix * __restrict__ rhs) - { - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal[c1][c2]); - }} - return; - } - template inline void add(iMatrix * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iMatrix * __restrict__ rhs) - { - for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); - }} - return; - } - template inline void add(iMatrix * __restrict__ ret, - const iMatrix * __restrict__ lhs, - const iScalar * __restrict__ rhs) - { - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); - else - ret->_internal[c1][c2]=lhs->_internal[c1][c2]; - }} - return; - } - - // Need to figure multi-precision. - template Mytype timesI(Mytype &r) - { - iScalar i; - i._internal = Complex(0,1); - return r*i; - } - - // + operator for scalar, vector, matrix - template - //inline auto operator + (iScalar& lhs,iScalar&& rhs) -> iScalar - inline auto operator + (const iScalar& lhs,const iScalar& rhs) -> iScalar - { - typedef iScalar ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; - } - template - inline auto operator + (const iVector& lhs,const iVector& rhs) ->iVector - { - typedef iVector ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; - } - template - inline auto operator + (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix - { - typedef iMatrix ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; - } - template -inline auto operator + (const iScalar& lhs,const iMatrix& rhs)->iMatrix - { - typedef iMatrix ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; - } - - template - inline auto operator + (const iMatrix& lhs,const iScalar& rhs)->iMatrix - { - typedef iMatrix ret_t; - ret_t ret; - add(&ret,&lhs,&rhs); - return ret; - } - - - /////////////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////// SUB /////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////////////// - - -// SUB is simple for now; cannot mix types and straightforward template -// Scalar +/- Scalar -// Vector +/- Vector -// Matrix +/- Matrix -// Matrix /- scalar -template inline void sub(iScalar * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iScalar * __restrict__ rhs) -{ - sub(&ret->_internal,&lhs->_internal,&rhs->_internal); -} - -template inline void sub(iVector * __restrict__ ret, - const iVector * __restrict__ lhs, - const iVector * __restrict__ rhs) -{ - for(int c=0;c_internal[c]=lhs->_internal[c]-rhs->_internal[c]; - } - return; -} -template inline void sub(iMatrix * __restrict__ ret, - const iMatrix * __restrict__ lhs, - const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal[c1][c2]); - }} - return; -} -template inline void sub(iMatrix * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); - } else { - // Fails -- need unary minus. Catalogue other unops? - ret->_internal[c1][c2]=zero; - ret->_internal[c1][c2]=ret->_internal[c1][c2]-rhs->_internal[c1][c2]; - - } - }} - return; -} -template inline void sub(iMatrix * __restrict__ ret, - const iMatrix * __restrict__ lhs, - const iScalar * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); - else - ret->_internal[c1][c2]=lhs->_internal[c1][c2]; - }} - return; -} - -template void vprefetch(const iScalar &vv) -{ - vprefetch(vv._internal); -} -template void vprefetch(const iVector &vv) -{ - for(int i=0;i void vprefetch(const iMatrix &vv) -{ - for(int i=0;i inline auto -operator - (const iScalar& lhs, const iScalar& rhs) -> iScalar -{ - typedef iScalar ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator - (const iVector& lhs,const iVector& rhs) ->iVector -{ - typedef iVector ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator - (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator - (const iScalar& lhs,const iMatrix& rhs)->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} -template -inline auto operator - (const iMatrix& lhs,const iScalar& rhs)->iMatrix -{ - typedef iMatrix ret_t; - ret_t ret; - sub(&ret,&lhs,&rhs); - return ret; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////// MAC /////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////// - - /////////////////////////// - // Legal multiplication table - /////////////////////////// - // scal x scal = scal - // mat x mat = mat - // mat x scal = mat - // scal x mat = mat - // mat x vec = vec - // vec x scal = vec - // scal x vec = vec - /////////////////////////// -template -inline void mac(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs) -{ - mac(&ret->_internal,&lhs->_internal,&rhs->_internal); -} -template -inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); - }}} - return; -} -template -inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ - for(int c1=0;c1_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); - }} - return; -} -template -inline void mac(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ - for(int c1=0;c1_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); - }} - return; -} -template -inline void mac(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) -{ - for(int c1=0;c1_internal[c1],&lhs->_internal[c1][c2],&rhs->_internal[c2]); - }} - return; -} -template -inline void mac(iVector * __restrict__ ret,const iScalar * __restrict__ lhs,const iVector * __restrict__ rhs) -{ - for(int c1=0;c1_internal[c1],&lhs->_internal,&rhs->_internal[c1]); - } - return; -} -template -inline void mac(iVector * __restrict__ ret,const iVector * __restrict__ lhs,const iScalar * __restrict__ rhs) -{ - for(int c1=0;c1_internal[c1],&lhs->_internal[c1],&rhs->_internal); - } - return; -} - - /////////////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////// MUL /////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////////////// - - -template -inline void mult(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs){ - mult(&ret->_internal,&lhs->_internal,&rhs->_internal); -} - -template -inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][0],&rhs->_internal[0][c2]); - for(int c3=1;c3_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); - } - }} - return; -} -template -inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); - }} - return; -} - -template -inline void mult(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); - }} - return; -} -// Matrix left multiplies vector -template -inline void mult(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) -{ - for(int c1=0;c1_internal[c1],&lhs->_internal[c1][0],&rhs->_internal[0]); - for(int c2=1;c2_internal[c1],&lhs->_internal[c1][c2],&rhs->_internal[c2]); - } - } - return; -} -template -inline void mult(iVector * __restrict__ ret, - const iScalar * __restrict__ lhs, - const iVector * __restrict__ rhs){ - for(int c1=0;c1_internal[c1],&lhs->_internal,&rhs->_internal[c1]); - } -} -template -inline void mult(iVector * __restrict__ ret, - const iVector * __restrict__ rhs, - const iScalar * __restrict__ lhs){ - mult(ret,lhs,rhs); -} - - - -template inline -iVector operator * (const iMatrix& lhs,const iVector& rhs) -{ - iVector ret; - mult(&ret,&lhs,&rhs); - return ret; -} - -template inline -iVector operator * (const iScalar& lhs,const iVector& rhs) -{ - iVector ret; - mult(&ret,&lhs,&rhs); - return ret; -} - -template inline -iVector operator * (const iVector& lhs,const iScalar& rhs) -{ - iVector ret; - mult(&ret,&lhs,&rhs); - return ret; -} - - ////////////////////////////////////////////////////////////////// - // Glue operators to mult routines. Must resolve return type cleverly from typeof(internal) - // since nesting matrix x matrix-> matrix - // while matrix x matrix-> matrix - // so return type depends on argument types in nasty way. - ////////////////////////////////////////////////////////////////// - // scal x scal = scal - // mat x mat = mat - // mat x scal = mat - // scal x mat = mat - // mat x vec = vec - // vec x scal = vec - // scal x vec = vec - // - // We can special case scalar_type ?? -template -inline auto operator * (const iScalar& lhs,const iScalar& rhs) -> iScalar -{ - typedef iScalar ret_t; - ret_t ret; - mult(&ret,&lhs,&rhs); - return ret; -} -template inline -auto operator * (const iMatrix& lhs,const iMatrix& rhs) -> iMatrix -{ - typedef decltype(lhs._internal[0][0]*rhs._internal[0][0]) ret_t; - iMatrix ret; - mult(&ret,&lhs,&rhs); - return ret; -} -template inline -auto operator * (const iMatrix& lhs,const iScalar& rhs) -> iMatrix -{ - typedef decltype(lhs._internal[0][0]*rhs._internal) ret_t; - - iMatrix ret; - for(int c1=0;c1 inline -auto operator * (const iScalar& lhs,const iMatrix& rhs) -> iMatrix -{ - typedef decltype(lhs._internal*rhs._internal[0][0]) ret_t; - iMatrix ret; - for(int c1=0;c1 inline -auto operator * (const iMatrix& lhs,const iVector& rhs) -> iVector -{ - typedef decltype(lhs._internal[0][0]*rhs._internal[0]) ret_t; - iVector ret; - for(int c1=0;c1 inline -auto operator * (const iScalar& lhs,const iVector& rhs) -> iVector -{ - typedef decltype(lhs._internal*rhs._internal[0]) ret_t; - iVector ret; - for(int c1=0;c1 inline -auto operator * (const iVector& lhs,const iScalar& rhs) -> iVector -{ - typedef decltype(lhs._internal[0]*rhs._internal) ret_t; - iVector ret; - for(int c1=0;c1 inline iScalar operator * (const iScalar& lhs,const typename iScalar::scalar_type rhs) -{ - typename iScalar::tensor_reduced srhs(rhs); - return lhs*srhs; -} -template inline iScalar operator * (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs*lhs; } - -template inline iVector operator * (const iVector& lhs,const typename iScalar::scalar_type rhs) -{ - typename iVector::tensor_reduced srhs(rhs); - return lhs*srhs; -} -template inline iVector operator * (const typename iScalar::scalar_type lhs,const iVector& rhs) { return rhs*lhs; } - -template inline iMatrix operator * (const iMatrix& lhs,const typename iScalar::scalar_type &rhs) -{ - typename iMatrix::tensor_reduced srhs(rhs); - return lhs*srhs; -} -template inline iMatrix operator * (const typename iScalar::scalar_type & lhs,const iMatrix& rhs) { return rhs*lhs; } - -//////////////////////////////////////////////////////////////////// -// Double support; cast to "scalar_type" through constructor -//////////////////////////////////////////////////////////////////// -template inline iScalar operator * (const iScalar& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iScalar operator * (double lhs,const iScalar& rhs) { return rhs*lhs; } - -template inline iVector operator * (const iVector& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iVector operator * (double lhs,const iVector& rhs) { return rhs*lhs; } - -template inline iMatrix operator * (const iMatrix& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iMatrix operator * (double lhs,const iMatrix& rhs) { return rhs*lhs; } - -//////////////////////////////////////////////////////////////////// -// Complex support; cast to "scalar_type" through constructor -//////////////////////////////////////////////////////////////////// -template inline iScalar operator * (const iScalar& lhs,ComplexD rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iScalar operator * (ComplexD lhs,const iScalar& rhs) { return rhs*lhs; } - -template inline iVector operator * (const iVector& lhs,ComplexD rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iVector operator * (ComplexD lhs,const iVector& rhs) { return rhs*lhs; } - -template inline iMatrix operator * (const iMatrix& lhs,ComplexD rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iMatrix operator * (ComplexD lhs,const iMatrix& rhs) { return rhs*lhs; } - -//////////////////////////////////////////////////////////////////// -// Integer support; cast to "scalar_type" through constructor -//////////////////////////////////////////////////////////////////// -template inline iScalar operator * (const iScalar& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iScalar operator * (Integer lhs,const iScalar& rhs) { return rhs*lhs; } - -template inline iVector operator * (const iVector& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iVector operator * (Integer lhs,const iVector& rhs) { return rhs*lhs; } - -template inline iMatrix operator * (const iMatrix& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs*srhs; -} -template inline iMatrix operator * (Integer lhs,const iMatrix& rhs) { return rhs*lhs; } - - - -/////////////////////////////////////////////////////////////////////////////////////////////// -// addition by fundamental scalar type applies to matrix(down diag) and scalar -/////////////////////////////////////////////////////////////////////////////////////////////// -template inline iScalar operator + (const iScalar& lhs,const typename iScalar::scalar_type rhs) -{ - typename iScalar::tensor_reduced srhs(rhs); - return lhs+srhs; -} -template inline iScalar operator + (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs+lhs; } - -template inline iMatrix operator + (const iMatrix& lhs,const typename iScalar::scalar_type rhs) -{ - typename iMatrix::tensor_reduced srhs(rhs); - return lhs+srhs; -} -template inline iMatrix operator + (const typename iScalar::scalar_type lhs,const iMatrix& rhs) { return rhs+lhs; } - -//////////////////////////////////////////////////////////////////// -// Double support; cast to "scalar_type" through constructor -//////////////////////////////////////////////////////////////////// -template inline iScalar operator + (const iScalar& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs+srhs; -} -template inline iScalar operator + (double lhs,const iScalar& rhs) { return rhs+lhs; } - -template inline iMatrix operator + (const iMatrix& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs+srhs; -} -template inline iMatrix operator + (double lhs,const iMatrix& rhs) { return rhs+lhs; } - - -// Integer support cast to scalar type through constructor - - -template inline iScalar operator + (const iScalar& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs+srhs; -} - -template inline iScalar operator + (Integer lhs,const iScalar& rhs) { return rhs+lhs; } - -template inline iMatrix operator + (const iMatrix& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs+srhs; -} -template inline iMatrix operator + (Integer lhs,const iMatrix& rhs) { return rhs+lhs; } - - -/////////////////////////////////////////////////////////////////////////////////////////////// -// subtraction of fundamental scalar type applies to matrix(down diag) and scalar -/////////////////////////////////////////////////////////////////////////////////////////////// -template inline iScalar operator - (const iScalar& lhs,const typename iScalar::scalar_type rhs) -{ - typename iScalar::tensor_reduced srhs(rhs); - return lhs-srhs; -} -template inline iScalar operator - (const typename iScalar::scalar_type lhs,const iScalar& rhs) -{ - typename iScalar::tensor_reduced slhs(lhs); - return slhs-rhs; -} - -template inline iMatrix operator - (const iMatrix& lhs,const typename iScalar::scalar_type rhs) -{ - typename iScalar::tensor_reduced srhs(rhs); - return lhs-srhs; -} -template inline iMatrix operator - (const typename iScalar::scalar_type lhs,const iMatrix& rhs) -{ - typename iScalar::tensor_reduced slhs(lhs); - return slhs-rhs; -} - -//////////////////////////////////////////////////////////////////// -// Double support; cast to "scalar_type" through constructor -//////////////////////////////////////////////////////////////////// -template inline iScalar operator - (const iScalar& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs-srhs; -} -template inline iScalar operator - (double lhs,const iScalar& rhs) -{ - typename iScalar::scalar_type t(lhs); - typename iScalar::tensor_reduced slhs(t); - return slhs-rhs; -} - -template inline iMatrix operator - (const iMatrix& lhs,double rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs-srhs; -} -template inline iMatrix operator - (double lhs,const iMatrix& rhs) -{ - typename iScalar::scalar_type t(lhs); - typename iScalar::tensor_reduced slhs(t); - return slhs-rhs; -} - -//////////////////////////////////////////////////////////////////// -// Integer support; cast to "scalar_type" through constructor -//////////////////////////////////////////////////////////////////// -template inline iScalar operator - (const iScalar& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs-srhs; -} -template inline iScalar operator - (Integer lhs,const iScalar& rhs) -{ - typename iScalar::scalar_type t(lhs); - typename iScalar::tensor_reduced slhs(t); - return slhs-rhs; -} -template inline iMatrix operator - (const iMatrix& lhs,Integer rhs) -{ - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); - return lhs-srhs; -} -template inline iMatrix operator - (Integer lhs,const iMatrix& rhs) -{ - typename iScalar::scalar_type t(lhs); - typename iScalar::tensor_reduced slhs(t); - return slhs-rhs; -} - -} #endif diff --git a/lib/Grid_math_arith_add.h b/lib/Grid_math_arith_add.h new file mode 100644 index 00000000..7e62e07b --- /dev/null +++ b/lib/Grid_math_arith_add.h @@ -0,0 +1,122 @@ +#ifndef GRID_MATH_ARITH_ADD_H +#define GRID_MATH_ARITH_ADD_H + +namespace Grid { + + + /////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////// ADD /////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + + +// ADD is simple for now; cannot mix types and straightforward template +// Scalar +/- Scalar +// Vector +/- Vector +// Matrix +/- Matrix + template inline void add(iScalar * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iScalar * __restrict__ rhs) + { + add(&ret->_internal,&lhs->_internal,&rhs->_internal); + } + template inline void add(iVector * __restrict__ ret, + const iVector * __restrict__ lhs, + const iVector * __restrict__ rhs) + { + for(int c=0;c_internal[c]=lhs->_internal[c]+rhs->_internal[c]; + } + return; + } + + template inline void add(iMatrix * __restrict__ ret, + const iMatrix * __restrict__ lhs, + const iMatrix * __restrict__ rhs) + { + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal[c1][c2]); + }} + return; + } + template inline void add(iMatrix * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iMatrix * __restrict__ rhs) + { + for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); + }} + return; + } + template inline void add(iMatrix * __restrict__ ret, + const iMatrix * __restrict__ lhs, + const iScalar * __restrict__ rhs) + { + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); + else + ret->_internal[c1][c2]=lhs->_internal[c1][c2]; + }} + return; + } + + // Need to figure multi-precision. + template Mytype timesI(Mytype &r) + { + iScalar i; + i._internal = Complex(0,1); + return r*i; + } + + // + operator for scalar, vector, matrix + template + //inline auto operator + (iScalar& lhs,iScalar&& rhs) -> iScalar + inline auto operator + (const iScalar& lhs,const iScalar& rhs) -> iScalar + { + typedef iScalar ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; + } + template + inline auto operator + (const iVector& lhs,const iVector& rhs) ->iVector + { + typedef iVector ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; + } + template + inline auto operator + (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix + { + typedef iMatrix ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; + } + template +inline auto operator + (const iScalar& lhs,const iMatrix& rhs)->iMatrix + { + typedef iMatrix ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; + } + + template + inline auto operator + (const iMatrix& lhs,const iScalar& rhs)->iMatrix + { + typedef iMatrix ret_t; + ret_t ret; + add(&ret,&lhs,&rhs); + return ret; + } + + + +} + +#endif diff --git a/lib/Grid_math_arith_mac.h b/lib/Grid_math_arith_mac.h new file mode 100644 index 00000000..59cb9a5e --- /dev/null +++ b/lib/Grid_math_arith_mac.h @@ -0,0 +1,81 @@ +#ifndef GRID_MATH_ARITH_MAC_H +#define GRID_MATH_ARITH_MAC_H + +namespace Grid { + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////// MAC /////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// + + /////////////////////////// + // Legal multiplication table + /////////////////////////// + // scal x scal = scal + // mat x mat = mat + // mat x scal = mat + // scal x mat = mat + // mat x vec = vec + // vec x scal = vec + // scal x vec = vec + /////////////////////////// +template +inline void mac(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs) +{ + mac(&ret->_internal,&lhs->_internal,&rhs->_internal); +} +template +inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); + }}} + return; +} +template +inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ + for(int c1=0;c1_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); + }} + return; +} +template +inline void mac(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ + for(int c1=0;c1_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); + }} + return; +} +template +inline void mac(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) +{ + for(int c1=0;c1_internal[c1],&lhs->_internal[c1][c2],&rhs->_internal[c2]); + }} + return; +} +template +inline void mac(iVector * __restrict__ ret,const iScalar * __restrict__ lhs,const iVector * __restrict__ rhs) +{ + for(int c1=0;c1_internal[c1],&lhs->_internal,&rhs->_internal[c1]); + } + return; +} +template +inline void mac(iVector * __restrict__ ret,const iVector * __restrict__ lhs,const iScalar * __restrict__ rhs) +{ + for(int c1=0;c1_internal[c1],&lhs->_internal[c1],&rhs->_internal); + } + return; +} + + +} + +#endif diff --git a/lib/Grid_math_arith_mul.h b/lib/Grid_math_arith_mul.h new file mode 100644 index 00000000..c8bb0b2c --- /dev/null +++ b/lib/Grid_math_arith_mul.h @@ -0,0 +1,189 @@ +#ifndef GRID_MATH_ARITH_MUL_H +#define GRID_MATH_ARITH_MUL_H + +namespace Grid { + + + /////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////// MUL /////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + + +template +inline void mult(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs){ + mult(&ret->_internal,&lhs->_internal,&rhs->_internal); +} + +template +inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][0],&rhs->_internal[0][c2]); + for(int c3=1;c3_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); + } + }} + return; +} +template +inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); + }} + return; +} + +template +inline void mult(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); + }} + return; +} +// Matrix left multiplies vector +template +inline void mult(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) +{ + for(int c1=0;c1_internal[c1],&lhs->_internal[c1][0],&rhs->_internal[0]); + for(int c2=1;c2_internal[c1],&lhs->_internal[c1][c2],&rhs->_internal[c2]); + } + } + return; +} +template +inline void mult(iVector * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iVector * __restrict__ rhs){ + for(int c1=0;c1_internal[c1],&lhs->_internal,&rhs->_internal[c1]); + } +} +template +inline void mult(iVector * __restrict__ ret, + const iVector * __restrict__ rhs, + const iScalar * __restrict__ lhs){ + mult(ret,lhs,rhs); +} + + + +template inline +iVector operator * (const iMatrix& lhs,const iVector& rhs) +{ + iVector ret; + mult(&ret,&lhs,&rhs); + return ret; +} + +template inline +iVector operator * (const iScalar& lhs,const iVector& rhs) +{ + iVector ret; + mult(&ret,&lhs,&rhs); + return ret; +} + +template inline +iVector operator * (const iVector& lhs,const iScalar& rhs) +{ + iVector ret; + mult(&ret,&lhs,&rhs); + return ret; +} + + ////////////////////////////////////////////////////////////////// + // Glue operators to mult routines. Must resolve return type cleverly from typeof(internal) + // since nesting matrix x matrix-> matrix + // while matrix x matrix-> matrix + // so return type depends on argument types in nasty way. + ////////////////////////////////////////////////////////////////// + // scal x scal = scal + // mat x mat = mat + // mat x scal = mat + // scal x mat = mat + // mat x vec = vec + // vec x scal = vec + // scal x vec = vec + // + // We can special case scalar_type ?? +template +inline auto operator * (const iScalar& lhs,const iScalar& rhs) -> iScalar +{ + typedef iScalar ret_t; + ret_t ret; + mult(&ret,&lhs,&rhs); + return ret; +} +template inline +auto operator * (const iMatrix& lhs,const iMatrix& rhs) -> iMatrix +{ + typedef decltype(lhs._internal[0][0]*rhs._internal[0][0]) ret_t; + iMatrix ret; + mult(&ret,&lhs,&rhs); + return ret; +} +template inline +auto operator * (const iMatrix& lhs,const iScalar& rhs) -> iMatrix +{ + typedef decltype(lhs._internal[0][0]*rhs._internal) ret_t; + + iMatrix ret; + for(int c1=0;c1 inline +auto operator * (const iScalar& lhs,const iMatrix& rhs) -> iMatrix +{ + typedef decltype(lhs._internal*rhs._internal[0][0]) ret_t; + iMatrix ret; + for(int c1=0;c1 inline +auto operator * (const iMatrix& lhs,const iVector& rhs) -> iVector +{ + typedef decltype(lhs._internal[0][0]*rhs._internal[0]) ret_t; + iVector ret; + for(int c1=0;c1 inline +auto operator * (const iScalar& lhs,const iVector& rhs) -> iVector +{ + typedef decltype(lhs._internal*rhs._internal[0]) ret_t; + iVector ret; + for(int c1=0;c1 inline +auto operator * (const iVector& lhs,const iScalar& rhs) -> iVector +{ + typedef decltype(lhs._internal[0]*rhs._internal) ret_t; + iVector ret; + for(int c1=0;c1 inline iScalar operator * (const iScalar& lhs,const typename iScalar::scalar_type rhs) +{ + typename iScalar::tensor_reduced srhs(rhs); + return lhs*srhs; +} +template inline iScalar operator * (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs*lhs; } + +template inline iVector operator * (const iVector& lhs,const typename iScalar::scalar_type rhs) +{ + typename iVector::tensor_reduced srhs(rhs); + return lhs*srhs; +} +template inline iVector operator * (const typename iScalar::scalar_type lhs,const iVector& rhs) { return rhs*lhs; } + +template inline iMatrix operator * (const iMatrix& lhs,const typename iScalar::scalar_type &rhs) +{ + typename iMatrix::tensor_reduced srhs(rhs); + return lhs*srhs; +} +template inline iMatrix operator * (const typename iScalar::scalar_type & lhs,const iMatrix& rhs) { return rhs*lhs; } + +//////////////////////////////////////////////////////////////////// +// Double support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator * (const iScalar& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iScalar operator * (double lhs,const iScalar& rhs) { return rhs*lhs; } + +template inline iVector operator * (const iVector& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iVector operator * (double lhs,const iVector& rhs) { return rhs*lhs; } + +template inline iMatrix operator * (const iMatrix& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iMatrix operator * (double lhs,const iMatrix& rhs) { return rhs*lhs; } + +//////////////////////////////////////////////////////////////////// +// Complex support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator * (const iScalar& lhs,ComplexD rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iScalar operator * (ComplexD lhs,const iScalar& rhs) { return rhs*lhs; } + +template inline iVector operator * (const iVector& lhs,ComplexD rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iVector operator * (ComplexD lhs,const iVector& rhs) { return rhs*lhs; } + +template inline iMatrix operator * (const iMatrix& lhs,ComplexD rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iMatrix operator * (ComplexD lhs,const iMatrix& rhs) { return rhs*lhs; } + +//////////////////////////////////////////////////////////////////// +// Integer support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator * (const iScalar& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iScalar operator * (Integer lhs,const iScalar& rhs) { return rhs*lhs; } + +template inline iVector operator * (const iVector& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iVector operator * (Integer lhs,const iVector& rhs) { return rhs*lhs; } + +template inline iMatrix operator * (const iMatrix& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs*srhs; +} +template inline iMatrix operator * (Integer lhs,const iMatrix& rhs) { return rhs*lhs; } + + + +/////////////////////////////////////////////////////////////////////////////////////////////// +// addition by fundamental scalar type applies to matrix(down diag) and scalar +/////////////////////////////////////////////////////////////////////////////////////////////// +template inline iScalar operator + (const iScalar& lhs,const typename iScalar::scalar_type rhs) +{ + typename iScalar::tensor_reduced srhs(rhs); + return lhs+srhs; +} +template inline iScalar operator + (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs+lhs; } + +template inline iMatrix operator + (const iMatrix& lhs,const typename iScalar::scalar_type rhs) +{ + typename iMatrix::tensor_reduced srhs(rhs); + return lhs+srhs; +} +template inline iMatrix operator + (const typename iScalar::scalar_type lhs,const iMatrix& rhs) { return rhs+lhs; } + +//////////////////////////////////////////////////////////////////// +// Double support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator + (const iScalar& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs+srhs; +} +template inline iScalar operator + (double lhs,const iScalar& rhs) { return rhs+lhs; } + +template inline iMatrix operator + (const iMatrix& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs+srhs; +} +template inline iMatrix operator + (double lhs,const iMatrix& rhs) { return rhs+lhs; } + + +// Integer support cast to scalar type through constructor + + +template inline iScalar operator + (const iScalar& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs+srhs; +} + +template inline iScalar operator + (Integer lhs,const iScalar& rhs) { return rhs+lhs; } + +template inline iMatrix operator + (const iMatrix& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs+srhs; +} +template inline iMatrix operator + (Integer lhs,const iMatrix& rhs) { return rhs+lhs; } + + +/////////////////////////////////////////////////////////////////////////////////////////////// +// subtraction of fundamental scalar type applies to matrix(down diag) and scalar +/////////////////////////////////////////////////////////////////////////////////////////////// +template inline iScalar operator - (const iScalar& lhs,const typename iScalar::scalar_type rhs) +{ + typename iScalar::tensor_reduced srhs(rhs); + return lhs-srhs; +} +template inline iScalar operator - (const typename iScalar::scalar_type lhs,const iScalar& rhs) +{ + typename iScalar::tensor_reduced slhs(lhs); + return slhs-rhs; +} + +template inline iMatrix operator - (const iMatrix& lhs,const typename iScalar::scalar_type rhs) +{ + typename iScalar::tensor_reduced srhs(rhs); + return lhs-srhs; +} +template inline iMatrix operator - (const typename iScalar::scalar_type lhs,const iMatrix& rhs) +{ + typename iScalar::tensor_reduced slhs(lhs); + return slhs-rhs; +} + +//////////////////////////////////////////////////////////////////// +// Double support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator - (const iScalar& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs-srhs; +} +template inline iScalar operator - (double lhs,const iScalar& rhs) +{ + typename iScalar::scalar_type t(lhs); + typename iScalar::tensor_reduced slhs(t); + return slhs-rhs; +} + +template inline iMatrix operator - (const iMatrix& lhs,double rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs-srhs; +} +template inline iMatrix operator - (double lhs,const iMatrix& rhs) +{ + typename iScalar::scalar_type t(lhs); + typename iScalar::tensor_reduced slhs(t); + return slhs-rhs; +} + +//////////////////////////////////////////////////////////////////// +// Integer support; cast to "scalar_type" through constructor +//////////////////////////////////////////////////////////////////// +template inline iScalar operator - (const iScalar& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs-srhs; +} +template inline iScalar operator - (Integer lhs,const iScalar& rhs) +{ + typename iScalar::scalar_type t(lhs); + typename iScalar::tensor_reduced slhs(t); + return slhs-rhs; +} +template inline iMatrix operator - (const iMatrix& lhs,Integer rhs) +{ + typename iScalar::scalar_type t(rhs); + typename iScalar::tensor_reduced srhs(t); + return lhs-srhs; +} +template inline iMatrix operator - (Integer lhs,const iMatrix& rhs) +{ + typename iScalar::scalar_type t(lhs); + typename iScalar::tensor_reduced slhs(t); + return slhs-rhs; +} + + +} +#endif diff --git a/lib/Grid_math_arith_sub.h b/lib/Grid_math_arith_sub.h new file mode 100644 index 00000000..3a58bf4c --- /dev/null +++ b/lib/Grid_math_arith_sub.h @@ -0,0 +1,134 @@ +#ifndef GRID_MATH_ARITH_SUB_H +#define GRID_MATH_ARITH_SUB_H + +namespace Grid { + + + /////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////// SUB /////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////// + + +// SUB is simple for now; cannot mix types and straightforward template +// Scalar +/- Scalar +// Vector +/- Vector +// Matrix +/- Matrix +// Matrix /- scalar +template inline void sub(iScalar * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iScalar * __restrict__ rhs) +{ + sub(&ret->_internal,&lhs->_internal,&rhs->_internal); +} + +template inline void sub(iVector * __restrict__ ret, + const iVector * __restrict__ lhs, + const iVector * __restrict__ rhs) +{ + for(int c=0;c_internal[c]=lhs->_internal[c]-rhs->_internal[c]; + } + return; +} +template inline void sub(iMatrix * __restrict__ ret, + const iMatrix * __restrict__ lhs, + const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal[c1][c2]); + }} + return; +} +template inline void sub(iMatrix * __restrict__ ret, + const iScalar * __restrict__ lhs, + const iMatrix * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); + } else { + // Fails -- need unary minus. Catalogue other unops? + ret->_internal[c1][c2]=zero; + ret->_internal[c1][c2]=ret->_internal[c1][c2]-rhs->_internal[c1][c2]; + + } + }} + return; +} +template inline void sub(iMatrix * __restrict__ ret, + const iMatrix * __restrict__ lhs, + const iScalar * __restrict__ rhs){ + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); + else + ret->_internal[c1][c2]=lhs->_internal[c1][c2]; + }} + return; +} + +template void vprefetch(const iScalar &vv) +{ + vprefetch(vv._internal); +} +template void vprefetch(const iVector &vv) +{ + for(int i=0;i void vprefetch(const iMatrix &vv) +{ + for(int i=0;i inline auto +operator - (const iScalar& lhs, const iScalar& rhs) -> iScalar +{ + typedef iScalar ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator - (const iVector& lhs,const iVector& rhs) ->iVector +{ + typedef iVector ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator - (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix +{ + typedef iMatrix ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator - (const iScalar& lhs,const iMatrix& rhs)->iMatrix +{ + typedef iMatrix ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} +template +inline auto operator - (const iMatrix& lhs,const iScalar& rhs)->iMatrix +{ + typedef iMatrix ret_t; + ret_t ret; + sub(&ret,&lhs,&rhs); + return ret; +} + + +} + +#endif From d964d01d6aeb0b223a596f3712b1fc22ef52b834 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 20:44:19 +0100 Subject: [PATCH 075/429] Shrinking and organising the files --- lib/Grid.h | 2 +- lib/Grid_QCD.h | 24 - lib/Grid_cshift_common.h | 19 +- lib/Grid_cshift_mpi.h | 15 +- lib/Grid_cshift_none.h | 6 +- lib/Grid_lattice.h | 630 ++---------------------- lib/Grid_lattice_arith.h | 160 ++++++ lib/Grid_lattice_conformable.h | 14 + lib/Grid_lattice_coordinate.h | 45 ++ lib/Grid_lattice_local.h | 54 ++ lib/Grid_lattice_peekpoke.h | 143 ++++++ lib/Grid_lattice_reality.h | 52 ++ lib/Grid_lattice_reduction.h | 45 ++ lib/Grid_lattice_rng.h | 32 ++ lib/Grid_lattice_trace.h | 43 ++ lib/Grid_lattice_transfer.h | 46 ++ lib/Grid_lattice_transpose.h | 39 ++ lib/{Grid_predicated.h => Grid_where.h} | 19 +- 18 files changed, 750 insertions(+), 638 deletions(-) create mode 100644 lib/Grid_lattice_arith.h create mode 100644 lib/Grid_lattice_conformable.h create mode 100644 lib/Grid_lattice_coordinate.h create mode 100644 lib/Grid_lattice_local.h create mode 100644 lib/Grid_lattice_peekpoke.h create mode 100644 lib/Grid_lattice_reality.h create mode 100644 lib/Grid_lattice_reduction.h create mode 100644 lib/Grid_lattice_rng.h create mode 100644 lib/Grid_lattice_trace.h create mode 100644 lib/Grid_lattice_transfer.h create mode 100644 lib/Grid_lattice_transpose.h rename lib/{Grid_predicated.h => Grid_where.h} (77%) diff --git a/lib/Grid.h b/lib/Grid.h index c340d678..093302cb 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -1,5 +1,5 @@ // -// Grid.cpp +// Grid.h // simd // // Created by Peter Boyle on 09/05/2014. diff --git a/lib/Grid_QCD.h b/lib/Grid_QCD.h index 51ef1774..c405662d 100644 --- a/lib/Grid_QCD.h +++ b/lib/Grid_QCD.h @@ -139,30 +139,6 @@ namespace QCD { return peekIndex(rhs,i,j); } - // FIXME this is rather generic and should find a way to place it earlier. - inline void LatticeCoordinate(LatticeInteger &l,int mu){ - GridBase *grid = l._grid; - int Nsimd = grid->iSites(); - std::vector gcoor; - std::vector mergebuf(Nsimd); - std::vector mergeptr(Nsimd); - for(int o=0;ooSites();o++){ - for(int i=0;iiSites();i++){ - grid->RankIndexToGlobalCoor(grid->ThisRank(),o,i,gcoor); - // grid->RankIndexToGlobalCoor(0,o,i,gcoor); - mergebuf[i]=gcoor[mu]; - mergeptr[i]=&mergebuf[i]; - } - merge(l._odata[o],mergeptr); - } - }; - -#include - -#if 0 - -#endif - } //namespace QCD } // Grid #endif diff --git a/lib/Grid_cshift_common.h b/lib/Grid_cshift_common.h index 2910151c..8c4f1e1d 100644 --- a/lib/Grid_cshift_common.h +++ b/lib/Grid_cshift_common.h @@ -1,10 +1,11 @@ #ifndef _GRID_CSHIFT_COMMON_H_ #define _GRID_CSHIFT_COMMON_H_ +namespace Grid { ////////////////////////////////////////////////////// // Gather for when there is no need to SIMD split ////////////////////////////////////////////////////// -friend void Gather_plane_simple (Lattice &rhs,std::vector > &buffer, int dimension,int plane,int cbmask) +template void Gather_plane_simple (Lattice &rhs,std::vector > &buffer, int dimension,int plane,int cbmask) { int rd = rhs._grid->_rdimensions[dimension]; @@ -48,7 +49,7 @@ friend void Gather_plane_simple (Lattice &rhs,std::vector &rhs,std::vector pointers,int dimension,int plane,int cbmask) + template void Gather_plane_extract(Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask) { int rd = rhs._grid->_rdimensions[dimension]; @@ -91,7 +92,7 @@ friend void Gather_plane_extract(Lattice &rhs,std::vector p ////////////////////////////////////////////////////// // Scatter for when there is no need to SIMD split ////////////////////////////////////////////////////// -friend void Scatter_plane_simple (Lattice &rhs,std::vector > &buffer, int dimension,int plane,int cbmask) +template void Scatter_plane_simple (Lattice &rhs,std::vector > &buffer, int dimension,int plane,int cbmask) { int rd = rhs._grid->_rdimensions[dimension]; @@ -134,7 +135,7 @@ friend void Scatter_plane_simple (Lattice &rhs,std::vector &rhs,std::vector pointers,int dimension,int plane,int cbmask) + template void Scatter_plane_merge(Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask) { int rd = rhs._grid->_rdimensions[dimension]; @@ -177,7 +178,7 @@ friend void Scatter_plane_merge(Lattice &rhs,std::vector po ////////////////////////////////////////////////////// // local to node block strided copies ////////////////////////////////////////////////////// -friend void Copy_plane(Lattice& lhs,Lattice &rhs, int dimension,int lplane,int rplane,int cbmask) +template void Copy_plane(Lattice& lhs,Lattice &rhs, int dimension,int lplane,int rplane,int cbmask) { int rd = rhs._grid->_rdimensions[dimension]; @@ -219,7 +220,7 @@ friend void Copy_plane(Lattice& lhs,Lattice &rhs, int dimension,int } } -friend void Copy_plane_permute(Lattice& lhs,Lattice &rhs, int dimension,int lplane,int rplane,int cbmask,int permute_type) +template void Copy_plane_permute(Lattice& lhs,Lattice &rhs, int dimension,int lplane,int rplane,int cbmask,int permute_type) { int rd = rhs._grid->_rdimensions[dimension]; @@ -265,7 +266,7 @@ friend void Copy_plane_permute(Lattice& lhs,Lattice &rhs, int dimens ////////////////////////////////////////////////////// // Local to node Cshift ////////////////////////////////////////////////////// -friend void Cshift_local(Lattice& ret,Lattice &rhs,int dimension,int shift) +template void Cshift_local(Lattice& ret,Lattice &rhs,int dimension,int shift) { int sshift[2]; @@ -280,7 +281,7 @@ friend void Cshift_local(Lattice& ret,Lattice &rhs,int dimension,int } } -friend Lattice Cshift_local(Lattice &ret,Lattice &rhs,int dimension,int shift,int cbmask) +template Lattice Cshift_local(Lattice &ret,Lattice &rhs,int dimension,int shift,int cbmask) { GridBase *grid = rhs._grid; int fd = grid->_fdimensions[dimension]; @@ -322,5 +323,5 @@ friend Lattice Cshift_local(Lattice &ret,Lattice &rhs,int dime } return ret; } - +} #endif diff --git a/lib/Grid_cshift_mpi.h b/lib/Grid_cshift_mpi.h index f51becf3..c078c7d8 100644 --- a/lib/Grid_cshift_mpi.h +++ b/lib/Grid_cshift_mpi.h @@ -6,7 +6,9 @@ #define MIN(x,y) ((x)>(y)?(y):(x)) #endif -friend Lattice Cshift(Lattice &rhs,int dimension,int shift) +namespace Grid { + +template Lattice Cshift(Lattice &rhs,int dimension,int shift) { typedef typename vobj::vector_type vector_type; typedef typename vobj::scalar_type scalar_type; @@ -37,7 +39,7 @@ friend Lattice Cshift(Lattice &rhs,int dimension,int shift) return ret; } -friend void Cshift_comms(Lattice& ret,Lattice &rhs,int dimension,int shift) +template void Cshift_comms(Lattice& ret,Lattice &rhs,int dimension,int shift) { int sshift[2]; @@ -52,7 +54,7 @@ friend void Cshift_comms(Lattice& ret,Lattice &rhs,int dimension,int } } -friend void Cshift_comms_simd(Lattice& ret,Lattice &rhs,int dimension,int shift) +template void Cshift_comms_simd(Lattice& ret,Lattice &rhs,int dimension,int shift) { int sshift[2]; @@ -67,8 +69,7 @@ friend void Cshift_comms_simd(Lattice& ret,Lattice &rhs,int dimensio } } - -friend void Cshift_comms(Lattice &ret,Lattice &rhs,int dimension,int shift,int cbmask) +template void Cshift_comms(Lattice &ret,Lattice &rhs,int dimension,int shift,int cbmask) { typedef typename vobj::vector_type vector_type; typedef typename vobj::scalar_type scalar_type; @@ -127,8 +128,7 @@ friend void Cshift_comms(Lattice &ret,Lattice &rhs,int dimension,int } } - -friend void Cshift_comms_simd(Lattice &ret,Lattice &rhs,int dimension,int shift,int cbmask) +template void Cshift_comms_simd(Lattice &ret,Lattice &rhs,int dimension,int shift,int cbmask) { GridBase *grid=rhs._grid; const int Nsimd = grid->Nsimd(); @@ -260,4 +260,5 @@ friend void Cshift_comms_simd(Lattice &ret,Lattice &rhs,int dimensi } } } +} #endif diff --git a/lib/Grid_cshift_none.h b/lib/Grid_cshift_none.h index 7f4f7bc1..3485a63e 100644 --- a/lib/Grid_cshift_none.h +++ b/lib/Grid_cshift_none.h @@ -1,12 +1,12 @@ #ifndef _GRID_CSHIFT_NONE_H_ #define _GRID_CSHIFT_NONE_H_ - -friend Lattice Cshift(Lattice &rhs,int dimension,int shift) +namespace Grid { +template Lattice Cshift(Lattice &rhs,int dimension,int shift) { Lattice ret(rhs._grid); ret.checkerboard = rhs._grid->CheckerBoardDestination(rhs.checkerboard,shift); Cshift_local(ret,rhs,dimension,shift); return ret; } - +} #endif diff --git a/lib/Grid_lattice.h b/lib/Grid_lattice.h index be95caa0..cc115c3c 100644 --- a/lib/Grid_lattice.h +++ b/lib/Grid_lattice.h @@ -3,10 +3,10 @@ namespace Grid { -// TODO: Indexing () +// TODO: // mac,real,imag -// -// Functionality required: + +// Functionality: // -=,+=,*=,() // add,+,sub,-,mult,mac,* // adj,conj @@ -17,7 +17,6 @@ namespace Grid { // innerProduct,outerProduct, // localNorm2 // localInnerProduct -// extern int GridCshiftPermuteMap[4][16]; @@ -33,51 +32,39 @@ public: typedef typename vobj::scalar_type scalar_type; typedef typename vobj::vector_type vector_type; + ////////////////////////////////////////////////////////////////// + // Constructor requires "grid" passed. + // what about a default grid? + ////////////////////////////////////////////////////////////////// Lattice(GridBase *grid) : _grid(grid) { _odata.reserve(_grid->oSites()); assert((((uint64_t)&_odata[0])&0xF) ==0); checkerboard=0; } -#include - - template - friend void conformable(const Lattice &lhs,const Lattice &rhs); + template inline Lattice & operator = (const sobj & r){ +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + this->_odata[ss]=r; + } + return *this; + } - // FIXME Performance difference between operator * and mult is troubling. - // Auto move constructor seems to lose surprisingly much. - - // Site wise binary operations - // We eliminate a temporary object assignment if use the mult,add,sub routines. - // For the operator versions we rely on move constructor to eliminate the - // vector copy back. - template - friend void mult(Lattice &ret,const Lattice &lhs,const Lattice &rhs); - - template - friend void mac(Lattice &ret,const Lattice &lhs,const Lattice &rhs); - - template - friend void sub(Lattice &ret,const Lattice &lhs,const Lattice &rhs); - - template - friend void add(Lattice &ret,const Lattice &lhs,const Lattice &rhs); + // *=,+=,-= operators inherit behvour from correspond */+/- operation + template inline Lattice &operator *=(const T &r) { + *this = (*this)*r; + return *this; + } + template inline Lattice &operator -=(const T &r) { + *this = (*this)-r; + return *this; + } + template inline Lattice &operator +=(const T &r) { + *this = (*this)+r; + return *this; + } - friend void axpy(Lattice &ret,double a,const Lattice &lhs,const Lattice &rhs){ - conformable(lhs,rhs); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - axpy(&ret._odata[ss],a,&lhs._odata[ss],&rhs._odata[ss]); - } - } - friend void axpy(Lattice &ret,std::complex a,const Lattice &lhs,const Lattice &rhs){ - conformable(lhs,rhs); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - axpy(&ret._odata[ss],a,&lhs._odata[ss],&rhs._odata[ss]); - } - } inline friend Lattice operator / (const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); Lattice ret(lhs._grid); @@ -87,550 +74,23 @@ public: } return ret; }; - - template - inline Lattice & operator = (const sobj & r){ -#pragma omp parallel for - for(int ss=0;ss<_grid->oSites();ss++){ - this->_odata[ss]=r; - } - return *this; - } - - // Poke a scalar object into the SIMD array - template - friend void pokeSite(const sobj &s,Lattice &l,std::vector &site){ - - GridBase *grid=l._grid; - - typedef typename vobj::scalar_type scalar_type; - typedef typename vobj::vector_type vector_type; - - int Nsimd = grid->Nsimd(); - - assert( l.checkerboard== l._grid->CheckerBoard(site)); - assert( sizeof(sobj)*Nsimd == sizeof(vobj)); - - int rank,odx,idx; - grid->GlobalCoorToRankIndex(rank,odx,idx,site); - - // Optional to broadcast from node 0. - grid->Broadcast(0,s); - - std::vector buf(Nsimd); - std::vector pointers(Nsimd); - for(int i=0;i - friend void peekSite(sobj &s,Lattice &l,std::vector &site){ - - GridBase *grid=l._grid; - - typedef typename vobj::scalar_type scalar_type; - typedef typename vobj::vector_type vector_type; - - int Nsimd = grid->Nsimd(); - - assert( l.checkerboard== l._grid->CheckerBoard(site)); - assert( sizeof(sobj)*Nsimd == sizeof(vobj)); - - int rank,odx,idx; - grid->GlobalCoorToRankIndex(rank,odx,idx,site); - std::vector buf(Nsimd); - std::vector pointers(Nsimd); - for(int i=0;iBroadcast(rank,s); - - return; - }; - - // FIXME Randomise; deprecate this - friend void random(Lattice &l){ - Real *v_ptr = (Real *)&l._odata[0]; - size_t v_len = l._grid->oSites()*sizeof(vobj); - size_t d_len = v_len/sizeof(Real); - - for(int i=0;i &l){ - Real *v_ptr = (Real *)&l._odata[0]; - size_t o_len = l._grid->oSites(); - size_t v_len = sizeof(vobj)/sizeof(vRealF); - size_t vec_len = vRealF::Nsimd(); - - for(int i=0;i &l){ - // Zero mean, unit variance. - std::normal_distribution distribution(0.0,1.0); - Real *v_ptr = (Real *)&l._odata[0]; - size_t v_len = l._grid->oSites()*sizeof(vobj); - size_t d_len = v_len/sizeof(Real); - - for(int i=0;i operator -(const Lattice &r) { - Lattice ret(r._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss]= -r._odata[ss]; - } - return ret; - } - // *=,+=,-= operators inherit behvour from correspond */+/- operation - template - inline Lattice &operator *=(const T &r) { - *this = (*this)*r; - return *this; - } - template - inline Lattice &operator -=(const T &r) { - *this = (*this)-r; - return *this; - } - template - inline Lattice &operator +=(const T &r) { - *this = (*this)+r; - return *this; - } - - inline friend Lattice adj(const Lattice &lhs){ - Lattice ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = adj(lhs._odata[ss]); - } - return ret; - }; - - inline friend Lattice transpose(const Lattice &lhs){ - Lattice ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = transpose(lhs._odata[ss]); - } - return ret; - }; - - - inline friend Lattice conj(const Lattice &lhs){ - Lattice ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = conj(lhs._odata[ss]); - } - return ret; - }; - - // remove and insert a half checkerboard - friend void pickCheckerboard(int cb,Lattice &half,const Lattice &full){ - half.checkerboard = cb; - int ssh=0; -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - std::vector coor; - int cbos; - - full._grid->oCoorFromOindex(coor,ss); - cbos=half._grid->CheckerBoard(coor); - - if (cbos==cb) { - - half._odata[ssh] = full._odata[ss]; - ssh++; - } - } - } - friend void setCheckerboard(Lattice &full,const Lattice &half){ - int cb = half.checkerboard; - int ssh=0; -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - std::vector coor; - int cbos; - - full._grid->oCoorFromOindex(coor,ss); - cbos=half._grid->CheckerBoard(coor); - - if (cbos==cb) { - full._odata[ss]=half._odata[ssh]; - ssh++; - } - } - } -}; // class Lattice - - template - void conformable(const Lattice &lhs,const Lattice &rhs) - { - assert(lhs._grid == rhs._grid); - assert(lhs.checkerboard == rhs.checkerboard); - } - - template - void mult(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ - conformable(lhs,rhs); - uint32_t vec_len = lhs._grid->oSites(); -#pragma omp parallel for - for(int ss=0;ss - void mac(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ - conformable(lhs,rhs); - uint32_t vec_len = lhs._grid->oSites(); -#pragma omp parallel for - for(int ss=0;ss - void sub(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ - conformable(lhs,rhs); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - sub(&ret._odata[ss],&lhs._odata[ss],&rhs._odata[ss]); - } - } - template - void add(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ - conformable(lhs,rhs); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - add(&ret._odata[ss],&lhs._odata[ss],&rhs._odata[ss]); - } - } - - // Lattice BinOp Lattice, - template - inline auto operator * (const Lattice &lhs,const Lattice &rhs)-> Lattice - { - //NB mult performs conformable check. Do not reapply here for performance. - Lattice ret(rhs._grid); - mult(ret,lhs,rhs); - return ret; - } - template - inline auto operator + (const Lattice &lhs,const Lattice &rhs)-> Lattice - { - //NB mult performs conformable check. Do not reapply here for performance. - Lattice ret(rhs._grid); - add(ret,lhs,rhs); - return ret; - } - template - inline auto operator - (const Lattice &lhs,const Lattice &rhs)-> Lattice - { - //NB mult performs conformable check. Do not reapply here for performance. - Lattice ret(rhs._grid); - sub(ret,lhs,rhs); - return ret; - } - - // Scalar BinOp Lattice ;generate return type - template - inline auto operator * (const left &lhs,const Lattice &rhs) -> Lattice - { - Lattice ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=lhs*rhs._odata[ss]; - } - return ret; - } - template - inline auto operator + (const left &lhs,const Lattice &rhs) -> Lattice - { - Lattice ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=lhs+rhs._odata[ss]; - } - return ret; - } - template - inline auto operator - (const left &lhs,const Lattice &rhs) -> Lattice - { - Lattice ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=lhs-rhs._odata[ss]; - } - return ret; - } - template - inline auto operator * (const Lattice &lhs,const right &rhs) -> Lattice - { - Lattice ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=lhs._odata[ss]*rhs; - } - return ret; - } - template - inline auto operator + (const Lattice &lhs,const right &rhs) -> Lattice - { - Lattice ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=lhs._odata[ss]+rhs; - } - return ret; - } - template - inline auto operator - (const Lattice &lhs,const right &rhs) -> Lattice - { - Lattice ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=lhs._odata[ss]-rhs; - } - return ret; - } - - //////////////////////////////////////////////////////////////////////////////////////////////////// - // Trace - //////////////////////////////////////////////////////////////////////////////////////////////////// - template - inline auto trace(const Lattice &lhs) - -> Lattice - { - Lattice ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = trace(lhs._odata[ss]); - } - return ret; - }; - - //////////////////////////////////////////////////////////////////////////////////////////////////// - // Index level dependent operations - //////////////////////////////////////////////////////////////////////////////////////////////////// - template - inline auto traceIndex(const Lattice &lhs) - -> Lattice(lhs._odata[0]))> - { - Lattice(lhs._odata[0]))> ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = traceIndex(lhs._odata[ss]); - } - return ret; - }; - template - inline auto transposeIndex(const Lattice &lhs) - -> Lattice(lhs._odata[0]))> - { - Lattice(lhs._odata[0]))> ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = transposeIndex(lhs._odata[ss]); - } - return ret; - }; - - // Fixme; this is problematic since the number of args is variable and - // may mismatch... - template - inline auto peekIndex(const Lattice &lhs) - -> Lattice(lhs._odata[0]))> - { - Lattice(lhs._odata[0]))> ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = peekIndex(lhs._odata[ss]); - } - return ret; - }; - template - inline auto peekIndex(const Lattice &lhs,int i) - -> Lattice(lhs._odata[0],i))> - { - Lattice(lhs._odata[0],i))> ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = peekIndex(lhs._odata[ss],i); - } - return ret; - }; - template - inline auto peekIndex(const Lattice &lhs,int i,int j) - -> Lattice(lhs._odata[0],i,j))> - { - Lattice(lhs._odata[0],i,j))> ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = peekIndex(lhs._odata[ss],i,j); - } - return ret; - }; - //////////////////////////////////////////////////////////////////////////////////////////////////// - // Poke internal indices of a Lattice object - //////////////////////////////////////////////////////////////////////////////////////////////////// - template inline - void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0]))> & rhs) - { -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - pokeIndex(lhs._odata[ss],rhs._odata[ss]); - } - } - template inline - void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0],0))> & rhs,int i) - { -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - pokeIndex(lhs._odata[ss],rhs._odata[ss],i); - } - } - template inline - void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0],0,0))> & rhs,int i,int j) - { -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - pokeIndex(lhs._odata[ss],rhs._odata[ss],i,j); - } - } - - //////////////////////////////////////////////////////////////////////////////////////////////////// - // Reduction operations - //////////////////////////////////////////////////////////////////////////////////////////////////// - template - inline RealD norm2(const Lattice &arg){ - - typedef typename vobj::scalar_type scalar; - typedef typename vobj::vector_type vector; - decltype(innerProduct(arg._odata[0],arg._odata[0])) vnrm=zero; - scalar nrm; - //FIXME make this loop parallelisable - vnrm=zero; - for(int ss=0;ssoSites(); ss++){ - vnrm = vnrm + innerProduct(arg._odata[ss],arg._odata[ss]); - } - vector vvnrm =TensorRemove(vnrm) ; - nrm = Reduce(vvnrm); - arg._grid->GlobalSum(nrm); - return real(nrm); - } - - template - inline auto innerProduct(const Lattice &left,const Lattice &right) ->decltype(innerProduct(left._odata[0],right._odata[0])) - { - typedef typename vobj::scalar_type scalar; - decltype(innerProduct(left._odata[0],right._odata[0])) vnrm=zero; - - scalar nrm; - //FIXME make this loop parallelisable - for(int ss=0;ssoSites(); ss++){ - vnrm = vnrm + innerProduct(left._odata[ss],right._odata[ss]); - } - nrm = Reduce(vnrm); - right._grid->GlobalSum(nrm); - return nrm; - } - - ///////////////////////////////////////////////////// - // Non site reduced routines - ///////////////////////////////////////////////////// - - // localNorm2, - template - inline auto localNorm2 (const Lattice &rhs)-> Lattice - { - Lattice ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=innerProduct(rhs._odata[ss],rhs._odata[ss]); - } - return ret; - } - - template - inline auto real(const Lattice &z) -> Lattice - { - Lattice ret(z._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = real(z._odata[ss]); - } - return ret; - } - - template - inline auto imag(const Lattice &z) -> Lattice - { - Lattice ret(z._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = imag(z._odata[ss]); - } - return ret; - } - - // localInnerProduct - template - inline auto localInnerProduct (const Lattice &lhs,const Lattice &rhs) - -> Lattice - { - Lattice ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=innerProduct(lhs._odata[ss],rhs._odata[ss]); - } - return ret; - } - - // outerProduct Scalar x Scalar -> Scalar - // Vector x Vector -> Matrix - template - inline auto outerProduct (const Lattice &lhs,const Lattice &rhs) -> Lattice - { - Lattice ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=outerProduct(lhs._odata[ss],rhs._odata[ss]); - } - return ret; - } - - + }; // class Lattice } + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + #endif diff --git a/lib/Grid_lattice_arith.h b/lib/Grid_lattice_arith.h new file mode 100644 index 00000000..468dca79 --- /dev/null +++ b/lib/Grid_lattice_arith.h @@ -0,0 +1,160 @@ +#ifndef GRID_LATTICE_ARITH_H +#define GRID_LATTICE_ARITH_H + +namespace Grid { + + template + inline Lattice operator -(const Lattice &r) + { + Lattice ret(r._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss]= -r._odata[ss]; + } + return ret; + } + + template + inline void axpy(Lattice &ret,double a,const Lattice &lhs,const Lattice &rhs){ + conformable(lhs,rhs); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + axpy(&ret._odata[ss],a,&lhs._odata[ss],&rhs._odata[ss]); + } + } + template + inline void axpy(Lattice &ret,std::complex a,const Lattice &lhs,const Lattice &rhs){ + conformable(lhs,rhs); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + axpy(&ret._odata[ss],a,&lhs._odata[ss],&rhs._odata[ss]); + } + } + + + template + void mult(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ + conformable(lhs,rhs); + uint32_t vec_len = lhs._grid->oSites(); +#pragma omp parallel for + for(int ss=0;ss + void mac(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ + conformable(lhs,rhs); + uint32_t vec_len = lhs._grid->oSites(); +#pragma omp parallel for + for(int ss=0;ss + void sub(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ + conformable(lhs,rhs); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + sub(&ret._odata[ss],&lhs._odata[ss],&rhs._odata[ss]); + } + } + template + void add(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ + conformable(lhs,rhs); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + add(&ret._odata[ss],&lhs._odata[ss],&rhs._odata[ss]); + } + } + + // Lattice BinOp Lattice, + template + inline auto operator * (const Lattice &lhs,const Lattice &rhs)-> Lattice + { + //NB mult performs conformable check. Do not reapply here for performance. + Lattice ret(rhs._grid); + mult(ret,lhs,rhs); + return ret; + } + template + inline auto operator + (const Lattice &lhs,const Lattice &rhs)-> Lattice + { + //NB mult performs conformable check. Do not reapply here for performance. + Lattice ret(rhs._grid); + add(ret,lhs,rhs); + return ret; + } + template + inline auto operator - (const Lattice &lhs,const Lattice &rhs)-> Lattice + { + //NB mult performs conformable check. Do not reapply here for performance. + Lattice ret(rhs._grid); + sub(ret,lhs,rhs); + return ret; + } + + // Scalar BinOp Lattice ;generate return type + template + inline auto operator * (const left &lhs,const Lattice &rhs) -> Lattice + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=lhs*rhs._odata[ss]; + } + return ret; + } + template + inline auto operator + (const left &lhs,const Lattice &rhs) -> Lattice + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=lhs+rhs._odata[ss]; + } + return ret; + } + template + inline auto operator - (const left &lhs,const Lattice &rhs) -> Lattice + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=lhs-rhs._odata[ss]; + } + return ret; + } + template + inline auto operator * (const Lattice &lhs,const right &rhs) -> Lattice + { + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=lhs._odata[ss]*rhs; + } + return ret; + } + template + inline auto operator + (const Lattice &lhs,const right &rhs) -> Lattice + { + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=lhs._odata[ss]+rhs; + } + return ret; + } + template + inline auto operator - (const Lattice &lhs,const right &rhs) -> Lattice + { + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=lhs._odata[ss]-rhs; + } + return ret; + } +} +#endif diff --git a/lib/Grid_lattice_conformable.h b/lib/Grid_lattice_conformable.h new file mode 100644 index 00000000..b9af33b4 --- /dev/null +++ b/lib/Grid_lattice_conformable.h @@ -0,0 +1,14 @@ +#ifndef GRID_LATTICE_CONFORMABLE_H +#define GRID_LATTICE_CONFORMABLE_H + +namespace Grid { + + template + void conformable(const Lattice &lhs,const Lattice &rhs) + { + assert(lhs._grid == rhs._grid); + assert(lhs.checkerboard == rhs.checkerboard); + } + +} +#endif diff --git a/lib/Grid_lattice_coordinate.h b/lib/Grid_lattice_coordinate.h new file mode 100644 index 00000000..0a71ec8b --- /dev/null +++ b/lib/Grid_lattice_coordinate.h @@ -0,0 +1,45 @@ +#ifndef GRID_LATTICE_COORDINATE_H +#define GRID_LATTICE_COORDINATE_H + +namespace Grid { + + template inline void LatticeCoordinate(Lattice &l,int mu) + { + GridBase *grid = l._grid; + int Nsimd = grid->iSites(); + std::vector gcoor; + std::vector mergebuf(Nsimd); + std::vector mergeptr(Nsimd); + vInteger vI; + for(int o=0;ooSites();o++){ + for(int i=0;iiSites();i++){ + grid->RankIndexToGlobalCoor(grid->ThisRank(),o,i,gcoor); + // grid->RankIndexToGlobalCoor(0,o,i,gcoor); + mergebuf[i]=gcoor[mu]; + mergeptr[i]=&mergebuf[i]; + } + merge(vI,mergeptr); + l._odata[o]=vI; + } + }; + + // LatticeCoordinate(); + // FIXME for debug; deprecate this; made obscelete by + template void lex_sites(Lattice &l){ + Real *v_ptr = (Real *)&l._odata[0]; + size_t o_len = l._grid->oSites(); + size_t v_len = sizeof(vobj)/sizeof(vRealF); + size_t vec_len = vRealF::Nsimd(); + + for(int i=0;i + inline auto localNorm2 (const Lattice &rhs)-> Lattice + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=innerProduct(rhs._odata[ss],rhs._odata[ss]); + } + return ret; + } + + // localInnerProduct + template + inline auto localInnerProduct (const Lattice &lhs,const Lattice &rhs) + -> Lattice + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=innerProduct(lhs._odata[ss],rhs._odata[ss]); + } + return ret; + } + + // outerProduct Scalar x Scalar -> Scalar + // Vector x Vector -> Matrix + template + inline auto outerProduct (const Lattice &lhs,const Lattice &rhs) -> Lattice + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=outerProduct(lhs._odata[ss],rhs._odata[ss]); + } + return ret; + } + +} + +#endif diff --git a/lib/Grid_lattice_peekpoke.h b/lib/Grid_lattice_peekpoke.h new file mode 100644 index 00000000..41212037 --- /dev/null +++ b/lib/Grid_lattice_peekpoke.h @@ -0,0 +1,143 @@ +#ifndef GRID_LATTICE_PEEK_H +#define GRID_LATTICE_PEEK_H + +/////////////////////////////////////////////// +// Peeking and poking around +/////////////////////////////////////////////// + +namespace Grid { + + //////////////////////////////////////////////////////////////////////////////////////////////////// + // Peek internal indices of a Lattice object + //////////////////////////////////////////////////////////////////////////////////////////////////// + template + inline auto peekIndex(const Lattice &lhs) + -> Lattice(lhs._odata[0]))> + { + Lattice(lhs._odata[0]))> ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = peekIndex(lhs._odata[ss]); + } + return ret; + }; + template + inline auto peekIndex(const Lattice &lhs,int i) + -> Lattice(lhs._odata[0],i))> + { + Lattice(lhs._odata[0],i))> ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = peekIndex(lhs._odata[ss],i); + } + return ret; + }; + template + inline auto peekIndex(const Lattice &lhs,int i,int j) + -> Lattice(lhs._odata[0],i,j))> + { + Lattice(lhs._odata[0],i,j))> ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = peekIndex(lhs._odata[ss],i,j); + } + return ret; + }; + //////////////////////////////////////////////////////////////////////////////////////////////////// + // Poke internal indices of a Lattice object + //////////////////////////////////////////////////////////////////////////////////////////////////// + template inline + void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0]))> & rhs) + { +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + pokeIndex(lhs._odata[ss],rhs._odata[ss]); + } + } + template inline + void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0],0))> & rhs,int i) + { +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + pokeIndex(lhs._odata[ss],rhs._odata[ss],i); + } + } + template inline + void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0],0,0))> & rhs,int i,int j) + { +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + pokeIndex(lhs._odata[ss],rhs._odata[ss],i,j); + } + } + + ////////////////////////////////////////////////////// + // Poke a scalar object into the SIMD array + ////////////////////////////////////////////////////// + template + void pokeSite(const sobj &s,Lattice &l,std::vector &site){ + + GridBase *grid=l._grid; + + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + + int Nsimd = grid->Nsimd(); + + assert( l.checkerboard== l._grid->CheckerBoard(site)); + assert( sizeof(sobj)*Nsimd == sizeof(vobj)); + + int rank,odx,idx; + grid->GlobalCoorToRankIndex(rank,odx,idx,site); + + // Optional to broadcast from node 0. + grid->Broadcast(0,s); + + std::vector buf(Nsimd); + std::vector pointers(Nsimd); + for(int i=0;i + void peekSite(sobj &s,Lattice &l,std::vector &site){ + + GridBase *grid=l._grid; + + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + + int Nsimd = grid->Nsimd(); + + assert( l.checkerboard== l._grid->CheckerBoard(site)); + assert( sizeof(sobj)*Nsimd == sizeof(vobj)); + + int rank,odx,idx; + grid->GlobalCoorToRankIndex(rank,odx,idx,site); + std::vector buf(Nsimd); + std::vector pointers(Nsimd); + for(int i=0;iBroadcast(rank,s); + + return; + }; + +} +#endif + diff --git a/lib/Grid_lattice_reality.h b/lib/Grid_lattice_reality.h new file mode 100644 index 00000000..a3a7a27f --- /dev/null +++ b/lib/Grid_lattice_reality.h @@ -0,0 +1,52 @@ +#ifndef GRID_LATTICE_REALITY_H +#define GRID_LATTICE_REALITY_H + + +// FIXME .. this is the sector of the code +// I am most worried about the directions +// The choice of burying complex in the SIMD +// is making the use of "real" and "imag" very cumbersome + +namespace Grid { + + template inline Lattice adj(const Lattice &lhs){ + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = adj(lhs._odata[ss]); + } + return ret; + }; + + template inline Lattice conj(const Lattice &lhs){ + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = conj(lhs._odata[ss]); + } + return ret; + }; + + template inline auto real(const Lattice &z) -> Lattice + { + Lattice ret(z._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = real(z._odata[ss]); + } + return ret; + } + + template inline auto imag(const Lattice &z) -> Lattice + { + Lattice ret(z._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = imag(z._odata[ss]); + } + return ret; + } + + +} +#endif diff --git a/lib/Grid_lattice_reduction.h b/lib/Grid_lattice_reduction.h new file mode 100644 index 00000000..8167fab0 --- /dev/null +++ b/lib/Grid_lattice_reduction.h @@ -0,0 +1,45 @@ +#ifndef GRID_LATTICE_REDUCTION_H +#define GRID_LATTICE_REDUCTION_H + +namespace Grid { + + //////////////////////////////////////////////////////////////////////////////////////////////////// + // Reduction operations + //////////////////////////////////////////////////////////////////////////////////////////////////// + template + inline RealD norm2(const Lattice &arg){ + + typedef typename vobj::scalar_type scalar; + typedef typename vobj::vector_type vector; + decltype(innerProduct(arg._odata[0],arg._odata[0])) vnrm=zero; + scalar nrm; + //FIXME make this loop parallelisable + vnrm=zero; + for(int ss=0;ssoSites(); ss++){ + vnrm = vnrm + innerProduct(arg._odata[ss],arg._odata[ss]); + } + vector vvnrm =TensorRemove(vnrm) ; + nrm = Reduce(vvnrm); + arg._grid->GlobalSum(nrm); + return real(nrm); + } + + template + inline auto innerProduct(const Lattice &left,const Lattice &right) ->decltype(innerProduct(left._odata[0],right._odata[0])) + { + typedef typename vobj::scalar_type scalar; + decltype(innerProduct(left._odata[0],right._odata[0])) vnrm=zero; + + scalar nrm; + //FIXME make this loop parallelisable + for(int ss=0;ssoSites(); ss++){ + vnrm = vnrm + innerProduct(left._odata[ss],right._odata[ss]); + } + nrm = Reduce(vnrm); + right._grid->GlobalSum(nrm); + return nrm; + } + +} +#endif + diff --git a/lib/Grid_lattice_rng.h b/lib/Grid_lattice_rng.h new file mode 100644 index 00000000..636bfb72 --- /dev/null +++ b/lib/Grid_lattice_rng.h @@ -0,0 +1,32 @@ +#ifndef GRID_LATTICE_RNG_H +#define GRID_LATTICE_RNG_H + +namespace Grid { + + // FIXME Randomise; deprecate this + template inline void random(Lattice &l){ + Real *v_ptr = (Real *)&l._odata[0]; + size_t v_len = l._grid->oSites()*sizeof(vobj); + size_t d_len = v_len/sizeof(Real); + + for(int i=0;i inline void gaussian(Lattice &l){ + // Zero mean, unit variance. + std::normal_distribution distribution(0.0,1.0); + Real *v_ptr = (Real *)&l._odata[0]; + size_t v_len = l._grid->oSites()*sizeof(vobj); + size_t d_len = v_len/sizeof(Real); + + for(int i=0;i + inline auto trace(const Lattice &lhs) + -> Lattice + { + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = trace(lhs._odata[ss]); + } + return ret; + }; + + //////////////////////////////////////////////////////////////////////////////////////////////////// + // Trace Index level dependent operation + //////////////////////////////////////////////////////////////////////////////////////////////////// + template + inline auto traceIndex(const Lattice &lhs) + -> Lattice(lhs._odata[0]))> + { + Lattice(lhs._odata[0]))> ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = traceIndex(lhs._odata[ss]); + } + return ret; + }; + + +} +#endif + diff --git a/lib/Grid_lattice_transfer.h b/lib/Grid_lattice_transfer.h new file mode 100644 index 00000000..ecb3016a --- /dev/null +++ b/lib/Grid_lattice_transfer.h @@ -0,0 +1,46 @@ +#ifndef GRID_LATTICE_TRANSFER_H +#define GRID_LATTICE_TRANSFER_H + +namespace Grid { + + //////////////////////////////////////////////////////////////////////////////////////////// + // remove and insert a half checkerboard + //////////////////////////////////////////////////////////////////////////////////////////// + template inline void pickCheckerboard(int cb,Lattice &half,const Lattice &full){ + half.checkerboard = cb; + int ssh=0; +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + std::vector coor; + int cbos; + + full._grid->oCoorFromOindex(coor,ss); + cbos=half._grid->CheckerBoard(coor); + + if (cbos==cb) { + + half._odata[ssh] = full._odata[ss]; + ssh++; + } + } + } + template inline void setCheckerboard(Lattice &full,const Lattice &half){ + int cb = half.checkerboard; + int ssh=0; +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + std::vector coor; + int cbos; + + full._grid->oCoorFromOindex(coor,ss); + cbos=half._grid->CheckerBoard(coor); + + if (cbos==cb) { + full._odata[ss]=half._odata[ssh]; + ssh++; + } + } + } + +} +#endif diff --git a/lib/Grid_lattice_transpose.h b/lib/Grid_lattice_transpose.h new file mode 100644 index 00000000..7166d2b5 --- /dev/null +++ b/lib/Grid_lattice_transpose.h @@ -0,0 +1,39 @@ +#ifndef GRID_LATTICE_TRANSPOSE_H +#define GRID_LATTICE_TRANSPOSE_H + +/////////////////////////////////////////////// +// Transpose +/////////////////////////////////////////////// + +namespace Grid { + + //////////////////////////////////////////////////////////////////////////////////////////////////// + // Transpose + //////////////////////////////////////////////////////////////////////////////////////////////////// + template + inline Lattice transpose(const Lattice &lhs){ + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = transpose(lhs._odata[ss]); + } + return ret; + }; + + //////////////////////////////////////////////////////////////////////////////////////////////////// + // Index level dependent transpose + //////////////////////////////////////////////////////////////////////////////////////////////////// + template + inline auto transposeIndex(const Lattice &lhs) + -> Lattice(lhs._odata[0]))> + { + Lattice(lhs._odata[0]))> ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = transposeIndex(lhs._odata[ss]); + } + return ret; + }; + +} +#endif diff --git a/lib/Grid_predicated.h b/lib/Grid_where.h similarity index 77% rename from lib/Grid_predicated.h rename to lib/Grid_where.h index c6f29204..3a7052ad 100644 --- a/lib/Grid_predicated.h +++ b/lib/Grid_where.h @@ -1,14 +1,14 @@ -#ifndef GRID_PREDICATED_H -#define GRID_PREDICATED_H - +#ifndef GRID_WHERE_H +#define GRID_WHERE_H +namespace Grid { // Must implement the predicate gating the // Must be able to reduce the predicate down to a single vInteger per site. // Must be able to require the type be iScalar x iScalar x .... // give a GetVtype method in iScalar // and blow away the tensor structures. // -template -inline void where(Lattice &ret,const LatticeInteger &predicate,Lattice &iftrue,Lattice &iffalse) +template +inline void where(Lattice &ret,const Lattice &predicate,Lattice &iftrue,Lattice &iffalse) { conformable(iftrue,iffalse); conformable(iftrue,predicate); @@ -17,6 +17,7 @@ inline void where(Lattice &ret,const LatticeInteger &predicate,LatticeNsimd(); const int words = sizeof(vobj)/sizeof(vector_type); @@ -35,7 +36,7 @@ inline void where(Lattice &ret,const LatticeInteger &predicate,Lattice &ret,const LatticeInteger &predicate,Lattice -inline Lattice where(const LatticeInteger &predicate,Lattice &iftrue,Lattice &iffalse) +template +inline Lattice where(const Lattice &predicate,Lattice &iftrue,Lattice &iffalse) { conformable(iftrue,iffalse); conformable(iftrue,predicate); @@ -58,5 +59,5 @@ inline Lattice where(const LatticeInteger &predicate,Lattice &iftrue return ret; } - +} #endif From e6ec92d0e48f9d8c49f77ec38c75afd6ebd12124 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 20:45:00 +0100 Subject: [PATCH 076/429] More files, shorter each. --- lib/Makefile.am | 31 ++++++++++++++++++++++++++----- tests/Makefile.am | 1 - 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/lib/Makefile.am b/lib/Makefile.am index 93625c68..dab5c6d3 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -1,7 +1,6 @@ # additional include paths necessary to compile the C++ library AM_CXXFLAGS = -I$(top_srcdir)/ - extra_sources= if BUILD_COMMS_MPI extra_sources+=Grid_communicator_mpi.cc @@ -21,7 +20,7 @@ libGrid_a_SOURCES = Grid_init.cc $(extra_sources) # # Include files # -include_HEADERS = Grid_config.h\ +include_HEADERS =\ Grid.h\ Grid_QCD.h\ Grid_aligned_allocator.h\ @@ -37,11 +36,33 @@ include_HEADERS = Grid_config.h\ Grid_cshift_mpi.h\ Grid_cshift_none.h\ Grid_lattice.h\ + Grid_lattice_arith.h\ + Grid_lattice_conformable.h\ + Grid_lattice_coordinate.h\ + Grid_lattice_local.h\ + Grid_lattice_peekpoke.h\ + Grid_lattice_reality.h\ + Grid_lattice_reduction.h + Grid_lattice_rng.h\ + Grid_lattice_trace.h\ + Grid_lattice_transfer.h\ + Grid_lattice_transpose.h\ Grid_math.h\ Grid_math_arith.h\ + Grid_math_arith_add.h\ + Grid_math_arith_mac.h\ + Grid_math_arith_mul.h\ + Grid_math_arith_scalar.h\ + Grid_math_arith_sub.h\ + Grid_math_inner.h\ + Grid_math_outer.h\ + Grid_math_peek.h\ + Grid_math_poke.h\ + Grid_math_reality.h\ Grid_math_tensors.h\ + Grid_math_trace.h\ Grid_math_traits.h\ - Grid_predicated.h\ + Grid_math_transpose.h\ Grid_simd.h\ Grid_stencil.h\ Grid_summation.h\ @@ -49,7 +70,7 @@ include_HEADERS = Grid_config.h\ Grid_vComplexF.h\ Grid_vInteger.h\ Grid_vRealD.h\ - Grid_vRealF.h - + Grid_vRealF.h\ + Grid_where.h diff --git a/tests/Makefile.am b/tests/Makefile.am index 2bf8cd1a..ec0703b1 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -12,4 +12,3 @@ Grid_main_LDADD = -lGrid test_Grid_stencil_SOURCES = test_Grid_stencil.cc test_Grid_stencil_LDADD = -lGrid - From a17ce0695b78c597266581fbd2e47514b9311d89 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 20:52:40 +0100 Subject: [PATCH 077/429] Clean up --- Makefile.in | 616 +++++++++++++++++++++++++++++----------------------- TODO | 12 + 2 files changed, 358 insertions(+), 270 deletions(-) diff --git a/Makefile.in b/Makefile.in index 3ca9a01f..99b67fff 100644 --- a/Makefile.in +++ b/Makefile.in @@ -13,8 +13,6 @@ # PARTICULAR PURPOSE. @SET_MAKE@ - - VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ @@ -87,68 +85,19 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : -@BUILD_COMMS_MPI_TRUE@am__append_1 = Grid_communicator_mpi.cc \ -@BUILD_COMMS_MPI_TRUE@ Grid_stencil_common.cc -@BUILD_COMMS_NONE_TRUE@am__append_2 = Grid_communicator_fake.cc \ -@BUILD_COMMS_NONE_TRUE@ Grid_stencil_common.cc -subdir = lib +subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ - $(am__DIST_COMMON) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = Grid_config.h +CONFIG_HEADER = $(top_builddir)/lib/Grid_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" -LIBRARIES = $(lib_LIBRARIES) -AR = ar -ARFLAGS = cru -AM_V_AR = $(am__v_AR_@AM_V@) -am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) -am__v_AR_0 = @echo " AR " $@; -am__v_AR_1 = -libGrid_a_AR = $(AR) $(ARFLAGS) -libGrid_a_LIBADD = -am__libGrid_a_SOURCES_DIST = Grid_init.cc Grid_communicator_mpi.cc \ - Grid_stencil_common.cc Grid_communicator_fake.cc -@BUILD_COMMS_MPI_TRUE@am__objects_1 = Grid_communicator_mpi.$(OBJEXT) \ -@BUILD_COMMS_MPI_TRUE@ Grid_stencil_common.$(OBJEXT) -@BUILD_COMMS_NONE_TRUE@am__objects_2 = \ -@BUILD_COMMS_NONE_TRUE@ Grid_communicator_fake.$(OBJEXT) \ -@BUILD_COMMS_NONE_TRUE@ Grid_stencil_common.$(OBJEXT) -am__objects_3 = $(am__objects_1) $(am__objects_2) -am_libGrid_a_OBJECTS = Grid_init.$(OBJEXT) $(am__objects_3) -libGrid_a_OBJECTS = $(am_libGrid_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false @@ -161,33 +110,30 @@ AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -AM_V_CXX = $(am__v_CXX_@AM_V@) -am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) -am__v_CXX_0 = @echo " CXX " $@; -am__v_CXX_1 = -CXXLD = $(CXX) -CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ - -o $@ -AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) -am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) -am__v_CXXLD_0 = @echo " CXXLD " $@; -am__v_CXXLD_1 = -SOURCES = $(libGrid_a_SOURCES) -DIST_SOURCES = $(am__libGrid_a_SOURCES_DIST) +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac -HEADERS = $(include_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ - $(LISP)Grid_config.h.in +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. @@ -206,9 +152,52 @@ am__define_uniq_tagged_files = \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags -am__DIST_COMMON = $(srcdir)/Grid_config.h.in $(srcdir)/Makefile.in \ - $(top_srcdir)/depcomp +CSCOPE = cscope +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING ChangeLog \ + INSTALL NEWS README TODO compile depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ @@ -305,176 +294,99 @@ top_srcdir = @top_srcdir@ # additional include paths necessary to compile the C++ library AM_CXXFLAGS = -I$(top_srcdir)/ -extra_sources = $(am__append_1) $(am__append_2) - -# -# Libraries -# -lib_LIBRARIES = libGrid.a -libGrid_a_SOURCES = Grid_init.cc $(extra_sources) - -# -# Include files -# -include_HEADERS = Grid_config.h\ - Grid.h\ - Grid_simd.h\ - Grid_vComplexD.h\ - Grid_vComplexF.h\ - Grid_vRealD.h\ - Grid_vRealF.h\ - Grid_Cartesian.h\ - Grid_Lattice.h\ - Grid_Communicator.h\ - Grid_QCD.h\ - Grid_aligned_allocator.h\ - Grid_cshift.h\ - Grid_cshift_common.h\ - Grid_cshift_mpi.h\ - Grid_cshift_none.h\ - Grid_stencil.h\ - Grid_math_types.h - -all: Grid_config.h - $(MAKE) $(AM_MAKEFLAGS) all-am +SUBDIRS = lib tests +all: all-recursive .SUFFIXES: -.SUFFIXES: .cc .o .obj +am--refresh: Makefile + @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu lib/Makefile + $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): -Grid_config.h: stamp-h1 - @test -f $@ || rm -f stamp-h1 - @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 - -stamp-h1: $(srcdir)/Grid_config.h.in $(top_builddir)/config.status - @rm -f stamp-h1 - cd $(top_builddir) && $(SHELL) ./config.status lib/Grid_config.h -$(srcdir)/Grid_config.h.in: $(am__configure_deps) - ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) - rm -f stamp-h1 - touch $@ - -distclean-hdr: - -rm -f Grid_config.h stamp-h1 -install-libLIBRARIES: $(lib_LIBRARIES) - @$(NORMAL_INSTALL) - @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ - echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \ - $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; } - @$(POST_INSTALL) - @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ - for p in $$list; do \ - if test -f $$p; then \ - $(am__strip_dir) \ - echo " ( cd '$(DESTDIR)$(libdir)' && $(RANLIB) $$f )"; \ - ( cd "$(DESTDIR)$(libdir)" && $(RANLIB) $$f ) || exit $$?; \ - else :; fi; \ - done - -uninstall-libLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(libdir)'; $(am__uninstall_files_from_dir) - -clean-libLIBRARIES: - -test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES) - -libGrid.a: $(libGrid_a_OBJECTS) $(libGrid_a_DEPENDENCIES) $(EXTRA_libGrid_a_DEPENDENCIES) - $(AM_V_at)-rm -f libGrid.a - $(AM_V_AR)$(libGrid_a_AR) libGrid.a $(libGrid_a_OBJECTS) $(libGrid_a_LIBADD) - $(AM_V_at)$(RANLIB) libGrid.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_communicator_fake.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_communicator_mpi.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_init.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Grid_stencil_common.Po@am__quote@ - -.cc.o: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< - -.cc.obj: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` -install-includeHEADERS: $(include_HEADERS) - @$(NORMAL_INSTALL) - @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ - done - -uninstall-includeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am +tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ @@ -487,7 +399,7 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $$unique; \ fi; \ fi -ctags: ctags-am +ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) @@ -500,7 +412,13 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ @@ -518,8 +436,11 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -549,22 +470,176 @@ distdir: $(DISTFILES) || exit 1; \ fi; \ done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) $(HEADERS) Grid_config.h -installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -installcheck: installcheck-am +installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ @@ -586,90 +661,91 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -clean: clean-am +clean: clean-recursive -clean-am: clean-generic clean-libLIBRARIES mostlyclean-am +clean-am: clean-generic mostlyclean-am -distclean: distclean-am - -rm -rf ./$(DEPDIR) +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-hdr distclean-tags +distclean-am: clean-am distclean-generic distclean-tags -dvi: dvi-am +dvi: dvi-recursive dvi-am: -html: html-am +html: html-recursive html-am: -info: info-am +info: info-recursive info-am: -install-data-am: install-includeHEADERS +install-data-am: -install-dvi: install-dvi-am +install-dvi: install-dvi-recursive install-dvi-am: -install-exec-am: install-libLIBRARIES +install-exec-am: -install-html: install-html-am +install-html: install-html-recursive install-html-am: -install-info: install-info-am +install-info: install-info-recursive install-info-am: install-man: -install-pdf: install-pdf-am +install-pdf: install-pdf-recursive install-pdf-am: -install-ps: install-ps-am +install-ps: install-ps-recursive install-ps-am: installcheck-am: -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic -mostlyclean: mostlyclean-am +mostlyclean: mostlyclean-recursive -mostlyclean-am: mostlyclean-compile mostlyclean-generic +mostlyclean-am: mostlyclean-generic -pdf: pdf-am +pdf: pdf-recursive pdf-am: -ps: ps-am +ps: ps-recursive ps-am: -uninstall-am: uninstall-includeHEADERS uninstall-libLIBRARIES +uninstall-am: -.MAKE: all install-am install-strip +.MAKE: $(am__recursive_targets) install-am install-strip -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libLIBRARIES cscopelist-am ctags ctags-am distclean \ - distclean-compile distclean-generic distclean-hdr \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-includeHEADERS install-info \ - install-info-am install-libLIBRARIES install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-includeHEADERS uninstall-libLIBRARIES +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ + distcheck distclean distclean-generic distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile diff --git a/TODO b/TODO index bfe506f7..ee0e0aeb 100644 --- a/TODO +++ b/TODO @@ -10,6 +10,18 @@ FUNCTIONALITY: * How to do U[mu] ... lorentz part of type structure or not. more like chroma if not. -- DONE * subdirs lib, tests ?? ----- DONE + - lib/math + - lib/cartesian + - lib/cshift + - lib/stencil + - lib/communicator + - lib/algorithms + - lib/fileio + + - lib/qcd + - lib/qcd/actions + - lib/qcd/measurements + - lib/qcd/ Not done, or just incomplete From aee6669d0baeb1eb5118d82a915ab9b752cbfad5 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 21:22:50 +0100 Subject: [PATCH 078/429] Build reorg with which I am a bit happier --- lib/{ => cartesian}/Grid_cartesian_base.h | 0 lib/{ => cartesian}/Grid_cartesian_full.h | 0 lib/{ => cartesian}/Grid_cartesian_red_black.h | 0 lib/{ => communicator}/Grid_communicator_fake.cc | 0 lib/{ => communicator}/Grid_communicator_mpi.cc | 0 lib/{ => cshift}/Grid_cshift_common.h | 0 lib/{ => cshift}/Grid_cshift_mpi.h | 0 lib/{ => cshift}/Grid_cshift_none.h | 0 lib/{ => lattice}/Grid_lattice_arith.h | 0 lib/{ => lattice}/Grid_lattice_conformable.h | 0 lib/{ => lattice}/Grid_lattice_coordinate.h | 0 lib/{ => lattice}/Grid_lattice_local.h | 0 lib/{ => lattice}/Grid_lattice_peekpoke.h | 0 lib/{ => lattice}/Grid_lattice_reality.h | 0 lib/{ => lattice}/Grid_lattice_reduction.h | 0 lib/{ => lattice}/Grid_lattice_rng.h | 0 lib/{ => lattice}/Grid_lattice_trace.h | 0 lib/{ => lattice}/Grid_lattice_transfer.h | 0 lib/{ => lattice}/Grid_lattice_transpose.h | 0 lib/{ => math}/Grid_math_arith.h | 0 lib/{ => math}/Grid_math_arith_add.h | 0 lib/{ => math}/Grid_math_arith_mac.h | 0 lib/{ => math}/Grid_math_arith_mul.h | 0 lib/{ => math}/Grid_math_arith_scalar.h | 0 lib/{ => math}/Grid_math_arith_sub.h | 0 lib/{ => math}/Grid_math_inner.h | 0 lib/{ => math}/Grid_math_outer.h | 0 lib/{ => math}/Grid_math_peek.h | 0 lib/{ => math}/Grid_math_poke.h | 0 lib/{ => math}/Grid_math_reality.h | 0 lib/{ => math}/Grid_math_tensors.h | 0 lib/{ => math}/Grid_math_trace.h | 0 lib/{ => math}/Grid_math_traits.h | 0 lib/{ => math}/Grid_math_transpose.h | 0 lib/{ => qcd}/Grid_QCD.h | 0 lib/{ => simd}/Grid_vComplexD.h | 0 lib/{ => simd}/Grid_vComplexF.h | 0 lib/{ => simd}/Grid_vInteger.h | 0 lib/{ => simd}/Grid_vRealD.h | 0 lib/{ => simd}/Grid_vRealF.h | 0 lib/{ => stencil}/Grid_stencil_common.cc | 0 41 files changed, 0 insertions(+), 0 deletions(-) rename lib/{ => cartesian}/Grid_cartesian_base.h (100%) rename lib/{ => cartesian}/Grid_cartesian_full.h (100%) rename lib/{ => cartesian}/Grid_cartesian_red_black.h (100%) rename lib/{ => communicator}/Grid_communicator_fake.cc (100%) rename lib/{ => communicator}/Grid_communicator_mpi.cc (100%) rename lib/{ => cshift}/Grid_cshift_common.h (100%) rename lib/{ => cshift}/Grid_cshift_mpi.h (100%) rename lib/{ => cshift}/Grid_cshift_none.h (100%) rename lib/{ => lattice}/Grid_lattice_arith.h (100%) rename lib/{ => lattice}/Grid_lattice_conformable.h (100%) rename lib/{ => lattice}/Grid_lattice_coordinate.h (100%) rename lib/{ => lattice}/Grid_lattice_local.h (100%) rename lib/{ => lattice}/Grid_lattice_peekpoke.h (100%) rename lib/{ => lattice}/Grid_lattice_reality.h (100%) rename lib/{ => lattice}/Grid_lattice_reduction.h (100%) rename lib/{ => lattice}/Grid_lattice_rng.h (100%) rename lib/{ => lattice}/Grid_lattice_trace.h (100%) rename lib/{ => lattice}/Grid_lattice_transfer.h (100%) rename lib/{ => lattice}/Grid_lattice_transpose.h (100%) rename lib/{ => math}/Grid_math_arith.h (100%) rename lib/{ => math}/Grid_math_arith_add.h (100%) rename lib/{ => math}/Grid_math_arith_mac.h (100%) rename lib/{ => math}/Grid_math_arith_mul.h (100%) rename lib/{ => math}/Grid_math_arith_scalar.h (100%) rename lib/{ => math}/Grid_math_arith_sub.h (100%) rename lib/{ => math}/Grid_math_inner.h (100%) rename lib/{ => math}/Grid_math_outer.h (100%) rename lib/{ => math}/Grid_math_peek.h (100%) rename lib/{ => math}/Grid_math_poke.h (100%) rename lib/{ => math}/Grid_math_reality.h (100%) rename lib/{ => math}/Grid_math_tensors.h (100%) rename lib/{ => math}/Grid_math_trace.h (100%) rename lib/{ => math}/Grid_math_traits.h (100%) rename lib/{ => math}/Grid_math_transpose.h (100%) rename lib/{ => qcd}/Grid_QCD.h (100%) rename lib/{ => simd}/Grid_vComplexD.h (100%) rename lib/{ => simd}/Grid_vComplexF.h (100%) rename lib/{ => simd}/Grid_vInteger.h (100%) rename lib/{ => simd}/Grid_vRealD.h (100%) rename lib/{ => simd}/Grid_vRealF.h (100%) rename lib/{ => stencil}/Grid_stencil_common.cc (100%) diff --git a/lib/Grid_cartesian_base.h b/lib/cartesian/Grid_cartesian_base.h similarity index 100% rename from lib/Grid_cartesian_base.h rename to lib/cartesian/Grid_cartesian_base.h diff --git a/lib/Grid_cartesian_full.h b/lib/cartesian/Grid_cartesian_full.h similarity index 100% rename from lib/Grid_cartesian_full.h rename to lib/cartesian/Grid_cartesian_full.h diff --git a/lib/Grid_cartesian_red_black.h b/lib/cartesian/Grid_cartesian_red_black.h similarity index 100% rename from lib/Grid_cartesian_red_black.h rename to lib/cartesian/Grid_cartesian_red_black.h diff --git a/lib/Grid_communicator_fake.cc b/lib/communicator/Grid_communicator_fake.cc similarity index 100% rename from lib/Grid_communicator_fake.cc rename to lib/communicator/Grid_communicator_fake.cc diff --git a/lib/Grid_communicator_mpi.cc b/lib/communicator/Grid_communicator_mpi.cc similarity index 100% rename from lib/Grid_communicator_mpi.cc rename to lib/communicator/Grid_communicator_mpi.cc diff --git a/lib/Grid_cshift_common.h b/lib/cshift/Grid_cshift_common.h similarity index 100% rename from lib/Grid_cshift_common.h rename to lib/cshift/Grid_cshift_common.h diff --git a/lib/Grid_cshift_mpi.h b/lib/cshift/Grid_cshift_mpi.h similarity index 100% rename from lib/Grid_cshift_mpi.h rename to lib/cshift/Grid_cshift_mpi.h diff --git a/lib/Grid_cshift_none.h b/lib/cshift/Grid_cshift_none.h similarity index 100% rename from lib/Grid_cshift_none.h rename to lib/cshift/Grid_cshift_none.h diff --git a/lib/Grid_lattice_arith.h b/lib/lattice/Grid_lattice_arith.h similarity index 100% rename from lib/Grid_lattice_arith.h rename to lib/lattice/Grid_lattice_arith.h diff --git a/lib/Grid_lattice_conformable.h b/lib/lattice/Grid_lattice_conformable.h similarity index 100% rename from lib/Grid_lattice_conformable.h rename to lib/lattice/Grid_lattice_conformable.h diff --git a/lib/Grid_lattice_coordinate.h b/lib/lattice/Grid_lattice_coordinate.h similarity index 100% rename from lib/Grid_lattice_coordinate.h rename to lib/lattice/Grid_lattice_coordinate.h diff --git a/lib/Grid_lattice_local.h b/lib/lattice/Grid_lattice_local.h similarity index 100% rename from lib/Grid_lattice_local.h rename to lib/lattice/Grid_lattice_local.h diff --git a/lib/Grid_lattice_peekpoke.h b/lib/lattice/Grid_lattice_peekpoke.h similarity index 100% rename from lib/Grid_lattice_peekpoke.h rename to lib/lattice/Grid_lattice_peekpoke.h diff --git a/lib/Grid_lattice_reality.h b/lib/lattice/Grid_lattice_reality.h similarity index 100% rename from lib/Grid_lattice_reality.h rename to lib/lattice/Grid_lattice_reality.h diff --git a/lib/Grid_lattice_reduction.h b/lib/lattice/Grid_lattice_reduction.h similarity index 100% rename from lib/Grid_lattice_reduction.h rename to lib/lattice/Grid_lattice_reduction.h diff --git a/lib/Grid_lattice_rng.h b/lib/lattice/Grid_lattice_rng.h similarity index 100% rename from lib/Grid_lattice_rng.h rename to lib/lattice/Grid_lattice_rng.h diff --git a/lib/Grid_lattice_trace.h b/lib/lattice/Grid_lattice_trace.h similarity index 100% rename from lib/Grid_lattice_trace.h rename to lib/lattice/Grid_lattice_trace.h diff --git a/lib/Grid_lattice_transfer.h b/lib/lattice/Grid_lattice_transfer.h similarity index 100% rename from lib/Grid_lattice_transfer.h rename to lib/lattice/Grid_lattice_transfer.h diff --git a/lib/Grid_lattice_transpose.h b/lib/lattice/Grid_lattice_transpose.h similarity index 100% rename from lib/Grid_lattice_transpose.h rename to lib/lattice/Grid_lattice_transpose.h diff --git a/lib/Grid_math_arith.h b/lib/math/Grid_math_arith.h similarity index 100% rename from lib/Grid_math_arith.h rename to lib/math/Grid_math_arith.h diff --git a/lib/Grid_math_arith_add.h b/lib/math/Grid_math_arith_add.h similarity index 100% rename from lib/Grid_math_arith_add.h rename to lib/math/Grid_math_arith_add.h diff --git a/lib/Grid_math_arith_mac.h b/lib/math/Grid_math_arith_mac.h similarity index 100% rename from lib/Grid_math_arith_mac.h rename to lib/math/Grid_math_arith_mac.h diff --git a/lib/Grid_math_arith_mul.h b/lib/math/Grid_math_arith_mul.h similarity index 100% rename from lib/Grid_math_arith_mul.h rename to lib/math/Grid_math_arith_mul.h diff --git a/lib/Grid_math_arith_scalar.h b/lib/math/Grid_math_arith_scalar.h similarity index 100% rename from lib/Grid_math_arith_scalar.h rename to lib/math/Grid_math_arith_scalar.h diff --git a/lib/Grid_math_arith_sub.h b/lib/math/Grid_math_arith_sub.h similarity index 100% rename from lib/Grid_math_arith_sub.h rename to lib/math/Grid_math_arith_sub.h diff --git a/lib/Grid_math_inner.h b/lib/math/Grid_math_inner.h similarity index 100% rename from lib/Grid_math_inner.h rename to lib/math/Grid_math_inner.h diff --git a/lib/Grid_math_outer.h b/lib/math/Grid_math_outer.h similarity index 100% rename from lib/Grid_math_outer.h rename to lib/math/Grid_math_outer.h diff --git a/lib/Grid_math_peek.h b/lib/math/Grid_math_peek.h similarity index 100% rename from lib/Grid_math_peek.h rename to lib/math/Grid_math_peek.h diff --git a/lib/Grid_math_poke.h b/lib/math/Grid_math_poke.h similarity index 100% rename from lib/Grid_math_poke.h rename to lib/math/Grid_math_poke.h diff --git a/lib/Grid_math_reality.h b/lib/math/Grid_math_reality.h similarity index 100% rename from lib/Grid_math_reality.h rename to lib/math/Grid_math_reality.h diff --git a/lib/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h similarity index 100% rename from lib/Grid_math_tensors.h rename to lib/math/Grid_math_tensors.h diff --git a/lib/Grid_math_trace.h b/lib/math/Grid_math_trace.h similarity index 100% rename from lib/Grid_math_trace.h rename to lib/math/Grid_math_trace.h diff --git a/lib/Grid_math_traits.h b/lib/math/Grid_math_traits.h similarity index 100% rename from lib/Grid_math_traits.h rename to lib/math/Grid_math_traits.h diff --git a/lib/Grid_math_transpose.h b/lib/math/Grid_math_transpose.h similarity index 100% rename from lib/Grid_math_transpose.h rename to lib/math/Grid_math_transpose.h diff --git a/lib/Grid_QCD.h b/lib/qcd/Grid_QCD.h similarity index 100% rename from lib/Grid_QCD.h rename to lib/qcd/Grid_QCD.h diff --git a/lib/Grid_vComplexD.h b/lib/simd/Grid_vComplexD.h similarity index 100% rename from lib/Grid_vComplexD.h rename to lib/simd/Grid_vComplexD.h diff --git a/lib/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h similarity index 100% rename from lib/Grid_vComplexF.h rename to lib/simd/Grid_vComplexF.h diff --git a/lib/Grid_vInteger.h b/lib/simd/Grid_vInteger.h similarity index 100% rename from lib/Grid_vInteger.h rename to lib/simd/Grid_vInteger.h diff --git a/lib/Grid_vRealD.h b/lib/simd/Grid_vRealD.h similarity index 100% rename from lib/Grid_vRealD.h rename to lib/simd/Grid_vRealD.h diff --git a/lib/Grid_vRealF.h b/lib/simd/Grid_vRealF.h similarity index 100% rename from lib/Grid_vRealF.h rename to lib/simd/Grid_vRealF.h diff --git a/lib/Grid_stencil_common.cc b/lib/stencil/Grid_stencil_common.cc similarity index 100% rename from lib/Grid_stencil_common.cc rename to lib/stencil/Grid_stencil_common.cc From 62fec044193331356c082433d3a3624bd62f322e Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 21:23:32 +0100 Subject: [PATCH 079/429] Reorganisation --- configure.ac | 2 +- lib/Grid.h | 4 +++- lib/Grid_cartesian.h | 6 +++--- lib/Grid_cshift.h | 9 +++++---- lib/Grid_lattice.h | 24 +++++++++++------------- lib/Grid_math.h | 20 ++++++++++---------- lib/Grid_simd.h | 10 +++++----- lib/math/Grid_math_arith.h | 10 +++++----- 8 files changed, 43 insertions(+), 42 deletions(-) diff --git a/configure.ac b/configure.ac index 07c1974e..97fdbf85 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ # Process this file with autoconf to produce a configure script. AC_INIT([Grid], [1.0], [paboyle@ph.ed.ac.uk]) -AM_INIT_AUTOMAKE +AM_INIT_AUTOMAKE(subdir-objects) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([lib/Grid.h]) AC_CONFIG_HEADERS([lib/Grid_config.h]) diff --git a/lib/Grid.h b/lib/Grid.h index 093302cb..c456bf8a 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -47,8 +47,10 @@ #include #include #include +#include +#include #include -#include +#include namespace Grid { diff --git a/lib/Grid_cartesian.h b/lib/Grid_cartesian.h index dbac98a8..c01be20a 100644 --- a/lib/Grid_cartesian.h +++ b/lib/Grid_cartesian.h @@ -1,8 +1,8 @@ #ifndef GRID_CARTESIAN_H #define GRID_CARTESIAN_H -#include -#include -#include +#include +#include +#include #endif diff --git a/lib/Grid_cshift.h b/lib/Grid_cshift.h index 2df2370e..1c601b7d 100644 --- a/lib/Grid_cshift.h +++ b/lib/Grid_cshift.h @@ -1,16 +1,17 @@ #ifndef _GRID_CSHIFT_H_ #define _GRID_CSHIFT_H_ -#include + +#include #ifdef GRID_COMMS_NONE -#include +#include #endif #ifdef GRID_COMMS_FAKE -#include +#include #endif #ifdef GRID_COMMS_MPI -#include +#include #endif #endif diff --git a/lib/Grid_lattice.h b/lib/Grid_lattice.h index cc115c3c..03bacf2d 100644 --- a/lib/Grid_lattice.h +++ b/lib/Grid_lattice.h @@ -77,19 +77,17 @@ public: }; // class Lattice } -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/lib/Grid_math.h b/lib/Grid_math.h index b1e04c19..17bc09a5 100644 --- a/lib/Grid_math.h +++ b/lib/Grid_math.h @@ -1,16 +1,16 @@ #ifndef GRID_MATH_H #define GRID_MATH_H -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #endif diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index dbde0fd7..9bf10fc9 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -229,11 +229,11 @@ inline void Gpermute(vsimd &y,const vsimd &b,int perm){ }; }; -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include namespace Grid { diff --git a/lib/math/Grid_math_arith.h b/lib/math/Grid_math_arith.h index e7b6b4ac..ca90ba88 100644 --- a/lib/math/Grid_math_arith.h +++ b/lib/math/Grid_math_arith.h @@ -1,11 +1,11 @@ #ifndef GRID_MATH_ARITH_H #define GRID_MATH_ARITH_H -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #endif From 1556c2ba3f38d98145a162ad021a6946bb4e913e Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 21:24:10 +0100 Subject: [PATCH 080/429] Finishing the reorg --- lib/Grid_init.cc | 0 lib/Makefile.am | 85 +++++++++++++++++++++++----------------------- tests/Grid_main.cc | 2 +- 3 files changed, 44 insertions(+), 43 deletions(-) mode change 100755 => 100644 lib/Grid_init.cc diff --git a/lib/Grid_init.cc b/lib/Grid_init.cc old mode 100755 new mode 100644 diff --git a/lib/Makefile.am b/lib/Makefile.am index dab5c6d3..20c1f867 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -3,12 +3,12 @@ AM_CXXFLAGS = -I$(top_srcdir)/ extra_sources= if BUILD_COMMS_MPI - extra_sources+=Grid_communicator_mpi.cc - extra_sources+=Grid_stencil_common.cc + extra_sources+=communicator/Grid_communicator_mpi.cc + extra_sources+=stencil/Grid_stencil_common.cc endif if BUILD_COMMS_NONE - extra_sources+=Grid_communicator_fake.cc - extra_sources+=Grid_stencil_common.cc + extra_sources+=communicator/Grid_communicator_fake.cc + extra_sources+=stencil/Grid_stencil_common.cc endif # @@ -22,55 +22,56 @@ libGrid_a_SOURCES = Grid_init.cc $(extra_sources) # include_HEADERS =\ Grid.h\ - Grid_QCD.h\ Grid_aligned_allocator.h\ Grid_cartesian.h\ - Grid_cartesian_base.h\ - Grid_cartesian_full.h\ - Grid_cartesian_red_black.h\ Grid_communicator.h\ Grid_comparison.h\ Grid_config.h\ Grid_cshift.h\ - Grid_cshift_common.h\ - Grid_cshift_mpi.h\ - Grid_cshift_none.h\ Grid_lattice.h\ - Grid_lattice_arith.h\ - Grid_lattice_conformable.h\ - Grid_lattice_coordinate.h\ - Grid_lattice_local.h\ - Grid_lattice_peekpoke.h\ - Grid_lattice_reality.h\ - Grid_lattice_reduction.h - Grid_lattice_rng.h\ - Grid_lattice_trace.h\ - Grid_lattice_transfer.h\ - Grid_lattice_transpose.h\ Grid_math.h\ - Grid_math_arith.h\ - Grid_math_arith_add.h\ - Grid_math_arith_mac.h\ - Grid_math_arith_mul.h\ - Grid_math_arith_scalar.h\ - Grid_math_arith_sub.h\ - Grid_math_inner.h\ - Grid_math_outer.h\ - Grid_math_peek.h\ - Grid_math_poke.h\ - Grid_math_reality.h\ - Grid_math_tensors.h\ - Grid_math_trace.h\ - Grid_math_traits.h\ - Grid_math_transpose.h\ Grid_simd.h\ Grid_stencil.h\ Grid_summation.h\ - Grid_vComplexD.h\ - Grid_vComplexF.h\ - Grid_vInteger.h\ - Grid_vRealD.h\ - Grid_vRealF.h\ Grid_where.h +nobase_include_HEADERS=\ + cartesian/Grid_cartesian_base.h\ + cartesian/Grid_cartesian_full.h\ + cartesian/Grid_cartesian_red_black.h\ + cshift/Grid_cshift_common.h\ + cshift/Grid_cshift_mpi.h\ + cshift/Grid_cshift_none.h\ + lattice/Grid_lattice_arith.h\ + lattice/Grid_lattice_conformable.h\ + lattice/Grid_lattice_coordinate.h\ + lattice/Grid_lattice_local.h\ + lattice/Grid_lattice_peekpoke.h\ + lattice/Grid_lattice_reality.h\ + lattice/Grid_lattice_reduction.h\ + lattice/Grid_lattice_rng.h\ + lattice/Grid_lattice_trace.h\ + lattice/Grid_lattice_transfer.h\ + lattice/Grid_lattice_transpose.h\ + math/Grid_math_arith.h\ + math/Grid_math_arith_add.h\ + math/Grid_math_arith_mac.h\ + math/Grid_math_arith_mul.h\ + math/Grid_math_arith_scalar.h\ + math/Grid_math_arith_sub.h\ + math/Grid_math_inner.h\ + math/Grid_math_outer.h\ + math/Grid_math_peek.h\ + math/Grid_math_poke.h\ + math/Grid_math_reality.h\ + math/Grid_math_tensors.h\ + math/Grid_math_trace.h\ + math/Grid_math_traits.h\ + math/Grid_math_transpose.h\ + qcd/Grid_QCD.h\ + simd/Grid_vComplexD.h\ + simd/Grid_vComplexF.h\ + simd/Grid_vInteger.h\ + simd/Grid_vRealD.h\ + simd/Grid_vRealF.h diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index e58d20e2..bd206ea1 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -277,7 +277,7 @@ int main (int argc, char ** argv) peekSite(bar,Bar,coor); for(int r=0;r<3;r++){ for(int c=0;c<3;c++){ - // cout<<"bar "< Date: Sat, 18 Apr 2015 22:16:31 +0100 Subject: [PATCH 081/429] Update --- TODO | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TODO b/TODO index ee0e0aeb..867ca248 100644 --- a/TODO +++ b/TODO @@ -16,12 +16,12 @@ FUNCTIONALITY: - lib/stencil - lib/communicator - lib/algorithms - - lib/fileio - - lib/qcd + + - lib/io/ -- GridLog, GridIn, GridErr, GridDebug, GridMessage - lib/qcd/actions - lib/qcd/measurements - - lib/qcd/ + Not done, or just incomplete From f64d39ab5734817f1b2939f5865722cac83eefd5 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 18 Apr 2015 22:17:01 +0100 Subject: [PATCH 082/429] Split all OMP directives into lattice subdir for easy maintainance of parallelism and future OMP 4.0 offload. --- lib/Grid_comparison.h | 132 +------------------------ lib/Grid_init.cc | 2 +- lib/lattice/Grid_lattice_comparison.h | 133 ++++++++++++++++++++++++++ 3 files changed, 138 insertions(+), 129 deletions(-) create mode 100644 lib/lattice/Grid_lattice_comparison.h diff --git a/lib/Grid_comparison.h b/lib/Grid_comparison.h index c890d342..b91f6f91 100644 --- a/lib/Grid_comparison.h +++ b/lib/Grid_comparison.h @@ -1,5 +1,6 @@ #ifndef GRID_COMPARISON_H #define GRID_COMPARISON_H + namespace Grid { // Generic list of functors @@ -132,133 +133,8 @@ namespace Grid { { return Comparison(sne(),lhs,rhs); } - - ////////////////////////////////////////////////////////////////////////// - // relational operators - // - // Support <,>,<=,>=,==,!= - // - //Query supporting bitwise &, |, ^, ! - //Query supporting logical &&, ||, - ////////////////////////////////////////////////////////////////////////// - template - inline Lattice LLComparison(vfunctor op,const Lattice &lhs,const Lattice &rhs) - { - Lattice ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=op(lhs._odata[ss],rhs._odata[ss]); - } - return ret; - } - template - inline Lattice LSComparison(vfunctor op,const Lattice &lhs,const robj &rhs) - { - Lattice ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=op(lhs._odata[ss],rhs); - } - return ret; - } - template - inline Lattice SLComparison(vfunctor op,const lobj &lhs,const Lattice &rhs) - { - Lattice ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=op(lhs._odata[ss],rhs); - } - return ret; - } - - // Less than - template - inline Lattice operator < (const Lattice & lhs, const Lattice & rhs) { - return LLComparison(vlt(),lhs,rhs); - } - template - inline Lattice operator < (const Lattice & lhs, const robj & rhs) { - return LSComparison(vlt(),lhs,rhs); - } - template - inline Lattice operator < (const lobj & lhs, const Lattice & rhs) { - return SLComparison(vlt(),lhs,rhs); - } - - // Less than equal - template - inline Lattice operator <= (const Lattice & lhs, const Lattice & rhs) { - return LLComparison(vle(),lhs,rhs); - } - template - inline Lattice operator <= (const Lattice & lhs, const robj & rhs) { - return LSComparison(vle(),lhs,rhs); - } - template - inline Lattice operator <= (const lobj & lhs, const Lattice & rhs) { - return SLComparison(vle(),lhs,rhs); - } - - // Greater than - template - inline Lattice operator > (const Lattice & lhs, const Lattice & rhs) { - return LLComparison(vgt(),lhs,rhs); - } - template - inline Lattice operator > (const Lattice & lhs, const robj & rhs) { - return LSComparison(vgt(),lhs,rhs); - } - template - inline Lattice operator > (const lobj & lhs, const Lattice & rhs) { - return SLComparison(vgt(),lhs,rhs); - } - - - // Greater than equal - template - inline Lattice operator >= (const Lattice & lhs, const Lattice & rhs) { - return LLComparison(vge(),lhs,rhs); - } - template - inline Lattice operator >= (const Lattice & lhs, const robj & rhs) { - return LSComparison(vge(),lhs,rhs); - } - template - inline Lattice operator >= (const lobj & lhs, const Lattice & rhs) { - return SLComparison(vge(),lhs,rhs); - } - - - // equal - template - inline Lattice operator == (const Lattice & lhs, const Lattice & rhs) { - return LLComparison(veq(),lhs,rhs); - } - template - inline Lattice operator == (const Lattice & lhs, const robj & rhs) { - return LSComparison(veq(),lhs,rhs); - } - template - inline Lattice operator == (const lobj & lhs, const Lattice & rhs) { - return SLComparison(veq(),lhs,rhs); - } - - - // not equal - template - inline Lattice operator != (const Lattice & lhs, const Lattice & rhs) { - return LLComparison(vne(),lhs,rhs); - } - template - inline Lattice operator != (const Lattice & lhs, const robj & rhs) { - return LSComparison(vne(),lhs,rhs); - } - template - inline Lattice operator != (const lobj & lhs, const Lattice & rhs) { - return SLComparison(vne(),lhs,rhs); - } - - } + +#include + #endif diff --git a/lib/Grid_init.cc b/lib/Grid_init.cc index 9e8b8b96..ee11a982 100644 --- a/lib/Grid_init.cc +++ b/lib/Grid_init.cc @@ -11,7 +11,7 @@ #include #include -#include "Grid.h" +#include #undef __X86_64 namespace Grid { diff --git a/lib/lattice/Grid_lattice_comparison.h b/lib/lattice/Grid_lattice_comparison.h new file mode 100644 index 00000000..82c98572 --- /dev/null +++ b/lib/lattice/Grid_lattice_comparison.h @@ -0,0 +1,133 @@ +#ifndef GRID_LATTICE_COMPARISON_H +#define GRID_LATTICE_COMPARISON_H + +namespace Grid { + + ////////////////////////////////////////////////////////////////////////// + // relational operators + // + // Support <,>,<=,>=,==,!= + // + //Query supporting bitwise &, |, ^, ! + //Query supporting logical &&, ||, + ////////////////////////////////////////////////////////////////////////// + template + inline Lattice LLComparison(vfunctor op,const Lattice &lhs,const Lattice &rhs) + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=op(lhs._odata[ss],rhs._odata[ss]); + } + return ret; + } + template + inline Lattice LSComparison(vfunctor op,const Lattice &lhs,const robj &rhs) + { + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=op(lhs._odata[ss],rhs); + } + return ret; + } + template + inline Lattice SLComparison(vfunctor op,const lobj &lhs,const Lattice &rhs) + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + ret._odata[ss]=op(lhs._odata[ss],rhs); + } + return ret; + } + + // Less than + template + inline Lattice operator < (const Lattice & lhs, const Lattice & rhs) { + return LLComparison(vlt(),lhs,rhs); + } + template + inline Lattice operator < (const Lattice & lhs, const robj & rhs) { + return LSComparison(vlt(),lhs,rhs); + } + template + inline Lattice operator < (const lobj & lhs, const Lattice & rhs) { + return SLComparison(vlt(),lhs,rhs); + } + + // Less than equal + template + inline Lattice operator <= (const Lattice & lhs, const Lattice & rhs) { + return LLComparison(vle(),lhs,rhs); + } + template + inline Lattice operator <= (const Lattice & lhs, const robj & rhs) { + return LSComparison(vle(),lhs,rhs); + } + template + inline Lattice operator <= (const lobj & lhs, const Lattice & rhs) { + return SLComparison(vle(),lhs,rhs); + } + + // Greater than + template + inline Lattice operator > (const Lattice & lhs, const Lattice & rhs) { + return LLComparison(vgt(),lhs,rhs); + } + template + inline Lattice operator > (const Lattice & lhs, const robj & rhs) { + return LSComparison(vgt(),lhs,rhs); + } + template + inline Lattice operator > (const lobj & lhs, const Lattice & rhs) { + return SLComparison(vgt(),lhs,rhs); + } + + + // Greater than equal + template + inline Lattice operator >= (const Lattice & lhs, const Lattice & rhs) { + return LLComparison(vge(),lhs,rhs); + } + template + inline Lattice operator >= (const Lattice & lhs, const robj & rhs) { + return LSComparison(vge(),lhs,rhs); + } + template + inline Lattice operator >= (const lobj & lhs, const Lattice & rhs) { + return SLComparison(vge(),lhs,rhs); + } + + + // equal + template + inline Lattice operator == (const Lattice & lhs, const Lattice & rhs) { + return LLComparison(veq(),lhs,rhs); + } + template + inline Lattice operator == (const Lattice & lhs, const robj & rhs) { + return LSComparison(veq(),lhs,rhs); + } + template + inline Lattice operator == (const lobj & lhs, const Lattice & rhs) { + return SLComparison(veq(),lhs,rhs); + } + + + // not equal + template + inline Lattice operator != (const Lattice & lhs, const Lattice & rhs) { + return LLComparison(vne(),lhs,rhs); + } + template + inline Lattice operator != (const Lattice & lhs, const robj & rhs) { + return LSComparison(vne(),lhs,rhs); + } + template + inline Lattice operator != (const lobj & lhs, const Lattice & rhs) { + return SLComparison(vne(),lhs,rhs); + } + +} +#endif From 650410cb2f82f2b1356c85ad7ab9f4defcd5c763 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 19 Apr 2015 14:55:16 +0100 Subject: [PATCH 083/429] Update to task list --- TODO | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index 867ca248..a8fa5ce9 100644 --- a/TODO +++ b/TODO @@ -17,21 +17,22 @@ FUNCTIONALITY: - lib/communicator - lib/algorithms - lib/qcd - + future - lib/io/ -- GridLog, GridIn, GridErr, GridDebug, GridMessage - lib/qcd/actions - lib/qcd/measurements Not done, or just incomplete +* random number generation * Consider switch std::vector to boost arrays. boost::multi_array A()... to replace multi1d, multi2d etc.. - * How to define simple matrix operations, such as flavour matrices? * Dirac, Pauli, SU subgroup, etc.. * Gamma/Dirac structures + * Fourspin, two spin project * su3 exponentiation, log etc.. [Jamie's code?] From a5b0c492d75f176d98f24563f320af2459775599 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 19 Apr 2015 14:55:58 +0100 Subject: [PATCH 084/429] Rework of RNG to use C++11 random. Should work correctly maintaining parallel RNG across a machine. If a "fixedSeed" is used, randoms should be reproducible across different machine decomposition since the generators are physically indexed and assigned in lexico ordering. --- lib/cartesian/Grid_cartesian_base.h | 51 +++++--- lib/cartesian/Grid_cartesian_full.h | 6 +- lib/cartesian/Grid_cartesian_red_black.h | 9 +- lib/lattice/Grid_lattice_conformable.h | 4 + lib/lattice/Grid_lattice_rng.h | 144 +++++++++++++++++++---- tests/Grid_main.cc | 25 ++-- tests/test_Grid_stencil.cc | 7 +- 7 files changed, 191 insertions(+), 55 deletions(-) diff --git a/lib/cartesian/Grid_cartesian_base.h b/lib/cartesian/Grid_cartesian_base.h index 2731d9a5..9ee10293 100644 --- a/lib/cartesian/Grid_cartesian_base.h +++ b/lib/cartesian/Grid_cartesian_base.h @@ -6,22 +6,25 @@ namespace Grid{ -class GridBase : public CartesianCommunicator { + class GridRNG ; // Forward declaration; + + class GridBase : public CartesianCommunicator { public: - // Give Lattice access - template friend class Lattice; - - GridBase(std::vector & processor_grid) : CartesianCommunicator(processor_grid) {}; + // Give Lattice access + template friend class Lattice; - - //FIXME - // protected: - // Lattice wide random support. not yet fully implemented. Need seed strategy - // and one generator per site. - // std::default_random_engine generator; - // static std::mt19937 generator( 9 ); - + GridRNG *_rng; + + GridBase(std::vector & processor_grid) : CartesianCommunicator(processor_grid) {}; + + //FIXME + // protected: + // Lattice wide random support. not yet fully implemented. Need seed strategy + // and one generator per site. + // std::default_random_engine generator; + // static std::mt19937 generator( 9 ); + ////////////////////////////////////////////////////////////////////// // Commicator provides information on the processor grid ////////////////////////////////////////////////////////////////////// @@ -32,7 +35,7 @@ public: ////////////////////////////////////////////////////////////////////// // Physics Grid information. - std::vector _simd_layout; // Which dimensions get relayed out over simd lanes. + std::vector _simd_layout;// Which dimensions get relayed out over simd lanes. std::vector _fdimensions;// Global dimensions of array prior to cb removal std::vector _gdimensions;// Global dimensions of array after cb removal std::vector _ldimensions;// local dimensions of array with processor images removed @@ -41,6 +44,8 @@ public: std::vector _istride; // Inner stride i.e. within simd lane int _osites; // _isites*_osites = product(dimensions). int _isites; + int _fsites; // _isites*_osites = product(dimensions). + int _gsites; std::vector _slice_block; // subslice information std::vector _slice_stride; std::vector _slice_nblock; @@ -149,6 +154,21 @@ public: //////////////////////////////////////////////////////////////// // Global addressing //////////////////////////////////////////////////////////////// + void GlobalIndexToGlobalCoor(int gidx,std::vector &gcoor){ + gcoor.resize(_ndimension); + for(int d=0;d<_ndimension;d++){ + gcoor[d] = gidx % _gdimensions[d]; + gidx = gidx / _gdimensions[d]; + } + } + void GlobalCoorToGlobalIndex(const std::vector & gcoor,int & gidx){ + gidx=0; + int mult=1; + for(int mu=0;mu<_ndimension;mu++) { + gidx+=mult*gcoor[mu]; + mult*=_gdimensions[mu]; + } + } void RankIndexToGlobalCoor(int rank, int o_idx, int i_idx , std::vector &gcoor) { gcoor.resize(_ndimension); @@ -194,7 +214,8 @@ public: i_idx= iIndex(lcoor); o_idx= oIndex(lcoor); } - }; + + } #endif diff --git a/lib/cartesian/Grid_cartesian_full.h b/lib/cartesian/Grid_cartesian_full.h index 383bf14f..73bd08b3 100644 --- a/lib/cartesian/Grid_cartesian_full.h +++ b/lib/cartesian/Grid_cartesian_full.h @@ -43,12 +43,14 @@ public: _ostride.resize(_ndimension); _istride.resize(_ndimension); - _osites = 1; - _isites = 1; + _fsites = _gsites = _osites = _isites = 1; + for(int d=0;d<_ndimension;d++){ _fdimensions[d] = dimensions[d]; // Global dimensions _gdimensions[d] = _fdimensions[d]; // Global dimensions _simd_layout[d] = simd_layout[d]; + _fsites = _fsites * _fdimensions[d]; + _gsites = _gsites * _gdimensions[d]; //FIXME check for exact division diff --git a/lib/cartesian/Grid_cartesian_red_black.h b/lib/cartesian/Grid_cartesian_red_black.h index e85fd3f7..55bd1f20 100644 --- a/lib/cartesian/Grid_cartesian_red_black.h +++ b/lib/cartesian/Grid_cartesian_red_black.h @@ -62,14 +62,17 @@ public: _ostride.resize(_ndimension); _istride.resize(_ndimension); - _osites = 1; - _isites = 1; + _fsites = _gsites = _osites = _isites = 1; + for(int d=0;d<_ndimension;d++){ _fdimensions[d] = dimensions[d]; _gdimensions[d] = _fdimensions[d]; + _fsites = _fsites * _fdimensions[d]; + _gsites = _gsites * _gdimensions[d]; + if (d==0) _gdimensions[0] = _gdimensions[0]/2; // Remove a checkerboard _ldimensions[d] = _gdimensions[d]/_processors[d]; - + // Use a reduced simd grid _simd_layout[d] = simd_layout[d]; _rdimensions[d]= _ldimensions[d]/_simd_layout[d]; diff --git a/lib/lattice/Grid_lattice_conformable.h b/lib/lattice/Grid_lattice_conformable.h index b9af33b4..faa8c7a7 100644 --- a/lib/lattice/Grid_lattice_conformable.h +++ b/lib/lattice/Grid_lattice_conformable.h @@ -9,6 +9,10 @@ namespace Grid { assert(lhs._grid == rhs._grid); assert(lhs.checkerboard == rhs.checkerboard); } + void inline conformable(const GridBase *lhs,GridBase *rhs) + { + assert(lhs == rhs); + } } #endif diff --git a/lib/lattice/Grid_lattice_rng.h b/lib/lattice/Grid_lattice_rng.h index 636bfb72..24627c92 100644 --- a/lib/lattice/Grid_lattice_rng.h +++ b/lib/lattice/Grid_lattice_rng.h @@ -1,32 +1,136 @@ #ifndef GRID_LATTICE_RNG_H #define GRID_LATTICE_RNG_H +#include + namespace Grid { - // FIXME Randomise; deprecate this - template inline void random(Lattice &l){ - Real *v_ptr = (Real *)&l._odata[0]; - size_t v_len = l._grid->oSites()*sizeof(vobj); - size_t d_len = v_len/sizeof(Real); - - for(int i=0;i inline void gaussian(Lattice &l){ - // Zero mean, unit variance. - std::normal_distribution distribution(0.0,1.0); - Real *v_ptr = (Real *)&l._odata[0]; - size_t v_len = l._grid->oSites()*sizeof(vobj); - size_t d_len = v_len/sizeof(Real); + fixedSeed(std::vector &seeds) : src(seeds.begin(),seeds.end()) {}; - for(int i=0;i list(1); + + src.generate(list.begin(),list.end()); + + return list[0]; + + } + + }; + class GridRNG { + public: + // One generator per site. + std::vector _generators; + + // Uniform and Gaussian distributions from these generators. + std::uniform_real_distribution _uniform; + std::normal_distribution _gaussian; + + GridBase *_grid; + int _vol; + + int generator_idx(int os,int is){ + return is*_grid->oSites()+os; + } + + GridRNG(GridBase *grid) : _uniform{0,1}, _gaussian(0.0,1.0) { + _grid=grid; + _vol =_grid->iSites()*_grid->oSites(); + _generators.resize(_vol); + // SeedFixedIntegers(seeds); + // worst case we seed properly but non-deterministically + SeedRandomDevice(); + } + + // FIXME: drive seeding from node zero and transmit to all + // to get unique randoms on each node + void SeedRandomDevice(void){ + std::random_device rd; + Seed(rd); + } + void SeedFixedIntegers(std::vector &seeds){ + fixedSeed src(seeds); + Seed(src); + } + + // This loop could be made faster to avoid the Ahmdahl by + // i) seed generators on each timeslice, for x=y=z=0; + // ii) seed generators on each z for x=y=0 + // iii)seed generators on each y,z for x=0 + // iv) seed generators on each y,z,x + // made possible by physical indexing. + template void Seed(source &src) + { + std::vector gcoor; + + for(int gidx=0;gidx<_grid->_gsites;gidx++){ + int rank,o_idx,i_idx; + _grid->GlobalIndexToGlobalCoor(gidx,gcoor); + _grid->GlobalCoorToRankIndex(rank,o_idx,i_idx,gcoor); + + int l_idx=generator_idx(o_idx,i_idx); + + typename source::result_type init = src(); + + _grid->Broadcast(0,(void *)&init,sizeof(init)); + if( rank == _grid->ThisRank() ){ + _generators[l_idx] = std::ranlux48(init); + } + } + } + + //FIXME implement generic IO and create state save/restore + //void SaveState(const std::string &file); + //void LoadState(const std::string &file); + + template inline void fill(Lattice &l,distribution &dist){ + + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + + conformable(_grid,l._grid); + + int Nsimd =_grid->Nsimd(); + int osites=_grid->oSites(); + + int words = sizeof(vobj)/sizeof(vector_type); + std::vector > buf(Nsimd,std::vector(words)); + std::vector pointers(Nsimd); + + for(int ss=0;ss inline void random(GridRNG &rng,Lattice &l){ + rng.fill(l,rng._uniform); + } + + template inline void gaussian(GridRNG &rng,Lattice &l){ + rng.fill(l,rng._gaussian); + } } #endif diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index bd206ea1..83cacf92 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -57,7 +57,8 @@ int main (int argc, char ** argv) GridCartesian Fine(latt_size,simd_layout,mpi_layout); GridRedBlackCartesian rbFine(latt_size,simd_layout,mpi_layout); - + GridRNG FineRNG(&Fine); + LatticeColourMatrix Foo(&Fine); LatticeColourMatrix Bar(&Fine); @@ -91,17 +92,17 @@ int main (int argc, char ** argv) iSpinMatrix iGammaFive; ColourMatrix cmat; - random(Foo); - gaussian(Bar); - random(scFoo); - random(scBar); + random(FineRNG,Foo); + gaussian(FineRNG,Bar); + random(FineRNG,scFoo); + random(FineRNG,scBar); - random(cMat); - random(sMat); - random(scMat); - random(cVec); - random(sVec); - random(scVec); + random(FineRNG,cMat); + random(FineRNG,sMat); + random(FineRNG,scMat); + random(FineRNG,cVec); + random(FineRNG,sVec); + random(FineRNG,scVec); fflush(stdout); cVec = cMat * cVec; // LatticeColourVector = LatticeColourMatrix * LatticeColourVector @@ -277,7 +278,7 @@ int main (int argc, char ** argv) peekSite(bar,Bar,coor); for(int r=0;r<3;r++){ for(int c=0;c<3;c++){ - cout<<"bar "< Date: Wed, 22 Apr 2015 22:46:48 +0100 Subject: [PATCH 085/429] Got the NERSC IO working and fixed a bug in cshift. --- configure | 22 + configure.ac | 2 + lib/Grid.h | 1 + lib/Grid_communicator.h | 7 +- lib/Grid_comparison.h | 24 +- lib/Grid_config.h | 6 + lib/Grid_config.h.in | 6 + lib/Grid_lattice.h | 12 +- lib/cartesian/Grid_cartesian_base.h | 41 +- lib/communicator/Grid_communicator_fake.cc | 1 + lib/communicator/Grid_communicator_mpi.cc | 3 + lib/cshift/Grid_cshift_mpi.h | 8 +- lib/lattice/Grid_lattice_coordinate.h | 9 +- lib/lattice/Grid_lattice_peekpoke.h | 84 +++- lib/lattice/Grid_lattice_reduction.h | 30 ++ lib/math/Grid_math_tensors.h | 41 +- lib/math/Grid_math_traits.h | 14 + lib/parallelIO/GridNerscIO.h | 524 +++++++++++++++++++++ lib/qcd/Grid_QCD.h | 4 +- tests/Grid_cshift.cc | 84 ++++ tests/Grid_nersc_io.cc | 62 +++ tests/Makefile.am | 8 +- 22 files changed, 925 insertions(+), 68 deletions(-) create mode 100644 lib/parallelIO/GridNerscIO.h create mode 100644 tests/Grid_cshift.cc create mode 100644 tests/Grid_nersc_io.cc diff --git a/configure b/configure index fc0b6453..48fafcf1 100755 --- a/configure +++ b/configure @@ -4999,6 +4999,28 @@ _ACEOF fi done +for ac_func in ntohll +do : + ac_fn_c_check_func "$LINENO" "ntohll" "ac_cv_func_ntohll" +if test "x$ac_cv_func_ntohll" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NTOHLL 1 +_ACEOF + +fi +done + +for ac_func in be64toh +do : + ac_fn_c_check_func "$LINENO" "be64toh" "ac_cv_func_be64toh" +if test "x$ac_cv_func_be64toh" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_BE64TOH 1 +_ACEOF + +fi +done + # Check whether --enable-simd was given. if test "${enable_simd+set}" = set; then : diff --git a/configure.ac b/configure.ac index 97fdbf85..21f40f6c 100644 --- a/configure.ac +++ b/configure.ac @@ -25,6 +25,8 @@ AC_TYPE_UINT64_T # Checks for library functions. AC_CHECK_FUNCS([gettimeofday]) +AC_CHECK_FUNCS([ntohll]) +AC_CHECK_FUNCS([be64toh]) AC_ARG_ENABLE([simd],[AC_HELP_STRING([--enable-simd=SSE|AVX|AVX2|AVX512],[Select instructions])],[ac_SIMD=${enable_simd}],[ac_SIMD=AVX2]) diff --git a/lib/Grid.h b/lib/Grid.h index c456bf8a..7e12490a 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -51,6 +51,7 @@ #include #include #include +#include namespace Grid { diff --git a/lib/Grid_communicator.h b/lib/Grid_communicator.h index 845c0123..f5baa413 100644 --- a/lib/Grid_communicator.h +++ b/lib/Grid_communicator.h @@ -35,6 +35,7 @@ class CartesianCommunicator { // Grid information queries ///////////////////////////////// int IsBoss(void) { return _processor==0; }; + int BossRank(void) { return 0; }; int ThisRank(void) { return _processor; }; const std::vector & ThisProcessorCoor(void) { return _processor_coor; }; const std::vector & ProcessorGrid(void) { return _processors; }; @@ -49,6 +50,8 @@ class CartesianCommunicator { void GlobalSum(RealD &); void GlobalSumVector(RealD *,int N); + void GlobalSum(uint32_t &); + void GlobalSum(ComplexF &c) { GlobalSumVector((float *)&c,2); @@ -68,12 +71,10 @@ class CartesianCommunicator { } template void GlobalSum(obj &o){ - typedef typename obj::scalar_type scalar_type; int words = sizeof(obj)/sizeof(scalar_type); - scalar_type * ptr = (scalar_type *)& o; - GlobalSum(ptr,words); + GlobalSumVector(ptr,words); } //////////////////////////////////////////////////////////// // Face exchange diff --git a/lib/Grid_comparison.h b/lib/Grid_comparison.h index b91f6f91..530817c6 100644 --- a/lib/Grid_comparison.h +++ b/lib/Grid_comparison.h @@ -8,42 +8,42 @@ namespace Grid { public: vInteger operator()(const lobj &lhs, const robj &rhs) { - return lhs == rhs; + return TensorRemove(lhs) == TensorRemove(rhs); } }; template class vne { public: vInteger operator()(const lobj &lhs, const robj &rhs) { - return lhs != rhs; + return TensorRemove(lhs) != TensorRemove(rhs); } }; template class vlt { public: vInteger operator()(const lobj &lhs, const robj &rhs) { - return lhs < rhs; + return TensorRemove(lhs) < TensorRemove(rhs); } }; template class vle { public: vInteger operator()(const lobj &lhs, const robj &rhs) { - return lhs <= rhs; + return TensorRemove(lhs) <= TensorRemove(rhs); } }; template class vgt { public: vInteger operator()(const lobj &lhs, const robj &rhs) { - return lhs > rhs; + return TensorRemove(lhs) > TensorRemove(rhs); } }; template class vge { public: vInteger operator()(const lobj &lhs, const robj &rhs) { - return lhs >= rhs; + return TensorRemove(lhs) >= TensorRemove(rhs); } }; @@ -52,42 +52,42 @@ namespace Grid { public: Integer operator()(const lobj &lhs, const robj &rhs) { - return lhs == rhs; + return TensorRemove(lhs) == TensorRemove(rhs); } }; template class sne { public: Integer operator()(const lobj &lhs, const robj &rhs) { - return lhs != rhs; + return TensorRemove(lhs) != TensorRemove(rhs); } }; template class slt { public: Integer operator()(const lobj &lhs, const robj &rhs) { - return lhs < rhs; + return TensorRemove(lhs) < TensorRemove(rhs); } }; template class sle { public: Integer operator()(const lobj &lhs, const robj &rhs) { - return lhs <= rhs; + return TensorRemove(lhs) <= TensorRemove(rhs); } }; template class sgt { public: Integer operator()(const lobj &lhs, const robj &rhs) { - return lhs > rhs; + return TensorRemove(lhs) > TensorRemove(rhs); } }; template class sge { public: Integer operator()(const lobj &lhs, const robj &rhs) { - return lhs >= rhs; + return TensorRemove(lhs) >= TensorRemove(rhs); } }; diff --git a/lib/Grid_config.h b/lib/Grid_config.h index cb676b54..2171ea6b 100644 --- a/lib/Grid_config.h +++ b/lib/Grid_config.h @@ -16,6 +16,9 @@ /* GRID_COMMS_NONE */ /* #undef GRID_COMMS_NONE */ +/* Define to 1 if you have the `be64toh' function. */ +/* #undef HAVE_BE64TOH */ + /* Define to 1 if you have the `gettimeofday' function. */ #define HAVE_GETTIMEOFDAY 1 @@ -31,6 +34,9 @@ /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 +/* Define to 1 if you have the `ntohll' function. */ +/* #undef HAVE_NTOHLL */ + /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 diff --git a/lib/Grid_config.h.in b/lib/Grid_config.h.in index 467ee6e4..2381525f 100644 --- a/lib/Grid_config.h.in +++ b/lib/Grid_config.h.in @@ -15,6 +15,9 @@ /* GRID_COMMS_NONE */ #undef GRID_COMMS_NONE +/* Define to 1 if you have the `be64toh' function. */ +#undef HAVE_BE64TOH + /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY @@ -30,6 +33,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H +/* Define to 1 if you have the `ntohll' function. */ +#undef HAVE_NTOHLL + /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H diff --git a/lib/Grid_lattice.h b/lib/Grid_lattice.h index 03bacf2d..7256459c 100644 --- a/lib/Grid_lattice.h +++ b/lib/Grid_lattice.h @@ -37,7 +37,8 @@ public: // what about a default grid? ////////////////////////////////////////////////////////////////// Lattice(GridBase *grid) : _grid(grid) { - _odata.reserve(_grid->oSites()); + // _odata.reserve(_grid->oSites()); + _odata.resize(_grid->oSites()); assert((((uint64_t)&_odata[0])&0xF) ==0); checkerboard=0; } @@ -49,6 +50,15 @@ public: } return *this; } + template inline Lattice & operator = (const Lattice & r){ + conformable(*this,r); + std::cout<<"Lattice operator ="<oSites();ss++){ + this->_odata[ss]=r._odata[ss]; + } + return *this; + } // *=,+=,-= operators inherit behvour from correspond */+/- operation template inline Lattice &operator *=(const T &r) { diff --git a/lib/cartesian/Grid_cartesian_base.h b/lib/cartesian/Grid_cartesian_base.h index 9ee10293..aff9375a 100644 --- a/lib/cartesian/Grid_cartesian_base.h +++ b/lib/cartesian/Grid_cartesian_base.h @@ -6,34 +6,23 @@ namespace Grid{ - class GridRNG ; // Forward declaration; - + ////////////////////////////////////////////////////////////////////// + // Commicator provides information on the processor grid + ////////////////////////////////////////////////////////////////////// + // unsigned long _ndimension; + // std::vector _processors; // processor grid + // int _processor; // linear processor rank + // std::vector _processor_coor; // linear processor rank + ////////////////////////////////////////////////////////////////////// class GridBase : public CartesianCommunicator { + public: // Give Lattice access template friend class Lattice; - GridRNG *_rng; - GridBase(std::vector & processor_grid) : CartesianCommunicator(processor_grid) {}; - //FIXME - // protected: - // Lattice wide random support. not yet fully implemented. Need seed strategy - // and one generator per site. - // std::default_random_engine generator; - // static std::mt19937 generator( 9 ); - - ////////////////////////////////////////////////////////////////////// - // Commicator provides information on the processor grid - ////////////////////////////////////////////////////////////////////// - // unsigned long _ndimension; - // std::vector _processors; // processor grid - // int _processor; // linear processor rank - // std::vector _processor_coor; // linear processor rank - ////////////////////////////////////////////////////////////////////// - // Physics Grid information. std::vector _simd_layout;// Which dimensions get relayed out over simd lanes. std::vector _fdimensions;// Global dimensions of array prior to cb removal @@ -101,6 +90,13 @@ public: for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*ocoor[d]; return idx; } + inline void CoorFromIndex (std::vector& coor,int index,std::vector &dims){ + coor.resize(_ndimension); + for(int d=0;d<_ndimension;d++){ + coor[d] = index % dims[d]; + index = index / dims[d]; + } + } inline void oCoorFromOindex (std::vector& coor,int Oindex){ coor.resize(_ndimension); for(int d=0;d<_ndimension;d++){ @@ -146,6 +142,7 @@ public: inline int lSites(void) { return _isites*_osites; }; inline int gSites(void) { return _isites*_osites*_Nprocessors; }; inline int Nd (void) { return _ndimension;}; + inline const std::vector &FullDimensions(void) { return _fdimensions;}; inline const std::vector &GlobalDimensions(void) { return _gdimensions;}; inline const std::vector &LocalDimensions(void) { return _ldimensions;}; @@ -175,10 +172,10 @@ public: std::vector coor(_ndimension); ProcessorCoorFromRank(rank,coor); - for(int mu=0;mu<_ndimension;mu++) gcoor[mu] = _ldimensions[mu]&coor[mu]; + for(int mu=0;mu<_ndimension;mu++) gcoor[mu] = _ldimensions[mu]*coor[mu]; iCoorFromIindex(coor,i_idx); - for(int mu=0;mu<_ndimension;mu++) gcoor[mu] += _rdimensions[mu]&coor[mu]; + for(int mu=0;mu<_ndimension;mu++) gcoor[mu] += _rdimensions[mu]*coor[mu]; oCoorFromOindex (coor,o_idx); for(int mu=0;mu<_ndimension;mu++) gcoor[mu] += coor[mu]; diff --git a/lib/communicator/Grid_communicator_fake.cc b/lib/communicator/Grid_communicator_fake.cc index 2b94ea4b..5f4a4024 100644 --- a/lib/communicator/Grid_communicator_fake.cc +++ b/lib/communicator/Grid_communicator_fake.cc @@ -17,6 +17,7 @@ CartesianCommunicator::CartesianCommunicator(std::vector &processors) void CartesianCommunicator::GlobalSum(float &){} void CartesianCommunicator::GlobalSumVector(float *,int N){} void CartesianCommunicator::GlobalSum(double &){} +void CartesianCommunicator::GlobalSum(uint32_t &){} void CartesianCommunicator::GlobalSumVector(double *,int N){} // Basic Halo comms primitive diff --git a/lib/communicator/Grid_communicator_mpi.cc b/lib/communicator/Grid_communicator_mpi.cc index dba5f039..bd53bd9c 100644 --- a/lib/communicator/Grid_communicator_mpi.cc +++ b/lib/communicator/Grid_communicator_mpi.cc @@ -28,6 +28,9 @@ CartesianCommunicator::CartesianCommunicator(std::vector &processors) assert(Size==_Nprocessors); } +void CartesianCommunicator::GlobalSum(uint32_t &u){ + MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT32_T,MPI_SUM,communicator); +} void CartesianCommunicator::GlobalSum(float &f){ MPI_Allreduce(MPI_IN_PLACE,&f,1,MPI_FLOAT,MPI_SUM,communicator); } diff --git a/lib/cshift/Grid_cshift_mpi.h b/lib/cshift/Grid_cshift_mpi.h index c078c7d8..60894ef3 100644 --- a/lib/cshift/Grid_cshift_mpi.h +++ b/lib/cshift/Grid_cshift_mpi.h @@ -188,8 +188,8 @@ template void Cshift_comms_simd(Lattice &ret,Lattice &r if ( comm_any ) { - for(int i=0;i void Cshift_comms_simd(Lattice &ret,Lattice &r for(int i=0;i inline void LatticeCoordinate(Lattice &l,int mu) { + typedef typename iobj::scalar_type scalar_type; + typedef typename iobj::vector_type vector_type; GridBase *grid = l._grid; int Nsimd = grid->iSites(); std::vector gcoor; - std::vector mergebuf(Nsimd); - std::vector mergeptr(Nsimd); - vInteger vI; + std::vector mergebuf(Nsimd); + std::vector mergeptr(Nsimd); + vector_type vI; for(int o=0;ooSites();o++){ for(int i=0;iiSites();i++){ grid->RankIndexToGlobalCoor(grid->ThisRank(),o,i,gcoor); - // grid->RankIndexToGlobalCoor(0,o,i,gcoor); mergebuf[i]=gcoor[mu]; mergeptr[i]=&mergebuf[i]; } diff --git a/lib/lattice/Grid_lattice_peekpoke.h b/lib/lattice/Grid_lattice_peekpoke.h index 41212037..93245016 100644 --- a/lib/lattice/Grid_lattice_peekpoke.h +++ b/lib/lattice/Grid_lattice_peekpoke.h @@ -43,6 +43,7 @@ namespace Grid { } return ret; }; + //////////////////////////////////////////////////////////////////////////////////////////////////// // Poke internal indices of a Lattice object //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -88,26 +89,26 @@ namespace Grid { assert( sizeof(sobj)*Nsimd == sizeof(vobj)); int rank,odx,idx; - grid->GlobalCoorToRankIndex(rank,odx,idx,site); - // Optional to broadcast from node 0. - grid->Broadcast(0,s); + grid->GlobalCoorToRankIndex(rank,odx,idx,site); + grid->Broadcast(grid->BossRank(),s); std::vector buf(Nsimd); std::vector pointers(Nsimd); - for(int i=0;iThisRank() ) { + for(int i=0;i + void peekLocalSite(sobj &s,Lattice &l,std::vector &site){ + + GridBase *grid=l._grid; + + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + + int Nsimd = grid->Nsimd(); + + assert( l.checkerboard== l._grid->CheckerBoard(site)); + assert( sizeof(sobj)*Nsimd == sizeof(vobj)); + + int odx,idx; + idx= grid->iIndex(site); + odx= grid->oIndex(site); + + std::vector buf(Nsimd); + std::vector pointers(Nsimd); + for(int i=0;i + void pokeLocalSite(const sobj &s,Lattice &l,std::vector &site){ + + GridBase *grid=l._grid; + + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + + int Nsimd = grid->Nsimd(); + + assert( l.checkerboard== l._grid->CheckerBoard(site)); + assert( sizeof(sobj)*Nsimd == sizeof(vobj)); + + int odx,idx; + idx= grid->iIndex(site); + odx= grid->oIndex(site); + + std::vector buf(Nsimd); + std::vector pointers(Nsimd); + for(int i=0;i + inline typename vobj::scalar_object sum(const Lattice &arg){ + + GridBase *grid=arg._grid; + int Nsimd = grid->Nsimd(); + + typedef typename vobj::scalar_object sobj; + typedef typename vobj::scalar_type scalar_type; + + vobj vsum; + sobj ssum; + + vsum=zero; + ssum=zero; + for(int ss=0;ssoSites(); ss++){ + vsum = vsum + arg._odata[ss]; + } + + std::vector buf(Nsimd); + std::vector pointers(Nsimd); + for(int i=0;iGlobalSum(ssum); + + return ssum; + } + } #endif diff --git a/lib/math/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h index 98b9d22e..0ee30970 100644 --- a/lib/math/Grid_math_tensors.h +++ b/lib/math/Grid_math_tensors.h @@ -13,10 +13,12 @@ template class iScalar public: vtype _internal; - typedef typename GridTypeMapper::scalar_type scalar_type; + typedef typename GridTypeMapper::scalar_type scalar_type; typedef typename GridTypeMapper::vector_type vector_type; typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; typedef iScalar tensor_reduced; + typedef typename GridTypeMapper::scalar_object recurse_scalar_object; + typedef iScalar scalar_object; enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; @@ -27,7 +29,7 @@ public: iScalar(scalar_type s) : _internal(s) {};// recurse down and hit the constructor for vector_type - iScalar(Zero &z){ *this = zero; }; + iScalar(const Zero &z){ *this = zero; }; iScalar & operator= (const Zero &hero){ zeroit(*this); @@ -73,11 +75,18 @@ public: operator ComplexD () const { return(TensorRemove(_internal)); }; operator RealD () const { return(real(TensorRemove(_internal))); } + + template::notvalue, T>::type* = nullptr > inline auto operator = (T arg) -> iScalar + { + _internal = arg; + return *this; + } + }; /////////////////////////////////////////////////////////// // Allows to turn scalar>>> back to double. /////////////////////////////////////////////////////////// -template inline typename std::enable_if::notvalue, T>::type TensorRemove(T arg) { return arg;} +template inline typename std::enable_if::notvalue, T>::type TensorRemove(T arg) { return arg;} template inline auto TensorRemove(iScalar arg) -> decltype(TensorRemove(arg._internal)) { return TensorRemove(arg._internal); @@ -91,14 +100,17 @@ public: typedef typename GridTypeMapper::scalar_type scalar_type; typedef typename GridTypeMapper::vector_type vector_type; typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; + typedef typename GridTypeMapper::scalar_object recurse_scalar_object; + typedef iScalar tensor_reduced; + typedef iVector scalar_object; + enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; - typedef iScalar tensor_reduced; - iVector(Zero &z){ *this = zero; }; + iVector(const Zero &z){ *this = zero; }; iVector() {};// Empty constructure - iVector & operator= (Zero &hero){ + iVector & operator= (const Zero &hero){ zeroit(*this); return *this; } @@ -153,18 +165,27 @@ public: typedef typename GridTypeMapper::scalar_type scalar_type; typedef typename GridTypeMapper::vector_type vector_type; - typedef typename GridTypeMapper::tensor_reduced tensor_reduced_v; + typedef typename GridTypeMapper::scalar_object recurse_scalar_object; + typedef iScalar tensor_reduced; + typedef iMatrix scalar_object; enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; - typedef iScalar tensor_reduced; - iMatrix(Zero &z){ *this = zero; }; + iMatrix(const Zero &z){ *this = zero; }; iMatrix() {}; - iMatrix & operator= (Zero &hero){ + iMatrix & operator= (const Zero &hero){ zeroit(*this); return *this; } + template::notvalue, T>::type* = nullptr > inline auto operator = (T arg) -> iMatrix + { + zeroit(*this); + for(int i=0;i &that){ for(int i=0;i class GridTypeMapper { @@ -43,6 +45,7 @@ namespace Grid { typedef RealD scalar_type; typedef RealD vector_type; typedef RealD tensor_reduced; + typedef RealD scalar_object; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { @@ -50,6 +53,7 @@ namespace Grid { typedef ComplexF scalar_type; typedef ComplexF vector_type; typedef ComplexF tensor_reduced; + typedef ComplexF scalar_object; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { @@ -57,6 +61,7 @@ namespace Grid { typedef ComplexD scalar_type; typedef ComplexD vector_type; typedef ComplexD tensor_reduced; + typedef ComplexD scalar_object; enum { TensorLevel = 0 }; }; @@ -65,6 +70,7 @@ namespace Grid { typedef RealF scalar_type; typedef vRealF vector_type; typedef vRealF tensor_reduced; + typedef RealF scalar_object; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { @@ -72,6 +78,7 @@ namespace Grid { typedef RealD scalar_type; typedef vRealD vector_type; typedef vRealD tensor_reduced; + typedef RealD scalar_object; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { @@ -79,6 +86,7 @@ namespace Grid { typedef ComplexF scalar_type; typedef vComplexF vector_type; typedef vComplexF tensor_reduced; + typedef ComplexF scalar_object; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { @@ -86,6 +94,7 @@ namespace Grid { typedef ComplexD scalar_type; typedef vComplexD vector_type; typedef vComplexD tensor_reduced; + typedef ComplexD scalar_object; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { @@ -93,6 +102,7 @@ namespace Grid { typedef Integer scalar_type; typedef vInteger vector_type; typedef vInteger tensor_reduced; + typedef Integer scalar_object; enum { TensorLevel = 0 }; }; @@ -102,6 +112,10 @@ namespace Grid { static const bool notvalue = false; }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; template<> struct isGridTensor { static const bool value = false; static const bool notvalue = true; diff --git a/lib/parallelIO/GridNerscIO.h b/lib/parallelIO/GridNerscIO.h new file mode 100644 index 00000000..51820357 --- /dev/null +++ b/lib/parallelIO/GridNerscIO.h @@ -0,0 +1,524 @@ +#ifndef GRID_NERSC_IO_H +#define GRID_NERSC_IO_H + +#include +#include +#include +#include + +#include + +namespace Grid { + + using namespace QCD; + +//////////////////////////////////////////////////////////////////////////////// +// Some data types for intermediate storage +//////////////////////////////////////////////////////////////////////////////// + template using iLorentzColour2x3 = iVector, 2>, 4 >; +typedef iLorentzColour2x3 LorentzColour2x3; +typedef iLorentzColour2x3 LorentzColour2x3F; +typedef iLorentzColour2x3 LorentzColour2x3D; + +//////////////////////////////////////////////////////////////////////////////// +// header specification/interpretation +//////////////////////////////////////////////////////////////////////////////// +class NerscField { + public: + // header strings (not in order) + int dimension[4]; + std::string boundary[4]; + int data_start; + std::string hdr_version; + std::string storage_format; + // Checks on data + double link_trace; + double plaquette; + uint32_t checksum; + unsigned int sequence_number; + std::string data_type; + std::string ensemble_id ; + std::string ensemble_label ; + std::string creator ; + std::string creator_hardware ; + std::string creation_date ; + std::string archive_date ; + std::string floating_point; +}; + + +//////////////////////////////////////////////////////////////////////////////// +// Write and read from fstream; comput header offset for payload +//////////////////////////////////////////////////////////////////////////////// +inline unsigned int writeNerscHeader(NerscField &field,std::string file) +{ + std::ofstream fout(file,std::ios::out); + + fout.seekp(0,std::ios::beg); + fout << "BEGIN_HEADER" << std::endl; + fout << "HDR_VERSION = " << field.hdr_version << std::endl; + fout << "DATATYPE = " << field.data_type << std::endl; + fout << "STORAGE_FORMAT = " << field.storage_format << std::endl; + + for(int i=0;i<4;i++){ + fout << "DIMENSION_" << i+1 << " = " << field.dimension[i] << std::endl ; + } + // just to keep the space and write it later + fout << "LINK_TRACE = " << std::setprecision(10) << field.link_trace << std::endl; + fout << "PLAQUETTE = " << std::setprecision(10) << field.plaquette << std::endl; + for(int i=0;i<4;i++){ + fout << "BOUNDARY_"< header; + std::string line; + + ////////////////////////////////////////////////// + // read the header + ////////////////////////////////////////////////// + std::ifstream fin(file); + + getline(fin,line); // read one line and insist is + + removeWhitespace(line); + assert(line==std::string("BEGIN_HEADER")); + + do { + getline(fin,line); // read one line + int eq = line.find("="); + if(eq >0) { + std::string key=line.substr(0,eq); + std::string val=line.substr(eq+1); + removeWhitespace(key); + removeWhitespace(val); + + header[key] = val; + } + } while( line.find("END_HEADER") == std::string::npos ); + + field.data_start = fin.tellg(); + + ////////////////////////////////////////////////// + // chomp the values + ////////////////////////////////////////////////// + + field.hdr_version = header[std::string("HDR_VERSION")]; + field.data_type = header[std::string("DATATYPE")]; + field.storage_format = header[std::string("STORAGE_FORMAT")]; + + field.dimension[0] = std::stol(header[std::string("DIMENSION_1")]); + field.dimension[1] = std::stol(header[std::string("DIMENSION_2")]); + field.dimension[2] = std::stol(header[std::string("DIMENSION_3")]); + field.dimension[3] = std::stol(header[std::string("DIMENSION_4")]); + + assert(grid->_ndimension == 4); + for(int d=0;d<4;d++){ + assert(grid->_fdimensions[d]==field.dimension[d]); + } + + field.link_trace = std::stod(header[std::string("LINK_TRACE")]); + field.plaquette = std::stod(header[std::string("PLAQUETTE")]); + + field.boundary[0] = header[std::string("BOUNDARY_1")]; + field.boundary[1] = header[std::string("BOUNDARY_2")]; + field.boundary[2] = header[std::string("BOUNDARY_3")]; + field.boundary[3] = header[std::string("BOUNDARY_4")]; + + field.checksum = std::stoul(header[std::string("CHECKSUM")],0,16); + field.ensemble_id = header[std::string("ENSEMBLE_ID")]; + field.ensemble_label = header[std::string("ENSEMBLE_LABEL")]; + field.sequence_number = std::stol(header[std::string("SEQUENCE_NUMBER")]); + field.creator = header[std::string("CREATOR")]; + field.creator_hardware = header[std::string("CREATOR_HARDWARE")]; + field.creation_date = header[std::string("CREATION_DATE")]; + field.archive_date = header[std::string("ARCHIVE_DATE")]; + field.floating_point = header[std::string("FLOATING_POINT")]; + + return field.data_start; +} + + +////////////////////////////////////////////////////////////////////// +// Utilities +////////////////////////////////////////////////////////////////////// +inline void reconstruct3(LorentzColourMatrix & cm) +{ + const int x=0; + const int y=1; + const int z=2; + for(int mu=0;mu<4;mu++){ + cm(mu)()(2,x) = adj(cm(mu)()(0,y)*cm(mu)()(1,z)-cm(mu)()(0,z)*cm(mu)()(1,y)); //x= yz-zy + cm(mu)()(2,y) = adj(cm(mu)()(0,z)*cm(mu)()(1,x)-cm(mu)()(0,x)*cm(mu)()(1,z)); //y= zx-xz + cm(mu)()(2,z) = adj(cm(mu)()(0,x)*cm(mu)()(1,y)-cm(mu)()(0,y)*cm(mu)()(1,x)); //z= xy-yx + } +} + + + void inline be32toh(void *file_object,uint32_t bytes) + { + uint32_t * f = (uint32_t *)file_object; + for(int i=0;i*sizeof(uint32_t)>8) | ((f&0xFF000000UL)>>24) ; + fp[i] = ntohl(f); + } + } + void inline be64toh(void *file_object,uint32_t bytes) + { + uint64_t * f = (uint64_t *)file_object; + for(int i=0;i*sizeof(uint64_t)>8) | ((f&0xFF000000UL)>>24) ; + g = g << 32; + f = f >> 32; + g|= ((f&0xFF)<<24) | ((f&0xFF00)<<8) | ((f&0xFF0000)>>8) | ((f&0xFF000000UL)>>24) ; + fp[i] = ntohl(g); + } + } + +inline void NerscChecksum(uint32_t *buf,uint32_t buf_size,uint32_t &csum) +{ + for(int i=0;i*sizeof(uint32_t) + struct NerscSimpleMunger{ + void operator() (fobj &in,sobj &out,uint32_t &csum){ + + for(int mu=0;mu<4;mu++){ + for(int i=0;i<3;i++){ + for(int j=0;j<3;j++){ + out(mu)()(i,j) = in(mu)()(i,j); + }}} + + NerscChecksum((uint32_t *)&in,sizeof(in),csum); + }; + }; + template + struct NerscSimpleUnmunger{ + void operator() (sobj &in,fobj &out,uint32_t &csum){ + for(int mu=0;mu<4;mu++){ + for(int i=0;i<3;i++){ + for(int j=0;j<3;j++){ + out(mu)()(i,j) = in(mu)()(i,j); + }}} + NerscChecksum((uint32_t *)&out,sizeof(out),csum); + }; + }; + + template + struct Nersc3x2munger{ + void operator() (fobj &in,sobj &out,uint32_t &csum){ + + NerscChecksum((uint32_t *)&in,sizeof(in),csum); + + for(int mu=0;mu<4;mu++){ + for(int i=0;i<2;i++){ + for(int j=0;j<3;j++){ + out(mu)()(i,j) = in(mu)(i)(j); + }} + } + reconstruct3(out); + } + }; + + template + struct Nersc3x2unmunger{ + + void operator() (sobj &in,fobj &out,uint32_t &csum){ + + NerscChecksum((uint32_t *)&out,sizeof(out),csum); + + for(int mu=0;mu<4;mu++){ + for(int i=0;i<2;i++){ + for(int j=0;j<3;j++){ + out(mu)(i)(j) = in(mu)()(i,j); + }} + } + } +}; + +//////////////////////////////////////////////////////////////////////////// +// Template wizardry to map types to strings for NERSC in an extensible way +//////////////////////////////////////////////////////////////////////////// + template struct NerscDataType { + static void DataType (std::string &str) { str = std::string("4D_BINARY_UNKNOWN"); }; + static void FloatingPoint(std::string &str) { str = std::string("IEEE64BIG"); }; + }; + + template<> struct NerscDataType > { + static void DataType (std::string &str) { str = std::string("4D_SU3_GAUGE_3X3"); }; + static void FloatingPoint(std::string &str) { str = std::string("IEEE64BIG");}; + }; + + template<> struct NerscDataType > { + static void DataType (std::string &str) { str = std::string("4D_SU3_GAUGE_3X3"); }; + static void FloatingPoint(std::string &str) { str = std::string("IEEE32BIG");}; + }; + +////////////////////////////////////////////////////////////////////// +// Bit and Physical Checksumming and QA of data +////////////////////////////////////////////////////////////////////// +/* +template inline uint32_t NerscChecksum(Lattice & data) +{ + uint32_t sum; + for(int ss=0;ssOsites();ss++){ + uint32_t *iptr = (uint32_t *)& data._odata[0] ; + for(int i=0;iglobalSum(sum); + return sum; +} +*/ +template inline void NerscPhysicalCharacteristics(Lattice & data,NerscField &header) +{ + header.data_type = NerscDataType::DataType; + header.floating_point = NerscDataType::FloatingPoint; + return; +} + + template<> inline void NerscPhysicalCharacteristics(LatticeGaugeField & data,NerscField &header) +{ + NerscDataType::DataType(header.data_type); + NerscDataType::FloatingPoint(header.floating_point); + header.link_trace=1.0; + header.plaquette =1.0; +} + +template inline void NerscStatisics(Lattice & data,NerscField &header) +{ + assert(data._grid->_ndimension==4); + + for(int d=0;d<4;d++) + header.dimension[d] = data._grid->_fdimensions[d]; + + // compute checksum and any physical properties contained for this type + // header.checksum = NerscChecksum(data); + + NerscPhysicalCharacteristics(data,header); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Now the meat: the object readers +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +template +inline void readNerscObject(Lattice &Umu,std::string file,munger munge,int offset,std::string &format) +{ + GridBase *grid = Umu._grid; + + int ieee32big = (format == std::string("IEEE32BIG")); + int ieee32 = (format == std::string("IEEE32")); + int ieee64big = (format == std::string("IEEE64BIG")); + int ieee64 = (format == std::string("IEEE64")); + + // Find the location of each site and send to primary node + // for(int site=0; site < Layout::vol(); ++site){ + // multi1d coord = crtesn(site, Layout::lattSize()); + // for(int dd=0; dd_fdimensions[3];t++){ + for(int z=0;z_fdimensions[2];z++){ + for(int y=0;y_fdimensions[1];y++){ + for(int x=0;x_fdimensions[0];x++){ + + std::vector site({x,y,z,t}); + + if ( grid->IsBoss() ) { + fin.read((char *)&file_object,sizeof(file_object)); + + if(ieee32big) be32toh((void *)&file_object,sizeof(file_object)); + if(ieee32) le32toh((void *)&file_object,sizeof(file_object)); + if(ieee64big) be64toh((void *)&file_object,sizeof(file_object)); + if(ieee64) le64toh((void *)&file_object,sizeof(file_object)); + + munge(file_object,munged,csum); + } + // The boss who read the file has their value poked + pokeSite(munged,Umu,site); + }}}} + } +} + +template +inline void writeNerscObject(Lattice &Umu,std::string file,munger munge,int offset, + int sequence,double lt,double pl) +{ + GridBase *grid = Umu._grid; + NerscField header; + + ////////////////////////////////////////////////// + // First write the header; this is in wrong place + ////////////////////////////////////////////////// + assert(grid->_ndimension == 4); + for(int d=0;d<4;d++){ + header.dimension[d]=grid->_fdimensions[d]; + header.boundary [d]=std::string("PERIODIC");; + } + header.hdr_version=std::string("WHATDAHECK"); + // header.storage_format=storage_format::string; // use template specialisation + // header.data_type=data_type::string; + header.storage_format=std::string("debug"); + header.data_type =std::string("debug"); + + //FIXME; use template specialisation to fill these out + header.link_trace =lt; + header.plaquette =pl; + header.checksum =0; + + // + header.sequence_number =sequence; + header.ensemble_id =std::string("UKQCD"); + header.ensemble_label =std::string("UKQCD"); + header.creator =std::string("Tadahito"); + header.creator_hardware=std::string("BlueGene/Q"); + header.creation_date =std::string("AnnoDomini"); + header.archive_date =std::string("AnnoDomini"); + header.floating_point =std::string("IEEE64BIG"); + // header.data_start=; + // unsigned int checksum; + + ////////////////////////////////////////////////// + // Now write the body + ////////////////////////////////////////////////// + { + std::ofstream fout(file,std::ios::binary|std::ios::in); + fout.seekp(offset); + + Umu = zero; + uint32_t csum=0; + fobj file_object; + sobj unmunged; + for(int t=0;t_fdimensions[3];t++){ + for(int z=0;z_fdimensions[2];z++){ + for(int y=0;y_fdimensions[1];y++){ + for(int x=0;x_fdimensions[0];x++){ + std::vector site({x,y,z,t}); + peekSite(unmunged,Umu,site); + munge(unmunged,file_object,csum); + // broadcast & insert + fout.write((char *)&file_object,sizeof(file_object)); + }}}} + } +} + + + +inline void readNerscConfiguration(LatticeGaugeField &Umu,NerscField& header,std::string file) +{ + GridBase *grid = Umu._grid; + + int offset = readNerscHeader(file,Umu._grid,header); + + std::string format(header.floating_point); + + int ieee32big = (format == std::string("IEEE32BIG")); + int ieee32 = (format == std::string("IEEE32")); + int ieee64big = (format == std::string("IEEE64BIG")); + int ieee64 = (format == std::string("IEEE64")); + + // depending on datatype, set up munger; + // munger is a function of + if ( header.data_type == std::string("4D_SU3_GAUGE") ) { + if ( ieee32 || ieee32big ) { + readNerscObject + (Umu,file, + Nersc3x2munger(), + offset,format); + } + if ( ieee64 || ieee64big ) { + readNerscObject + (Umu,file, + Nersc3x2munger(), + offset,format); + } + } else if ( header.data_type == std::string("4D_SU3_GAUGE_3X3") ) { + if ( ieee32 || ieee32big ) { + readNerscObject + (Umu,file,NerscSimpleMunger(),offset,format); + } + if ( ieee64 || ieee64big ) { + readNerscObject + (Umu,file,NerscSimpleMunger(),offset,format); + } + } else { + assert(0); + } + +} + +template +inline void writeNerscConfiguration(Lattice &Umu,NerscField &header,std::string file) +{ + GridBase &grid = Umu._grid; + + NerscStatisics(Umu,header); + + int offset = writeNerscHeader(header,file); + + writeNerscObject(Umu,NerscSimpleMunger(),offset); +} + + +} +#endif diff --git a/lib/qcd/Grid_QCD.h b/lib/qcd/Grid_QCD.h index c405662d..b30b7a67 100644 --- a/lib/qcd/Grid_QCD.h +++ b/lib/qcd/Grid_QCD.h @@ -42,6 +42,8 @@ namespace QCD { typedef iColourMatrix ColourMatrix; typedef iSpinColourMatrix SpinColourMatrix; typedef iLorentzColourMatrix LorentzColourMatrix; + typedef iLorentzColourMatrix LorentzColourMatrixF; + typedef iLorentzColourMatrix LorentzColourMatrixD; typedef iSpinVector SpinVector; typedef iColourVector ColourVector; @@ -66,7 +68,7 @@ namespace QCD { typedef Lattice LatticeReal; typedef Lattice LatticeComplex; - typedef Lattice LatticeInteger; // Predicates for "where" + typedef Lattice LatticeInteger; // Predicates for "where" typedef Lattice LatticeColourMatrix; typedef Lattice LatticeSpinMatrix; diff --git a/tests/Grid_cshift.cc b/tests/Grid_cshift.cc new file mode 100644 index 00000000..3fe2b9cc --- /dev/null +++ b/tests/Grid_cshift.cc @@ -0,0 +1,84 @@ +#include +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector simd_layout({1,1,2,2}); + std::vector mpi_layout ({2,2,2,2}); + std::vector latt_size ({8,8,8,16}); + + GridCartesian Fine(latt_size,simd_layout,mpi_layout); + GridRNG FineRNG(&Fine); + + LatticeComplex U(&Fine); + LatticeComplex ShiftU(&Fine); + + LatticeComplex lex(&Fine); + lex=zero; + Integer stride =1; + { + double nrm; + LatticeComplex coor(&Fine); + + for(int d=0;d<4;d++){ + LatticeCoordinate(coor,d); + lex = lex + coor*stride; + stride=stride*latt_size[d]; + } + U=lex; + } + + TComplex cm; + + for(int dir=0;dir<4;dir++){ + for(int shift=0;shift coor(4); + + for(coor[3]=0;coor[3] scoor(coor); + scoor[dir] = (scoor[dir]+shift)%latt_size[dir]; + + Integer slex = scoor[0] + + latt_size[0]*scoor[1] + + latt_size[0]*latt_size[1]*scoor[2] + + latt_size[0]*latt_size[1]*latt_size[2]*scoor[3]; + + Complex scm(slex); + + nrm = abs(scm-cm()()()); + std::vector peer(4); + int index=real(cm); + Fine.CoorFromIndex(peer,index,latt_size); + + if (nrm > 0){ + cout<<"FAIL shift "<< shift<<" in dir "<< dir<<" ["< +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector simd_layout({1,1,2,2}); + std::vector mpi_layout ({2,1,1,2}); + std::vector latt_size ({16,16,16,32}); + + GridCartesian Fine(latt_size,simd_layout,mpi_layout); + GridRNG FineRNG(&Fine); + LatticeGaugeField Umu(&Fine); + + std::vector U(4,&Fine); + + NerscField header; + + std::string file("./ckpoint_lat.4000"); + readNerscConfiguration(Umu,header,file); + + for(int mu=0;mu(Umu,mu); + } + + // Painful ; fix syntactical niceness + LatticeComplex LinkTrace(&Fine); + LinkTrace=zero; + for(int mu=0;mu Date: Thu, 23 Apr 2015 07:51:15 +0100 Subject: [PATCH 086/429] Fixing endian on linux I hope --- configure.ac | 3 +-- lib/parallelIO/GridNerscIO.h | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/configure.ac b/configure.ac index 21f40f6c..647b5e30 100644 --- a/configure.ac +++ b/configure.ac @@ -17,6 +17,7 @@ AC_PROG_RANLIB AC_CHECK_HEADERS(stdint.h) AC_CHECK_HEADERS(malloc/malloc.h) AC_CHECK_HEADERS(malloc.h) +AC_CHECK_HEADERS(endian.h) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_SIZE_T @@ -25,8 +26,6 @@ AC_TYPE_UINT64_T # Checks for library functions. AC_CHECK_FUNCS([gettimeofday]) -AC_CHECK_FUNCS([ntohll]) -AC_CHECK_FUNCS([be64toh]) AC_ARG_ENABLE([simd],[AC_HELP_STRING([--enable-simd=SSE|AVX|AVX2|AVX512],[Select instructions])],[ac_SIMD=${enable_simd}],[ac_SIMD=AVX2]) diff --git a/lib/parallelIO/GridNerscIO.h b/lib/parallelIO/GridNerscIO.h index 51820357..5d1e2e41 100644 --- a/lib/parallelIO/GridNerscIO.h +++ b/lib/parallelIO/GridNerscIO.h @@ -6,7 +6,13 @@ #include #include +#ifdef HAVE_ENDIAN_H +#include #include +#define ntohll be64toh +#else +#include +#endif namespace Grid { @@ -177,14 +183,14 @@ inline void reconstruct3(LorentzColourMatrix & cm) } - void inline be32toh(void *file_object,uint32_t bytes) + void inline be32toh_v(void *file_object,uint32_t bytes) { uint32_t * f = (uint32_t *)file_object; for(int i=0;i*sizeof(uint32_t) &Umu,std::string file,munger munge,int if ( grid->IsBoss() ) { fin.read((char *)&file_object,sizeof(file_object)); - if(ieee32big) be32toh((void *)&file_object,sizeof(file_object)); - if(ieee32) le32toh((void *)&file_object,sizeof(file_object)); - if(ieee64big) be64toh((void *)&file_object,sizeof(file_object)); - if(ieee64) le64toh((void *)&file_object,sizeof(file_object)); + if(ieee32big) be32toh_v((void *)&file_object,sizeof(file_object)); + if(ieee32) le32toh_v((void *)&file_object,sizeof(file_object)); + if(ieee64big) be64toh_v((void *)&file_object,sizeof(file_object)); + if(ieee64) le64toh_v((void *)&file_object,sizeof(file_object)); munge(file_object,munged,csum); } From 73c0db82d5fd50300d9ebcb3280bcb69f7cf7e21 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 23 Apr 2015 08:02:51 +0100 Subject: [PATCH 087/429] Better description of Intel's many ISA targets --- configure.ac | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 647b5e30..b6e73bcb 100644 --- a/configure.ac +++ b/configure.ac @@ -27,7 +27,9 @@ AC_TYPE_UINT64_T # Checks for library functions. AC_CHECK_FUNCS([gettimeofday]) -AC_ARG_ENABLE([simd],[AC_HELP_STRING([--enable-simd=SSE|AVX|AVX2|AVX512],[Select instructions])],[ac_SIMD=${enable_simd}],[ac_SIMD=AVX2]) +AC_ARG_ENABLE([simd],[AC_HELP_STRING([--enable-simd=SSE|AVX|AVX2|AVX512|MIC],\ + [Select instructions to be SSE4.0, AVX 1.0, AVX 2.0+FMA, AVX 512, MIC])],\ + [ac_SIMD=${enable_simd}],[ac_SIMD=AVX2]) case ${ac_SIMD} in SSE4) @@ -42,8 +44,8 @@ case ${ac_SIMD} in echo Configuring for AVX2 AC_DEFINE([AVX2],[1],[AVX2] ) ;; - AVX512) - echo Configuring for AVX512 + AVX512|MIC) + echo Configuring for AVX512 and MIC AC_DEFINE([AVX512],[1],[AVX512] ) ;; *) From a9e574dd27174e4ed1455d3531009bb97f1b75d6 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 23 Apr 2015 08:31:40 +0100 Subject: [PATCH 088/429] Snippets from Guido to optimise Reduce --- lib/simd/Grid_vComplexF.h | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index 9fac656c..d931964c 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -213,19 +213,44 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ friend inline ComplexF Reduce(const vComplexF & in) { #ifdef SSE4 -#error + union { + __m128 v1; // SSE 4 x float vector + float f[4]; // scalar array of 4 floats + } u128; + u128.v1= _mm_add_ps(v, _mm_shuffle_ps(v, v, 0b01001110)); // FIXME Prefer to use _MM_SHUFFLE macros + return ComplexF(u128.f[0], u128.f[1]); #endif -#if defined (AVX1) || defined(AVX2) - // FIXME this is inefficient and use - __attribute__ ((aligned(32))) float c_[8]; - _mm256_store_ps(c_,in.v); - return ComplexF(c_[0]+c_[2]+c_[4]+c_[6],c_[1]+c_[3]+c_[5]+c_[7]); - +#ifdef AVX1 + //it would be better passing 2 arguments to saturate the vector lanes + union { + __m256 v1; + float f[8]; + } u256; + //SWAP lanes + __m256 t0 = _mm256_permute2f128_ps(in.v, in.v, 1); + __m256 t1 = _mm256_permute_ps(in.v , 0b11011000);//real (0,2,1,3) + __m256 t2 = _mm256_permute_ps(t0 , 0b10001101);//imag (1,3,0,2) + t0 = _mm256_blend_ps(t1, t2, 0b0101000001010000);// (0,0,1,1,0,0,1,1) + t1 = _mm256_hadd_ps(t0,t0); + u256.v1 = _mm256_hadd_ps(t1, t1); + return ComplexF(u256.f[0], u256.f[4]); +#endif +#ifdef AVX2 + union { + __m256 v1; + float f[8]; + } u256; + const __m256i mask= _mm256_set_epi32( 7, 5, 3, 1, 6, 4, 2, 0); + __m256 tmp1 = _mm256_permutevar8x32_ps(in.v, mask); + __m256 tmp2 = _mm256_hadd_ps(tmp1, tmp1); + u256.v1 = _mm256_hadd_ps(tmp2, tmp2); + return ComplexF(u256.f[0], u256.f[4]); #endif #ifdef AVX512 return ComplexF(_mm512_mask_reduce_add_ps(0x5555, in.v),_mm512_mask_reduce_add_ps(0xAAAA, in.v)); #endif #ifdef QPX +#error #endif } From 2f8431ab03a4b26e4af6c18b5088c6c65d8e4aa8 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 23 Apr 2015 11:04:19 +0100 Subject: [PATCH 089/429] Consolidate index to coor in a single routine --- lib/cartesian/Grid_cartesian_base.h | 30 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/lib/cartesian/Grid_cartesian_base.h b/lib/cartesian/Grid_cartesian_base.h index aff9375a..6ccfd175 100644 --- a/lib/cartesian/Grid_cartesian_base.h +++ b/lib/cartesian/Grid_cartesian_base.h @@ -90,20 +90,26 @@ public: for(int d=0;d<_ndimension;d++) idx+=_ostride[d]*ocoor[d]; return idx; } - inline void CoorFromIndex (std::vector& coor,int index,std::vector &dims){ - coor.resize(_ndimension); + static inline void CoorFromIndex (std::vector& coor,int index,std::vector &dims){ + int nd= dims.size(); + coor.resize(nd); for(int d=0;d<_ndimension;d++){ coor[d] = index % dims[d]; index = index / dims[d]; } } - inline void oCoorFromOindex (std::vector& coor,int Oindex){ - coor.resize(_ndimension); + static inline void IndexFromCoor (std::vector& coor,int &index,std::vector &dims){ + int nd=dims.size(); + int stride=1; + index=0; for(int d=0;d<_ndimension;d++){ - coor[d] = Oindex % _rdimensions[d]; - Oindex = Oindex / _rdimensions[d]; + index = index+stride*coor[d]; + stride=stride*dims[d]; } } + inline void oCoorFromOindex (std::vector& coor,int Oindex){ + CoorFromIndex(coor,Oindex,_rdimensions); + } ////////////////////////////////////////////////////////// // SIMD lane addressing @@ -116,11 +122,7 @@ public: } inline void iCoorFromIindex(std::vector &coor,int lane) { - coor.resize(_ndimension); - for(int d=0;d<_ndimension;d++){ - coor[d] = lane % _simd_layout[d]; - lane = lane / _simd_layout[d]; - } + CoorFromIndex(coor,lane,_simd_layout); } inline int PermuteDim(int dimension){ return _simd_layout[dimension]>1; @@ -152,11 +154,7 @@ public: // Global addressing //////////////////////////////////////////////////////////////// void GlobalIndexToGlobalCoor(int gidx,std::vector &gcoor){ - gcoor.resize(_ndimension); - for(int d=0;d<_ndimension;d++){ - gcoor[d] = gidx % _gdimensions[d]; - gidx = gidx / _gdimensions[d]; - } + CoorFromIndex(gcoor,gidx,_gdimensions); } void GlobalCoorToGlobalIndex(const std::vector & gcoor,int & gidx){ gidx=0; From b7416d79e3ca82299b74f20931d3c663f9b870c0 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 23 Apr 2015 11:04:59 +0100 Subject: [PATCH 090/429] Begginings of slice summation and subblocking --- TODO | 4 +-- configure | 46 ++++++++++++++------------------- lib/Grid_config.h | 7 ++--- lib/Grid_config.h.in | 7 ++--- lib/Grid_stencil.h | 6 ++--- lib/Grid_summation.h | 61 +++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 88 insertions(+), 43 deletions(-) diff --git a/TODO b/TODO index a8fa5ce9..256f2609 100644 --- a/TODO +++ b/TODO @@ -10,7 +10,7 @@ FUNCTIONALITY: * How to do U[mu] ... lorentz part of type structure or not. more like chroma if not. -- DONE * subdirs lib, tests ?? ----- DONE - - lib/math + - lib/math - lib/cartesian - lib/cshift - lib/stencil @@ -26,7 +26,7 @@ FUNCTIONALITY: Not done, or just incomplete * random number generation -* Consider switch std::vector to boost arrays. +* Consider switch std::vector to boost arrays or something lighter weight boost::multi_array A()... to replace multi1d, multi2d etc.. * How to define simple matrix operations, such as flavour matrices? diff --git a/configure b/configure index 48fafcf1..9e554925 100755 --- a/configure +++ b/configure @@ -1365,8 +1365,9 @@ Optional Features: --disable-dependency-tracking speeds up one-time build --disable-openmp do not use OpenMP - --enable-simd=SSE|AVX|AVX2|AVX512 - Select instructions + --enable-simd=SSE|AVX|AVX2|AVX512|MIC + Select instructions to be SSE4.0, AVX 1.0, AVX + 2.0+FMA, AVX 512, MIC --enable-comms=none|mpi Select communications Some influential environment variables: @@ -4945,6 +4946,18 @@ fi done +for ac_header in endian.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "endian.h" "ac_cv_header_endian_h" "$ac_includes_default" +if test "x$ac_cv_header_endian_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ENDIAN_H 1 +_ACEOF + +fi + +done + # Checks for typedefs, structures, and compiler characteristics. ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" @@ -4999,32 +5012,11 @@ _ACEOF fi done -for ac_func in ntohll -do : - ac_fn_c_check_func "$LINENO" "ntohll" "ac_cv_func_ntohll" -if test "x$ac_cv_func_ntohll" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_NTOHLL 1 -_ACEOF - -fi -done - -for ac_func in be64toh -do : - ac_fn_c_check_func "$LINENO" "be64toh" "ac_cv_func_be64toh" -if test "x$ac_cv_func_be64toh" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_BE64TOH 1 -_ACEOF - -fi -done - # Check whether --enable-simd was given. if test "${enable_simd+set}" = set; then : - enableval=$enable_simd; ac_SIMD=${enable_simd} + enableval=$enable_simd; \ + ac_SIMD=${enable_simd} else ac_SIMD=AVX2 fi @@ -5049,8 +5041,8 @@ $as_echo "#define AVX1 1" >>confdefs.h $as_echo "#define AVX2 1" >>confdefs.h ;; - AVX512) - echo Configuring for AVX512 + AVX512|MIC) + echo Configuring for AVX512 and MIC $as_echo "#define AVX512 1" >>confdefs.h diff --git a/lib/Grid_config.h b/lib/Grid_config.h index 2171ea6b..4152540e 100644 --- a/lib/Grid_config.h +++ b/lib/Grid_config.h @@ -16,8 +16,8 @@ /* GRID_COMMS_NONE */ /* #undef GRID_COMMS_NONE */ -/* Define to 1 if you have the `be64toh' function. */ -/* #undef HAVE_BE64TOH */ +/* Define to 1 if you have the header file. */ +/* #undef HAVE_ENDIAN_H */ /* Define to 1 if you have the `gettimeofday' function. */ #define HAVE_GETTIMEOFDAY 1 @@ -34,9 +34,6 @@ /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 -/* Define to 1 if you have the `ntohll' function. */ -/* #undef HAVE_NTOHLL */ - /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 diff --git a/lib/Grid_config.h.in b/lib/Grid_config.h.in index 2381525f..2dc0bda4 100644 --- a/lib/Grid_config.h.in +++ b/lib/Grid_config.h.in @@ -15,8 +15,8 @@ /* GRID_COMMS_NONE */ #undef GRID_COMMS_NONE -/* Define to 1 if you have the `be64toh' function. */ -#undef HAVE_BE64TOH +/* Define to 1 if you have the header file. */ +#undef HAVE_ENDIAN_H /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY @@ -33,9 +33,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H -/* Define to 1 if you have the `ntohll' function. */ -#undef HAVE_NTOHLL - /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H diff --git a/lib/Grid_stencil.h b/lib/Grid_stencil.h index d8debac0..7bafb879 100644 --- a/lib/Grid_stencil.h +++ b/lib/Grid_stencil.h @@ -283,7 +283,7 @@ namespace Grid { if ( comm_any ) { for(int i=0;i_ndimension == fine->_ndimension); + + int _ndimension = coarse->_ndimension; + + // local and global volumes subdivide cleanly after SIMDization + for(int d=0;d<_ndimension;d++){ + assert((fine->_rdimensions[d] / coarse->_rdimensions[d])* coarse->_rdimensions[d]==fine->_rdimensions[d]); + assert((fine->_ldimensions[d] / coarse->_ldimensions[d])* coarse->_ldimensions[d]==fine->_ldimensions[d]); + assert((fine->_gdimensions[d] / coarse->_gdimensions[d])* coarse->_gdimensions[d]==fine->_gdimensions[d]); + assert((fine->_fdimensions[d] / coarse->_fdimensions[d])* coarse->_fdimensions[d]==fine->_fdimensions[d]); + } +} +// Generic name : Coarsen? +// : SubMeshSum? +// template -inline void sumBlocks(Lattice &coarseData,const Lattice &coarseData,const Lattice &fineData) { GridBase * fine = findData._grid; GridBase * coarse= findData._grid; + + subdivides(coars,fine); // require they map + + int _ndimension = coarse->_ndimension; + std::vector replicated(_ndimension,false); + std::vector block_r (_dimension); + std::vector block_f (_dimension); + + /////////////////////////////////////////////////////////// + // Detect whether the result is replicated in dimension d + /////////////////////////////////////////////////////////// + for(int d=0 ; d<_ndimension;d++){ + if ( (_fdimensions[d] == 1) && (coarse->_processors[d]>1) ) { + replicated[d]=true; + } + block_r[d] = fine->_rdimensions[d] / coarse->_rdimensions[d]; + block_l[d] = fine->_ldimensions[d] / coarse->_ldimensions[d]; + block_f[d] = fine->_fdimensions[d] / coarse->_fdimensions[d]; + } + + coaseData=zero; + + //FIXME Bagel's strategy: loop over fine sites + // identify corresponding coarse site, but coarse sites are + // divided across threads. Not so easy to do in openmp but + // there must be a way + for(int sf=0;sfoSites();sf++){ + + int sc; + vobj sum=zero; + std::vector coor_c(_ndimension); + std::vector coor_f(_ndimension); + + GridBase::CoorFromIndex(coor_f,sf,fine->_rdimensions); + + for(int d=0;d<_ndimension;d++) coor_c[d]=coor_f[d]/fine->_rdimensions; + + GridBase::IndexFromCoor(coor_c,sc,coarse->_rdimensions); + + coarseData._odata[sc]=coarseData._odata[sc]+fineData._odata[sf]; + + } return; } #endif From 62e8d2d12730c3b642c85dfd80e4a08eabafa82e Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 23 Apr 2015 15:13:00 +0100 Subject: [PATCH 091/429] Slice summation working. May move this into lattice/Grid_lattice_reduction however --- lib/Grid_lattice.h | 1 + lib/Grid_simd.h | 36 ++++----- lib/Grid_summation.h | 113 ++++++++++++++++++++------- lib/cartesian/Grid_cartesian_base.h | 41 +++++----- lib/lattice/Grid_lattice_reduction.h | 5 +- lib/math/Grid_math_tensors.h | 32 ++++++++ tests/Grid_nersc_io.cc | 25 +++++- 7 files changed, 181 insertions(+), 72 deletions(-) diff --git a/lib/Grid_lattice.h b/lib/Grid_lattice.h index 7256459c..ed875bc0 100644 --- a/lib/Grid_lattice.h +++ b/lib/Grid_lattice.h @@ -98,6 +98,7 @@ public: #include #include #include +#include diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index 9bf10fc9..17755fe0 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -126,16 +126,16 @@ namespace Grid { ///////////////////////////////////////////////////////////////// // Generic extract/merge/permute ///////////////////////////////////////////////////////////////// + template inline void Gextract(const vsimd &y,std::vector &extracted){ - // FIXME: bounce off stack is painful - // temporary hack while I figure out better way. - // There are intrinsics to do this work without the storage. + // FIXME: bounce off memory is painful int Nextr=extracted.size(); int Nsimd=vsimd::Nsimd(); int s=Nsimd/Nextr; std::vector > buf(Nsimd); + vstore(y,&buf[0]); for(int i=0;i &extracted){ } }; template +inline void Gextract(const vsimd &y,std::vector &extracted){ + int Nextr=extracted.size(); + int Nsimd=vsimd::Nsimd(); + int s=Nsimd/Nextr; + + std::vector > buf(Nsimd); + + vstore(y,&buf[0]); + for(int i=0;i inline void Gmerge(vsimd &y,std::vector &extracted){ int Nextr=extracted.size(); int Nsimd=vsimd::Nsimd(); @@ -158,23 +171,6 @@ inline void Gmerge(vsimd &y,std::vector &extracted){ vset(y,&buf[0]); }; template -inline void Gextract(const vsimd &y,std::vector &extracted){ - // FIXME: bounce off stack is painful - // temporary hack while I figure out better way. - // There are intrinsics to do this work without the storage. - int Nextr=extracted.size(); - int Nsimd=vsimd::Nsimd(); - int s=Nsimd/Nextr; - - std::vector > buf(Nsimd); - - vstore(y,&buf[0]); - - for(int i=0;i inline void Gmerge(vsimd &y,std::vector &extracted){ int Nextr=extracted.size(); int Nsimd=vsimd::Nsimd(); diff --git a/lib/Grid_summation.h b/lib/Grid_summation.h index 366cef06..12eeb2bc 100644 --- a/lib/Grid_summation.h +++ b/lib/Grid_summation.h @@ -1,7 +1,8 @@ #ifndef GRID_SUMMATION_H #define GRID_SUMMATION_H +namespace Grid { -void subdivides(GridBase *coarse,GridBase *fine) +inline void subdivides(GridBase *coarse,GridBase *fine) { assert(coarse->_ndimension == fine->_ndimension); @@ -9,58 +10,43 @@ void subdivides(GridBase *coarse,GridBase *fine) // local and global volumes subdivide cleanly after SIMDization for(int d=0;d<_ndimension;d++){ + assert(coarse->_processors[d] == fine->_processors[d]); + assert(coarse->_simd_layout[d] == fine->_simd_layout[d]); assert((fine->_rdimensions[d] / coarse->_rdimensions[d])* coarse->_rdimensions[d]==fine->_rdimensions[d]); - assert((fine->_ldimensions[d] / coarse->_ldimensions[d])* coarse->_ldimensions[d]==fine->_ldimensions[d]); - assert((fine->_gdimensions[d] / coarse->_gdimensions[d])* coarse->_gdimensions[d]==fine->_gdimensions[d]); - assert((fine->_fdimensions[d] / coarse->_fdimensions[d])* coarse->_fdimensions[d]==fine->_fdimensions[d]); } } + +// useful in multigrid project; // Generic name : Coarsen? -// : SubMeshSum? -// template inline void sumBlocks(Lattice &coarseData,const Lattice &fineData) { - GridBase * fine = findData._grid; - GridBase * coarse= findData._grid; + GridBase * fine = fineData._grid; + GridBase * coarse= coarseData._grid; - subdivides(coars,fine); // require they map + subdivides(coarse,fine); // require they map int _ndimension = coarse->_ndimension; - std::vector replicated(_ndimension,false); - std::vector block_r (_dimension); - std::vector block_f (_dimension); - + std::vector block_r (_ndimension); + /////////////////////////////////////////////////////////// // Detect whether the result is replicated in dimension d /////////////////////////////////////////////////////////// + for(int d=0 ; d<_ndimension;d++){ - if ( (_fdimensions[d] == 1) && (coarse->_processors[d]>1) ) { - replicated[d]=true; - } block_r[d] = fine->_rdimensions[d] / coarse->_rdimensions[d]; - block_l[d] = fine->_ldimensions[d] / coarse->_ldimensions[d]; - block_f[d] = fine->_fdimensions[d] / coarse->_fdimensions[d]; } - coaseData=zero; - - //FIXME Bagel's strategy: loop over fine sites - // identify corresponding coarse site, but coarse sites are - // divided across threads. Not so easy to do in openmp but - // there must be a way + coarseData=zero; for(int sf=0;sfoSites();sf++){ int sc; - vobj sum=zero; std::vector coor_c(_ndimension); std::vector coor_f(_ndimension); GridBase::CoorFromIndex(coor_f,sf,fine->_rdimensions); - - for(int d=0;d<_ndimension;d++) coor_c[d]=coor_f[d]/fine->_rdimensions; - + for(int d=0;d<_ndimension;d++) coor_c[d]=coor_f[d]/block_r[d]; GridBase::IndexFromCoor(coor_c,sc,coarse->_rdimensions); coarseData._odata[sc]=coarseData._odata[sc]+fineData._odata[sf]; @@ -68,4 +54,75 @@ inline void sumBlocks(Lattice &coarseData,const Lattice &fineData) } return; } + +template inline void sliceSum(const Lattice &Data,std::vector &result,int orthogdim) +{ + typedef typename vobj::scalar_object sobj; + + GridBase *grid = Data._grid; + const int Nd = grid->_ndimension; + const int Nsimd = grid->Nsimd(); + + assert(orthogdim >= 0); + assert(orthogdim < Nd); + + int fd=grid->_fdimensions[orthogdim]; + int ld=grid->_ldimensions[orthogdim]; + int rd=grid->_rdimensions[orthogdim]; + + std::vector > lvSum(rd); // will locally sum vectors first + std::vector lsSum(ld,sobj(zero)); // sum across these down to scalars + std::vector extracted(Nsimd); // splitting the SIMD + + result.resize(fd); // And then global sum to return the same vector to every node for IO to file + for(int r=0;r coor(Nd); + + // sum over reduced dimension planes, breaking out orthog dir + for(int ss=0;ssoSites();ss++){ + GridBase::CoorFromIndex(coor,ss,grid->_rdimensions); + int r = coor[orthogdim]; + lvSum[r]=lvSum[r]+Data._odata[ss]; + } + + // Sum across simd lanes in the plane, breaking out orthog dir. + std::vector icoor(Nd); + + for(int rt=0;rtiCoorFromIindex(icoor,idx); + + int ldx =rt+icoor[orthogdim]*rd; + + lsSum[ldx]=lsSum[ldx]+extracted[idx]; + + } + } + + // sum over nodes. + sobj gsum; + for(int t=0;t_processor_coor[orthogdim] ) { + gsum=lsSum[lt]; + } else { + gsum=zero; + } + + grid->GlobalSum(gsum); + + result[t]=gsum; + } + +} + +} #endif diff --git a/lib/cartesian/Grid_cartesian_base.h b/lib/cartesian/Grid_cartesian_base.h index 6ccfd175..6fd55399 100644 --- a/lib/cartesian/Grid_cartesian_base.h +++ b/lib/cartesian/Grid_cartesian_base.h @@ -93,7 +93,7 @@ public: static inline void CoorFromIndex (std::vector& coor,int index,std::vector &dims){ int nd= dims.size(); coor.resize(nd); - for(int d=0;d<_ndimension;d++){ + for(int d=0;d &pcoor,std::vector &lcoor,const std::vector &gcoor) + { + pcoor.resize(_ndimension); + lcoor.resize(_ndimension); + for(int mu=0;mu<_ndimension;mu++){ + pcoor[mu] = gcoor[mu]/_ldimensions[mu]; + lcoor[mu] = gcoor[mu]%_ldimensions[mu]; + } + } + void GlobalCoorToRankIndex(int &rank, int &o_idx, int &i_idx ,const std::vector &gcoor) + { + std::vector pcoor; + std::vector lcoor; + GlobalCoorToProcessorCoorLocalCoor(pcoor,lcoor,gcoor); + rank = RankFromProcessorCoor(pcoor); + i_idx= iIndex(lcoor); + o_idx= oIndex(lcoor); + } + void RankIndexToGlobalCoor(int rank, int o_idx, int i_idx , std::vector &gcoor) { gcoor.resize(_ndimension); @@ -191,24 +210,6 @@ public: gcoor.resize(_ndimension); for(int mu=0;mu<_ndimension;mu++) gcoor[mu] = Pcoor[mu]*_ldimensions[mu]+Lcoor[mu]; } - void GlobalCoorToProcessorCoorLocalCoor(std::vector &pcoor,std::vector &lcoor,const std::vector &gcoor) - { - pcoor.resize(_ndimension); - lcoor.resize(_ndimension); - for(int mu=0;mu<_ndimension;mu++){ - pcoor[mu] = gcoor[mu]/_ldimensions[mu]; - lcoor[mu] = gcoor[mu]%_ldimensions[mu]; - } - } - void GlobalCoorToRankIndex(int &rank, int &o_idx, int &i_idx ,const std::vector &gcoor) - { - std::vector pcoor; - std::vector lcoor; - GlobalCoorToProcessorCoorLocalCoor(pcoor,lcoor,gcoor); - rank = RankFromProcessorCoor(pcoor); - i_idx= iIndex(lcoor); - o_idx= oIndex(lcoor); - } }; diff --git a/lib/lattice/Grid_lattice_reduction.h b/lib/lattice/Grid_lattice_reduction.h index 7d34d2ea..b96d0f05 100644 --- a/lib/lattice/Grid_lattice_reduction.h +++ b/lib/lattice/Grid_lattice_reduction.h @@ -25,7 +25,9 @@ namespace Grid { } template - inline auto innerProduct(const Lattice &left,const Lattice &right) ->decltype(innerProduct(left._odata[0],right._odata[0])) + inline ComplexD innerProduct(const Lattice &left,const Lattice &right) + // inline auto innerProduct(const Lattice &left,const Lattice &right) + //->decltype(innerProduct(left._odata[0],right._odata[0])) { typedef typename vobj::scalar_type scalar; decltype(innerProduct(left._odata[0],right._odata[0])) vnrm=zero; @@ -54,6 +56,7 @@ namespace Grid { vsum=zero; ssum=zero; + //FIXME make this loop parallelisable for(int ss=0;ssoSites(); ss++){ vsum = vsum + arg._odata[ss]; } diff --git a/lib/math/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h index 0ee30970..379e61d2 100644 --- a/lib/math/Grid_math_tensors.h +++ b/lib/math/Grid_math_tensors.h @@ -241,5 +241,37 @@ public: }; +template inline +void extract(const vobj &vec,std::vector &extracted) +{ + typedef typename vobj::scalar_type scalar_type ; + typedef typename vobj::vector_type vector_type ; + + int Nsimd=vobj::vector_type::Nsimd(); + + extracted.resize(Nsimd); + + std::vector pointers(Nsimd); + for(int i=0;i inline +void merge(vobj &vec,std::vector &extracted) +{ + typedef typename vobj::scalar_type scalar_type ; + typedef typename vobj::vector_type vector_type ; + + int Nsimd=vobj::vector_type::Nsimd(); + assert(extracted.size()==Nsimd); + + std::vector pointers(Nsimd); + for(int i=0;i simd_layout({1,1,2,2}); - std::vector mpi_layout ({2,1,1,2}); + std::vector mpi_layout ({1,1,1,1}); std::vector latt_size ({16,16,16,32}); + int orthodir=3; + int orthosz =latt_size[orthodir]; GridCartesian Fine(latt_size,simd_layout,mpi_layout); GridRNG FineRNG(&Fine); @@ -45,14 +47,31 @@ int main (int argc, char ** argv) } } - double vol = Fine.gSites(); - Complex PlaqScale(1.0/vol/6.0/3.0); + + std::vector Plaq_T(orthosz); + sliceSum(Plaq,Plaq_T,Nd-1); + int Nt = Plaq_T.size(); + + TComplex Plaq_T_sum=zero; + for(int t=0;t Date: Thu, 23 Apr 2015 20:41:22 +0100 Subject: [PATCH 092/429] move --- lib/qcd/{Grid_QCD.h => Grid_qcd.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/qcd/{Grid_QCD.h => Grid_qcd.h} (100%) diff --git a/lib/qcd/Grid_QCD.h b/lib/qcd/Grid_qcd.h similarity index 100% rename from lib/qcd/Grid_QCD.h rename to lib/qcd/Grid_qcd.h From 4b4dcc4c1369ea4d5a25db4fc7947fda97a70114 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 23 Apr 2015 20:42:09 +0100 Subject: [PATCH 093/429] Rename Grid_QCD --- lib/Grid.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/Grid.h b/lib/Grid.h index 7e12490a..2a666c3b 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -50,16 +50,21 @@ #include #include #include -#include +#include #include namespace Grid { void Grid_init(int *argc,char ***argv); void Grid_finalize(void); - double usecond(void); void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr); void Grid_debug_handler_init(void); + void Grid_quiesce_nodes(void); + void Grid_unquiesce_nodes(void); + + // C++11 time facilities better? + double usecond(void); + }; From e2e3ea57428cd2cf9190e392d914085bcf597c48 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 23 Apr 2015 20:42:30 +0100 Subject: [PATCH 094/429] Reorganised the TODO. Really getting somewhere --- TODO | 298 ++++++++++++----------------------------- lib/Grid_init.cc | 61 +++++++-- lib/Grid_summation.h | 94 ++++++++++++- tests/Grid_nersc_io.cc | 13 +- 4 files changed, 239 insertions(+), 227 deletions(-) diff --git a/TODO b/TODO index 256f2609..12e33302 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,77 @@ +* - BinaryWriter, TextWriter etc... + - protocol buffers? replace xml + +* Stencil operator support -----Initial thoughts, trial implementation DONE. + -----some simple tests that Stencil matches Cshift. + -----do all permute in comms phase, so that copy permute + -----cases move into a buffer. + -----allow transform in/out buffers spproj + + +* CovariantShift support -----Use a class to store gauge field? (parallel transport?) + +* Consider switch std::vector to boost arrays or something lighter weight + boost::multi_array A()... to replace multi1d, multi2d etc.. + +* How to define simple matrix operations, such as flavour matrices? + +* Make the Tensor types and Complex etc... play more nicely. + +* Dirac, Pauli, SU subgroup, etc.. * Gamma/Dirac structures + +* Fourspin, two spin project + +* su3 exponentiation & log etc.. [Jamie's code?] + TaProj + +* Parallel MPI2 IO + +* rb4d support. + +* Check for missing functionality - partially audited against QDP++ layout + +* Optimise the extract/merge SIMD routines; Azusa?? + - I have collated into single location at least. + - Need to use _mm_*insert/extract routines. + +* Conformable test in Cshift routines. + +* QDP++ regression suite and comparative benchmark + +AUDITS: + +* FIXME audit +* const audit +* Replace vset with a call to merge.; +* care in Gmerge,Gextract over vset . +* extract / merge extra implementation removal +* Test infrastructure + + // TODO + // + // Base class to share common code between vRealF, VComplexF etc... + // + // Unary functions + // cos,sin, tan, acos, asin, cosh, acosh, tanh, sinh, // Scalar only arg + // exp, log, sqrt, fabs + // + // transposeColor, transposeSpin, + // adjColor, adjSpin, + // + // copyMask. + // + // localMaxAbs + // + // Fourier transform equivalent. + +* LinearOperator + + LinearSolver + + Polynomial etc... + +====================================================================================================== + FUNCTIONALITY: * Conditional execution, where etc... -----DONE, simple test * Integer relational support -----DONE @@ -22,222 +96,24 @@ FUNCTIONALITY: - lib/qcd/actions - lib/qcd/measurements +* Subset support, slice sums etc... -----DONE + sliceSum(orthog) + sum + innerProduct + norm2 -Not done, or just incomplete -* random number generation +* Subgrid Transferral -----DONE + subBlock (coarseLattice,fineLattice) + projectBlockBasis + promoteBlockBasis -* Consider switch std::vector to boost arrays or something lighter weight - boost::multi_array A()... to replace multi1d, multi2d etc.. +* random number generation ----- DONE -* How to define simple matrix operations, such as flavour matrices? - -* Dirac, Pauli, SU subgroup, etc.. * Gamma/Dirac structures - -* Fourspin, two spin project - -* su3 exponentiation, log etc.. [Jamie's code?] - -* Stencil operator support -----Initial thoughts, trial implementation DONE. - -----some simple tests that Stencil matches Cshift. - -----do all permute in comms phase, so that copy permute - -----cases move into a buffer. - -----allow transform in/out buffers spproj - -* CovariantShift support -----Use a class to store gauge field? (parallel transport?) - -* Subset support, slice sums etc... -----Only need slice sum? - -----Generic cartesian subslicing? - -----Array ranges / boost extents? - -----Multigrid grid transferral? - -----Suggests generalised cartesian subblocking - sums, returning modified grid? - -----What should interface be? - -* Grid transferral - * pickCheckerboard, pickSubPlane, pickSubBlock, - * sumSubPlane, sumSubBlocks - -* rb4d support. - -* Check for missing functionality - partially audited against QDP++ layout - -* Optimise the extract/merge SIMD routines; Azusa?? - - - I have collated into single location at least. - - Need to use _mm_*insert/extract routines. - -* Conformable test in Cshift routines. - - - -* Broadcast, reduction tests. innerProduct, localInnerProduct - -* QDP++ regression suite and comparative benchmark +* Broadcast, reduction tests. innerProduct, localInnerProduct --- DONE * I/O support - -* NERSC Lattice loading, plaquette test - - - MPI IO? - - BinaryWriter, TextWriter etc... - - protocol buffers? - -AUDITS: -// Lattice support audit Tested in Grid_main.cc -// -// -=,+=,*= Y -// add,+,sub,-,mult,mac,* Y -// innerProduct,norm2 Y -// localInnerProduct,outerProduct, Y -// adj,conj Y -// transpose, Y -// trace Y -// -// transposeIndex Y -// traceIndex Y -// peekIndex Y -// -// real,imag missing, semantic thought needed on real/im support. -// perhaps I just keep everything complex? -// - -* FIXME audit -* const audit -* Replace vset with a call to merge.; -* care in Gmerge,Gextract over vset . -* extract / merge extra implementation removal -* Test infrastructure - -[ More on subsets and grid transfers ] -i) Three classes of subset; red black parity subsetting (pick checkerboard). - cartesian sub-block subsetting - rbNd - -ii) Need to be able to project one Grid to another Grid. - -Lattice coarse_data SubBlockSum (GridBase *CoarseGrid, Lattice &fine_data) - -Operation ensure either: - rd[dim] divide rd[dim] fine_data - -This will give a distributed array over mpi ranks in a given dim IF coarse gd != 1 and _processors[d]>1 -Dimension can be *replicated* on all ranks in dimension. Need a "replicated" option on GridCartesian etc.. - -This will give "slice" summation and fourier projection assistance. - - Generic concept is to subdivide (based on RD so applies to red/black or full). - Return a type on SUB-grid from CellSum TOP-grid - SUB-grid need not distribute but be replicated in some dims if that is how the - cartesian communicator works. - -Instead of subsetting - -iii) No general permutation map. +* NERSC Lattice loading, plaquette test ------- DONE single node - ? Cell definition <-> sliceSum. - ? Replicated arrays. +* Controling std::cout ------- DONE - - - -// Cartesian grid inheritance -// Grid::GridBase -// | -// __________|___________ -// | | -// Grid::GridCartesian Grid::GridCartesianRedBlack -// -// TODO: document the following as an API guaranteed public interface - - /* - * Rough map of functionality against QDP++ Layout - * - * Param | Grid | QDP++ - * ----------------------------------------- - * | | - * void | oSites, iSites, lSites | sitesOnNode - * void | gSites | vol - * | | - * gcoor | oIndex, iIndex | linearSiteIndex // no virtual node in QDP - * lcoor | | - * - * void | CheckerBoarded | - // No checkerboarded in QDP - * void | FullDimensions | lattSize - * void | GlobalDimensions | lattSize // No checkerboarded in QDP - * void | LocalDimensions | subgridLattSize - * void | VirtualLocalDimensions | subgridLattSize // no virtual node in QDP - * | | - * int x 3 | oiSiteRankToGlobal | siteCoords - * | ProcessorCoorLocalCoorToGlobalCoor | - * | | - * vector | GlobalCoorToRankIndex | nodeNumber(coord) - * vector | GlobalCoorToProcessorCoorLocalCoor| nodeCoord(coord) - * | | - * void | Processors | logicalSize // returns cart array shape - * void | ThisRank | nodeNumber(); // returns this node rank - * void | ThisProcessorCoor | // returns this node coor - * void | isBoss(void) | primaryNode(); - * | | - * | RankFromProcessorCoor | getLogicalCoorFrom(node) - * | ProcessorCoorFromRank | getNodeNumberFrom(logical_coord) - */ - // Work out whether to permute - // ABCDEFGH -> AE BF CG DH permute wrap num - // - // Shift 0 AE BF CG DH 0 0 0 0 ABCDEFGH 0 0 - // Shift 1 BF CG DH AE 0 0 0 1 BCDEFGHA 0 1 - // Shift 2 CG DH AE BF 0 0 1 1 CDEFGHAB 0 2 - // Shift 3 DH AE BF CG 0 1 1 1 DEFGHABC 0 3 - // Shift 4 AE BF CG DH 1 1 1 1 EFGHABCD 1 0 - // Shift 5 BF CG DH AE 1 1 1 0 FGHACBDE 1 1 - // Shift 6 CG DH AE BF 1 1 0 0 GHABCDEF 1 2 - // Shift 7 DH AE BF CG 1 0 0 0 HABCDEFG 1 3 - - // Suppose 4way simd in one dim. - // ABCDEFGH -> AECG BFDH permute wrap num - - // Shift 0 AECG BFDH 0,00 0,00 ABCDEFGH 0 0 - // Shift 1 BFDH CGEA 0,00 1,01 BCDEFGHA 0 1 - // Shift 2 CGEA DHFB 1,01 1,01 CDEFGHAB 1 0 - // Shift 3 DHFB EAGC 1,01 1,11 DEFGHABC 1 1 - // Shift 4 EAGC FBHD 1,11 1,11 EFGHABCD 2 0 - // Shift 5 FBHD GCAE 1,11 1,10 FGHABCDE 2 1 - // Shift 6 GCAE HDBF 1,10 1,10 GHABCDEF 3 0 - // Shift 7 HDBF AECG 1,10 0,00 HABCDEFG 3 1 - - // Generalisation to 8 way simd, 16 way simd required. - // - // Need log2 Nway masks. consisting of - // 1 bit 256 bit granule - // 2 bit 128 bit granule - // 4 bits 64 bit granule - // 8 bits 32 bit granules - // - // 15 bits.... - // TODO - // - // Base class to share common code between vRealF, VComplexF etc... - // - // lattice Broad cast assignment - // - // where() support - // implement with masks, and/or? Type of the mask & boolean support? - // - // Unary functions - // cos,sin, tan, acos, asin, cosh, acosh, tanh, sinh, // Scalar only arg - // exp, log, sqrt, fabs - // - // transposeColor, transposeSpin, - // adjColor, adjSpin, - // traceColor, traceSpin. - // peekColor, peekSpin + pokeColor PokeSpin - // - // copyMask. - // - // localMaxAbs - // - // norm2, - // sumMulti equivalent. - // Fourier transform equivalent. - // diff --git a/lib/Grid_init.cc b/lib/Grid_init.cc index ee11a982..762f7568 100644 --- a/lib/Grid_init.cc +++ b/lib/Grid_init.cc @@ -10,18 +10,57 @@ #include #include #include - +#include #include #undef __X86_64 +#define MAC + +#ifdef MAC +#include +#endif + namespace Grid { + std::streambuf *Grid_saved_stream_buf; +#if 0 + void Grid_quiesce_nodes(void) + { +#ifdef GRID_COMMS_MPI + int me; + MPI_Comm_rank(MPI_COMM_WORLD,&me); + std::streambuf* Grid_saved_stream_buf = std::cout.rdbuf(); + if ( me ) { + std::ofstream file("log.node"); + std::cout.rdbuf(file.rdbuf()); + } +#endif + } +#endif + void Grid_quiesce_nodes(void) + { +#ifdef GRID_COMMS_MPI + int me; + MPI_Comm_rank(MPI_COMM_WORLD,&me); + if ( me ) { + std::cout.setstate(std::ios::badbit); + } +#endif + } + void Grid_unquiesce_nodes(void) + { +#ifdef GRID_COMMS_MPI + std::cout.clear(); +#endif + } + void Grid_init(int *argc,char ***argv) { #ifdef GRID_COMMS_MPI MPI_Init(argc,argv); #endif Grid_debug_handler_init(); + Grid_quiesce_nodes(); } void Grid_finalize(void) { @@ -35,6 +74,10 @@ double usecond(void) { return 1.0*tv.tv_usec + 1.0e6*tv.tv_sec; } + +#define _NBACKTRACE (256) +void * Grid_backtrace_buffer[_NBACKTRACE]; + void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr) { printf("Caught signal %d\n",si->si_signo); @@ -43,10 +86,8 @@ void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr) #ifdef __X86_64 ucontext_t * uc= (ucontext_t *)ptr; - struct sigcontext *sc = (struct sigcontext *)&uc->uc_mcontext; printf(" instruction %llx\n",(uint64_t)sc->rip); - #define REG(A) printf(" %s %lx\n",#A, sc-> A); REG(rdi); REG(rsi); @@ -68,14 +109,14 @@ void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr) REG(r14); REG(r15); #endif - - fflush(stdout); - - if ( si->si_signo == SIGSEGV ) { - printf("Grid_sa_signal_handler: Oops... this was a sigsegv you naughty naughty programmer. Goodbye\n"); - fflush(stdout); - exit(-1); +#ifdef MAC + int symbols = backtrace (Grid_backtrace_buffer,_NBACKTRACE); + char **strings = backtrace_symbols(Grid_backtrace_buffer,symbols); + for (int i = 0; i < symbols; i++){ + printf ("%s\n", strings[i]); } +#endif + exit(0); return; }; diff --git a/lib/Grid_summation.h b/lib/Grid_summation.h index 12eeb2bc..c500c5f1 100644 --- a/lib/Grid_summation.h +++ b/lib/Grid_summation.h @@ -16,6 +16,96 @@ inline void subdivides(GridBase *coarse,GridBase *fine) } } +template +inline void projectBlockBasis(Lattice > &coarseData, + const Lattice &fineData, + const std::vector > &Basis) +{ + GridBase * fine = fineData._grid; + GridBase * coarse= coarseData._grid; + int _ndimension = coarse->_ndimension; + + // checks + assert( nbasis == Basis.size() ); + subdivides(coarse,fine); + for(int i=0;i block_r (_ndimension); + + for(int d=0 ; d<_ndimension;d++){ + block_r[d] = fine->_rdimensions[d] / coarse->_rdimensions[d]; + } + + coarseData=zero; + + // Loop with a cache friendly loop ordering + for(int sf=0;sfoSites();sf++){ + + int sc; + std::vector coor_c(_ndimension); + std::vector coor_f(_ndimension); + GridBase::CoorFromIndex(coor_f,sf,fine->_rdimensions); + for(int d=0;d<_ndimension;d++) coor_c[d]=coor_f[d]/block_r[d]; + GridBase::IndexFromCoor(coor_c,sc,coarse->_rdimensions); + + for(int i=0;i +inline void promoteBlockBasis(const Lattice > &coarseData, + Lattice &fineData, + const std::vector > &Basis) +{ + GridBase * fine = fineData._grid; + GridBase * coarse= coarseData._grid; + int _ndimension = coarse->_ndimension; + + // checks + assert( nbasis == Basis.size() ); + subdivides(coarse,fine); + for(int i=0;i block_r (_ndimension); + + for(int d=0 ; d<_ndimension;d++){ + block_r[d] = fine->_rdimensions[d] / coarse->_rdimensions[d]; + } + + // Loop with a cache friendly loop ordering + for(int sf=0;sfoSites();sf++){ + + int sc; + std::vector coor_c(_ndimension); + std::vector coor_f(_ndimension); + + GridBase::CoorFromIndex(coor_f,sf,fine->_rdimensions); + for(int d=0;d<_ndimension;d++) coor_c[d]=coor_f[d]/block_r[d]; + GridBase::IndexFromCoor(coor_c,sc,coarse->_rdimensions); + + for(int i=0;i @@ -30,10 +120,6 @@ inline void sumBlocks(Lattice &coarseData,const Lattice &fineData) std::vector block_r (_ndimension); - /////////////////////////////////////////////////////////// - // Detect whether the result is replicated in dimension d - /////////////////////////////////////////////////////////// - for(int d=0 ; d<_ndimension;d++){ block_r[d] = fine->_rdimensions[d] / coarse->_rdimensions[d]; } diff --git a/tests/Grid_nersc_io.cc b/tests/Grid_nersc_io.cc index 35cad831..f9faf7ef 100644 --- a/tests/Grid_nersc_io.cc +++ b/tests/Grid_nersc_io.cc @@ -11,12 +11,15 @@ int main (int argc, char ** argv) Grid_init(&argc,&argv); std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({1,1,1,1}); + std::vector mpi_layout ({2,2,2,2}); std::vector latt_size ({16,16,16,32}); + std::vector clatt_size ({4,4,4,8}); int orthodir=3; int orthosz =latt_size[orthodir]; GridCartesian Fine(latt_size,simd_layout,mpi_layout); + GridCartesian Coarse(clatt_size,simd_layout,mpi_layout); + GridRNG FineRNG(&Fine); LatticeGaugeField Umu(&Fine); @@ -40,6 +43,7 @@ int main (int argc, char ** argv) // (1+2+3)=6 = N(N-1)/2 terms LatticeComplex Plaq(&Fine); + LatticeComplex cPlaq(&Coarse); Plaq = zero; for(int mu=1;mu Date: Fri, 24 Apr 2015 18:20:03 +0100 Subject: [PATCH 095/429] First implementation of Dirac matrices as a Gamma class. --- lib/Grid_simd.h | 7 +- lib/math/Grid_math_arith_add.h | 7 - lib/math/Grid_math_reality.h | 59 ++- lib/math/Grid_math_tensors.h | 23 + lib/qcd/Grid_qcd.h | 3 + lib/qcd/Grid_qcd_dirac.h | 393 ++++++++++++++++++ lib/simd/Grid_vComplexD.h | 66 ++- lib/simd/Grid_vComplexF.h | 45 +- tests/Grid_gamma.cc | 95 +++++ .../{test_Grid_stencil.cc => Grid_stencil.cc} | 0 tests/Makefile.am | 9 +- 11 files changed, 683 insertions(+), 24 deletions(-) create mode 100644 lib/qcd/Grid_qcd_dirac.h create mode 100644 tests/Grid_gamma.cc rename tests/{test_Grid_stencil.cc => Grid_stencil.cc} (100%) diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index 17755fe0..d8788e33 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -61,7 +61,12 @@ namespace Grid { inline void add (ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) + (*r); } inline ComplexF adj(const ComplexF& r ){ return(conj(r)); } //conj already supported for complex - + + inline ComplexF timesI(const ComplexF r) { return(r*ComplexF(0.0,1.0));} + inline ComplexF timesMinusI(const ComplexF r){ return(r*ComplexF(0.0,-1.0));} + inline ComplexD timesI(const ComplexD r) { return(r*ComplexD(0.0,1.0));} + inline ComplexD timesMinusI(const ComplexD r){ return(r*ComplexD(0.0,-1.0));} + inline void mac (RealD * __restrict__ y,const RealD * __restrict__ a,const RealD *__restrict__ x){ *y = (*a) * (*x)+(*y);} inline void mult(RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) * (*r);} inline void sub (RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) - (*r);} diff --git a/lib/math/Grid_math_arith_add.h b/lib/math/Grid_math_arith_add.h index 7e62e07b..93449402 100644 --- a/lib/math/Grid_math_arith_add.h +++ b/lib/math/Grid_math_arith_add.h @@ -63,13 +63,6 @@ namespace Grid { return; } - // Need to figure multi-precision. - template Mytype timesI(Mytype &r) - { - iScalar i; - i._internal = Complex(0,1); - return r*i; - } // + operator for scalar, vector, matrix template diff --git a/lib/math/Grid_math_reality.h b/lib/math/Grid_math_reality.h index 1f676c11..1bf34f2a 100644 --- a/lib/math/Grid_math_reality.h +++ b/lib/math/Grid_math_reality.h @@ -5,8 +5,63 @@ namespace Grid { /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////// CONJ /////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// - + +#ifdef GRID_WARN_SUBOPTIMAL +#warning "Optimisation alert switch over to two argument form to avoid copy back in perf critical timesI " +#endif +/////////////////////////////////////////////// +// multiply by I; make recursive. +/////////////////////////////////////////////// +template inline iScalar timesI(const iScalar&r) +{ + iScalar ret; + ret._internal = timesI(r._internal); + return ret; +} +template inline iVector timesI(const iVector&r) +{ + iVector ret; + for(int i=0;i inline iMatrix timesI(const iMatrix&r) +{ + iMatrix ret; + for(int i=0;i inline iScalar timesMinusI(const iScalar&r) +{ + iScalar ret; + ret._internal = timesMinusI(r._internal); + return ret; +} +template inline iVector timesMinusI(const iVector&r) +{ + iVector ret; + for(int i=0;i inline iMatrix timesMinusI(const iMatrix&r) +{ + iMatrix ret; + for(int i=0;i inline iScalar conj(const iScalar&r) { iScalar ret; @@ -31,7 +86,9 @@ template inline iMatrix conj(const iMatrix& return ret; } +/////////////////////////////////////////////// // Adj function for scalar, vector, matrix +/////////////////////////////////////////////// template inline iScalar adj(const iScalar&r) { iScalar ret; diff --git a/lib/math/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h index 379e61d2..8bca6805 100644 --- a/lib/math/Grid_math_tensors.h +++ b/lib/math/Grid_math_tensors.h @@ -72,6 +72,13 @@ public: return _internal; } + inline const vtype & operator ()(void) const { + return _internal; + } + // inline vtype && operator ()(void) { + // return _internal; + // } + operator ComplexD () const { return(TensorRemove(_internal)); }; operator RealD () const { return(real(TensorRemove(_internal))); } @@ -156,6 +163,12 @@ public: inline vtype & operator ()(int i) { return _internal[i]; } + inline const vtype & operator ()(int i) const { + return _internal[i]; + } + // inline vtype && operator ()(int i) { + // return _internal[i]; + // } }; template class iMatrix @@ -235,12 +248,22 @@ public: *this = (*this)+r; return *this; } + + // returns an lvalue reference inline vtype & operator ()(int i,int j) { return _internal[i][j]; } + inline const vtype & operator ()(int i,int j) const { + return _internal[i][j]; + } + + // inline vtype && operator ()(int i,int j) { + // return _internal[i][j]; + // } }; + template inline void extract(const vobj &vec,std::vector &extracted) { diff --git a/lib/qcd/Grid_qcd.h b/lib/qcd/Grid_qcd.h index b30b7a67..a5c4320e 100644 --- a/lib/qcd/Grid_qcd.h +++ b/lib/qcd/Grid_qcd.h @@ -143,4 +143,7 @@ namespace QCD { } //namespace QCD } // Grid + +#include + #endif diff --git a/lib/qcd/Grid_qcd_dirac.h b/lib/qcd/Grid_qcd_dirac.h new file mode 100644 index 00000000..86e3870d --- /dev/null +++ b/lib/qcd/Grid_qcd_dirac.h @@ -0,0 +1,393 @@ +#ifndef GRID_QCD_DIRAC_H +#define GRID_QCD_DIRAC_H +namespace Grid{ + +namespace QCD { + + class Gamma { + + public: + + const int Ns=4; + + enum GammaMatrix { + Identity, + GammaX, + GammaY, + GammaZ, + GammaT, + Gamma5, + // GammaXGamma5, + // GammaYGamma5, + // GammaZGamma5, + // GammaTGamma5, + // SigmaXY, + // SigmaXZ, + // SigmaYZ, + // SigmaXT, + // SigmaYT, + // SigmaZT, + MinusIdentity, + MinusGammaX, + MinusGammaY, + MinusGammaZ, + MinusGammaT, + MinusGamma5 + // MinusGammaXGamma5, easiest to form by composition + // MinusGammaYGamma5, as performance is not critical for these + // MinusGammaZGamma5, + // MinusGammaTGamma5, + // MinusSigmaXY, + // MinusSigmaXZ, + // MinusSigmaYZ, + // MinusSigmaXT, + // MinusSigmaYT, + // MinusSigmaZT + }; + + Gamma (GammaMatrix g) { _g=g; } + + GammaMatrix _g; + + + }; + + + /* Gx + * 0 0 0 i + * 0 0 i 0 + * 0 -i 0 0 + * -i 0 0 0 + */ + template inline void rmultMinusGammaX(iMatrix &ret,const iMatrix &rhs){ + for(int i=0;i inline void rmultGammaX(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multGammaX(iVector &ret, iVector &rhs){ + ret._internal[0] = timesI(rhs._internal[3]); + ret._internal[1] = timesI(rhs._internal[2]); + ret._internal[2] = timesMinusI(rhs._internal[1]); + ret._internal[3] = timesMinusI(rhs._internal[0]); + }; + template inline void multMinusGammaX(iVector &ret, iVector &rhs){ + ret(0) = timesMinusI(rhs(3)); + ret(1) = timesMinusI(rhs(2)); + ret(2) = timesI(rhs(1)); + ret(3) = timesI(rhs(0)); + }; + template inline void multGammaX(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multMinusGammaX(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multGammaY(iVector &ret, iVector &rhs){ + ret(0) = -rhs(3); + ret(1) = rhs(2); + ret(2) = rhs(1); + ret(3) = -rhs(0); + }; + template inline void multMinusGammaY(iVector &ret, iVector &rhs){ + ret(0) = rhs(3); + ret(1) = -rhs(2); + ret(2) = -rhs(1); + ret(3) = rhs(0); + }; + template inline void multGammaY(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multMinusGammaY(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multGammaZ(iVector &ret, iVector &rhs){ + ret(0) = timesI(rhs(2)); + ret(1) =timesMinusI(rhs(3)); + ret(2) =timesMinusI(rhs(0)); + ret(3) = timesI(rhs(1)); + }; + template inline void multMinusGammaZ(iVector &ret, iVector &rhs){ + ret(0) = timesMinusI(rhs(2)); + ret(1) = timesI(rhs(3)); + ret(2) = timesI(rhs(0)); + ret(3) = timesMinusI(rhs(1)); + }; + template inline void multGammaZ(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multMinusGammaZ(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multGammaT(iVector &ret, iVector &rhs){ + ret(0) = rhs(2); + ret(1) = rhs(3); + ret(2) = rhs(0); + ret(3) = rhs(1); + }; + template inline void multMinusGammaT(iVector &ret, iVector &rhs){ + ret(0) =-rhs(2); + ret(1) =-rhs(3); + ret(2) =-rhs(0); + ret(3) =-rhs(1); + }; + template inline void multGammaT(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multMinusGammaT(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multGamma5(iVector &ret, iVector &rhs){ + ret(0) = rhs(0); + ret(1) = rhs(1); + ret(2) =-rhs(2); + ret(3) =-rhs(3); + }; + template inline void multMinusGamma5(iVector &ret, iVector &rhs){ + ret(0) =-rhs(0); + ret(1) =-rhs(1); + ret(2) = rhs(2); + ret(3) = rhs(3); + }; + template inline void multGamma5(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multMinusGamma5(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline auto operator * ( const Gamma &G,const iScalar &arg) -> + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type + + { + iScalar ret; + ret._internal=G*arg._internal; + return ret; + } + template inline auto operator * ( const Gamma &G,const iVector &arg) -> + typename std::enable_if,SpinIndex>::notvalue,iVector >::type + { + iVector ret; + ret._internal=G*arg._internal; + return ret; + } + template inline auto operator * ( const Gamma &G,const iMatrix &arg) -> + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type + { + iMatrix ret; + ret._internal=G*arg._internal; + return ret; + } + //////////////////////////////////////////////////////// + // When we hit the spin index this matches and we stop + //////////////////////////////////////////////////////// + template inline auto operator * ( const Gamma &G,const iMatrix &arg) -> + typename std::enable_if,SpinIndex>::value,iMatrix >::type + { + iMatrix ret; + switch (G._g) { + case Gamma::Identity: + ret = arg; + break; + case Gamma::MinusIdentity: + ret = -arg; + break; + case Gamma::GammaX: + multGammaX(ret,arg); + break; + case Gamma::MinusGammaX: + multMinusGammaX(ret,arg); + break; + case Gamma::GammaY: + multGammaY(ret,arg); + break; + case Gamma::MinusGammaY: + multMinusGammaY(ret,arg); + break; + case Gamma::GammaZ: + multGammaZ(ret,arg); + break; + case Gamma::MinusGammaZ: + multMinusGammaZ(ret,arg); + break; + case Gamma::GammaT: + multGammaT(ret,arg); + break; + case Gamma::MinusGammaT: + multMinusGammaT(ret,arg); + break; + case Gamma::Gamma5: + multGamma5(ret,arg); + break; + case Gamma::MinusGamma5: + multMinusGamma5(ret,arg); + break; + default: + assert(0); + break; + } + return ret; + } + /* Output from test +./Grid_gamma +Identity((1,0),(0,0),(0,0),(0,0)) + ((0,0),(1,0),(0,0),(0,0)) + ((0,0),(0,0),(1,0),(0,0)) + ((0,0),(0,0),(0,0),(1,0)) OK + +GammaX ((0,0),(0,0),(0,0),(0,1)) + ((0,0),(0,0),(0,1),(0,0)) + ((0,0),(0,-1),(0,0),(0,0)) + ((0,-1),(0,0),(0,0),(0,0)) OK + * Gx + * 0 0 0 i + * 0 0 i 0 + * 0 -i 0 0 + * -i 0 0 0 + +GammaY ((-0,-0),(-0,-0),(-0,-0),(-1,-0)) + ((0,0),(0,0),(1,0),(0,0)) + ((0,0),(1,0),(0,0),(0,0)) OK + ((-1,-0),(-0,-0),(-0,-0),(-0,-0)) + *Gy + * 0 0 0 -1 [0] -+ [3] + * 0 0 1 0 [1] +- [2] + * 0 1 0 0 + * -1 0 0 0 + +GammaZ ((0,0),(0,0),(0,1),(0,0)) + ((0,0),(0,0),(0,0),(0,-1)) + ((0,-1),(0,0),(0,0),(0,0)) + ((0,0),(0,1),(0,0),(0,0)) OK + * 0 0 i 0 [0]+-i[2] + * 0 0 0 -i [1]-+i[3] + * -i 0 0 0 + * 0 i 0 0 + +GammaT ((0,0),(0,0),(1,0),(0,0)) + ((0,0),(0,0),(0,0),(1,0)) OK + ((1,0),(0,0),(0,0),(0,0)) + ((0,0),(1,0),(0,0),(0,0)) + * 0 0 1 0 [0]+-[2] + * 0 0 0 1 [1]+-[3] + * 1 0 0 0 + * 0 1 0 0 + +Gamma5 ((1,0),(0,0),(0,0),(0,0)) + ((0,0),(1,0),(0,0),(0,0)) + ((-0,-0),(-0,-0),(-1,-0),(-0,-0)) + ((-0,-0),(-0,-0),(-0,-0),(-1,-0)) + * 1 0 0 0 [0]+-[2] + * 0 1 0 0 [1]+-[3] OK + * 0 0 -1 0 + * 0 0 0 -1 + */ + +} //namespace QCD +} // Grid +#endif diff --git a/lib/simd/Grid_vComplexD.h b/lib/simd/Grid_vComplexD.h index 313eef4a..402d303c 100644 --- a/lib/simd/Grid_vComplexD.h +++ b/lib/simd/Grid_vComplexD.h @@ -101,13 +101,13 @@ namespace Grid { IF IMM0[2] = 0 THEN DEST[191:128]=SRC1[191:128] ELSE DEST[191:128]=SRC1[255:192] FI; IF IMM0[3] = 0 - THEN DEST[255:192]=SRC2[191:128] ELSE DEST[255:192]=SRC2[255:192] FI; + THEN DEST[255:192]=SRC2[191:128] ELSE DEST[255:192]=SRC2[255:192] FI; // Ox5 r<->i ; 0xC unchanged */ #if defined (AVX1)|| defined (AVX2) zvec ymm0,ymm1,ymm2; ymm0 = _mm256_shuffle_pd(a.v,a.v,0x0); // ymm0 <- ar ar, ar,ar b'00,00 ymm0 = _mm256_mul_pd(ymm0,b.v); // ymm0 <- ar bi, ar br - ymm1 = _mm256_shuffle_pd(b.v,b.v,0x5); // ymm1 <- br,bi b'01,01 + ymm1 = _mm256_shuffle_pd(b.v,b.v,0x5); // ymm1 <- br,bi b'01,01 ymm2 = _mm256_shuffle_pd(a.v,a.v,0xF); // ymm2 <- ai,ai b'11,11 ymm1 = _mm256_mul_pd(ymm1,ymm2); // ymm1 <- br ai, ai bi ret.v= _mm256_addsub_pd(ymm0,ymm1); @@ -140,7 +140,7 @@ namespace Grid { * publisher = {ACM}, * address = {New York, NY, USA}, * keywords = {autovectorization, fourier transform, program generation, simd, super-optimization}, - * } + * } */ zvec vzero,ymm0,ymm1,real,imag; vzero = _mm512_setzero(); @@ -252,23 +252,71 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ vComplexD ret ; vzero(ret); #if defined (AVX1)|| defined (AVX2) // addsubps 0, inv=>0+in.v[3] 0-in.v[2], 0+in.v[1], 0-in.v[0], ... - __m256d tmp = _mm256_addsub_pd(ret.v,_mm256_shuffle_pd(in.v,in.v,0x5)); - ret.v=_mm256_shuffle_pd(tmp,tmp,0x5); + // __m256d tmp = _mm256_addsub_pd(ret.v,_mm256_shuffle_pd(in.v,in.v,0x5)); + // ret.v=_mm256_shuffle_pd(tmp,tmp,0x5); + ret.v = _mm256_addsub_pd(ret.v,in.v); #endif #ifdef SSE4 ret.v = _mm_addsub_pd(ret.v,in.v); #endif #ifdef AVX512 - // Xeon does not have fmaddsub or addsub - // with mask 0xa (1010), v[0] -v[1] v[2] -v[3] .... - ret.v = _mm512_mask_sub_pd(in.v, 0xaaaa,ret.v, in.v); - + ret.v = _mm512_mask_sub_pd(in.v, 0xaaaa,ret.v, in.v); #endif #ifdef QPX assert(0); #endif return ret; } + + friend inline vComplexD timesI(const vComplexD &in){ + vComplexD ret; vzero(ret); +#if defined (AVX1)|| defined (AVX2) + cvec tmp =_mm256_addsub_ps(ret.v,in.v); // r,-i + /* + IF IMM0[0] = 0 + THEN DEST[63:0]=SRC1[63:0] ELSE DEST[63:0]=SRC1[127:64] FI; + IF IMM0[1] = 0 + THEN DEST[127:64]=SRC2[63:0] ELSE DEST[127:64]=SRC2[127:64] FI; + IF IMM0[2] = 0 + THEN DEST[191:128]=SRC1[191:128] ELSE DEST[191:128]=SRC1[255:192] FI; + IF IMM0[3] = 0 + THEN DEST[255:192]=SRC2[191:128] ELSE DEST[255:192]=SRC2[255:192] FI; + */ + ret.v =_mm256_shuffle_ps(tmp,tmp,0x5); +#endif +#ifdef SSE4 + cvec tmp =_mm_addsub_ps(ret.v,in.v); // r,-i + ret.v =_mm_shuffle_ps(tmp,tmp,0x5); +#endif +#ifdef AVX512 + ret.v = _mm512_mask_sub_ps(in.v,0xaaaa,ret.v,in.v); // real -imag + ret.v = _mm512_swizzle_ps(ret.v, _MM_SWIZ_REG_CDAB);// OK +#endif +#ifdef QPX + assert(0); +#endif + return ret; + } + friend inline vComplexD timesMinusI(const vComplexD &in){ + vComplexD ret; vzero(ret); +#if defined (AVX1)|| defined (AVX2) + cvec tmp =_mm256_shuffle_ps(in.v,in.v,0x5); + ret.v =_mm256_addsub_ps(ret.v,tmp); // i,-r +#endif +#ifdef SSE4 + cvec tmp =_mm_shuffle_ps(in.v,in.v,0x5); + ret.v =_mm_addsub_ps(ret.v,tmp); // r,-i +#endif +#ifdef AVX512 + cvec tmp = _mm512_swizzle_ps(in.v, _MM_SWIZ_REG_CDAB);// OK + ret.v = _mm512_mask_sub_ps(tmp,0xaaaa,ret.v,tmp); // real -imag +#endif +#ifdef QPX + assert(0); +#endif + return ret; + } + // REDUCE FIXME must be a cleaner implementation friend inline ComplexD Reduce(const vComplexD & in) { diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index d931964c..4c31ad04 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -329,9 +329,10 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ friend inline vComplexF conj(const vComplexF &in){ vComplexF ret ; vzero(ret); #if defined (AVX1)|| defined (AVX2) - cvec tmp; - tmp = _mm256_addsub_ps(ret.v,_mm256_shuffle_ps(in.v,in.v,_MM_SHUFFLE(2,3,0,1))); // ymm1 <- br,bi - ret.v=_mm256_shuffle_ps(tmp,tmp,_MM_SHUFFLE(2,3,0,1)); + // cvec tmp; + // tmp = _mm256_addsub_ps(ret.v,_mm256_shuffle_ps(in.v,in.v,_MM_SHUFFLE(2,3,0,1))); // ymm1 <- br,bi + // ret.v=_mm256_shuffle_ps(tmp,tmp,_MM_SHUFFLE(2,3,0,1)); + ret.v = _mm256_addsub_ps(ret.v,in.v); #endif #ifdef SSE4 ret.v = _mm_addsub_ps(ret.v,in.v); @@ -344,6 +345,44 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ #endif return ret; } + friend inline vComplexF timesI(const vComplexF &in){ + vComplexF ret; vzero(ret); +#if defined (AVX1)|| defined (AVX2) + cvec tmp =_mm256_addsub_ps(ret.v,in.v); // r,-i + ret.v = _mm256_shuffle_ps(tmp,tmp,0x5); +#endif +#ifdef SSE4 + cvec tmp =_mm_addsub_ps(ret.v,in.v); // r,-i + ret.v = _mm_shuffle_ps(tmp,tmp,0x5); +#endif +#ifdef AVX512 + ret.v = _mm512_mask_sub_ps(in.v,0xaaaa,ret.v,in.v); // real -imag + ret.v = _mm512_swizzle_ps(ret.v, _MM_SWIZ_REG_CDAB);// OK +#endif +#ifdef QPX + assert(0); +#endif + return ret; + } + friend inline vComplexF timesMinusI(const vComplexF &in){ + vComplexF ret; vzero(ret); +#if defined (AVX1)|| defined (AVX2) + cvec tmp =_mm256_shuffle_ps(in.v,in.v,0x5); + ret.v = _mm256_addsub_ps(ret.v,tmp); // i,-r +#endif +#ifdef SSE4 + cvec tmp =_mm_shuffle_ps(in.v,in.v,0x5); + ret.v = _mm_addsub_ps(ret.v,tmp); // r,-i +#endif +#ifdef AVX512 + cvec tmp = _mm512_swizzle_ps(in.v, _MM_SWIZ_REG_CDAB);// OK + ret.v = _mm512_mask_sub_ps(tmp,0xaaaa,ret.v,tmp); // real -imag +#endif +#ifdef QPX + assert(0); +#endif + return ret; + } // Unary negation friend inline vComplexF operator -(const vComplexF &r) { diff --git a/tests/Grid_gamma.cc b/tests/Grid_gamma.cc new file mode 100644 index 00000000..9c213352 --- /dev/null +++ b/tests/Grid_gamma.cc @@ -0,0 +1,95 @@ +#include +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector simd_layout({1,1,2,2}); + std::vector mpi_layout ({1,1,1,1}); + std::vector latt_size ({8,8,8,8}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + + GridRNG RNG(&Grid); + + SpinMatrix ident=zero; + SpinMatrix ll=zero; + SpinMatrix rr=zero; + SpinMatrix result; + + for(int a=0;a Date: Fri, 24 Apr 2015 18:40:44 +0100 Subject: [PATCH 096/429] Moved code from summation into transfer and reduction --- lib/Grid_summation.h | 208 --------------------------- lib/lattice/Grid_lattice_reduction.h | 76 ++++++++++ lib/lattice/Grid_lattice_transfer.h | 140 ++++++++++++++++++ lib/qcd/Grid_qcd_dirac.h | 174 +++++++++++++++------- 4 files changed, 336 insertions(+), 262 deletions(-) diff --git a/lib/Grid_summation.h b/lib/Grid_summation.h index c500c5f1..936ca8ef 100644 --- a/lib/Grid_summation.h +++ b/lib/Grid_summation.h @@ -2,213 +2,5 @@ #define GRID_SUMMATION_H namespace Grid { -inline void subdivides(GridBase *coarse,GridBase *fine) -{ - assert(coarse->_ndimension == fine->_ndimension); - - int _ndimension = coarse->_ndimension; - - // local and global volumes subdivide cleanly after SIMDization - for(int d=0;d<_ndimension;d++){ - assert(coarse->_processors[d] == fine->_processors[d]); - assert(coarse->_simd_layout[d] == fine->_simd_layout[d]); - assert((fine->_rdimensions[d] / coarse->_rdimensions[d])* coarse->_rdimensions[d]==fine->_rdimensions[d]); - } -} - -template -inline void projectBlockBasis(Lattice > &coarseData, - const Lattice &fineData, - const std::vector > &Basis) -{ - GridBase * fine = fineData._grid; - GridBase * coarse= coarseData._grid; - int _ndimension = coarse->_ndimension; - - // checks - assert( nbasis == Basis.size() ); - subdivides(coarse,fine); - for(int i=0;i block_r (_ndimension); - - for(int d=0 ; d<_ndimension;d++){ - block_r[d] = fine->_rdimensions[d] / coarse->_rdimensions[d]; - } - - coarseData=zero; - - // Loop with a cache friendly loop ordering - for(int sf=0;sfoSites();sf++){ - - int sc; - std::vector coor_c(_ndimension); - std::vector coor_f(_ndimension); - GridBase::CoorFromIndex(coor_f,sf,fine->_rdimensions); - for(int d=0;d<_ndimension;d++) coor_c[d]=coor_f[d]/block_r[d]; - GridBase::IndexFromCoor(coor_c,sc,coarse->_rdimensions); - - for(int i=0;i -inline void promoteBlockBasis(const Lattice > &coarseData, - Lattice &fineData, - const std::vector > &Basis) -{ - GridBase * fine = fineData._grid; - GridBase * coarse= coarseData._grid; - int _ndimension = coarse->_ndimension; - - // checks - assert( nbasis == Basis.size() ); - subdivides(coarse,fine); - for(int i=0;i block_r (_ndimension); - - for(int d=0 ; d<_ndimension;d++){ - block_r[d] = fine->_rdimensions[d] / coarse->_rdimensions[d]; - } - - // Loop with a cache friendly loop ordering - for(int sf=0;sfoSites();sf++){ - - int sc; - std::vector coor_c(_ndimension); - std::vector coor_f(_ndimension); - - GridBase::CoorFromIndex(coor_f,sf,fine->_rdimensions); - for(int d=0;d<_ndimension;d++) coor_c[d]=coor_f[d]/block_r[d]; - GridBase::IndexFromCoor(coor_c,sc,coarse->_rdimensions); - - for(int i=0;i -inline void sumBlocks(Lattice &coarseData,const Lattice &fineData) -{ - GridBase * fine = fineData._grid; - GridBase * coarse= coarseData._grid; - - subdivides(coarse,fine); // require they map - - int _ndimension = coarse->_ndimension; - - std::vector block_r (_ndimension); - - for(int d=0 ; d<_ndimension;d++){ - block_r[d] = fine->_rdimensions[d] / coarse->_rdimensions[d]; - } - - coarseData=zero; - for(int sf=0;sfoSites();sf++){ - - int sc; - std::vector coor_c(_ndimension); - std::vector coor_f(_ndimension); - - GridBase::CoorFromIndex(coor_f,sf,fine->_rdimensions); - for(int d=0;d<_ndimension;d++) coor_c[d]=coor_f[d]/block_r[d]; - GridBase::IndexFromCoor(coor_c,sc,coarse->_rdimensions); - - coarseData._odata[sc]=coarseData._odata[sc]+fineData._odata[sf]; - - } - return; -} - -template inline void sliceSum(const Lattice &Data,std::vector &result,int orthogdim) -{ - typedef typename vobj::scalar_object sobj; - - GridBase *grid = Data._grid; - const int Nd = grid->_ndimension; - const int Nsimd = grid->Nsimd(); - - assert(orthogdim >= 0); - assert(orthogdim < Nd); - - int fd=grid->_fdimensions[orthogdim]; - int ld=grid->_ldimensions[orthogdim]; - int rd=grid->_rdimensions[orthogdim]; - - std::vector > lvSum(rd); // will locally sum vectors first - std::vector lsSum(ld,sobj(zero)); // sum across these down to scalars - std::vector extracted(Nsimd); // splitting the SIMD - - result.resize(fd); // And then global sum to return the same vector to every node for IO to file - for(int r=0;r coor(Nd); - - // sum over reduced dimension planes, breaking out orthog dir - for(int ss=0;ssoSites();ss++){ - GridBase::CoorFromIndex(coor,ss,grid->_rdimensions); - int r = coor[orthogdim]; - lvSum[r]=lvSum[r]+Data._odata[ss]; - } - - // Sum across simd lanes in the plane, breaking out orthog dir. - std::vector icoor(Nd); - - for(int rt=0;rtiCoorFromIindex(icoor,idx); - - int ldx =rt+icoor[orthogdim]*rd; - - lsSum[ldx]=lsSum[ldx]+extracted[idx]; - - } - } - - // sum over nodes. - sobj gsum; - for(int t=0;t_processor_coor[orthogdim] ) { - gsum=lsSum[lt]; - } else { - gsum=zero; - } - - grid->GlobalSum(gsum); - - result[t]=gsum; - } - -} - } #endif diff --git a/lib/lattice/Grid_lattice_reduction.h b/lib/lattice/Grid_lattice_reduction.h index b96d0f05..bec436f6 100644 --- a/lib/lattice/Grid_lattice_reduction.h +++ b/lib/lattice/Grid_lattice_reduction.h @@ -2,6 +2,9 @@ #define GRID_LATTICE_REDUCTION_H namespace Grid { +#ifdef GRID_WARN_SUBOPTIMAL +#warning "Optimisation alert all these reduction loops are NOT threaded " +#endif //////////////////////////////////////////////////////////////////////////////////////////////////// // Reduction operations @@ -73,6 +76,79 @@ namespace Grid { return ssum; } + + + +template inline void sliceSum(const Lattice &Data,std::vector &result,int orthogdim) +{ + typedef typename vobj::scalar_object sobj; + + GridBase *grid = Data._grid; + const int Nd = grid->_ndimension; + const int Nsimd = grid->Nsimd(); + + assert(orthogdim >= 0); + assert(orthogdim < Nd); + + int fd=grid->_fdimensions[orthogdim]; + int ld=grid->_ldimensions[orthogdim]; + int rd=grid->_rdimensions[orthogdim]; + + std::vector > lvSum(rd); // will locally sum vectors first + std::vector lsSum(ld,sobj(zero)); // sum across these down to scalars + std::vector extracted(Nsimd); // splitting the SIMD + + result.resize(fd); // And then global sum to return the same vector to every node for IO to file + for(int r=0;r coor(Nd); + + // sum over reduced dimension planes, breaking out orthog dir + for(int ss=0;ssoSites();ss++){ + GridBase::CoorFromIndex(coor,ss,grid->_rdimensions); + int r = coor[orthogdim]; + lvSum[r]=lvSum[r]+Data._odata[ss]; + } + + // Sum across simd lanes in the plane, breaking out orthog dir. + std::vector icoor(Nd); + + for(int rt=0;rtiCoorFromIindex(icoor,idx); + + int ldx =rt+icoor[orthogdim]*rd; + + lsSum[ldx]=lsSum[ldx]+extracted[idx]; + + } + } + + // sum over nodes. + sobj gsum; + for(int t=0;t_processor_coor[orthogdim] ) { + gsum=lsSum[lt]; + } else { + gsum=zero; + } + + grid->GlobalSum(gsum); + + result[t]=gsum; + } + +} + + } #endif diff --git a/lib/lattice/Grid_lattice_transfer.h b/lib/lattice/Grid_lattice_transfer.h index ecb3016a..53973741 100644 --- a/lib/lattice/Grid_lattice_transfer.h +++ b/lib/lattice/Grid_lattice_transfer.h @@ -3,6 +3,20 @@ namespace Grid { +inline void subdivides(GridBase *coarse,GridBase *fine) +{ + assert(coarse->_ndimension == fine->_ndimension); + + int _ndimension = coarse->_ndimension; + + // local and global volumes subdivide cleanly after SIMDization + for(int d=0;d<_ndimension;d++){ + assert(coarse->_processors[d] == fine->_processors[d]); + assert(coarse->_simd_layout[d] == fine->_simd_layout[d]); + assert((fine->_rdimensions[d] / coarse->_rdimensions[d])* coarse->_rdimensions[d]==fine->_rdimensions[d]); + } +} + //////////////////////////////////////////////////////////////////////////////////////////// // remove and insert a half checkerboard //////////////////////////////////////////////////////////////////////////////////////////// @@ -42,5 +56,131 @@ namespace Grid { } } + +template +inline void projectBlockBasis(Lattice > &coarseData, + const Lattice &fineData, + const std::vector > &Basis) +{ + GridBase * fine = fineData._grid; + GridBase * coarse= coarseData._grid; + int _ndimension = coarse->_ndimension; + + // checks + assert( nbasis == Basis.size() ); + subdivides(coarse,fine); + for(int i=0;i block_r (_ndimension); + + for(int d=0 ; d<_ndimension;d++){ + block_r[d] = fine->_rdimensions[d] / coarse->_rdimensions[d]; + } + + coarseData=zero; + + // Loop with a cache friendly loop ordering + for(int sf=0;sfoSites();sf++){ + + int sc; + std::vector coor_c(_ndimension); + std::vector coor_f(_ndimension); + GridBase::CoorFromIndex(coor_f,sf,fine->_rdimensions); + for(int d=0;d<_ndimension;d++) coor_c[d]=coor_f[d]/block_r[d]; + GridBase::IndexFromCoor(coor_c,sc,coarse->_rdimensions); + + for(int i=0;i +inline void promoteBlockBasis(const Lattice > &coarseData, + Lattice &fineData, + const std::vector > &Basis) +{ + GridBase * fine = fineData._grid; + GridBase * coarse= coarseData._grid; + int _ndimension = coarse->_ndimension; + + // checks + assert( nbasis == Basis.size() ); + subdivides(coarse,fine); + for(int i=0;i block_r (_ndimension); + + for(int d=0 ; d<_ndimension;d++){ + block_r[d] = fine->_rdimensions[d] / coarse->_rdimensions[d]; + } + + // Loop with a cache friendly loop ordering + for(int sf=0;sfoSites();sf++){ + + int sc; + std::vector coor_c(_ndimension); + std::vector coor_f(_ndimension); + + GridBase::CoorFromIndex(coor_f,sf,fine->_rdimensions); + for(int d=0;d<_ndimension;d++) coor_c[d]=coor_f[d]/block_r[d]; + GridBase::IndexFromCoor(coor_c,sc,coarse->_rdimensions); + + for(int i=0;i +inline void sumBlocks(Lattice &coarseData,const Lattice &fineData) +{ + GridBase * fine = fineData._grid; + GridBase * coarse= coarseData._grid; + + subdivides(coarse,fine); // require they map + + int _ndimension = coarse->_ndimension; + + std::vector block_r (_ndimension); + + for(int d=0 ; d<_ndimension;d++){ + block_r[d] = fine->_rdimensions[d] / coarse->_rdimensions[d]; + } + + coarseData=zero; + for(int sf=0;sfoSites();sf++){ + + int sc; + std::vector coor_c(_ndimension); + std::vector coor_f(_ndimension); + + GridBase::CoorFromIndex(coor_f,sf,fine->_rdimensions); + for(int d=0;d<_ndimension;d++) coor_c[d]=coor_f[d]/block_r[d]; + GridBase::IndexFromCoor(coor_c,sc,coarse->_rdimensions); + + coarseData._odata[sc]=coarseData._odata[sc]+fineData._odata[sf]; + + } + return; +} + } #endif diff --git a/lib/qcd/Grid_qcd_dirac.h b/lib/qcd/Grid_qcd_dirac.h index 86e3870d..ef2a4cd8 100644 --- a/lib/qcd/Grid_qcd_dirac.h +++ b/lib/qcd/Grid_qcd_dirac.h @@ -59,6 +59,8 @@ namespace QCD { * 0 -i 0 0 * -i 0 0 0 */ + // right multiplication makes sense for matrix args, not for vector since there is + // no concept of row versus columnar indices template inline void rmultMinusGammaX(iMatrix &ret,const iMatrix &rhs){ for(int i=0;i inline void multGammaX(iVector &ret, iVector &rhs){ - ret._internal[0] = timesI(rhs._internal[3]); - ret._internal[1] = timesI(rhs._internal[2]); - ret._internal[2] = timesMinusI(rhs._internal[1]); - ret._internal[3] = timesMinusI(rhs._internal[0]); - }; - template inline void multMinusGammaX(iVector &ret, iVector &rhs){ - ret(0) = timesMinusI(rhs(3)); - ret(1) = timesMinusI(rhs(2)); - ret(2) = timesI(rhs(1)); - ret(3) = timesI(rhs(0)); - }; template inline void multGammaX(iMatrix &ret, const iMatrix &rhs){ for(int i=0;i inline void multGammaX(iVector &ret, iVector &rhs){ + ret._internal[0] = timesI(rhs._internal[3]); + ret._internal[1] = timesI(rhs._internal[2]); + ret._internal[2] = timesMinusI(rhs._internal[1]); + ret._internal[3] = timesMinusI(rhs._internal[0]); + }; + template inline void multMinusGammaX(iVector &ret, iVector &rhs){ + ret(0) = timesMinusI(rhs(3)); + ret(1) = timesMinusI(rhs(2)); + ret(2) = timesI(rhs(1)); + ret(3) = timesI(rhs(0)); + }; /*Gy @@ -114,17 +114,21 @@ namespace QCD { * 0 1 0 0 * -1 0 0 0 */ - template inline void multGammaY(iVector &ret, iVector &rhs){ - ret(0) = -rhs(3); - ret(1) = rhs(2); - ret(2) = rhs(1); - ret(3) = -rhs(0); + template inline void rmultGammaY(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multMinusGammaY(iVector &ret, iVector &rhs){ - ret(0) = rhs(3); - ret(1) = -rhs(2); - ret(2) = -rhs(1); - ret(3) = rhs(0); + template inline void rmultMinusGammaY(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multGammaY(iMatrix &ret, const iMatrix &rhs){ for(int i=0;i inline void multGammaY(iVector &ret, iVector &rhs){ + ret(0) = -rhs(3); + ret(1) = rhs(2); + ret(2) = rhs(1); + ret(3) = -rhs(0); + }; + template inline void multMinusGammaY(iVector &ret, iVector &rhs){ + ret(0) = rhs(3); + ret(1) = -rhs(2); + ret(2) = -rhs(1); + ret(3) = rhs(0); + }; /*Gz * 0 0 i 0 [0]+-i[2] * 0 0 0 -i [1]-+i[3] * -i 0 0 0 * 0 i 0 0 */ - template inline void multGammaZ(iVector &ret, iVector &rhs){ - ret(0) = timesI(rhs(2)); - ret(1) =timesMinusI(rhs(3)); - ret(2) =timesMinusI(rhs(0)); - ret(3) = timesI(rhs(1)); + template inline void rmultGammaZ(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multMinusGammaZ(iVector &ret, iVector &rhs){ - ret(0) = timesMinusI(rhs(2)); - ret(1) = timesI(rhs(3)); - ret(2) = timesI(rhs(0)); - ret(3) = timesMinusI(rhs(1)); + template inline void rmultMinusGammaZ(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multGammaZ(iMatrix &ret, const iMatrix &rhs){ for(int i=0;i inline void multGammaZ(iVector &ret, iVector &rhs){ + ret(0) = timesI(rhs(2)); + ret(1) =timesMinusI(rhs(3)); + ret(2) =timesMinusI(rhs(0)); + ret(3) = timesI(rhs(1)); + }; + template inline void multMinusGammaZ(iVector &ret, iVector &rhs){ + ret(0) = timesMinusI(rhs(2)); + ret(1) = timesI(rhs(3)); + ret(2) = timesI(rhs(0)); + ret(3) = timesMinusI(rhs(1)); + }; /*Gt * 0 0 1 0 [0]+-[2] * 0 0 0 1 [1]+-[3] * 1 0 0 0 * 0 1 0 0 */ - template inline void multGammaT(iVector &ret, iVector &rhs){ - ret(0) = rhs(2); - ret(1) = rhs(3); - ret(2) = rhs(0); - ret(3) = rhs(1); + template inline void rmultGammaT(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multMinusGammaT(iVector &ret, iVector &rhs){ - ret(0) =-rhs(2); - ret(1) =-rhs(3); - ret(2) =-rhs(0); - ret(3) =-rhs(1); + template inline void rmultMinusGammaT(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multGammaT(iMatrix &ret, const iMatrix &rhs){ for(int i=0;i inline void multGammaT(iVector &ret, iVector &rhs){ + ret(0) = rhs(2); + ret(1) = rhs(3); + ret(2) = rhs(0); + ret(3) = rhs(1); + }; + template inline void multMinusGammaT(iVector &ret, iVector &rhs){ + ret(0) =-rhs(2); + ret(1) =-rhs(3); + ret(2) =-rhs(0); + ret(3) =-rhs(1); + }; /*G5 * 1 0 0 0 [0]+-[2] * 0 1 0 0 [1]+-[3] * 0 0 -1 0 * 0 0 0 -1 */ - template inline void multGamma5(iVector &ret, iVector &rhs){ - ret(0) = rhs(0); - ret(1) = rhs(1); - ret(2) =-rhs(2); - ret(3) =-rhs(3); + template inline void rmultGamma5(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multMinusGamma5(iVector &ret, iVector &rhs){ - ret(0) =-rhs(0); - ret(1) =-rhs(1); - ret(2) = rhs(2); - ret(3) = rhs(3); + template inline void rmultMinusGamma5(iMatrix &ret, const iMatrix &rhs){ + for(int i=0;i inline void multGamma5(iMatrix &ret, const iMatrix &rhs){ for(int i=0;i inline void multGamma5(iVector &ret, iVector &rhs){ + ret(0) = rhs(0); + ret(1) = rhs(1); + ret(2) =-rhs(2); + ret(3) =-rhs(3); + }; + template inline void multMinusGamma5(iVector &ret, iVector &rhs){ + ret(0) =-rhs(0); + ret(1) =-rhs(1); + ret(2) = rhs(2); + ret(3) = rhs(3); + }; + /////////////////////////////////////////////////////////////////////////////////////////////////// From 750dd5f5fd8a4f182fe38577538c68e0f9f9e932 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 24 Apr 2015 18:41:34 +0100 Subject: [PATCH 097/429] Cleared the code out from Grid_summation to lattice/Grid_lattice_transfer.h --- lib/Grid_summation.h | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 lib/Grid_summation.h diff --git a/lib/Grid_summation.h b/lib/Grid_summation.h deleted file mode 100644 index 936ca8ef..00000000 --- a/lib/Grid_summation.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef GRID_SUMMATION_H -#define GRID_SUMMATION_H -namespace Grid { - -} -#endif From f2ac20e7abf42449aa29b9544dab659f93e572e4 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 24 Apr 2015 18:42:44 +0100 Subject: [PATCH 098/429] Removed summation --- lib/Grid_lattice.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/Grid_lattice.h b/lib/Grid_lattice.h index ed875bc0..7256459c 100644 --- a/lib/Grid_lattice.h +++ b/lib/Grid_lattice.h @@ -98,7 +98,6 @@ public: #include #include #include -#include From 71d5927a6635ca4768cce3b12905b9f1b419ee4a Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 24 Apr 2015 19:08:29 +0100 Subject: [PATCH 099/429] Vectors now too and right multiple of matrix with gamma --- lib/Makefile.am | 13 ++-- lib/qcd/Grid_qcd_dirac.h | 156 +++++++++++++++++++++++++++++++++++---- tests/Grid_gamma.cc | 8 +- 3 files changed, 156 insertions(+), 21 deletions(-) diff --git a/lib/Makefile.am b/lib/Makefile.am index 20c1f867..9034ce9c 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -4,18 +4,21 @@ AM_CXXFLAGS = -I$(top_srcdir)/ extra_sources= if BUILD_COMMS_MPI extra_sources+=communicator/Grid_communicator_mpi.cc - extra_sources+=stencil/Grid_stencil_common.cc endif + if BUILD_COMMS_NONE extra_sources+=communicator/Grid_communicator_fake.cc - extra_sources+=stencil/Grid_stencil_common.cc endif # # Libraries # lib_LIBRARIES = libGrid.a -libGrid_a_SOURCES = Grid_init.cc $(extra_sources) +libGrid_a_SOURCES =\ + Grid_init.cc\ + stencil/Grid_stencil_common.cc\ + qcd/Grid_qcd_dirac.cc\ + $(extra_sources) # # Include files @@ -32,7 +35,6 @@ include_HEADERS =\ Grid_math.h\ Grid_simd.h\ Grid_stencil.h\ - Grid_summation.h\ Grid_where.h nobase_include_HEADERS=\ @@ -68,7 +70,8 @@ nobase_include_HEADERS=\ math/Grid_math_trace.h\ math/Grid_math_traits.h\ math/Grid_math_transpose.h\ - qcd/Grid_QCD.h\ + qcd/Grid_qcd.h\ + qcd/Grid_qcd_dirac.h\ simd/Grid_vComplexD.h\ simd/Grid_vComplexF.h\ simd/Grid_vInteger.h\ diff --git a/lib/qcd/Grid_qcd_dirac.h b/lib/qcd/Grid_qcd_dirac.h index ef2a4cd8..945178e9 100644 --- a/lib/qcd/Grid_qcd_dirac.h +++ b/lib/qcd/Grid_qcd_dirac.h @@ -44,12 +44,14 @@ namespace QCD { // MinusSigmaYT, // MinusSigmaZT }; + + static GammaMatrix GammaMatrices[]; + static const char *GammaMatrixNames[]; Gamma (GammaMatrix g) { _g=g; } GammaMatrix _g; - }; @@ -94,13 +96,13 @@ namespace QCD { } }; - template inline void multGammaX(iVector &ret, iVector &rhs){ + template inline void multGammaX(iVector &ret, const iVector &rhs){ ret._internal[0] = timesI(rhs._internal[3]); ret._internal[1] = timesI(rhs._internal[2]); ret._internal[2] = timesMinusI(rhs._internal[1]); ret._internal[3] = timesMinusI(rhs._internal[0]); }; - template inline void multMinusGammaX(iVector &ret, iVector &rhs){ + template inline void multMinusGammaX(iVector &ret, const iVector &rhs){ ret(0) = timesMinusI(rhs(3)); ret(1) = timesMinusI(rhs(2)); ret(2) = timesI(rhs(1)); @@ -146,13 +148,13 @@ namespace QCD { ret(3,i) = rhs(0,i); } }; - template inline void multGammaY(iVector &ret, iVector &rhs){ + template inline void multGammaY(iVector &ret, const iVector &rhs){ ret(0) = -rhs(3); ret(1) = rhs(2); ret(2) = rhs(1); ret(3) = -rhs(0); }; - template inline void multMinusGammaY(iVector &ret, iVector &rhs){ + template inline void multMinusGammaY(iVector &ret, const iVector &rhs){ ret(0) = rhs(3); ret(1) = -rhs(2); ret(2) = -rhs(1); @@ -196,13 +198,13 @@ namespace QCD { ret(3,i) = timesMinusI(rhs(1,i)); } }; - template inline void multGammaZ(iVector &ret, iVector &rhs){ + template inline void multGammaZ(iVector &ret, const iVector &rhs){ ret(0) = timesI(rhs(2)); ret(1) =timesMinusI(rhs(3)); ret(2) =timesMinusI(rhs(0)); ret(3) = timesI(rhs(1)); }; - template inline void multMinusGammaZ(iVector &ret, iVector &rhs){ + template inline void multMinusGammaZ(iVector &ret, const iVector &rhs){ ret(0) = timesMinusI(rhs(2)); ret(1) = timesI(rhs(3)); ret(2) = timesI(rhs(0)); @@ -246,13 +248,13 @@ namespace QCD { ret(3,i) =-rhs(1,i); } }; - template inline void multGammaT(iVector &ret, iVector &rhs){ + template inline void multGammaT(iVector &ret, const iVector &rhs){ ret(0) = rhs(2); ret(1) = rhs(3); ret(2) = rhs(0); ret(3) = rhs(1); }; - template inline void multMinusGammaT(iVector &ret, iVector &rhs){ + template inline void multMinusGammaT(iVector &ret, const iVector &rhs){ ret(0) =-rhs(2); ret(1) =-rhs(3); ret(2) =-rhs(0); @@ -298,13 +300,13 @@ namespace QCD { } }; - template inline void multGamma5(iVector &ret, iVector &rhs){ + template inline void multGamma5(iVector &ret, const iVector &rhs){ ret(0) = rhs(0); ret(1) = rhs(1); ret(2) =-rhs(2); ret(3) =-rhs(3); }; - template inline void multMinusGamma5(iVector &ret, iVector &rhs){ + template inline void multMinusGamma5(iVector &ret, const iVector &rhs){ ret(0) =-rhs(0); ret(1) =-rhs(1); ret(2) = rhs(2); @@ -313,6 +315,10 @@ namespace QCD { +#ifdef GRID_WARN_SUBOPTIMAL +#warning "Optimisation alert switch over to multGammaX early " +#endif + /////////////////////////////////////////////////////////////////////////////////////////////////// // Operator * : first case this is not a spin index, so recurse /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -323,10 +329,8 @@ namespace QCD { // note that doing so from the lattice operator will avoid copy back and case switch overhead, as // was done for the tensor math operator to remove operator * notation early // -#ifdef GRID_WARN_SUBOPTIMAL -#warning "Optimisation alert switch over to multGammaX early " -#endif + //left multiply template inline auto operator * ( const Gamma &G,const iScalar &arg) -> typename std::enable_if,SpinIndex>::notvalue,iScalar >::type @@ -349,6 +353,32 @@ namespace QCD { ret._internal=G*arg._internal; return ret; } + + + //right multiply + template inline auto operator * (const iScalar &arg, const Gamma &G) -> + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type + + { + iScalar ret; + ret._internal=arg._internal*G; + return ret; + } + template inline auto operator * (const iVector &arg, const Gamma &G) -> + typename std::enable_if,SpinIndex>::notvalue,iVector >::type + { + iVector ret; + ret._internal=arg._internal*G; + return ret; + } + template inline auto operator * (const iMatrix &arg, const Gamma &G) -> + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type + { + iMatrix ret; + ret._internal=arg._internal*G; + return ret; + } + //////////////////////////////////////////////////////// // When we hit the spin index this matches and we stop //////////////////////////////////////////////////////// @@ -399,6 +429,104 @@ namespace QCD { } return ret; } + // Could have used type trait for Matrix/vector and then an enable if to share code + template inline auto operator * ( const Gamma &G,const iVector &arg) -> + typename std::enable_if,SpinIndex>::value,iVector >::type + { + iVector ret; + switch (G._g) { + case Gamma::Identity: + ret = arg; + break; + case Gamma::MinusIdentity: + ret = -arg; + break; + case Gamma::GammaX: + multGammaX(ret,arg); + break; + case Gamma::MinusGammaX: + multMinusGammaX(ret,arg); + break; + case Gamma::GammaY: + multGammaY(ret,arg); + break; + case Gamma::MinusGammaY: + multMinusGammaY(ret,arg); + break; + case Gamma::GammaZ: + multGammaZ(ret,arg); + break; + case Gamma::MinusGammaZ: + multMinusGammaZ(ret,arg); + break; + case Gamma::GammaT: + multGammaT(ret,arg); + break; + case Gamma::MinusGammaT: + multMinusGammaT(ret,arg); + break; + case Gamma::Gamma5: + multGamma5(ret,arg); + break; + case Gamma::MinusGamma5: + multMinusGamma5(ret,arg); + break; + default: + assert(0); + break; + } + return ret; + } + + template inline auto operator * (const iMatrix &arg, const Gamma &G) -> + typename std::enable_if,SpinIndex>::value,iMatrix >::type + { + iMatrix ret; + switch (G._g) { + case Gamma::Identity: + ret = arg; + break; + case Gamma::MinusIdentity: + ret = -arg; + break; + case Gamma::GammaX: + rmultGammaX(ret,arg); + break; + case Gamma::MinusGammaX: + rmultMinusGammaX(ret,arg); + break; + case Gamma::GammaY: + rmultGammaY(ret,arg); + break; + case Gamma::MinusGammaY: + rmultMinusGammaY(ret,arg); + break; + case Gamma::GammaZ: + rmultGammaZ(ret,arg); + break; + case Gamma::MinusGammaZ: + rmultMinusGammaZ(ret,arg); + break; + case Gamma::GammaT: + rmultGammaT(ret,arg); + break; + case Gamma::MinusGammaT: + rmultMinusGammaT(ret,arg); + break; + case Gamma::Gamma5: + rmultGamma5(ret,arg); + break; + case Gamma::MinusGamma5: + rmultMinusGamma5(ret,arg); + break; + default: + assert(0); + break; + } + return ret; + } + + /* Output from test ./Grid_gamma Identity((1,0),(0,0),(0,0),(0,0)) diff --git a/tests/Grid_gamma.cc b/tests/Grid_gamma.cc index 9c213352..d3a33039 100644 --- a/tests/Grid_gamma.cc +++ b/tests/Grid_gamma.cc @@ -23,6 +23,9 @@ int main (int argc, char ** argv) SpinMatrix rr=zero; SpinMatrix result; + SpinVector lv=zero; + SpinVector rv=zero; + for(int a=0;a Date: Fri, 24 Apr 2015 19:12:14 +0100 Subject: [PATCH 100/429] static names and enum list --- lib/qcd/Grid_qcd_dirac.cc | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 lib/qcd/Grid_qcd_dirac.cc diff --git a/lib/qcd/Grid_qcd_dirac.cc b/lib/qcd/Grid_qcd_dirac.cc new file mode 100644 index 00000000..6526dfd3 --- /dev/null +++ b/lib/qcd/Grid_qcd_dirac.cc @@ -0,0 +1,39 @@ +#include + +namespace Grid { + + namespace QCD { + + Gamma::GammaMatrix Gamma::GammaMatrices [] = { + Gamma::Identity, + Gamma::GammaX, + Gamma::GammaY, + Gamma::GammaZ, + Gamma::GammaT, + Gamma::Gamma5, + Gamma::MinusIdentity, + Gamma::MinusGammaX, + Gamma::MinusGammaY, + Gamma::MinusGammaZ, + Gamma::MinusGammaT, + Gamma::MinusGamma5 + }; + const char *Gamma::GammaMatrixNames[] = { + "Identity ", + "GammaX ", + "GammaY ", + "GammaZ ", + "GammaT ", + "Gamma5 ", + "-Identity", + "-GammaX ", + "-GammaY ", + "-GammaZ ", + "-GammaT ", + "-Gamma5 ", + " " + }; + + + } +} From fc32450360c24a7be9d5daeda257e04be9b61e71 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 24 Apr 2015 20:21:40 +0100 Subject: [PATCH 101/429] Improved the gamma quite a bit. Serial rng's which are set on node zero and broadcaste --- lib/Grid_communicator.h | 2 + lib/communicator/Grid_communicator_fake.cc | 3 + lib/communicator/Grid_communicator_mpi.cc | 9 ++ lib/lattice/Grid_lattice_rng.h | 107 +++++++++++++++++---- lib/math/Grid_math_inner.h | 7 ++ lib/qcd/Grid_qcd_dirac.h | 8 +- tests/Grid_cshift.cc | 3 +- tests/Grid_gamma.cc | 33 ++++++- tests/Grid_main.cc | 3 +- tests/Grid_nersc_io.cc | 1 - tests/Grid_stencil.cc | 3 +- 11 files changed, 151 insertions(+), 28 deletions(-) diff --git a/lib/Grid_communicator.h b/lib/Grid_communicator.h index f5baa413..84d080ae 100644 --- a/lib/Grid_communicator.h +++ b/lib/Grid_communicator.h @@ -99,6 +99,8 @@ class CartesianCommunicator { Broadcast(root,(void *)&data,sizeof(data)); }; + static void BroadcastWorld(int root,void* data, int bytes); + }; } diff --git a/lib/communicator/Grid_communicator_fake.cc b/lib/communicator/Grid_communicator_fake.cc index 5f4a4024..c5b77620 100644 --- a/lib/communicator/Grid_communicator_fake.cc +++ b/lib/communicator/Grid_communicator_fake.cc @@ -37,6 +37,9 @@ void CartesianCommunicator::Barrier(void) void CartesianCommunicator::Broadcast(int root,void* data, int bytes) { } +void CartesianCommunicator::BroadcastWorld(int root,void* data, int bytes) +{ +} void CartesianCommunicator::ShiftedRanks(int dim,int shift,int &source,int &dest) diff --git a/lib/communicator/Grid_communicator_mpi.cc b/lib/communicator/Grid_communicator_mpi.cc index bd53bd9c..6a3f69f2 100644 --- a/lib/communicator/Grid_communicator_mpi.cc +++ b/lib/communicator/Grid_communicator_mpi.cc @@ -92,5 +92,14 @@ void CartesianCommunicator::Broadcast(int root,void* data, int bytes) communicator); } +void CartesianCommunicator::BroadcastWorld(int root,void* data, int bytes) +{ + MPI_Bcast(data, + bytes, + MPI_BYTE, + root, + MPI_COMM_WORLD); +} + } diff --git a/lib/lattice/Grid_lattice_rng.h b/lib/lattice/Grid_lattice_rng.h index 24627c92..85d8c471 100644 --- a/lib/lattice/Grid_lattice_rng.h +++ b/lib/lattice/Grid_lattice_rng.h @@ -26,7 +26,70 @@ namespace Grid { } }; - class GridRNG { + class GridRNGbase { + + public: + + GridRNGbase() : _uniform{0,1}, _gaussian(0.0,1.0) {}; + + int _seeded; + // One generator per site. + // Uniform and Gaussian distributions from these generators. + std::vector _generators; + std::uniform_real_distribution _uniform; + std::normal_distribution _gaussian; + + + }; + + class GridSerialRNG : public GridRNGbase { + public: + + // FIXME ... do we require lockstep draws of randoms + // from all nodes keeping seeds consistent. + // place a barrier/broadcast in the fill routine + template void Seed(source &src) + { + typename source::result_type init = src(); + CartesianCommunicator::BroadcastWorld(0,(void *)&init,sizeof(init)); + _generators[0] = std::ranlux48(init); + _seeded=1; + } + + GridSerialRNG() : GridRNGbase() { + _generators.resize(1); + _seeded=0; + } + + + template inline void fill(sobj &l,distribution &dist){ + + typedef typename sobj::scalar_type scalar_type; + + int words = sizeof(sobj)/sizeof(scalar_type); + + scalar_type *buf = (scalar_type *) & l; + + for(int idx=0;idx &seeds){ + fixedSeed src(seeds); + Seed(src); + } + + }; + + class GridParallelRNG : public GridRNGbase { public: // One generator per site. std::vector _generators; @@ -42,25 +105,13 @@ namespace Grid { return is*_grid->oSites()+os; } - GridRNG(GridBase *grid) : _uniform{0,1}, _gaussian(0.0,1.0) { + GridParallelRNG(GridBase *grid) : GridRNGbase() { _grid=grid; _vol =_grid->iSites()*_grid->oSites(); _generators.resize(_vol); - // SeedFixedIntegers(seeds); - // worst case we seed properly but non-deterministically - SeedRandomDevice(); + _seeded=0; } - // FIXME: drive seeding from node zero and transmit to all - // to get unique randoms on each node - void SeedRandomDevice(void){ - std::random_device rd; - Seed(rd); - } - void SeedFixedIntegers(std::vector &seeds){ - fixedSeed src(seeds); - Seed(src); - } // This loop could be made faster to avoid the Ahmdahl by // i) seed generators on each timeslice, for x=y=z=0; @@ -86,6 +137,7 @@ namespace Grid { _generators[l_idx] = std::ranlux48(init); } } + _seeded=1; } //FIXME implement generic IO and create state save/restore @@ -122,15 +174,34 @@ namespace Grid { merge(l._odata[ss],pointers); } }; + + void SeedRandomDevice(void){ + std::random_device rd; + Seed(rd); + } + void SeedFixedIntegers(std::vector &seeds){ + fixedSeed src(seeds); + Seed(src); + } + }; - // FIXME Implement a consistent seed management strategy - template inline void random(GridRNG &rng,Lattice &l){ + + template inline void random(GridParallelRNG &rng,Lattice &l){ rng.fill(l,rng._uniform); } - template inline void gaussian(GridRNG &rng,Lattice &l){ + template inline void gaussian(GridParallelRNG &rng,Lattice &l){ rng.fill(l,rng._gaussian); } + + + template inline void random(GridSerialRNG &rng,sobj &l){ + rng.fill(l,rng._uniform); + } + template inline void gaussian(GridSerialRNG &rng,sobj &l){ + rng.fill(l,rng._gaussian); + } + } #endif diff --git a/lib/math/Grid_math_inner.h b/lib/math/Grid_math_inner.h index 88387db7..465501e1 100644 --- a/lib/math/Grid_math_inner.h +++ b/lib/math/Grid_math_inner.h @@ -6,6 +6,13 @@ namespace Grid { // innerProduct Vector x Vector -> Scalar // innerProduct Matrix x Matrix -> Scalar /////////////////////////////////////////////////////////////////////////////////////// + template inline RealD norm2l(sobj &arg){ + typedef typename sobj::scalar_type scalar; + decltype(innerProduct(arg,arg)) nrm; + nrm = innerProduct(arg,arg); + return real(nrm); + } + template inline auto innerProduct (const iVector& lhs,const iVector& rhs) -> iScalar { diff --git a/lib/qcd/Grid_qcd_dirac.h b/lib/qcd/Grid_qcd_dirac.h index 945178e9..03dc9cc5 100644 --- a/lib/qcd/Grid_qcd_dirac.h +++ b/lib/qcd/Grid_qcd_dirac.h @@ -76,15 +76,15 @@ namespace QCD { ret(i,0) = timesMinusI(rhs(i,3)); ret(i,1) = timesMinusI(rhs(i,2)); ret(i,2) = timesI(rhs(i,1)); - ret(i,3) = timesI(rhs(i,1)); + ret(i,3) = timesI(rhs(i,0)); } }; template inline void multGammaX(iMatrix &ret, const iMatrix &rhs){ for(int i=0;i inline void multMinusGammaX(iMatrix &ret, const iMatrix &rhs){ diff --git a/tests/Grid_cshift.cc b/tests/Grid_cshift.cc index 3fe2b9cc..995756d6 100644 --- a/tests/Grid_cshift.cc +++ b/tests/Grid_cshift.cc @@ -14,7 +14,8 @@ int main (int argc, char ** argv) std::vector latt_size ({8,8,8,16}); GridCartesian Fine(latt_size,simd_layout,mpi_layout); - GridRNG FineRNG(&Fine); + GridParallelRNG FineRNG(&Fine); + FineRNG.SeedRandomDevice(); LatticeComplex U(&Fine); LatticeComplex ShiftU(&Fine); diff --git a/tests/Grid_gamma.cc b/tests/Grid_gamma.cc index d3a33039..758f9faa 100644 --- a/tests/Grid_gamma.cc +++ b/tests/Grid_gamma.cc @@ -16,9 +16,15 @@ int main (int argc, char ** argv) GridCartesian Grid(latt_size,simd_layout,mpi_layout); - GridRNG RNG(&Grid); + GridParallelRNG pRNG(&Grid); + pRNG.SeedRandomDevice(); + + GridSerialRNG sRNG; + sRNG.SeedRandomDevice(); SpinMatrix ident=zero; + SpinMatrix rnd ; random(sRNG,rnd); + SpinMatrix ll=zero; SpinMatrix rr=zero; SpinMatrix result; @@ -94,6 +100,29 @@ int main (int argc, char ** argv) } - + std::cout << "Testing Gamma^2 - 1 = 0"< U(4,&Fine); diff --git a/tests/Grid_stencil.cc b/tests/Grid_stencil.cc index 917cb558..f35581f6 100644 --- a/tests/Grid_stencil.cc +++ b/tests/Grid_stencil.cc @@ -48,7 +48,8 @@ int main (int argc, char ** argv) GridCartesian Fine(latt_size,simd_layout,mpi_layout); GridRedBlackCartesian rbFine(latt_size,simd_layout,mpi_layout); - GridRNG fRNG(&Fine); + GridParallelRNG fRNG(&Fine); + fRNG.SeedRandomDevice(); LatticeColourMatrix Foo(&Fine); LatticeColourMatrix Bar(&Fine); From dc970c644210a30e0ad17d3d0834005398f61ee2 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 24 Apr 2015 22:56:37 +0100 Subject: [PATCH 102/429] Dirac done ; remove from TODO --- TODO | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TODO b/TODO index 12e33302..d2f8423c 100644 --- a/TODO +++ b/TODO @@ -17,7 +17,7 @@ * Make the Tensor types and Complex etc... play more nicely. -* Dirac, Pauli, SU subgroup, etc.. * Gamma/Dirac structures +* Pauli, SU subgroup, etc.. * Fourspin, two spin project @@ -73,6 +73,7 @@ AUDITS: ====================================================================================================== FUNCTIONALITY: +* Dirac Gamma/Dirac structures ---- DONE * Conditional execution, where etc... -----DONE, simple test * Integer relational support -----DONE * Coordinate information, integers etc... -----DONE From 2d8cf9e456964d5c197a50acfdb1c4ec23422e81 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 25 Apr 2015 12:54:06 +0100 Subject: [PATCH 103/429] Added two spinor functionality required to support the Wilson hopping term. --- TODO | 22 +- lib/math/Grid_math_inner.h | 2 +- lib/qcd/Grid_qcd.h | 68 ++- lib/qcd/Grid_qcd_2spinor.h | 1082 ++++++++++++++++++++++++++++++++++++ tests/Grid_gamma.cc | 112 ++-- 5 files changed, 1227 insertions(+), 59 deletions(-) create mode 100644 lib/qcd/Grid_qcd_2spinor.h diff --git a/TODO b/TODO index d2f8423c..b12502eb 100644 --- a/TODO +++ b/TODO @@ -13,7 +13,26 @@ * Consider switch std::vector to boost arrays or something lighter weight boost::multi_array A()... to replace multi1d, multi2d etc.. -* How to define simple matrix operations, such as flavour matrices? +* TensorRemove is a hack, come up with a long term rationalised approach to Complex vs. Scalar > > + QDP forces use of "toDouble" to get back to non tensor scalar. This role is presently taken TensorRemove, but I + want to introduce a syntax that does not require this. + +* norm2l is a hack. figure out syntax error and make this norm2. c.f. tests/Grid_gamma.cc + +* std::vector replacement; + + Had to change "reserve" back to "resize" on std::vector in Lattice class. + + This forces the constructor call on EVERY element of the array with negative + performance effects on temporaries. + + The reversion was required because copy constructur has to work. + + CONCLUSION: I must implement a similar to vector without construction/fill on + resize. Find out if valarray or alternative works differently prior to + doing this since there may still be something I can use.. + +* Flavour matrices? * Make the Tensor types and Complex etc... play more nicely. @@ -36,7 +55,6 @@ * Conformable test in Cshift routines. -* QDP++ regression suite and comparative benchmark AUDITS: diff --git a/lib/math/Grid_math_inner.h b/lib/math/Grid_math_inner.h index 465501e1..71b5e3b8 100644 --- a/lib/math/Grid_math_inner.h +++ b/lib/math/Grid_math_inner.h @@ -6,7 +6,7 @@ namespace Grid { // innerProduct Vector x Vector -> Scalar // innerProduct Matrix x Matrix -> Scalar /////////////////////////////////////////////////////////////////////////////////////// - template inline RealD norm2l(sobj &arg){ + template inline RealD norm2l(const sobj &arg){ typedef typename sobj::scalar_type scalar; decltype(innerProduct(arg,arg)) nrm; nrm = innerProduct(arg,arg); diff --git a/lib/qcd/Grid_qcd.h b/lib/qcd/Grid_qcd.h index a5c4320e..f331bd88 100644 --- a/lib/qcd/Grid_qcd.h +++ b/lib/qcd/Grid_qcd.h @@ -7,6 +7,7 @@ namespace QCD { static const int Nc=3; static const int Ns=4; static const int Nd=4; + static const int Nhs=2; // half spinor static const int CbRed =0; static const int CbBlack=1; @@ -38,16 +39,21 @@ namespace QCD { template using iColourVector = iScalar > >; template using iSpinColourVector = iScalar, Ns> >; - typedef iSpinMatrix SpinMatrix; - typedef iColourMatrix ColourMatrix; - typedef iSpinColourMatrix SpinColourMatrix; - typedef iLorentzColourMatrix LorentzColourMatrix; + template using iHalfSpinVector = iScalar, Nhs> >; + template using iHalfSpinColourVector = iScalar, Nhs> >; + + typedef iSpinMatrix SpinMatrix; + typedef iColourMatrix ColourMatrix; + typedef iSpinColourMatrix SpinColourMatrix; + typedef iLorentzColourMatrix LorentzColourMatrix; typedef iLorentzColourMatrix LorentzColourMatrixF; typedef iLorentzColourMatrix LorentzColourMatrixD; - typedef iSpinVector SpinVector; - typedef iColourVector ColourVector; - typedef iSpinColourVector SpinColourVector; + typedef iSpinVector SpinVector; + typedef iColourVector ColourVector; + typedef iSpinColourVector SpinColourVector; + typedef iHalfSpinVector HalfSpinVector; + typedef iHalfSpinColourVector HalfSpinColourVector; typedef iSpinMatrix vSpinMatrix; @@ -55,36 +61,46 @@ namespace QCD { typedef iSpinColourMatrix vSpinColourMatrix; typedef iLorentzColourMatrix vLorentzColourMatrix; - typedef iSpinVector vSpinVector; - typedef iColourVector vColourVector; - typedef iSpinColourVector vSpinColourVector; + typedef iSpinVector vSpinVector; + typedef iColourVector vColourVector; + typedef iSpinColourVector vSpinColourVector; + typedef iHalfSpinVector vHalfSpinVector; + typedef iHalfSpinColourVector vHalfSpinColourVector; - typedef iSinglet TComplex; // This is painful. Tensor singlet complex type. - typedef iSinglet vTComplex; // what if we don't know the tensor structure - typedef iSinglet TReal; // Shouldn't need these; can I make it work without? - typedef iSinglet vTReal; - typedef iSinglet vTInteger; - typedef iSinglet TInteger; + typedef iSinglet TComplex; // FIXME This is painful. Tensor singlet complex type. + typedef iSinglet vTComplex; // what if we don't know the tensor structure + typedef iSinglet TReal; // Shouldn't need these; can I make it work without? + typedef iSinglet vTReal; + typedef iSinglet vTInteger; + typedef iSinglet TInteger; - typedef Lattice LatticeReal; - typedef Lattice LatticeComplex; - typedef Lattice LatticeInteger; // Predicates for "where" + typedef Lattice LatticeReal; + typedef Lattice LatticeComplex; + typedef Lattice LatticeInteger; // Predicates for "where" typedef Lattice LatticeColourMatrix; typedef Lattice LatticeSpinMatrix; typedef Lattice LatticeSpinColourMatrix; - typedef Lattice LatticeSpinColourVector; - typedef Lattice LatticeSpinVector; - typedef Lattice LatticeColourVector; + typedef Lattice LatticeSpinVector; + typedef Lattice LatticeColourVector; + typedef Lattice LatticeSpinColourVector; + typedef Lattice LatticeHalfSpinVector; + typedef Lattice LatticeHalfSpinColourVector; /////////////////////////////////////////// // Physical names for things /////////////////////////////////////////// - typedef Lattice LatticeFermion; - typedef Lattice LatticePropagator; - typedef Lattice LatticeGaugeField; + typedef Lattice LatticeHalfFermion; + typedef Lattice LatticeFermion; + typedef Lattice LatticePropagator; + typedef Lattice LatticeGaugeField; + + // Uhgg... typing this hurt ;) + // (my keyboard got burning hot when I typed this, must be the anti-Fermion) + typedef Lattice LatticeStaggeredFermion; + typedef Lattice LatticeStaggeredPropagator; ////////////////////////////////////////////////////////////////////////////// // Peek and Poke named after physics attributes @@ -145,5 +161,7 @@ namespace QCD { } // Grid #include +#include +//#include #endif diff --git a/lib/qcd/Grid_qcd_2spinor.h b/lib/qcd/Grid_qcd_2spinor.h new file mode 100644 index 00000000..c19264f5 --- /dev/null +++ b/lib/qcd/Grid_qcd_2spinor.h @@ -0,0 +1,1082 @@ +#ifndef GRID_QCD_TWOSPIN_H +#define GRID_QCD_TWOSPIN_H +namespace Grid{ + +namespace QCD { + + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // Normalisation alert; the g5 project is 1/2(1+-G5) + // the xyzt projects are (1+-Gxyzt) + // + // * xyzt project + // + // This is because this is how the Wilson operator is normally written as + // (m+4r) - \frac{1}{2} D_{hop} + // and / or + // 1 - \frac{1}{2 m+8r} D_{hop} = 1 - kappa D_{hop} + // + // Note that the free, critical hopping parameter kappa is then 1/8 th for r=1. + // + // However, the xyzt 2spin "projectors" are not really projectors because they do not + // square to 1, however the ChiralProjector is a true projector. + // + // For this reason there is NO provision in Grid of a four spinor result from the + // xyzt projectors. They are intended to be used only in combination with "reconstruct" in the + // wilson dirac operator and closely related actions. + // + // I also do NOT provide lattice wide operators of these, since the dirac operator is best implemented + // via Stencils and single site variants will be needed only for the cache friendly high perf dirac operator. + // + // * chiral project + // + // Both four spinor and two spinor result variants are provided. + // + // The four spinor project will be recursively provided to Lattice wide routines, and likely used in + // the domain wall and mobius implementations. + // + ////////////////////////////////////////////////////////////////////////////////////////////////////// + + /* Gx + * 0 0 0 i [0]+-i[3] + * 0 0 i 0 [1]+-i[2] + * 0 -i 0 0 + * -i 0 0 0 + */ + template inline void + spProjXp (iVector &hspin,const iVector &fspin) + { + // To fail is not to err (Cryptic clue: suggest to Google SFINAE ;) ) + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + hspin(0)=fspin(0)+timesI(fspin(3)); + hspin(1)=fspin(1)+timesI(fspin(2)); + } + template inline void spProjXm (iVector &hspin,const iVector &fspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + hspin(0)=fspin(0)-timesI(fspin(3)); + hspin(1)=fspin(1)-timesI(fspin(2)); + } + + // 0 0 0 -1 [0] -+ [3] + // 0 0 1 0 [1] +- [2] + // 0 1 0 0 + // -1 0 0 0 + template inline void spProjYp (iVector &hspin,const iVector &fspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + hspin(0)=fspin(0)-fspin(3); + hspin(1)=fspin(1)+fspin(2); + } + template inline void spProjYm (iVector &hspin,const iVector &fspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + hspin(0)=fspin(0)+fspin(3); + hspin(1)=fspin(1)-fspin(2); + } + /*Gz + * 0 0 i 0 [0]+-i[2] + * 0 0 0 -i [1]-+i[3] + * -i 0 0 0 + * 0 i 0 0 + */ + template inline void spProjZp (iVector &hspin,const iVector &fspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + hspin(0)=fspin(0)+timesI(fspin(2)); + hspin(1)=fspin(1)-timesI(fspin(3)); + } + template inline void spProjZm (iVector &hspin,const iVector &fspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + hspin(0)=fspin(0)-timesI(fspin(2)); + hspin(1)=fspin(1)+timesI(fspin(3)); + } + /*Gt + * 0 0 1 0 [0]+-[2] + * 0 0 0 1 [1]+-[3] + * 1 0 0 0 + * 0 1 0 0 + */ + template inline void spProjTp (iVector &hspin,const iVector &fspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + hspin(0)=fspin(0)+fspin(2); + hspin(1)=fspin(1)+fspin(3); + } + template inline void spProjTm (iVector &hspin,const iVector &fspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + hspin(0)=fspin(0)-fspin(2); + hspin(1)=fspin(1)-fspin(3); + } + /*G5 + * 1 0 0 0 + * 0 1 0 0 + * 0 0 -1 0 + * 0 0 0 -1 + */ + + template inline void spProj5p (iVector &hspin,const iVector &fspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + hspin(0)=fspin(0); + hspin(1)=fspin(1); + } + template inline void spProj5m (iVector &hspin,const iVector &fspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + hspin(0)=fspin(2); + hspin(1)=fspin(3); + } + + // template inline void fspProj5p (iVector &rfspin,const iVector &fspin) + template inline void spProj5p (iVector &rfspin,const iVector &fspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + rfspin(0)=fspin(0); + rfspin(1)=fspin(1); + rfspin(2)=zero; + rfspin(3)=zero; + } + // template inline void fspProj5m (iVector &rfspin,const iVector &fspin) + template inline void spProj5m (iVector &rfspin,const iVector &fspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + rfspin(0)=zero; + rfspin(1)=zero; + rfspin(2)=fspin(2); + rfspin(3)=fspin(3); + } + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Reconstruction routines to move back again to four spin + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /* Gx + * 0 0 0 i [0]+-i[3] + * 0 0 i 0 [1]+-i[2] + * 0 -i 0 0 -i[1]+-[2] == -i ([0]+-i[3]) = -i (1) + * -i 0 0 0 -i[0]+-[3] == -i ([1]+-i[2]) = -i (0) + */ + template inline void spReconXp (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)=hspin(0); + fspin(1)=hspin(1); + fspin(2)=timesMinusI(hspin(1)); + fspin(3)=timesMinusI(hspin(0)); + } + template inline void spReconXm (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)=hspin(0); + fspin(1)=hspin(1); + fspin(2)=timesI(hspin(1)); + fspin(3)=timesI(hspin(0)); + } + template inline void accumReconXp (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)+=hspin(0); + fspin(1)+=hspin(1); + fspin(2)-=timesI(hspin(1)); + fspin(3)-=timesI(hspin(0)); + } + template inline void accumReconXm (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)+=hspin(0); + fspin(1)+=hspin(1); + fspin(2)+=timesI(hspin(1)); + fspin(3)+=timesI(hspin(0)); + } + + // 0 0 0 -1 [0] -+ [3] + // 0 0 1 0 [1] +- [2] + // 0 1 0 0 == 1(1) + // -1 0 0 0 ==-1(0) + + template inline void spReconYp (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)=hspin(0); + fspin(1)=hspin(1); + fspin(2)= hspin(1); + fspin(3)=-hspin(0);//Unary minus? + } + template inline void spReconYm (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)=hspin(0); + fspin(1)=hspin(1); + fspin(2)=-hspin(1); + fspin(3)= hspin(0); + } + template inline void accumReconYp (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)+=hspin(0); + fspin(1)+=hspin(1); + fspin(2)+=hspin(1); + fspin(3)-=hspin(0); + } + template inline void accumReconYm (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)+=hspin(0); + fspin(1)+=hspin(1); + fspin(2)-=hspin(1); + fspin(3)+=hspin(0); + } + + /*Gz + * 0 0 i 0 [0]+-i[2] + * 0 0 0 -i [1]-+i[3] + * -i 0 0 0 => -i (0) + * 0 i 0 0 => i (1) + */ + template inline void spReconZp (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)=hspin(0); + fspin(1)=hspin(1); + fspin(2)=timesMinusI(hspin(0)); + fspin(3)=timesI(hspin(1)); + } + template inline void spReconZm (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)=hspin(0); + fspin(1)=hspin(1); + fspin(2)= timesI(hspin(0)); + fspin(3)=timesMinusI(hspin(1)); + } + template inline void accumReconZp (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)+=hspin(0); + fspin(1)+=hspin(1); + fspin(2)-=timesI(hspin(0)); + fspin(3)+=timesI(hspin(1)); + } + template inline void accumReconZm (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)+=hspin(0); + fspin(1)+=hspin(1); + fspin(2)+=timesI(hspin(0)); + fspin(3)-=timesI(hspin(1)); + } + /*Gt + * 0 0 1 0 [0]+-[2] + * 0 0 0 1 [1]+-[3] + * 1 0 0 0 => (0) + * 0 1 0 0 => (1) + */ + template inline void spReconTp (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)=hspin(0); + fspin(1)=hspin(1); + fspin(2)=hspin(0); + fspin(3)=hspin(1); + } + template inline void spReconTm (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)=hspin(0); + fspin(1)=hspin(1); + fspin(2)=-hspin(0); + fspin(3)=-hspin(1); + } + template inline void accumReconTp (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)+=hspin(0); + fspin(1)+=hspin(1); + fspin(2)+=hspin(0); + fspin(3)+=hspin(1); + } + template inline void accumReconTm (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)+=hspin(0); + fspin(1)+=hspin(1); + fspin(2)-=hspin(0); + fspin(3)-=hspin(1); + } + /*G5 + * 1 0 0 0 + * 0 1 0 0 + * 0 0 -1 0 + * 0 0 0 -1 + */ + template inline void spRecon5p (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)=hspin(0)+hspin(0); // add is lower latency than mul + fspin(1)=hspin(1)+hspin(1); // probably no measurable diffence though + fspin(2)=zero; + fspin(3)=zero; + } + template inline void spRecon5m (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)=zero; + fspin(1)=zero; + fspin(2)=hspin(0)+hspin(0); + fspin(3)=hspin(1)+hspin(1); + } + template inline void accumRecon5p (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(0)+=hspin(0)+hspin(0); + fspin(1)+=hspin(1)+hspin(1); + } + template inline void accumRecon5m (iVector &fspin,const iVector &hspin) + { + typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; + fspin(2)+=hspin(0)+hspin(0); + fspin(3)+=hspin(1)+hspin(1); + } + + ////////////////////////////////////////////////////////////////////////////////////////////// + // Recursively apply these until we hit the spin index + ////////////////////////////////////////////////////////////////////////////////////////////// + + ////////// + // Xp + ////////// + template inline void spProjXp (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spProjXp(hspin._internal,fspin._internal); + } + template inline void spProjXp (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spProjXp (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spReconXp (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spReconXp(hspin._internal,fspin._internal); + } + template inline void spReconXp (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spReconXp (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void accumReconXp (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + accumReconXp(hspin._internal,fspin._internal); + } + template inline void accumReconXp (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void accumReconXp (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spProjXm (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spProjXm(hspin._internal,fspin._internal); + } + template inline void spProjXm (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spProjXm (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spReconXm (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spReconXm(hspin._internal,fspin._internal); + } + template inline void spReconXm (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spReconXm (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void accumReconXm (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + accumReconXm(hspin._internal,fspin._internal); + } + template inline void accumReconXm (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void accumReconXm (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spProjYp (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spProjYp(hspin._internal,fspin._internal); + } + template inline void spProjYp (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spProjYp (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spReconYp (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spReconYp(hspin._internal,fspin._internal); + } + template inline void spReconYp (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spReconYp (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void accumReconYp (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + accumReconYp(hspin._internal,fspin._internal); + } + template inline void accumReconYp (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void accumReconYp (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spProjYm (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spProjYm(hspin._internal,fspin._internal); + } + template inline void spProjYm (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spProjYm (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spReconYm (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spReconYm(hspin._internal,fspin._internal); + } + template inline void spReconYm (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spReconYm (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void accumReconYm (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + accumReconYm(hspin._internal,fspin._internal); + } + template inline void accumReconYm (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void accumReconYm (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spProjZp (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spProjZp(hspin._internal,fspin._internal); + } + template inline void spProjZp (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spProjZp (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spReconZp (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spReconZp(hspin._internal,fspin._internal); + } + template inline void spReconZp (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spReconZp (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void accumReconZp (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + accumReconZp(hspin._internal,fspin._internal); + } + template inline void accumReconZp (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void accumReconZp (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spProjZm (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spProjZm(hspin._internal,fspin._internal); + } + template inline void spProjZm (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spProjZm (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spReconZm (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spReconZm(hspin._internal,fspin._internal); + } + template inline void spReconZm (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spReconZm (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void accumReconZm (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + accumReconZm(hspin._internal,fspin._internal); + } + template inline void accumReconZm (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void accumReconZm (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spProjTp (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spProjTp(hspin._internal,fspin._internal); + } + template inline void spProjTp (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spProjTp (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spReconTp (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spReconTp(hspin._internal,fspin._internal); + } + template inline void spReconTp (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spReconTp (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void accumReconTp (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + accumReconTp(hspin._internal,fspin._internal); + } + template inline void accumReconTp (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void accumReconTp (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spProjTm (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spProjTm(hspin._internal,fspin._internal); + } + template inline void spProjTm (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spProjTm (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spReconTm (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spReconTm(hspin._internal,fspin._internal); + } + template inline void spReconTm (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spReconTm (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void accumReconTm (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + accumReconTm(hspin._internal,fspin._internal); + } + template inline void accumReconTm (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void accumReconTm (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spProj5p (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spProj5p(hspin._internal,fspin._internal); + } + template inline void spProj5p (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spProj5p (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spRecon5p (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spRecon5p(hspin._internal,fspin._internal); + } + template inline void spRecon5p (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spRecon5p (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void accumRecon5p (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + accumRecon5p(hspin._internal,fspin._internal); + } + template inline void accumRecon5p (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void accumRecon5p (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void fspProj5p (iScalar &hspin,const iScalar &fspin) + template inline void spProj5p (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spProj5p(hspin._internal,fspin._internal); + } + // template inline void fspProj5p (iVector &hspin,iVector &fspin) + template inline void spProj5p (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void fspProj5p (iMatrix &hspin,iMatrix &fspin) + template inline void spProj5p (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spProj5m (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spProj5m(hspin._internal,fspin._internal); + } + template inline void spProj5m (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spProj5m (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void spRecon5m (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spRecon5m(hspin._internal,fspin._internal); + } + template inline void spRecon5m (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void spRecon5m (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void accumRecon5m (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + accumRecon5m(hspin._internal,fspin._internal); + } + template inline void accumRecon5m (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void accumRecon5m (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i inline void fspProj5m (iScalar &hspin,const iScalar &fspin) + template inline void spProj5m (iScalar &hspin,const iScalar &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; + spProj5m(hspin._internal,fspin._internal); + } + // template inline void fspProj5m (iVector &hspin,iVector &fspin) + template inline void spProj5m (iVector &hspin,iVector &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; + for(int i=0;i inline void fspProj5m (iMatrix &hspin,iMatrix &fspin) + template inline void spProj5m (iMatrix &hspin,iMatrix &fspin) + { + typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; + for(int i=0;i Date: Sat, 25 Apr 2015 13:04:26 +0100 Subject: [PATCH 104/429] Update to TODO list --- TODO | 64 ++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/TODO b/TODO index b12502eb..064e99b4 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,5 @@ * - BinaryWriter, TextWriter etc... - - protocol buffers? replace xml + - protocol buffers? replace xmlReader/Writer ec.. * Stencil operator support -----Initial thoughts, trial implementation DONE. -----some simple tests that Stencil matches Cshift. @@ -10,15 +10,14 @@ * CovariantShift support -----Use a class to store gauge field? (parallel transport?) + * Consider switch std::vector to boost arrays or something lighter weight boost::multi_array A()... to replace multi1d, multi2d etc.. -* TensorRemove is a hack, come up with a long term rationalised approach to Complex vs. Scalar > > - QDP forces use of "toDouble" to get back to non tensor scalar. This role is presently taken TensorRemove, but I - want to introduce a syntax that does not require this. * norm2l is a hack. figure out syntax error and make this norm2. c.f. tests/Grid_gamma.cc + * std::vector replacement; Had to change "reserve" back to "resize" on std::vector in Lattice class. @@ -32,30 +31,47 @@ resize. Find out if valarray or alternative works differently prior to doing this since there may still be something I can use.. -* Flavour matrices? * Make the Tensor types and Complex etc... play more nicely. +* TensorRemove is a hack, come up with a long term rationalised approach to Complex vs. Scalar > > + QDP forces use of "toDouble" to get back to non tensor scalar. This role is presently taken TensorRemove, but I + want to introduce a syntax that does not require this. -* Pauli, SU subgroup, etc.. - -* Fourspin, two spin project - -* su3 exponentiation & log etc.. [Jamie's code?] - TaProj - -* Parallel MPI2 IO - -* rb4d support. - -* Check for missing functionality - partially audited against QDP++ layout * Optimise the extract/merge SIMD routines; Azusa?? - I have collated into single location at least. - Need to use _mm_*insert/extract routines. + * Conformable test in Cshift routines. +* Flavour matrices? +* Pauli, SU subgroup, etc.. +* su3 exponentiation & log etc.. [Jamie's code?] +* TaProj + + +* Fourspin, two spin project --- DONE + + +* Parallel MPI2 IO + +* rb4d support for 5th dimension in Mobius. + + +* Check for missing functionality - partially audited against QDP++ layout + +Algorithms +* LinearOperator +* LinearSolver +* Polynomial +* Eigen +* Pcg +* fPcg +* MCR +* etc.. + AUDITS: * FIXME audit @@ -68,25 +84,20 @@ AUDITS: // TODO // // Base class to share common code between vRealF, VComplexF etc... - // + // // Unary functions // cos,sin, tan, acos, asin, cosh, acosh, tanh, sinh, // Scalar only arg // exp, log, sqrt, fabs // - // transposeColor, transposeSpin, + // transposeColor, transposeSpin, // adjColor, adjSpin, // - // copyMask. + // copyMask. // // localMaxAbs // // Fourier transform equivalent. -* LinearOperator - - LinearSolver - - Polynomial etc... ====================================================================================================== @@ -102,6 +113,8 @@ FUNCTIONALITY: ----- Implement mapping between traceColour and traceSpin and traceIndex<1/2>. * How to do U[mu] ... lorentz part of type structure or not. more like chroma if not. -- DONE +* Twospin/Fourspin/Gamma/Proj/Recon ----- DONE + * subdirs lib, tests ?? ----- DONE - lib/math - lib/cartesian @@ -133,6 +146,5 @@ FUNCTIONALITY: * I/O support * NERSC Lattice loading, plaquette test ------- DONE single node - * Controling std::cout ------- DONE From c678f2d255c63f9ddd3cd9f2d74cf6473497a0bd Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 25 Apr 2015 14:33:02 +0100 Subject: [PATCH 105/429] Starting the implementation of wilson; incomplete and committing non-functional code which is not yet included from elsewhere or linked to the build system. --- TODO | 10 +-- lib/qcd/Grid_qcd_wilson_dop.cc | 157 +++++++++++++++++++++++++++++++++ lib/qcd/Grid_qcd_wilson_dop.h | 62 +++++++++++++ 3 files changed, 224 insertions(+), 5 deletions(-) create mode 100644 lib/qcd/Grid_qcd_wilson_dop.cc create mode 100644 lib/qcd/Grid_qcd_wilson_dop.h diff --git a/TODO b/TODO index 064e99b4..46c12838 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,6 @@ * - BinaryWriter, TextWriter etc... - - protocol buffers? replace xmlReader/Writer ec.. + - use protocol buffers? replace xmlReader/Writer ec.. + - Binary use htonll, htonl * Stencil operator support -----Initial thoughts, trial implementation DONE. -----some simple tests that Stencil matches Cshift. @@ -15,10 +16,9 @@ boost::multi_array A()... to replace multi1d, multi2d etc.. -* norm2l is a hack. figure out syntax error and make this norm2. c.f. tests/Grid_gamma.cc +* norm2l is a hack. figure out syntax error and make this norm2 c.f. tests/Grid_gamma.cc - -* std::vector replacement; +**** std::vector replacement; Had to change "reserve" back to "resize" on std::vector in Lattice class. @@ -59,7 +59,6 @@ * rb4d support for 5th dimension in Mobius. - * Check for missing functionality - partially audited against QDP++ layout Algorithms @@ -70,6 +69,7 @@ Algorithms * Pcg * fPcg * MCR +* HDCG * etc.. AUDITS: diff --git a/lib/qcd/Grid_qcd_wilson_dop.cc b/lib/qcd/Grid_qcd_wilson_dop.cc new file mode 100644 index 00000000..73b19c12 --- /dev/null +++ b/lib/qcd/Grid_qcd_wilson_dop.cc @@ -0,0 +1,157 @@ +#ifnfdef GRID_QCD_WILSON_DOP_H +#define GRID_QCD_WILSON_DOP_H + +#include + +namespace Grid { +namespace QCD { + + +const std::vector WilsonMatrix::directions ({0,1,2,3, 0, 1, 2, 3,0}); +const std::vector WilsonMatrix::displacements({1,1,1,1,-1,-1,-1,-1,0}); + + // Should be in header? +static const int WilsonMatrix::Xp = 0; +static const int WilsonMatrix::Yp = 1; +static const int WilsonMatrix::Zp = 2; +static const int WilsonMatrix::Tp = 3; +static const int WilsonMatrix::Xm = 4; +static const int WilsonMatrix::Ym = 5; +static const int WilsonMatrix::Zm = 6; +static const int WilsonMatrix::Tm = 7; +static const int WilsonMatrix::X0 = 8; +static const int WilsonMatrix::npoint=9; + + +WilsonMatrix::WilsonMatrix(LatticeGaugeField &_Umu,int _mass) + : Stencil((&Umu._grid,npoint,0,directions,displacements), + mass(_mass), + Umu(_Umu) +{ + // Allocate the required comms buffer + grid = _Umu._grid; + comm_buf.resize(Stencil._unified_buffer_size); +} +void WilsonMatrix::multiply(const LatticeFermion &in, LatticeFermion &out) +{ + +} +void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) +{ + Stencil.HaloExchange(in,comm_buf); + + for(int ss=0;ss<_grid->oSites();ss++){ + + int offset,local; + + vSpinColourVector result; + vHalfSpinColourVector UChi; + + // Xp + offset = Stencil._offsets [Xp][ss]; + local = Stencil._is_local[Xp][ss]; + if ( local ) { + Uchi = U[]*spProjXp(in._odata[offset]); + } else { + Uchi = U[]*comm_buf._odata[offset] + } + result = ReconXp(Uchi); + + // Yp + offset = Stencil._offsets [Yp][ss]; + local = Stencil._is_local[Yp][ss]; + if ( local ) { + Uchi = U[]*spProjYp(in._odata[offset]); + } else { + Uchi = U[]*comm_buf._odata[offset] + } + result+= ReconYp(Uchi); + + // Zp + offset = Stencil._offsets [Zp][ss]; + local = Stencil._is_local[Zp][ss]; + if ( local ) { + Uchi = U[]*spProjZp(in._odata[offset]); + } else { + Uchi = U[]*comm_buf._odata[offset] + } + result+= ReconZp(Uchi); + + // Tp + offset = Stencil._offsets [Tp][ss]; + local = Stencil._is_local[Tp][ss]; + if ( local ) { + Uchi = U[]*spProjTp(in._odata[offset]); + } else { + Uchi = U[]*comm_buf._odata[offset] + } + result+= ReconTp(Uchi); + + // Xm + offset = Stencil._offsets [Xm][ss]; + local = Stencil._is_local[Xm][ss]; + if ( local ) { + Uchi = U[]*spProjXm(in._odata[offset]); + } else { + Uchi = U[]*comm_buf._odata[offset] + } + result+= ReconXm(Uchi); + + // Ym + offset = Stencil._offsets [Ym][ss]; + local = Stencil._is_local[Ym][ss]; + if ( local ) { + Uchi = U[]*spProjYm(in._odata[offset]); + } else { + Uchi = U[]*comm_buf._odata[offset] + } + result+= ReconYm(Uchi); + + // Zm + offset = Stencil._offsets [Zm][ss]; + local = Stencil._is_local[Zm][ss]; + if ( local ) { + Uchi = U[]*spProjZm(in._odata[offset]); + } else { + Uchi = U[]*comm_buf._odata[offset] + } + result+= ReconZm(Uchi); + + // Tm + offset = Stencil._offsets [Tm][ss]; + local = Stencil._is_local[Tm][ss]; + if ( local ) { + Uchi = U[]*spProjTm(in._odata[offset]); + } else { + Uchi = U[]*comm_buf._odata[offset] + } + result+= ReconTm(Uchi); + + out._odata[ss] = result; + } + +} +void WilsonMatrix::Dw(const LatticeFermion &in, LatticeFermion &out) +{ + +} +void WilsonMatrix::MpcDag (const LatticeFermion &in, LatticeFermion &out) +{ + +} +void WilsonMatrix::Mpc (const LatticeFermion &in, LatticeFermion &out) +{ + +} +void WilsonMatrix::MpcDagMpc(const LatticeFermion &in, LatticeFermion &out) +{ + +} +void WilsonMatrix::MDagM (const LatticeFermion &in, LatticeFermion &out) +{ + +} + + +}} +#endif diff --git a/lib/qcd/Grid_qcd_wilson_dop.h b/lib/qcd/Grid_qcd_wilson_dop.h new file mode 100644 index 00000000..f6775842 --- /dev/null +++ b/lib/qcd/Grid_qcd_wilson_dop.h @@ -0,0 +1,62 @@ +#ifnfdef GRID_QCD_WILSON_DOP_H +#define GRID_QCD_WILSON_DOP_H + +#include + +namespace Grid { + + namespace QCD { + + + template class LinearOperatorBase { + public: + void multiply(const Lattice &in, Lattice &out){ assert(0);} + }; + + class WilsonMatrix : public LinearOperatorBase + { + //NB r=1; + public: + double mass; + GridBase *grid; + + // Copy of the gauge field + LatticeGaugeField Umu; + + //Defines the stencil + CartesianStencil Stencil; + static const int npoint=9; + static const std::vector directions ; + static const std::vector displacements; + + static const int Xp,Xm,Yp,Ym,Zp,Zm,Tp,Tm; + + // Comms buffer + std::vector > comm_buf; + + // Constructor + WilsonMatrix(LatticeGaugeField &Umu,int mass); + + // override multiply + void multiply(const LatticeFermion &in, LatticeFermion &out); + + // non-hermitian hopping term; half cb or both + void Dhop(const LatticeFermion &in, LatticeFermion &out); + + // m+4r -1/2 Dhop; both cb's + void Dw(const LatticeFermion &in, LatticeFermion &out); + + // half checkerboard operaions + void MpcDag (const LatticeFermion &in, LatticeFermion &out); + void Mpc (const LatticeFermion &in, LatticeFermion &out); + void MpcDagMpc(const LatticeFermion &in, LatticeFermion &out); + + // full checkerboard hermitian + void MDagM (const LatticeFermion &in, LatticeFermion &out); + + + }; + + } +} +#endif From 35cfef2129f4a60ffec6916b9ef0f820150467f1 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 26 Apr 2015 15:51:09 +0100 Subject: [PATCH 106/429] Big updates with progress towards wilson matrix --- TODO | 18 ++- lib/Grid.h | 1 + lib/Grid_config.h | 4 +- lib/Grid_simd.h | 15 +- lib/Grid_stencil.h | 159 +++++++++++++----- lib/Makefile.am | 1 + lib/lattice/Grid_lattice_arith.h | 24 +-- lib/lattice/Grid_lattice_reduction.h | 9 +- lib/lattice/Grid_lattice_rng.h | 67 +++++++- lib/math/Grid_math_arith_scalar.h | 100 ++++++------ lib/math/Grid_math_inner.h | 6 +- lib/math/Grid_math_tensors.h | 39 +++-- lib/qcd/Grid_qcd.h | 233 +++++++++++++++++++++------ lib/qcd/Grid_qcd_dirac.h | 17 +- lib/qcd/Grid_qcd_wilson_dop.cc | 201 +++++++++++++++-------- lib/qcd/Grid_qcd_wilson_dop.h | 12 +- lib/simd/Grid_vComplexD.h | 51 +++--- lib/simd/Grid_vComplexF.h | 36 +++-- lib/simd/Grid_vRealD.h | 11 +- lib/simd/Grid_vRealF.h | 11 +- lib/stencil/Grid_stencil_common.cc | 3 +- tests/Grid_gamma.cc | 24 ++- tests/Grid_nersc_io.cc | 4 +- tests/Grid_simd.cc | 166 +++++++++++++++++++ tests/Grid_stencil.cc | 74 +++------ tests/Grid_wilson.cc | 69 ++++++++ tests/Makefile.am | 8 +- 27 files changed, 1008 insertions(+), 355 deletions(-) create mode 100644 tests/Grid_simd.cc create mode 100644 tests/Grid_wilson.cc diff --git a/TODO b/TODO index 46c12838..98dfc3b8 100644 --- a/TODO +++ b/TODO @@ -2,6 +2,10 @@ - use protocol buffers? replace xmlReader/Writer ec.. - Binary use htonll, htonl +* Reduce implemention is poor +* Bug in SeedFixedIntegers gives same output on each site. +* Bug in RNG with complex numbers ; only filling real values; need helper function -- DONE + * Stencil operator support -----Initial thoughts, trial implementation DONE. -----some simple tests that Stencil matches Cshift. -----do all permute in comms phase, so that copy permute @@ -11,6 +15,7 @@ * CovariantShift support -----Use a class to store gauge field? (parallel transport?) +* Strong test for norm2, conj and all primitive types. * Consider switch std::vector to boost arrays or something lighter weight boost::multi_array A()... to replace multi1d, multi2d etc.. @@ -33,10 +38,21 @@ * Make the Tensor types and Complex etc... play more nicely. -* TensorRemove is a hack, come up with a long term rationalised approach to Complex vs. Scalar > > + + - TensorRemove is a hack, come up with a long term rationalised approach to Complex vs. Scalar > > QDP forces use of "toDouble" to get back to non tensor scalar. This role is presently taken TensorRemove, but I want to introduce a syntax that does not require this. + - Reductions that contract indices on a site should always demote the tensor structure. + norm2(), innerProduct. + + - Result of Sum(), SliceSum // spatial sums + trace, traceIndex etc.. do not. + + - problem arises because "trace" returns Lattice moving everything down to Scalar, + and then Sum and SliceSum to not remove the Scalars. This would be fixed if we + template specialize the scalar scalar scalar sum and SliceSum, on the basis of being + pure scalar. * Optimise the extract/merge SIMD routines; Azusa?? - I have collated into single location at least. diff --git a/lib/Grid.h b/lib/Grid.h index 2a666c3b..d402b545 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -11,6 +11,7 @@ #define GRID_H #include + #include #include #include diff --git a/lib/Grid_config.h b/lib/Grid_config.h index 4152540e..f3d7016d 100644 --- a/lib/Grid_config.h +++ b/lib/Grid_config.h @@ -2,7 +2,7 @@ /* lib/Grid_config.h.in. Generated from configure.ac by autoheader. */ /* AVX */ -#define AVX1 1 +/* #undef AVX1 */ /* AVX2 */ /* #undef AVX2 */ @@ -77,7 +77,7 @@ #define PACKAGE_VERSION "1.0" /* SSE4 */ -/* #undef SSE4 */ +#define SSE4 1 /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index d8788e33..a059cc23 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -26,10 +26,15 @@ namespace Grid { typedef float RealF; typedef double RealD; - +#ifdef GRID_DEFAULT_PRECISION_DOUBLE + typedef RealD Real; +#else + typedef RealF Real; +#endif + typedef std::complex ComplexF; typedef std::complex ComplexD; - + typedef std::complex Complex; inline RealF adj(const RealF & r){ return r; } inline RealF conj(const RealF & r){ return r; } @@ -63,8 +68,8 @@ namespace Grid { //conj already supported for complex inline ComplexF timesI(const ComplexF r) { return(r*ComplexF(0.0,1.0));} - inline ComplexF timesMinusI(const ComplexF r){ return(r*ComplexF(0.0,-1.0));} inline ComplexD timesI(const ComplexD r) { return(r*ComplexD(0.0,1.0));} + inline ComplexF timesMinusI(const ComplexF r){ return(r*ComplexF(0.0,-1.0));} inline ComplexD timesMinusI(const ComplexD r){ return(r*ComplexD(0.0,-1.0));} inline void mac (RealD * __restrict__ y,const RealD * __restrict__ a,const RealD *__restrict__ x){ *y = (*a) * (*x)+(*y);} @@ -280,15 +285,11 @@ namespace Grid { // Default precision #ifdef GRID_DEFAULT_PRECISION_DOUBLE - typedef RealD Real; typedef vRealD vReal; typedef vComplexD vComplex; - typedef std::complex Complex; #else - typedef RealF Real; typedef vRealF vReal; typedef vComplexF vComplex; - typedef std::complex Complex; #endif } #endif diff --git a/lib/Grid_stencil.h b/lib/Grid_stencil.h index 7bafb879..83db0a80 100644 --- a/lib/Grid_stencil.h +++ b/lib/Grid_stencil.h @@ -47,6 +47,101 @@ namespace Grid { int from_rank; } ; + +/////////////////////////////////////////////////////////////////// +// Gather for when there is no need to SIMD split with compression +/////////////////////////////////////////////////////////////////// +template void +Gather_plane_simple (Lattice &rhs,std::vector > &buffer,int dimension,int plane,int cbmask,compressor &compress) +{ + int rd = rhs._grid->_rdimensions[dimension]; + + if ( !rhs._grid->CheckerBoarded(dimension) ) { + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + + // Simple block stride gather of SIMD objects +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + buffer[bo++]=compress(rhs._odata[so+o+b]); + } + o +=rhs._grid->_slice_stride[dimension]; + } + + } else { + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int ocb=1<CheckerBoardFromOindex(o+b);// Could easily be a table lookup + if ( ocb &cbmask ) { + buffer[bo]=compress(rhs._odata[so+o+b]); + bo++; + } + + } + o +=rhs._grid->_slice_stride[dimension]; + } + } +} + +/////////////////////////////////////////////////////////////////// +// Gather for when there *is* need to SIMD split with compression +/////////////////////////////////////////////////////////////////// +template void + Gather_plane_extract(Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask,compressor &compress) +{ + int rd = rhs._grid->_rdimensions[dimension]; + + if ( !rhs._grid->CheckerBoarded(dimension) ) { + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + + // Simple block stride gather of SIMD objects +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + cobj temp; + temp=compress(rhs._odata[so+o+b]); + extract(temp,pointers); + } + o +=rhs._grid->_slice_stride[dimension]; + } + + } else { + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int ocb=1<CheckerBoardFromOindex(o+b); + if ( ocb & cbmask ) { + cobj temp; + temp =compress(rhs._odata[so+o+b]); + extract(temp,pointers); + } + + } + o +=rhs._grid->_slice_stride[dimension]; + } + } +} + + class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal fill in. public: @@ -86,8 +181,8 @@ namespace Grid { // Could allow a functional munging of the halo to another type during the comms. // this could implement the 16bit/32bit/64bit compression. - template void HaloExchange(Lattice &source, - std::vector > &u_comm_buf) + template void + HaloExchange(Lattice &source,std::vector > &u_comm_buf,compressor &compress) { // conformable(source._grid,_grid); assert(source._grid==_grid); @@ -95,12 +190,10 @@ namespace Grid { int u_comm_offset=0; // Gather all comms buffers - typedef typename vobj::vector_type vector_type; - typedef typename vobj::scalar_type scalar_type; - for(int point = 0 ; point < _npoints; point++) { - printf("Point %d \n",point);fflush(stdout); + compress.Point(point); + int dimension = _directions[point]; int displacement = _distances[point]; @@ -126,33 +219,30 @@ namespace Grid { sshift[1] = _grid->CheckerBoardShift(_checkerboard,dimension,shift,1); if ( sshift[0] == sshift[1] ) { if (splice_dim) { - printf("splice 0x3 \n");fflush(stdout); - GatherStartCommsSimd(source,dimension,shift,0x3,u_comm_buf,u_comm_offset); + GatherStartCommsSimd(source,dimension,shift,0x3,u_comm_buf,u_comm_offset,compress); } else { - printf("NO splice 0x3 \n");fflush(stdout); - GatherStartComms(source,dimension,shift,0x3,u_comm_buf,u_comm_offset); + GatherStartComms(source,dimension,shift,0x3,u_comm_buf,u_comm_offset,compress); } } else { if(splice_dim){ - printf("splice 0x1,2 \n");fflush(stdout); - GatherStartCommsSimd(source,dimension,shift,0x1,u_comm_buf,u_comm_offset);// if checkerboard is unfavourable take two passes - GatherStartCommsSimd(source,dimension,shift,0x2,u_comm_buf,u_comm_offset);// both with block stride loop iteration + GatherStartCommsSimd(source,dimension,shift,0x1,u_comm_buf,u_comm_offset,compress);// if checkerboard is unfavourable take two passes + GatherStartCommsSimd(source,dimension,shift,0x2,u_comm_buf,u_comm_offset,compress);// both with block stride loop iteration } else { - printf("NO splice 0x1,2 \n");fflush(stdout); - GatherStartComms(source,dimension,shift,0x1,u_comm_buf,u_comm_offset); - GatherStartComms(source,dimension,shift,0x2,u_comm_buf,u_comm_offset); + GatherStartComms(source,dimension,shift,0x1,u_comm_buf,u_comm_offset,compress); + GatherStartComms(source,dimension,shift,0x2,u_comm_buf,u_comm_offset,compress); } } } } } - template void GatherStartComms(Lattice &rhs,int dimension,int shift,int cbmask, - std::vector > &u_comm_buf, - int &u_comm_offset) + template + void GatherStartComms(Lattice &rhs,int dimension,int shift,int cbmask, + std::vector > &u_comm_buf, + int &u_comm_offset,compressor & compress) { - typedef typename vobj::vector_type vector_type; - typedef typename vobj::scalar_type scalar_type; + typedef typename cobj::vector_type vector_type; + typedef typename cobj::scalar_type scalar_type; GridBase *grid=_grid; assert(rhs._grid==_grid); @@ -169,31 +259,26 @@ namespace Grid { int buffer_size = _grid->_slice_nblock[dimension]*_grid->_slice_block[dimension]; - std::vector > send_buf(buffer_size); // hmm... - std::vector > recv_buf(buffer_size); + std::vector > send_buf(buffer_size); // hmm... + std::vector > recv_buf(buffer_size); int cb= (cbmask==0x2)? 1 : 0; int sshift= _grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,cb); for(int x=0;x= rd ); int sx = (x+sshift)%rd; int comm_proc = (x+sshift)/rd; if (offnode) { - printf("GatherStartComms offnode x %d\n",x);fflush(stdout); int words = send_buf.size(); if (cbmask != 0x3) words=words>>1; - int bytes = words * sizeof(vobj); + int bytes = words * sizeof(cobj); - printf("Gather_plane_simple dimension %d sx %d cbmask %d\n",dimension,sx,cbmask);fflush(stdout); - Gather_plane_simple (rhs,send_buf,dimension,sx,cbmask); - - printf("GatherStartComms gathered offnode x %d\n",x);fflush(stdout); + Gather_plane_simple (rhs,send_buf,dimension,sx,cbmask,compress); int rank = _grid->_processor; int recv_from_rank; @@ -219,14 +304,14 @@ namespace Grid { } - template + template void GatherStartCommsSimd(Lattice &rhs,int dimension,int shift,int cbmask, - std::vector > &u_comm_buf, - int &u_comm_offset) + std::vector > &u_comm_buf, + int &u_comm_offset,compressor &compress) { const int Nsimd = _grid->Nsimd(); - typedef typename vobj::vector_type vector_type; - typedef typename vobj::scalar_type scalar_type; + typedef typename cobj::vector_type vector_type; + typedef typename cobj::scalar_type scalar_type; int fd = _grid->_fdimensions[dimension]; int rd = _grid->_rdimensions[dimension]; @@ -245,7 +330,7 @@ namespace Grid { // Simd direction uses an extract/merge pair /////////////////////////////////////////////// int buffer_size = _grid->_slice_nblock[dimension]*_grid->_slice_block[dimension]; - int words = sizeof(vobj)/sizeof(vector_type); + int words = sizeof(cobj)/sizeof(vector_type); /* FIXME ALTERNATE BUFFER DETERMINATION */ std::vector > send_buf_extract(Nsimd,std::vector(buffer_size*words) ); @@ -285,7 +370,7 @@ namespace Grid { for(int i=0;i(rhs,pointers,dimension,sx,cbmask,compress); for(int i=0;i - inline auto operator + (const Lattice &lhs,const Lattice &rhs)-> Lattice + inline auto operator + (const Lattice &lhs,const Lattice &rhs)-> Lattice { //NB mult performs conformable check. Do not reapply here for performance. - Lattice ret(rhs._grid); + Lattice ret(rhs._grid); add(ret,lhs,rhs); return ret; } template - inline auto operator - (const Lattice &lhs,const Lattice &rhs)-> Lattice + inline auto operator - (const Lattice &lhs,const Lattice &rhs)-> Lattice { //NB mult performs conformable check. Do not reapply here for performance. - Lattice ret(rhs._grid); + Lattice ret(rhs._grid); sub(ret,lhs,rhs); return ret; } @@ -107,9 +107,9 @@ namespace Grid { return ret; } template - inline auto operator + (const left &lhs,const Lattice &rhs) -> Lattice + inline auto operator + (const left &lhs,const Lattice &rhs) -> Lattice { - Lattice ret(rhs._grid); + Lattice ret(rhs._grid); #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ ret._odata[ss]=lhs+rhs._odata[ss]; @@ -117,9 +117,9 @@ namespace Grid { return ret; } template - inline auto operator - (const left &lhs,const Lattice &rhs) -> Lattice + inline auto operator - (const left &lhs,const Lattice &rhs) -> Lattice { - Lattice ret(rhs._grid); + Lattice ret(rhs._grid); #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ ret._odata[ss]=lhs-rhs._odata[ss]; @@ -137,9 +137,9 @@ namespace Grid { return ret; } template - inline auto operator + (const Lattice &lhs,const right &rhs) -> Lattice + inline auto operator + (const Lattice &lhs,const right &rhs) -> Lattice { - Lattice ret(lhs._grid); + Lattice ret(lhs._grid); #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ ret._odata[ss]=lhs._odata[ss]+rhs; @@ -147,9 +147,9 @@ namespace Grid { return ret; } template - inline auto operator - (const Lattice &lhs,const right &rhs) -> Lattice + inline auto operator - (const Lattice &lhs,const right &rhs) -> Lattice { - Lattice ret(lhs._grid); + Lattice ret(lhs._grid); #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ ret._odata[ss]=lhs._odata[ss]-rhs; diff --git a/lib/lattice/Grid_lattice_reduction.h b/lib/lattice/Grid_lattice_reduction.h index bec436f6..4491e8ec 100644 --- a/lib/lattice/Grid_lattice_reduction.h +++ b/lib/lattice/Grid_lattice_reduction.h @@ -14,7 +14,7 @@ namespace Grid { typedef typename vobj::scalar_type scalar; typedef typename vobj::vector_type vector; - decltype(innerProduct(arg._odata[0],arg._odata[0])) vnrm=zero; + decltype(innerProduct(arg._odata[0],arg._odata[0])) vnrm; scalar nrm; //FIXME make this loop parallelisable vnrm=zero; @@ -33,10 +33,11 @@ namespace Grid { //->decltype(innerProduct(left._odata[0],right._odata[0])) { typedef typename vobj::scalar_type scalar; - decltype(innerProduct(left._odata[0],right._odata[0])) vnrm=zero; + decltype(innerProduct(left._odata[0],right._odata[0])) vnrm; scalar nrm; //FIXME make this loop parallelisable + vnrm=zero; for(int ss=0;ssoSites(); ss++){ vnrm = vnrm + innerProduct(left._odata[ss],right._odata[ss]); } @@ -94,8 +95,10 @@ template inline void sliceSum(const Lattice &Data,std::vector< int ld=grid->_ldimensions[orthogdim]; int rd=grid->_rdimensions[orthogdim]; + sobj szero; szero=zero; + std::vector > lvSum(rd); // will locally sum vectors first - std::vector lsSum(ld,sobj(zero)); // sum across these down to scalars + std::vector lsSum(ld,szero); // sum across these down to scalars std::vector extracted(Nsimd); // splitting the SIMD result.resize(fd); // And then global sum to return the same vector to every node for IO to file diff --git a/lib/lattice/Grid_lattice_rng.h b/lib/lattice/Grid_lattice_rng.h index 85d8c471..0842c80c 100644 --- a/lib/lattice/Grid_lattice_rng.h +++ b/lib/lattice/Grid_lattice_rng.h @@ -26,6 +26,8 @@ namespace Grid { } }; + + class GridRNGbase { public: @@ -62,6 +64,21 @@ namespace Grid { } + // real scalars are one component + template void fillScalar(scalar &s,distribution &dist) + { + s=dist(_generators[0]); + } + template void fillScalar(ComplexF &s,distribution &dist) + { + s=ComplexF(dist(_generators[0]),dist(_generators[0])); + } + template void fillScalar(ComplexD &s,distribution &dist) + { + s=ComplexD(dist(_generators[0]),dist(_generators[0])); + } + + template inline void fill(sobj &l,distribution &dist){ typedef typename sobj::scalar_type scalar_type; @@ -71,13 +88,60 @@ namespace Grid { scalar_type *buf = (scalar_type *) & l; for(int idx=0;idx inline void fill(ComplexF &l,distribution &dist){ + fillScalar(l,dist); + CartesianCommunicator::BroadcastWorld(0,(void *)&l,sizeof(l)); + } + template inline void fill(ComplexD &l,distribution &dist){ + fillScalar(l,dist); + CartesianCommunicator::BroadcastWorld(0,(void *)&l,sizeof(l)); + } + template inline void fill(RealF &l,distribution &dist){ + fillScalar(l,dist); + CartesianCommunicator::BroadcastWorld(0,(void *)&l,sizeof(l)); + } + template inline void fill(RealD &l,distribution &dist){ + fillScalar(l,dist); + CartesianCommunicator::BroadcastWorld(0,(void *)&l,sizeof(l)); + } + // vector fill + template inline void fill(vComplexF &l,distribution &dist){ + RealF *pointer=(RealF *)&l; + for(int i=0;i<2*vComplexF::Nsimd();i++){ + fillScalar(pointer[i],dist); + } + CartesianCommunicator::BroadcastWorld(0,(void *)&l,sizeof(l)); + } + template inline void fill(vComplexD &l,distribution &dist){ + RealD *pointer=(RealD *)&l; + for(int i=0;i<2*vComplexD::Nsimd();i++){ + fillScalar(pointer[i],dist); + } + CartesianCommunicator::BroadcastWorld(0,(void *)&l,sizeof(l)); + } + template inline void fill(vRealF &l,distribution &dist){ + RealF *pointer=(RealF *)&l; + for(int i=0;i inline void fill(vRealD &l,distribution &dist){ + RealD *pointer=(RealD *)&l; + for(int i=0;i inline void random(GridParallelRNG &rng,Lattice &l){ rng.fill(l,rng._uniform); } diff --git a/lib/math/Grid_math_arith_scalar.h b/lib/math/Grid_math_arith_scalar.h index 2adb2836..69c9a169 100644 --- a/lib/math/Grid_math_arith_scalar.h +++ b/lib/math/Grid_math_arith_scalar.h @@ -11,21 +11,21 @@ namespace Grid { // multiplication by fundamental scalar type template inline iScalar operator * (const iScalar& lhs,const typename iScalar::scalar_type rhs) { - typename iScalar::tensor_reduced srhs(rhs); + typename iScalar::tensor_reduced srhs; srhs=rhs; return lhs*srhs; } template inline iScalar operator * (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs*lhs; } template inline iVector operator * (const iVector& lhs,const typename iScalar::scalar_type rhs) { - typename iVector::tensor_reduced srhs(rhs); + typename iVector::tensor_reduced srhs; srhs=rhs; return lhs*srhs; } template inline iVector operator * (const typename iScalar::scalar_type lhs,const iVector& rhs) { return rhs*lhs; } template inline iMatrix operator * (const iMatrix& lhs,const typename iScalar::scalar_type &rhs) { - typename iMatrix::tensor_reduced srhs(rhs); + typename iMatrix::tensor_reduced srhs; srhs=rhs; return lhs*srhs; } template inline iMatrix operator * (const typename iScalar::scalar_type & lhs,const iMatrix& rhs) { return rhs*lhs; } @@ -35,24 +35,24 @@ template inline iMatrix operator * (const typename iScalar inline iScalar operator * (const iScalar& lhs,double rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t; t=rhs; + typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } template inline iScalar operator * (double lhs,const iScalar& rhs) { return rhs*lhs; } template inline iVector operator * (const iVector& lhs,double rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t;t=rhs; + typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } template inline iVector operator * (double lhs,const iVector& rhs) { return rhs*lhs; } template inline iMatrix operator * (const iMatrix& lhs,double rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t;t=rhs; + typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } template inline iMatrix operator * (double lhs,const iMatrix& rhs) { return rhs*lhs; } @@ -62,24 +62,26 @@ template inline iMatrix operator * (double lhs,const iMatrix //////////////////////////////////////////////////////////////////// template inline iScalar operator * (const iScalar& lhs,ComplexD rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t;t=rhs; + typename iScalar::tensor_reduced srhs;srhs=t; + + return lhs*srhs; } template inline iScalar operator * (ComplexD lhs,const iScalar& rhs) { return rhs*lhs; } template inline iVector operator * (const iVector& lhs,ComplexD rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t;t=rhs; + typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } template inline iVector operator * (ComplexD lhs,const iVector& rhs) { return rhs*lhs; } template inline iMatrix operator * (const iMatrix& lhs,ComplexD rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t;t=rhs; + typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } template inline iMatrix operator * (ComplexD lhs,const iMatrix& rhs) { return rhs*lhs; } @@ -89,24 +91,24 @@ template inline iMatrix operator * (ComplexD lhs,const iMatr //////////////////////////////////////////////////////////////////// template inline iScalar operator * (const iScalar& lhs,Integer rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t; t=rhs; + typename iScalar::tensor_reduced srhs; srhs=t; return lhs*srhs; } template inline iScalar operator * (Integer lhs,const iScalar& rhs) { return rhs*lhs; } template inline iVector operator * (const iVector& lhs,Integer rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t;t=rhs; + typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } template inline iVector operator * (Integer lhs,const iVector& rhs) { return rhs*lhs; } template inline iMatrix operator * (const iMatrix& lhs,Integer rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t;t=rhs; + typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } template inline iMatrix operator * (Integer lhs,const iMatrix& rhs) { return rhs*lhs; } @@ -118,14 +120,14 @@ template inline iMatrix operator * (Integer lhs,const iMatri /////////////////////////////////////////////////////////////////////////////////////////////// template inline iScalar operator + (const iScalar& lhs,const typename iScalar::scalar_type rhs) { - typename iScalar::tensor_reduced srhs(rhs); + typename iScalar::tensor_reduced srhs; srhs=rhs; return lhs+srhs; } template inline iScalar operator + (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs+lhs; } template inline iMatrix operator + (const iMatrix& lhs,const typename iScalar::scalar_type rhs) { - typename iMatrix::tensor_reduced srhs(rhs); + typename iMatrix::tensor_reduced srhs; srhs=rhs; return lhs+srhs; } template inline iMatrix operator + (const typename iScalar::scalar_type lhs,const iMatrix& rhs) { return rhs+lhs; } @@ -135,16 +137,16 @@ template inline iMatrix operator + (const typename iScalar inline iScalar operator + (const iScalar& lhs,double rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t; t=rhs; + typename iScalar::tensor_reduced srhs; srhs=t; return lhs+srhs; } template inline iScalar operator + (double lhs,const iScalar& rhs) { return rhs+lhs; } template inline iMatrix operator + (const iMatrix& lhs,double rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t;t=rhs; + typename iScalar::tensor_reduced srhs;srhs=t; return lhs+srhs; } template inline iMatrix operator + (double lhs,const iMatrix& rhs) { return rhs+lhs; } @@ -155,8 +157,8 @@ template inline iMatrix operator + (double lhs,const iMatrix template inline iScalar operator + (const iScalar& lhs,Integer rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t; t=rhs; + typename iScalar::tensor_reduced srhs; srhs=t; return lhs+srhs; } @@ -164,8 +166,8 @@ template inline iScalar operator + (Integer lhs,const iScalar& rh template inline iMatrix operator + (const iMatrix& lhs,Integer rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t;t=rhs; + typename iScalar::tensor_reduced srhs;srhs=t; return lhs+srhs; } template inline iMatrix operator + (Integer lhs,const iMatrix& rhs) { return rhs+lhs; } @@ -176,23 +178,23 @@ template inline iMatrix operator + (Integer lhs,const iMatri /////////////////////////////////////////////////////////////////////////////////////////////// template inline iScalar operator - (const iScalar& lhs,const typename iScalar::scalar_type rhs) { - typename iScalar::tensor_reduced srhs(rhs); + typename iScalar::tensor_reduced srhs; srhs=rhs; return lhs-srhs; } template inline iScalar operator - (const typename iScalar::scalar_type lhs,const iScalar& rhs) { - typename iScalar::tensor_reduced slhs(lhs); + typename iScalar::tensor_reduced slhs;slhs=lhs; return slhs-rhs; } template inline iMatrix operator - (const iMatrix& lhs,const typename iScalar::scalar_type rhs) { - typename iScalar::tensor_reduced srhs(rhs); + typename iScalar::tensor_reduced srhs; srhs=rhs; return lhs-srhs; } template inline iMatrix operator - (const typename iScalar::scalar_type lhs,const iMatrix& rhs) { - typename iScalar::tensor_reduced slhs(lhs); + typename iScalar::tensor_reduced slhs;slhs=lhs; return slhs-rhs; } @@ -201,27 +203,27 @@ template inline iMatrix operator - (const typename iScalar inline iScalar operator - (const iScalar& lhs,double rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t; t=rhs; + typename iScalar::tensor_reduced srhs; srhs=t; return lhs-srhs; } template inline iScalar operator - (double lhs,const iScalar& rhs) { typename iScalar::scalar_type t(lhs); - typename iScalar::tensor_reduced slhs(t); + typename iScalar::tensor_reduced slhs;slhs=t; return slhs-rhs; } template inline iMatrix operator - (const iMatrix& lhs,double rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t;t=rhs; + typename iScalar::tensor_reduced srhs;srhs=t; return lhs-srhs; } template inline iMatrix operator - (double lhs,const iMatrix& rhs) { typename iScalar::scalar_type t(lhs); - typename iScalar::tensor_reduced slhs(t); + typename iScalar::tensor_reduced slhs;slhs=t; return slhs-rhs; } @@ -230,26 +232,26 @@ template inline iMatrix operator - (double lhs,const iMatrix //////////////////////////////////////////////////////////////////// template inline iScalar operator - (const iScalar& lhs,Integer rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t; t=rhs; + typename iScalar::tensor_reduced srhs; srhs=t; return lhs-srhs; } template inline iScalar operator - (Integer lhs,const iScalar& rhs) { - typename iScalar::scalar_type t(lhs); - typename iScalar::tensor_reduced slhs(t); + typename iScalar::scalar_type t;t=lhs; + typename iScalar::tensor_reduced slhs;slhs=t; return slhs-rhs; } template inline iMatrix operator - (const iMatrix& lhs,Integer rhs) { - typename iScalar::scalar_type t(rhs); - typename iScalar::tensor_reduced srhs(t); + typename iScalar::scalar_type t;t=rhs; + typename iScalar::tensor_reduced srhs;srhs=t; return lhs-srhs; } template inline iMatrix operator - (Integer lhs,const iMatrix& rhs) { - typename iScalar::scalar_type t(lhs); - typename iScalar::tensor_reduced slhs(t); + typename iScalar::scalar_type t;t=lhs; + typename iScalar::tensor_reduced slhs;slhs=t; return slhs-rhs; } diff --git a/lib/math/Grid_math_inner.h b/lib/math/Grid_math_inner.h index 71b5e3b8..1e44032c 100644 --- a/lib/math/Grid_math_inner.h +++ b/lib/math/Grid_math_inner.h @@ -17,7 +17,8 @@ namespace Grid { auto innerProduct (const iVector& lhs,const iVector& rhs) -> iScalar { typedef decltype(innerProduct(lhs._internal[0],rhs._internal[0])) ret_t; - iScalar ret=zero; + iScalar ret; + ret=zero; for(int c1=0;c1& lhs,const iMatrix& rhs) -> iScalar { typedef decltype(innerProduct(lhs._internal[0][0],rhs._internal[0][0])) ret_t; - iScalar ret=zero; + iScalar ret; iScalar tmp; + ret=zero; for(int c1=0;c1 == true" +// because then the standard C++ valarray container eliminates fill overhead on new allocation and +// non-move copying. +// +// However note that doing this eliminates some syntactical sugar such as +// calling the constructor explicitly or implicitly +// +#define TENSOR_IS_POD + template class iScalar { public: @@ -25,16 +35,22 @@ public: // Scalar no action // template using tensor_reduce_level = typename iScalar::tensor_reduce_level >; - iScalar(){}; - - iScalar(scalar_type s) : _internal(s) {};// recurse down and hit the constructor for vector_type - - iScalar(const Zero &z){ *this = zero; }; +#ifndef TENSOR_IS_POD + iScalar(){;}; + iScalar(scalar_type s) : _internal(s) {};// recurse down and hit the constructor for vector_type + iScalar(const Zero &z){ *this = zero; }; +#endif iScalar & operator= (const Zero &hero){ - zeroit(*this); - return *this; + zeroit(*this); + return *this; } + iScalar & operator= (const scalar_type s){ + _internal=s; + return *this; + } + + friend void zeroit(iScalar &that){ zeroit(that._internal); } @@ -114,8 +130,10 @@ public: enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; - iVector(const Zero &z){ *this = zero; }; - iVector() {};// Empty constructure +#ifndef TENSOR_IS_POD + iVector(const Zero &z){ *this = zero; }; + iVector() {};// Empty constructure +#endif iVector & operator= (const Zero &hero){ zeroit(*this); @@ -185,8 +203,11 @@ public: enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; +#ifndef TENSOR_IS_POD iMatrix(const Zero &z){ *this = zero; }; iMatrix() {}; +#endif + iMatrix & operator= (const Zero &hero){ zeroit(*this); return *this; diff --git a/lib/qcd/Grid_qcd.h b/lib/qcd/Grid_qcd.h index f331bd88..0bf68632 100644 --- a/lib/qcd/Grid_qcd.h +++ b/lib/qcd/Grid_qcd.h @@ -8,6 +8,7 @@ namespace QCD { static const int Ns=4; static const int Nd=4; static const int Nhs=2; // half spinor + static const int Nds=8; // double stored gauge field static const int CbRed =0; static const int CbBlack=1; @@ -28,79 +29,216 @@ namespace QCD { // // That probably makes for GridRedBlack4dCartesian grid. - template using iSinglet = iScalar > >; - template using iSpinMatrix = iScalar, Ns> >; - template using iSpinColourMatrix = iScalar, Ns> >; - template using iColourMatrix = iScalar > > ; - template using iLorentzColourMatrix = iVector >, Nd > ; + // s,sp,c,spc,lc + template using iSinglet = iScalar > >; + template using iSpinMatrix = iScalar, Ns> >; + template using iColourMatrix = iScalar > > ; + template using iSpinColourMatrix = iScalar, Ns> >; + template using iLorentzColourMatrix = iVector >, Nd > ; + template using iDoubleStoredColourMatrix = iVector >, Nds > ; + template using iSpinVector = iScalar, Ns> >; + template using iColourVector = iScalar > >; + template using iSpinColourVector = iScalar, Ns> >; + template using iHalfSpinVector = iScalar, Nhs> >; + template using iHalfSpinColourVector = iScalar, Nhs> >; + // Spin matrix + typedef iSpinMatrix SpinMatrix; + typedef iSpinMatrix SpinMatrixF; + typedef iSpinMatrix SpinMatrixD; - template using iSpinVector = iScalar, Ns> >; - template using iColourVector = iScalar > >; - template using iSpinColourVector = iScalar, Ns> >; + typedef iSpinMatrix vSpinMatrix; + typedef iSpinMatrix vSpinMatrixF; + typedef iSpinMatrix vSpinMatrixD; - template using iHalfSpinVector = iScalar, Nhs> >; - template using iHalfSpinColourVector = iScalar, Nhs> >; + // Colour Matrix + typedef iColourMatrix ColourMatrix; + typedef iColourMatrix ColourMatrixF; + typedef iColourMatrix ColourMatrixD; - typedef iSpinMatrix SpinMatrix; - typedef iColourMatrix ColourMatrix; - typedef iSpinColourMatrix SpinColourMatrix; - typedef iLorentzColourMatrix LorentzColourMatrix; + typedef iColourMatrix vColourMatrix; + typedef iColourMatrix vColourMatrixF; + typedef iColourMatrix vColourMatrixD; + + // SpinColour matrix + typedef iSpinColourMatrix SpinColourMatrix; + typedef iSpinColourMatrix SpinColourMatrixF; + typedef iSpinColourMatrix SpinColourMatrixD; + + typedef iSpinColourMatrix vSpinColourMatrix; + typedef iSpinColourMatrix vSpinColourMatrixF; + typedef iSpinColourMatrix vSpinColourMatrixD; + + // LorentzColour + typedef iLorentzColourMatrix LorentzColourMatrix; typedef iLorentzColourMatrix LorentzColourMatrixF; typedef iLorentzColourMatrix LorentzColourMatrixD; - typedef iSpinVector SpinVector; - typedef iColourVector ColourVector; - typedef iSpinColourVector SpinColourVector; - typedef iHalfSpinVector HalfSpinVector; - typedef iHalfSpinColourVector HalfSpinColourVector; - - - typedef iSpinMatrix vSpinMatrix; - typedef iColourMatrix vColourMatrix; - typedef iSpinColourMatrix vSpinColourMatrix; typedef iLorentzColourMatrix vLorentzColourMatrix; - + typedef iLorentzColourMatrix vLorentzColourMatrixF; + typedef iLorentzColourMatrix vLorentzColourMatrixD; + + // DoubleStored gauge field + typedef iDoubleStoredColourMatrix DoubleStoredColourMatrix; + typedef iDoubleStoredColourMatrix DoubleStoredColourMatrixF; + typedef iDoubleStoredColourMatrix DoubleStoredColourMatrixD; + + typedef iDoubleStoredColourMatrix vDoubleStoredColourMatrix; + typedef iDoubleStoredColourMatrix vDoubleStoredColourMatrixF; + typedef iDoubleStoredColourMatrix vDoubleStoredColourMatrixD; + + // Spin vector + typedef iSpinVector SpinVector; + typedef iSpinVector SpinVectorF; + typedef iSpinVector SpinVectorD; + typedef iSpinVector vSpinVector; + typedef iSpinVector vSpinVectorF; + typedef iSpinVector vSpinVectorD; + + // Colour vector + typedef iColourVector ColourVector; + typedef iColourVector ColourVectorF; + typedef iColourVector ColourVectorD; + typedef iColourVector vColourVector; + typedef iColourVector vColourVectorF; + typedef iColourVector vColourVectorD; + + // SpinColourVector + typedef iSpinColourVector SpinColourVector; + typedef iSpinColourVector SpinColourVectorF; + typedef iSpinColourVector SpinColourVectorD; + typedef iSpinColourVector vSpinColourVector; + typedef iSpinColourVector vSpinColourVectorF; + typedef iSpinColourVector vSpinColourVectorD; + + // HalfSpin vector + typedef iHalfSpinVector HalfSpinVector; + typedef iHalfSpinVector HalfSpinVectorF; + typedef iHalfSpinVector HalfSpinVectorD; + typedef iHalfSpinVector vHalfSpinVector; - typedef iHalfSpinColourVector vHalfSpinColourVector; + typedef iHalfSpinVector vHalfSpinVectorF; + typedef iHalfSpinVector vHalfSpinVectorD; + + // HalfSpinColour vector + typedef iHalfSpinColourVector HalfSpinColourVector; + typedef iHalfSpinColourVector HalfSpinColourVectorF; + typedef iHalfSpinColourVector HalfSpinColourVectorD; + typedef iHalfSpinColourVector vHalfSpinColourVector; + typedef iHalfSpinColourVector vHalfSpinColourVectorF; + typedef iHalfSpinColourVector vHalfSpinColourVectorD; + + // singlets typedef iSinglet TComplex; // FIXME This is painful. Tensor singlet complex type. - typedef iSinglet vTComplex; // what if we don't know the tensor structure + typedef iSinglet TComplexF; // FIXME This is painful. Tensor singlet complex type. + typedef iSinglet TComplexD; // FIXME This is painful. Tensor singlet complex type. + + typedef iSinglet vTComplex ; // what if we don't know the tensor structure + typedef iSinglet vTComplexF; // what if we don't know the tensor structure + typedef iSinglet vTComplexD; // what if we don't know the tensor structure + typedef iSinglet TReal; // Shouldn't need these; can I make it work without? + typedef iSinglet TRealF; // Shouldn't need these; can I make it work without? + typedef iSinglet TRealD; // Shouldn't need these; can I make it work without? + typedef iSinglet vTReal; - typedef iSinglet vTInteger; + typedef iSinglet vTRealF; + typedef iSinglet vTRealD; + + typedef iSinglet vTInteger; typedef iSinglet TInteger; - typedef Lattice LatticeReal; - typedef Lattice LatticeComplex; - typedef Lattice LatticeInteger; // Predicates for "where" - - typedef Lattice LatticeColourMatrix; - typedef Lattice LatticeSpinMatrix; - typedef Lattice LatticeSpinColourMatrix; - typedef Lattice LatticeSpinVector; - typedef Lattice LatticeColourVector; - typedef Lattice LatticeSpinColourVector; - typedef Lattice LatticeHalfSpinVector; - typedef Lattice LatticeHalfSpinColourVector; + // Lattices of these + typedef Lattice LatticeColourMatrix; + typedef Lattice LatticeColourMatrixF; + typedef Lattice LatticeColourMatrixD; + + typedef Lattice LatticeSpinMatrix; + typedef Lattice LatticeSpinMatrixF; + typedef Lattice LatticeSpinMatrixD; + + typedef Lattice LatticeSpinColourMatrix; + typedef Lattice LatticeSpinColourMatrixF; + typedef Lattice LatticeSpinColourMatrixD; + + + typedef Lattice LatticeLorentzColourMatrix; + typedef Lattice LatticeLorentzColourMatrixF; + typedef Lattice LatticeLorentzColourMatrixD; + + // DoubleStored gauge field + typedef Lattice LatticeDoubleStoredColourMatrix; + typedef Lattice LatticeDoubleStoredColourMatrixF; + typedef Lattice LatticeDoubleStoredColourMatrixD; + + typedef Lattice LatticeSpinVector; + typedef Lattice LatticeSpinVectorF; + typedef Lattice LatticeSpinVectorD; + + typedef Lattice LatticeColourVector; + typedef Lattice LatticeColourVectorF; + typedef Lattice LatticeColourVectorD; + + typedef Lattice LatticeSpinColourVector; + typedef Lattice LatticeSpinColourVectorF; + typedef Lattice LatticeSpinColourVectorD; + + typedef Lattice LatticeHalfSpinVector; + typedef Lattice LatticeHalfSpinVectorF; + typedef Lattice LatticeHalfSpinVectorD; + + typedef Lattice LatticeHalfSpinColourVector; + typedef Lattice LatticeHalfSpinColourVectorF; + typedef Lattice LatticeHalfSpinColourVectorD; + + typedef Lattice LatticeReal; + typedef Lattice LatticeRealF; + typedef Lattice LatticeRealD; + + typedef Lattice LatticeComplex; + typedef Lattice LatticeComplexF; + typedef Lattice LatticeComplexD; + + typedef Lattice LatticeInteger; // Predicates for "where" + /////////////////////////////////////////// // Physical names for things /////////////////////////////////////////// - typedef Lattice LatticeHalfFermion; - typedef Lattice LatticeFermion; + typedef LatticeHalfSpinColourVector LatticeHalfFermion; + typedef LatticeHalfSpinColourVectorF LatticeHalfFermionF; + typedef LatticeHalfSpinColourVectorF LatticeHalfFermionD; - typedef Lattice LatticePropagator; - typedef Lattice LatticeGaugeField; + typedef LatticeSpinColourVector LatticeFermion; + typedef LatticeSpinColourVectorF LatticeFermionF; + typedef LatticeSpinColourVectorD LatticeFermionD; + + typedef LatticeSpinColourMatrix LatticePropagator; + typedef LatticeSpinColourMatrixF LatticePropagatorF; + typedef LatticeSpinColourMatrixD LatticePropagatorD; + + typedef LatticeLorentzColourMatrix LatticeGaugeField; + typedef LatticeLorentzColourMatrixF LatticeGaugeFieldF; + typedef LatticeLorentzColourMatrixD LatticeGaugeFieldD; + + typedef LatticeDoubleStoredColourMatrix LatticeDoubledGaugeField; + typedef LatticeDoubleStoredColourMatrixF LatticeDoubledGaugeFieldF; + typedef LatticeDoubleStoredColourMatrixD LatticeDoubledGaugeFieldD; // Uhgg... typing this hurt ;) // (my keyboard got burning hot when I typed this, must be the anti-Fermion) - typedef Lattice LatticeStaggeredFermion; - typedef Lattice LatticeStaggeredPropagator; + typedef Lattice LatticeStaggeredFermion; + typedef Lattice LatticeStaggeredFermionF; + typedef Lattice LatticeStaggeredFermionD; + + typedef Lattice LatticeStaggeredPropagator; + typedef Lattice LatticeStaggeredPropagatorF; + typedef Lattice LatticeStaggeredPropagatorD; ////////////////////////////////////////////////////////////////////////////// // Peek and Poke named after physics attributes @@ -157,11 +295,14 @@ namespace QCD { return peekIndex(rhs,i,j); } + // FIXME transpose Colour, transpose Spin, traceColour traceSpin + } //namespace QCD } // Grid #include #include //#include +#include #endif diff --git a/lib/qcd/Grid_qcd_dirac.h b/lib/qcd/Grid_qcd_dirac.h index 03dc9cc5..2623e683 100644 --- a/lib/qcd/Grid_qcd_dirac.h +++ b/lib/qcd/Grid_qcd_dirac.h @@ -17,8 +17,14 @@ namespace QCD { GammaZ, GammaT, Gamma5, - // GammaXGamma5, - // GammaYGamma5, + MinusIdentity, + MinusGammaX, + MinusGammaY, + MinusGammaZ, + MinusGammaT, + MinusGamma5 + // GammaXGamma5, // Rest are composite (willing to take hit for two calls sequentially) + // GammaYGamma5, // as they are less commonly used. // GammaZGamma5, // GammaTGamma5, // SigmaXY, @@ -27,12 +33,6 @@ namespace QCD { // SigmaXT, // SigmaYT, // SigmaZT, - MinusIdentity, - MinusGammaX, - MinusGammaY, - MinusGammaZ, - MinusGammaT, - MinusGamma5 // MinusGammaXGamma5, easiest to form by composition // MinusGammaYGamma5, as performance is not critical for these // MinusGammaZGamma5, @@ -54,7 +54,6 @@ namespace QCD { }; - /* Gx * 0 0 0 i * 0 0 i 0 diff --git a/lib/qcd/Grid_qcd_wilson_dop.cc b/lib/qcd/Grid_qcd_wilson_dop.cc index 73b19c12..aba21417 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.cc +++ b/lib/qcd/Grid_qcd_wilson_dop.cc @@ -1,157 +1,220 @@ -#ifnfdef GRID_QCD_WILSON_DOP_H -#define GRID_QCD_WILSON_DOP_H #include namespace Grid { namespace QCD { - const std::vector WilsonMatrix::directions ({0,1,2,3, 0, 1, 2, 3,0}); const std::vector WilsonMatrix::displacements({1,1,1,1,-1,-1,-1,-1,0}); // Should be in header? -static const int WilsonMatrix::Xp = 0; -static const int WilsonMatrix::Yp = 1; -static const int WilsonMatrix::Zp = 2; -static const int WilsonMatrix::Tp = 3; -static const int WilsonMatrix::Xm = 4; -static const int WilsonMatrix::Ym = 5; -static const int WilsonMatrix::Zm = 6; -static const int WilsonMatrix::Tm = 7; -static const int WilsonMatrix::X0 = 8; -static const int WilsonMatrix::npoint=9; +const int WilsonMatrix::Xp = 0; +const int WilsonMatrix::Yp = 1; +const int WilsonMatrix::Zp = 2; +const int WilsonMatrix::Tp = 3; +const int WilsonMatrix::Xm = 4; +const int WilsonMatrix::Ym = 5; +const int WilsonMatrix::Zm = 6; +const int WilsonMatrix::Tm = 7; + //const int WilsonMatrix::X0 = 8; + class WilsonCompressor { + public: + int mu; + + void Point(int p) { mu=p;}; + vHalfSpinColourVector operator () (vSpinColourVector &in) + { + vHalfSpinColourVector ret; + switch(mu) { + case WilsonMatrix::Xp: + spProjXp(ret,in); + break; + case WilsonMatrix::Yp: + spProjYp(ret,in); + break; + case WilsonMatrix::Zp: + spProjZp(ret,in); + break; + case WilsonMatrix::Tp: + spProjTp(ret,in); + break; + case WilsonMatrix::Xm: + spProjXm(ret,in); + break; + case WilsonMatrix::Ym: + spProjYm(ret,in); + break; + case WilsonMatrix::Zm: + spProjZm(ret,in); + break; + case WilsonMatrix::Tm: + spProjTm(ret,in); + break; + default: + assert(0); + break; + } + return ret; + } + }; -WilsonMatrix::WilsonMatrix(LatticeGaugeField &_Umu,int _mass) - : Stencil((&Umu._grid,npoint,0,directions,displacements), + WilsonMatrix::WilsonMatrix(LatticeGaugeField &_Umu,double _mass) + : Stencil(Umu._grid,npoint,0,directions,displacements), mass(_mass), - Umu(_Umu) + Umu(_Umu._grid) { // Allocate the required comms buffer grid = _Umu._grid; comm_buf.resize(Stencil._unified_buffer_size); + DoubleStore(Umu,_Umu); } + +void WilsonMatrix::DoubleStore(LatticeDoubledGaugeField &Uds,const LatticeGaugeField &Umu) +{ + LatticeColourMatrix U(grid); + + for(int mu=0;mu(Umu,mu); + pokeIndex(Uds,U,mu); + U = adj(Cshift(U,mu,-1)); + pokeIndex(Uds,U,mu+4); + } +} + void WilsonMatrix::multiply(const LatticeFermion &in, LatticeFermion &out) { - + Dhop(in,out); + return; } + void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) { - Stencil.HaloExchange(in,comm_buf); + // Stencil.HaloExchange(in,comm_buf); - for(int ss=0;ss<_grid->oSites();ss++){ + for(int ss=0;ssoSites();ss++){ int offset,local; vSpinColourVector result; - vHalfSpinColourVector UChi; - + vHalfSpinColourVector chi; + vHalfSpinColourVector Uchi; + vHalfSpinColourVector *chi_p; // Xp offset = Stencil._offsets [Xp][ss]; local = Stencil._is_local[Xp][ss]; - if ( local ) { - Uchi = U[]*spProjXp(in._odata[offset]); - } else { - Uchi = U[]*comm_buf._odata[offset] - } - result = ReconXp(Uchi); + chi_p = &comm_buf[offset]; + if ( local ) { + spProjXp(chi,in._odata[offset]); + chi_p = χ + } + mult(&(Uchi()),&(Umu._odata[ss](Xp)),&(*chi_p)()); + spReconXp(result,Uchi); + +#if 0 // Yp offset = Stencil._offsets [Yp][ss]; local = Stencil._is_local[Yp][ss]; + chi_p = &comm_buf[offset]; if ( local ) { - Uchi = U[]*spProjYp(in._odata[offset]); - } else { - Uchi = U[]*comm_buf._odata[offset] - } - result+= ReconYp(Uchi); + spProjYp(chi,in._odata[offset]); + chi_p = χ + } + mult(&(Uchi()),&(Umu._odata[ss](Yp)),&(*chi_p)()); + accumReconYp(result,Uchi); // Zp offset = Stencil._offsets [Zp][ss]; local = Stencil._is_local[Zp][ss]; + chi_p = &comm_buf[offset]; if ( local ) { - Uchi = U[]*spProjZp(in._odata[offset]); - } else { - Uchi = U[]*comm_buf._odata[offset] - } - result+= ReconZp(Uchi); + spProjZp(chi,in._odata[offset]); + chi_p = χ + } + mult(&(Uchi()),&(Umu._odata[ss](Zp)),&(*chi_p)() ); + accumReconZp(result,Uchi); // Tp offset = Stencil._offsets [Tp][ss]; local = Stencil._is_local[Tp][ss]; + chi_p = &comm_buf[offset]; if ( local ) { - Uchi = U[]*spProjTp(in._odata[offset]); - } else { - Uchi = U[]*comm_buf._odata[offset] - } - result+= ReconTp(Uchi); + spProjTp(chi,in._odata[offset]); + chi_p = χ + } + mult(&(Uchi()),&(Umu._odata[ss](Tp)),&(*chi_p)()); + accumReconTp(result,Uchi); // Xm offset = Stencil._offsets [Xm][ss]; local = Stencil._is_local[Xm][ss]; + chi_p = &comm_buf[offset]; if ( local ) { - Uchi = U[]*spProjXm(in._odata[offset]); - } else { - Uchi = U[]*comm_buf._odata[offset] - } - result+= ReconXm(Uchi); + spProjXm(chi,in._odata[offset]); + chi_p = χ + } + mult(&(Uchi()),&(Umu._odata[ss](Xm)),&(*chi_p)()); + accumReconXm(result,Uchi); // Ym offset = Stencil._offsets [Ym][ss]; local = Stencil._is_local[Ym][ss]; + chi_p = &comm_buf[offset]; if ( local ) { - Uchi = U[]*spProjYm(in._odata[offset]); - } else { - Uchi = U[]*comm_buf._odata[offset] - } - result+= ReconYm(Uchi); + spProjYm(chi,in._odata[offset]); + chi_p = χ + } + mult(&(Uchi()),&(Umu._odata[ss](Ym)),&(*chi_p)()); + accumReconYm(result,Uchi); // Zm offset = Stencil._offsets [Zm][ss]; local = Stencil._is_local[Zm][ss]; + chi_p = &comm_buf[offset]; if ( local ) { - Uchi = U[]*spProjZm(in._odata[offset]); - } else { - Uchi = U[]*comm_buf._odata[offset] - } - result+= ReconZm(Uchi); + spProjZm(chi,in._odata[offset]); + chi_p = χ + } + mult(&(Uchi()),&(Umu._odata[ss](Zm)),&(*chi_p)()); + accumReconZm(result,Uchi); // Tm offset = Stencil._offsets [Tm][ss]; local = Stencil._is_local[Tm][ss]; + chi_p = &comm_buf[offset]; if ( local ) { - Uchi = U[]*spProjTm(in._odata[offset]); - } else { - Uchi = U[]*comm_buf._odata[offset] - } - result+= ReconTm(Uchi); - + spProjTm(chi,in._odata[offset]); + chi_p = χ + } + mult(&(Uchi()),&(Umu._odata[ss](Tm)),&(*chi_p)()); + accumReconTm(result,Uchi); +#endif out._odata[ss] = result; } } void WilsonMatrix::Dw(const LatticeFermion &in, LatticeFermion &out) { - + return; } void WilsonMatrix::MpcDag (const LatticeFermion &in, LatticeFermion &out) { - + return; } void WilsonMatrix::Mpc (const LatticeFermion &in, LatticeFermion &out) { - + return; } void WilsonMatrix::MpcDagMpc(const LatticeFermion &in, LatticeFermion &out) { - + return; } void WilsonMatrix::MDagM (const LatticeFermion &in, LatticeFermion &out) { - + return; } }} -#endif + diff --git a/lib/qcd/Grid_qcd_wilson_dop.h b/lib/qcd/Grid_qcd_wilson_dop.h index f6775842..dc3c80b9 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.h +++ b/lib/qcd/Grid_qcd_wilson_dop.h @@ -1,4 +1,4 @@ -#ifnfdef GRID_QCD_WILSON_DOP_H +#ifndef GRID_QCD_WILSON_DOP_H #define GRID_QCD_WILSON_DOP_H #include @@ -21,21 +21,23 @@ namespace Grid { GridBase *grid; // Copy of the gauge field - LatticeGaugeField Umu; + LatticeDoubledGaugeField Umu; //Defines the stencil CartesianStencil Stencil; static const int npoint=9; static const std::vector directions ; static const std::vector displacements; - static const int Xp,Xm,Yp,Ym,Zp,Zm,Tp,Tm; // Comms buffer - std::vector > comm_buf; + std::vector > comm_buf; // Constructor - WilsonMatrix(LatticeGaugeField &Umu,int mass); + WilsonMatrix(LatticeGaugeField &Umu,double mass); + + // DoubleStore + void DoubleStore(LatticeDoubledGaugeField &Uds,const LatticeGaugeField &Umu); // override multiply void multiply(const LatticeFermion &in, LatticeFermion &out); diff --git a/lib/simd/Grid_vComplexD.h b/lib/simd/Grid_vComplexD.h index 402d303c..76295fdf 100644 --- a/lib/simd/Grid_vComplexD.h +++ b/lib/simd/Grid_vComplexD.h @@ -251,13 +251,13 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ friend inline vComplexD conj(const vComplexD &in){ vComplexD ret ; vzero(ret); #if defined (AVX1)|| defined (AVX2) - // addsubps 0, inv=>0+in.v[3] 0-in.v[2], 0+in.v[1], 0-in.v[0], ... - // __m256d tmp = _mm256_addsub_pd(ret.v,_mm256_shuffle_pd(in.v,in.v,0x5)); - // ret.v=_mm256_shuffle_pd(tmp,tmp,0x5); - ret.v = _mm256_addsub_pd(ret.v,in.v); + // addsubps 0, inv=>0+in.v[3] 0-in.v[2], 0+in.v[1], 0-in.v[0], ... + zvec tmp = _mm256_addsub_pd(ret.v,_mm256_shuffle_pd(in.v,in.v,0x5)); + ret.v =_mm256_shuffle_pd(tmp,tmp,0x5); #endif #ifdef SSE4 - ret.v = _mm_addsub_pd(ret.v,in.v); + zvec tmp = _mm_addsub_pd(ret.v,_mm_shuffle_pd(in.v,in.v,0x1)); + ret.v = _mm_shuffle_pd(tmp,tmp,0x1); #endif #ifdef AVX512 ret.v = _mm512_mask_sub_pd(in.v, 0xaaaa,ret.v, in.v); @@ -268,48 +268,41 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ return ret; } - friend inline vComplexD timesI(const vComplexD &in){ + friend inline vComplexD timesMinusI(const vComplexD &in){ vComplexD ret; vzero(ret); + vComplexD tmp; #if defined (AVX1)|| defined (AVX2) - cvec tmp =_mm256_addsub_ps(ret.v,in.v); // r,-i - /* - IF IMM0[0] = 0 - THEN DEST[63:0]=SRC1[63:0] ELSE DEST[63:0]=SRC1[127:64] FI; - IF IMM0[1] = 0 - THEN DEST[127:64]=SRC2[63:0] ELSE DEST[127:64]=SRC2[127:64] FI; - IF IMM0[2] = 0 - THEN DEST[191:128]=SRC1[191:128] ELSE DEST[191:128]=SRC1[255:192] FI; - IF IMM0[3] = 0 - THEN DEST[255:192]=SRC2[191:128] ELSE DEST[255:192]=SRC2[255:192] FI; - */ - ret.v =_mm256_shuffle_ps(tmp,tmp,0x5); + tmp.v =_mm256_addsub_pd(ret.v,in.v); // r,-i + ret.v =_mm256_shuffle_pd(tmp.v,tmp.v,0x5); #endif #ifdef SSE4 - cvec tmp =_mm_addsub_ps(ret.v,in.v); // r,-i - ret.v =_mm_shuffle_ps(tmp,tmp,0x5); + tmp.v =_mm_addsub_pd(ret.v,in.v); // r,-i + ret.v =_mm_shuffle_pd(tmp.v,tmp.v,0x1); #endif #ifdef AVX512 - ret.v = _mm512_mask_sub_ps(in.v,0xaaaa,ret.v,in.v); // real -imag - ret.v = _mm512_swizzle_ps(ret.v, _MM_SWIZ_REG_CDAB);// OK + ret.v = _mm512_mask_sub_pd(in.v,0xaaaa,ret.v,in.v); // real -imag + ret.v = _mm512_swizzle_pd(ret.v, _MM_SWIZ_REG_CDAB);// OK #endif #ifdef QPX assert(0); #endif return ret; } - friend inline vComplexD timesMinusI(const vComplexD &in){ + + friend inline vComplexD timesI(const vComplexD &in){ vComplexD ret; vzero(ret); + vComplexD tmp; #if defined (AVX1)|| defined (AVX2) - cvec tmp =_mm256_shuffle_ps(in.v,in.v,0x5); - ret.v =_mm256_addsub_ps(ret.v,tmp); // i,-r + tmp.v =_mm256_shuffle_pd(in.v,in.v,0x5); + ret.v =_mm256_addsub_pd(ret.v,tmp.v); // i,-r #endif #ifdef SSE4 - cvec tmp =_mm_shuffle_ps(in.v,in.v,0x5); - ret.v =_mm_addsub_ps(ret.v,tmp); // r,-i + tmp.v =_mm_shuffle_pd(in.v,in.v,0x1); + ret.v =_mm_addsub_pd(ret.v,tmp.v); // r,-i #endif #ifdef AVX512 - cvec tmp = _mm512_swizzle_ps(in.v, _MM_SWIZ_REG_CDAB);// OK - ret.v = _mm512_mask_sub_ps(tmp,0xaaaa,ret.v,tmp); // real -imag + tmp.v = _mm512_swizzle_pd(in.v, _MM_SWIZ_REG_CDAB);// OK + ret.v = _mm512_mask_sub_pd(tmp.v,0xaaaa,ret.v,tmp.v); // real -imag #endif #ifdef QPX assert(0); diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index 4c31ad04..fb9c5a67 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -214,10 +214,10 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ { #ifdef SSE4 union { - __m128 v1; // SSE 4 x float vector + cvec v1; // SSE 4 x float vector float f[4]; // scalar array of 4 floats } u128; - u128.v1= _mm_add_ps(v, _mm_shuffle_ps(v, v, 0b01001110)); // FIXME Prefer to use _MM_SHUFFLE macros + u128.v1= _mm_add_ps(in.v, _mm_shuffle_ps(in.v,in.v, 0b01001110)); // FIXME Prefer to use _MM_SHUFFLE macros return ComplexF(u128.f[0], u128.f[1]); #endif #ifdef AVX1 @@ -329,13 +329,15 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ friend inline vComplexF conj(const vComplexF &in){ vComplexF ret ; vzero(ret); #if defined (AVX1)|| defined (AVX2) - // cvec tmp; - // tmp = _mm256_addsub_ps(ret.v,_mm256_shuffle_ps(in.v,in.v,_MM_SHUFFLE(2,3,0,1))); // ymm1 <- br,bi - // ret.v=_mm256_shuffle_ps(tmp,tmp,_MM_SHUFFLE(2,3,0,1)); - ret.v = _mm256_addsub_ps(ret.v,in.v); + cvec tmp; + tmp = _mm256_addsub_ps(ret.v,_mm256_shuffle_ps(in.v,in.v,_MM_SHUFFLE(2,3,0,1))); // ymm1 <- br,bi + ret.v=_mm256_shuffle_ps(tmp,tmp,_MM_SHUFFLE(2,3,0,1)); + #endif #ifdef SSE4 - ret.v = _mm_addsub_ps(ret.v,in.v); + cvec tmp; + tmp = _mm_addsub_ps(ret.v,_mm_shuffle_ps(in.v,in.v,_MM_SHUFFLE(2,3,0,1))); // ymm1 <- br,bi + ret.v=_mm_shuffle_ps(tmp,tmp,_MM_SHUFFLE(2,3,0,1)); #endif #ifdef AVX512 ret.v = _mm512_mask_sub_ps(in.v,0xaaaa,ret.v,in.v); // Zero out 0+real 0-imag @@ -345,15 +347,16 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ #endif return ret; } - friend inline vComplexF timesI(const vComplexF &in){ - vComplexF ret; vzero(ret); + friend inline vComplexF timesMinusI(const vComplexF &in){ + vComplexF ret; + vzero(ret); #if defined (AVX1)|| defined (AVX2) cvec tmp =_mm256_addsub_ps(ret.v,in.v); // r,-i - ret.v = _mm256_shuffle_ps(tmp,tmp,0x5); + ret.v = _mm256_shuffle_ps(tmp,tmp,_MM_SHUFFLE(2,3,0,1)); //-i,r #endif #ifdef SSE4 cvec tmp =_mm_addsub_ps(ret.v,in.v); // r,-i - ret.v = _mm_shuffle_ps(tmp,tmp,0x5); + ret.v = _mm_shuffle_ps(tmp,tmp,_MM_SHUFFLE(2,3,0,1)); #endif #ifdef AVX512 ret.v = _mm512_mask_sub_ps(in.v,0xaaaa,ret.v,in.v); // real -imag @@ -364,14 +367,14 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ #endif return ret; } - friend inline vComplexF timesMinusI(const vComplexF &in){ + friend inline vComplexF timesI(const vComplexF &in){ vComplexF ret; vzero(ret); #if defined (AVX1)|| defined (AVX2) - cvec tmp =_mm256_shuffle_ps(in.v,in.v,0x5); - ret.v = _mm256_addsub_ps(ret.v,tmp); // i,-r + cvec tmp =_mm256_shuffle_ps(in.v,in.v,_MM_SHUFFLE(2,3,0,1));//i,r + ret.v =_mm256_addsub_ps(ret.v,tmp); //i,-r #endif #ifdef SSE4 - cvec tmp =_mm_shuffle_ps(in.v,in.v,0x5); + cvec tmp =_mm_shuffle_ps(in.v,in.v,_MM_SHUFFLE(2,3,0,1)); ret.v = _mm_addsub_ps(ret.v,tmp); // r,-i #endif #ifdef AVX512 @@ -443,5 +446,8 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ inline vComplexF trace(const vComplexF &arg){ return arg; } + + } + #endif diff --git a/lib/simd/Grid_vRealD.h b/lib/simd/Grid_vRealD.h index ab848916..f6d68963 100644 --- a/lib/simd/Grid_vRealD.h +++ b/lib/simd/Grid_vRealD.h @@ -146,7 +146,7 @@ namespace Grid { ret.v = _mm256_set_pd(a[3],a[2],a[1],a[0]); #endif #ifdef SSE4 - ret.v = _mm_set_pd(a[0],a[1]); + ret.v = _mm_set_pd(a[1],a[0]); #endif #ifdef AVX512 ret.v = _mm512_set_pd(a[7],a[6],a[5],a[4],a[3],a[2],a[1],a[0]); @@ -186,6 +186,15 @@ namespace Grid { friend inline RealD Reduce(const vRealD & in) { +#if defined (SSE4) + // FIXME Hack + const RealD * ptr =(const RealD *) ∈ + RealD ret = 0; + for(int i=0;i_simd_layout[dimension]; int comm_dim = _grid->_processors[dimension] >1 ; - assert(simd_layout==1); + // assert(simd_layout==1); // Why? assert(comm_dim==1); + shift = (shift + fd) %fd; assert(shift>=0); assert(shift +struct scal { + d internal; +}; + int main (int argc, char ** argv) { @@ -22,22 +27,33 @@ int main (int argc, char ** argv) GridSerialRNG sRNG; sRNG.SeedRandomDevice(); - SpinMatrix ident=zero; + SpinMatrix ident; ident=zero; SpinMatrix rnd ; random(sRNG,rnd); - SpinMatrix ll=zero; - SpinMatrix rr=zero; + SpinMatrix ll; ll=zero; + SpinMatrix rr; rr=zero; SpinMatrix result; SpinVector lv; random(sRNG,lv); SpinVector rv; random(sRNG,rv); + std::cout << " Is pod " << std::is_pod::value << std::endl; + std::cout << " Is pod double " << std::is_pod::value << std::endl; + std::cout << " Is pod ComplexF " << std::is_pod::value << std::endl; + std::cout << " Is pod scal " << std::is_pod >::value << std::endl; + std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; + std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; + std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; + std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; + std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; + std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; + for(int a=0;a +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +class funcPlus { +public: + funcPlus() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = i1+i2;} + std::string name(void) const { return std::string("Plus"); } +}; +class funcMinus { +public: + funcMinus() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = i1-i2;} + std::string name(void) const { return std::string("Minus"); } +}; +class funcTimes { +public: + funcTimes() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = i1*i2;} + std::string name(void) const { return std::string("Times"); } +}; +class funcConj { +public: + funcConj() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = conj(i1);} + std::string name(void) const { return std::string("Conj"); } +}; +class funcAdj { +public: + funcAdj() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = adj(i1);} + std::string name(void) const { return std::string("Adj"); } +}; + +class funcTimesI { +public: + funcTimesI() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = timesI(i1);} + std::string name(void) const { return std::string("timesI"); } +}; + +class funcTimesMinusI { +public: + funcTimesMinusI() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = timesMinusI(i1);} + std::string name(void) const { return std::string("timesMinusI"); } +}; + +template +void Tester(const functor &func) +{ + GridSerialRNG sRNG; + sRNG.SeedRandomDevice(); + + int Nsimd = vec::Nsimd(); + + std::vector input1(Nsimd); + std::vector input2(Nsimd); + std::vector result(Nsimd); + std::vector reference(Nsimd); + + std::vector > buf(3); + vec & v_input1 = buf[0]; + vec & v_input2 = buf[1]; + vec & v_result = buf[2]; + + + for(int i=0;i0){ + std::cout<< "*****" << std::endl; + std::cout<< "["< simd_layout({1,1,2,2}); + std::vector mpi_layout ({1,1,1,1}); + std::vector latt_size ({8,8,8,8}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + std::vector seeds({1,2,3,4}); + + // Insist that operations on random scalars gives + // identical results to on vectors. + + Tester(funcPlus()); + + std::cout << "==================================="<< std::endl; + std::cout << "Testing vComplexF "<(funcTimesI()); + Tester(funcTimesMinusI()); + Tester(funcPlus()); + Tester(funcMinus()); + Tester(funcTimes()); + Tester(funcConj()); + Tester(funcAdj()); + + std::cout << "==================================="<< std::endl; + std::cout << "Testing vComplexD "<(funcTimesI()); + Tester(funcTimesMinusI()); + Tester(funcPlus()); + Tester(funcMinus()); + Tester(funcTimes()); + Tester(funcConj()); + Tester(funcAdj()); + + std::cout << "==================================="<< std::endl; + std::cout << "Testing vRealF "<(funcPlus()); + Tester(funcMinus()); + Tester(funcTimes()); + Tester(funcAdj()); + + std::cout << "==================================="<< std::endl; + std::cout << "Testing vRealD "<(funcPlus()); + Tester(funcMinus()); + Tester(funcTimes()); + Tester(funcAdj()); + + Grid_finalize(); +} diff --git a/tests/Grid_stencil.cc b/tests/Grid_stencil.cc index f35581f6..a7529045 100644 --- a/tests/Grid_stencil.cc +++ b/tests/Grid_stencil.cc @@ -4,60 +4,37 @@ using namespace std; using namespace Grid; using namespace Grid::QCD; +template +class SimpleCompressor { +public: + void Point(int) {}; + vobj operator() (vobj &arg) { + return arg; + } +}; int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector latt_size (4); - std::vector simd_layout(4); - std::vector mpi_layout (4); + std::vector simd_layout({1,1,2,2}); + std::vector mpi_layout ({2,2,2,2}); + std::vector latt_size ({8,8,8,8}); - int omp=1; - int lat=8; - - mpi_layout[0]=1; - mpi_layout[1]=1; - mpi_layout[2]=1; - mpi_layout[3]=1; - - latt_size[0] = lat; - latt_size[1] = lat; - latt_size[2] = lat; - latt_size[3] = lat; - double volume = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; + double volume = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; -#ifdef AVX512 - simd_layout[0] = 1; - simd_layout[1] = 2; - simd_layout[2] = 2; - simd_layout[3] = 2; -#endif -#if defined (AVX1)|| defined (AVX2) - simd_layout[0] = 1; - simd_layout[1] = 1; - simd_layout[2] = 2; - simd_layout[3] = 2; -#endif -#if defined (SSE2) - simd_layout[0] = 1; - simd_layout[1] = 1; - simd_layout[2] = 1; - simd_layout[3] = 2; -#endif - - GridCartesian Fine(latt_size,simd_layout,mpi_layout); - GridRedBlackCartesian rbFine(latt_size,simd_layout,mpi_layout); - GridParallelRNG fRNG(&Fine); - fRNG.SeedRandomDevice(); - - LatticeColourMatrix Foo(&Fine); - LatticeColourMatrix Bar(&Fine); - LatticeColourMatrix Check(&Fine); - LatticeColourMatrix Diff(&Fine); - - random(fRNG,Foo); - gaussian(fRNG,Bar); + GridCartesian Fine(latt_size,simd_layout,mpi_layout); + GridRedBlackCartesian rbFine(latt_size,simd_layout,mpi_layout); + GridParallelRNG fRNG(&Fine); + fRNG.SeedRandomDevice(); + + LatticeColourMatrix Foo(&Fine); + LatticeColourMatrix Bar(&Fine); + LatticeColourMatrix Check(&Fine); + LatticeColourMatrix Diff(&Fine); + + random(fRNG,Foo); + gaussian(fRNG,Bar); for(int dir=0;dir<4;dir++){ @@ -86,7 +63,8 @@ int main (int argc, char ** argv) fflush(stdout); std::vector > comm_buf(myStencil._unified_buffer_size); printf("calling halo exchange\n");fflush(stdout); - myStencil.HaloExchange(Foo,comm_buf); + SimpleCompressor compress; + myStencil.HaloExchange(Foo,comm_buf,compress); Bar = Cshift(Foo,dir,disp); diff --git a/tests/Grid_wilson.cc b/tests/Grid_wilson.cc new file mode 100644 index 00000000..ade5263d --- /dev/null +++ b/tests/Grid_wilson.cc @@ -0,0 +1,69 @@ +#include +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +template +struct scal { + d internal; +}; + + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector simd_layout({1,1,2,2}); + std::vector mpi_layout ({1,1,1,1}); + std::vector latt_size ({8,8,8,8}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + std::vector seeds({1,2,3,4}); + + GridParallelRNG pRNG(&Grid); + // pRNG.SeedFixedIntegers(seeds); + pRNG.SeedRandomDevice(); + + LatticeFermion src(&Grid); random(pRNG,src); + LatticeFermion result(&Grid); result=zero; + LatticeFermion ref(&Grid); ref=zero; + LatticeGaugeField Umu(&Grid); random(pRNG,Umu); + std::vector U(4,&Grid); + + for(int mu=0;mu(Umu,U[mu],mu); + } + + { + int mu=0; + // ref = src + Gamma(Gamma::GammaX)* src ; // 1-gamma_x + ref = src; + ref = U[0]*Cshift(ref,0,1); + } + + RealD mass=0.1; + WilsonMatrix Dw(Umu,mass); + std::cout << "Calling Dw"< Date: Mon, 27 Apr 2015 13:45:07 +0100 Subject: [PATCH 107/429] Reworking CSHIFT and Stencil. Implementing Wilson and discovered rework is required --- TODO | 4 + lib/Grid_config.h | 4 +- lib/Grid_stencil.h | 156 ++++++++++++---------------- lib/cartesian/Grid_cartesian_base.h | 6 +- lib/cshift/Grid_cshift_common.h | 4 +- lib/cshift/Grid_cshift_mpi.h | 132 ++++++++--------------- lib/qcd/Grid_qcd_wilson_dop.cc | 20 +++- tests/Grid_cshift.cc | 9 +- tests/Grid_simd.cc | 2 - tests/Grid_stencil.cc | 2 +- tests/Grid_wilson.cc | 41 ++++++-- 11 files changed, 176 insertions(+), 204 deletions(-) diff --git a/TODO b/TODO index 98dfc3b8..ef3940ea 100644 --- a/TODO +++ b/TODO @@ -2,6 +2,10 @@ - use protocol buffers? replace xmlReader/Writer ec.. - Binary use htonll, htonl +* Stencil -- do the permute for locally permuted in halo exchange. + - BUG cshift mpi; the "s" indexing is weird in the Cshift_comms_simd + as simd_layout or not is confusing + * Reduce implemention is poor * Bug in SeedFixedIntegers gives same output on each site. * Bug in RNG with complex numbers ; only filling real values; need helper function -- DONE diff --git a/lib/Grid_config.h b/lib/Grid_config.h index f3d7016d..4152540e 100644 --- a/lib/Grid_config.h +++ b/lib/Grid_config.h @@ -2,7 +2,7 @@ /* lib/Grid_config.h.in. Generated from configure.ac by autoheader. */ /* AVX */ -/* #undef AVX1 */ +#define AVX1 1 /* AVX2 */ /* #undef AVX2 */ @@ -77,7 +77,7 @@ #define PACKAGE_VERSION "1.0" /* SSE4 */ -#define SSE4 1 +/* #undef SSE4 */ /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 diff --git a/lib/Grid_stencil.h b/lib/Grid_stencil.h index 83db0a80..afb11db6 100644 --- a/lib/Grid_stencil.h +++ b/lib/Grid_stencil.h @@ -52,7 +52,7 @@ namespace Grid { // Gather for when there is no need to SIMD split with compression /////////////////////////////////////////////////////////////////// template void -Gather_plane_simple (Lattice &rhs,std::vector > &buffer,int dimension,int plane,int cbmask,compressor &compress) +Gather_plane_simple (const Lattice &rhs,std::vector > &buffer,int dimension,int plane,int cbmask,compressor &compress) { int rd = rhs._grid->_rdimensions[dimension]; @@ -97,7 +97,7 @@ Gather_plane_simple (Lattice &rhs,std::vector // Gather for when there *is* need to SIMD split with compression /////////////////////////////////////////////////////////////////// template void - Gather_plane_extract(Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask,compressor &compress) +Gather_plane_extract(const Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask,compressor &compress) { int rd = rhs._grid->_rdimensions[dimension]; @@ -182,7 +182,7 @@ template void // Could allow a functional munging of the halo to another type during the comms. // this could implement the 16bit/32bit/64bit compression. template void - HaloExchange(Lattice &source,std::vector > &u_comm_buf,compressor &compress) + HaloExchange(const Lattice &source,std::vector > &u_comm_buf,compressor &compress) { // conformable(source._grid,_grid); assert(source._grid==_grid); @@ -237,7 +237,7 @@ template void } template - void GatherStartComms(Lattice &rhs,int dimension,int shift,int cbmask, + void GatherStartComms(const Lattice &rhs,int dimension,int shift,int cbmask, std::vector > &u_comm_buf, int &u_comm_offset,compressor & compress) { @@ -250,6 +250,7 @@ template void int fd = _grid->_fdimensions[dimension]; int rd = _grid->_rdimensions[dimension]; + int pd = _grid->_processors[dimension]; int simd_layout = _grid->_simd_layout[dimension]; int comm_dim = _grid->_processors[dimension] >1 ; assert(simd_layout==1); @@ -267,11 +268,10 @@ template void for(int x=0;x= rd ); int sx = (x+sshift)%rd; - int comm_proc = (x+sshift)/rd; - - if (offnode) { + int comm_proc = ((x+sshift)/rd)%pd; + + if (comm_proc) { int words = send_buf.size(); if (cbmask != 0x3) words=words>>1; @@ -284,7 +284,8 @@ template void int recv_from_rank; int xmit_to_rank; _grid->ShiftedRanks(dimension,comm_proc,xmit_to_rank,recv_from_rank); - + assert (xmit_to_rank != _grid->ThisRank()); + assert (recv_from_rank != _grid->ThisRank()); // FIXME Implement asynchronous send & also avoid buffer copy _grid->SendToRecvFrom((void *)&send_buf[0], xmit_to_rank, @@ -293,7 +294,11 @@ template void bytes); printf("GatherStartComms communicated offnode x %d\n",x);fflush(stdout); - printf("GatherStartComms inserting %d buf size %d\n",u_comm_offset,buffer_size);fflush(stdout); + printf("GatherStartComms inserting %le to u_comm_offset %d buf size %d for dim %d shift %d\n", + *( (RealF *) &recv_buf[0]), + u_comm_offset,buffer_size, + dimension,shift + ); fflush(stdout); for(int i=0;i void template - void GatherStartCommsSimd(Lattice &rhs,int dimension,int shift,int cbmask, + void GatherStartCommsSimd(const Lattice &rhs,int dimension,int shift,int cbmask, std::vector > &u_comm_buf, int &u_comm_offset,compressor &compress) { const int Nsimd = _grid->Nsimd(); + typedef typename cobj::vector_type vector_type; typedef typename cobj::scalar_type scalar_type; int fd = _grid->_fdimensions[dimension]; int rd = _grid->_rdimensions[dimension]; int ld = _grid->_ldimensions[dimension]; + int pd = _grid->_processors[dimension]; int simd_layout = _grid->_simd_layout[dimension]; int comm_dim = _grid->_processors[dimension] >1 ; @@ -346,89 +353,62 @@ template void int cb = (cbmask==0x2)? 1 : 0; int sshift= _grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,cb); - - std::vector comm_offnode(simd_layout); - std::vector comm_proc (simd_layout); //relative processor coord in dim=dimension - std::vector icoor(_grid->Nd()); - - for(int x=0;x= ld; - comm_any = comm_any | comm_offnode[s]; - comm_proc[s] = shifted_x/ld; + // FIXME call local permute copy if none are offnode. + for(int i=0;i_ostride[dimension]; int sx = (x+sshift)%rd; - - if ( comm_any ) { - for(int i=0;i(rhs,pointers,dimension,sx,cbmask,compress); + std::cout<< "Gathered "<>(permute_type+1)); + int ic= (i&inner_bit)? 1:0; + + int my_coor = rd*ic + x; + int nbr_coor = my_coor+sshift; + int nbr_proc = ((nbr_coor)/ld) % pd;// relative shift in processors + + int nbr_ic = (nbr_coor%ld)/rd; // inner coord of peer + int nbr_ox = (nbr_coor%rd); // outer coord of peer + int nbr_lane = (i&(~inner_bit)); + + int recv_from_rank; + int xmit_to_rank; + + if (nbr_ic) nbr_lane|=inner_bit; + assert (sx == nbr_ox); + + if(nbr_proc){ + + std::cout<< "MPI sending "<ShiftedRanks(dimension,nbr_proc,xmit_to_rank,recv_from_rank); + + _grid->SendToRecvFrom((void *)&send_buf_extract[nbr_lane][0], + xmit_to_rank, + (void *)&recv_buf_extract[i][0], + recv_from_rank, + bytes); + std::cout<< "MPI complete "<(rhs,pointers,dimension,sx,cbmask,compress); - - for(int i=0;iiCoorFromIindex(icoor,i); - s = icoor[dimension]; - - if(comm_offnode[s]){ - - int rank = _grid->_processor; - int recv_from_rank; - int xmit_to_rank; - - _grid->ShiftedRanks(dimension,comm_proc[s],xmit_to_rank,recv_from_rank); - - - _grid->SendToRecvFrom((void *)&send_buf_extract[i][0], - xmit_to_rank, - (void *)&recv_buf_extract[i][0], - recv_from_rank, - bytes); - - rpointers[i] = (scalar_type *)&recv_buf_extract[i][0]; - - } else { - - rpointers[i] = (scalar_type *)&send_buf_extract[i][0]; - - } - - } - - // Permute by swizzling pointers in merge - int permute_slice=0; - int lshift=sshift%ld; - int wrap =lshift/rd; - int num =lshift%rd; - - if ( x< rd-num ) permute_slice=wrap; - else permute_slice = 1-wrap; - - int toggle_bit = (Nsimd>>(permute_type+1)); - int PermuteMap; - for(int i=0;i& coor,int Oindex){ + CoorFromIndex(coor,Oindex,_rdimensions); + } static inline void IndexFromCoor (std::vector& coor,int &index,std::vector &dims){ int nd=dims.size(); int stride=1; @@ -107,9 +110,6 @@ public: stride=stride*dims[d]; } } - inline void oCoorFromOindex (std::vector& coor,int Oindex){ - CoorFromIndex(coor,Oindex,_rdimensions); - } ////////////////////////////////////////////////////////// // SIMD lane addressing diff --git a/lib/cshift/Grid_cshift_common.h b/lib/cshift/Grid_cshift_common.h index 8c4f1e1d..eebc895e 100644 --- a/lib/cshift/Grid_cshift_common.h +++ b/lib/cshift/Grid_cshift_common.h @@ -5,7 +5,7 @@ namespace Grid { ////////////////////////////////////////////////////// // Gather for when there is no need to SIMD split ////////////////////////////////////////////////////// -template void Gather_plane_simple (Lattice &rhs,std::vector > &buffer, int dimension,int plane,int cbmask) +template void Gather_plane_simple (const Lattice &rhs,std::vector > &buffer, int dimension,int plane,int cbmask) { int rd = rhs._grid->_rdimensions[dimension]; @@ -49,7 +49,7 @@ template void Gather_plane_simple (Lattice &rhs,std::vector void Gather_plane_extract(Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask) + template void Gather_plane_extract(const Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask) { int rd = rhs._grid->_rdimensions[dimension]; diff --git a/lib/cshift/Grid_cshift_mpi.h b/lib/cshift/Grid_cshift_mpi.h index 60894ef3..ab9237ad 100644 --- a/lib/cshift/Grid_cshift_mpi.h +++ b/lib/cshift/Grid_cshift_mpi.h @@ -79,6 +79,7 @@ template void Cshift_comms(Lattice &ret,Lattice &rhs,int int fd = rhs._grid->_fdimensions[dimension]; int rd = rhs._grid->_rdimensions[dimension]; + int pd = rhs._grid->_processors[dimension]; int simd_layout = rhs._grid->_simd_layout[dimension]; int comm_dim = rhs._grid->_processors[dimension] >1 ; assert(simd_layout==1); @@ -95,11 +96,10 @@ template void Cshift_comms(Lattice &ret,Lattice &rhs,int for(int x=0;x= rd ); - int sx = (x+sshift)%rd; - int comm_proc = (x+sshift)/rd; + int sx = (x+sshift)%rd; + int comm_proc = ((x+sshift)/rd)%pd; - if (!offnode) { + if (comm_proc==0) { Copy_plane(ret,rhs,dimension,x,sx,cbmask); @@ -138,6 +138,7 @@ template void Cshift_comms_simd(Lattice &ret,Lattice &r int fd = grid->_fdimensions[dimension]; int rd = grid->_rdimensions[dimension]; int ld = grid->_ldimensions[dimension]; + int pd = grid->_processors[dimension]; int simd_layout = grid->_simd_layout[dimension]; int comm_dim = grid->_processors[dimension] >1 ; @@ -164,101 +165,58 @@ template void Cshift_comms_simd(Lattice &ret,Lattice &r /////////////////////////////////////////// // Work out what to send where /////////////////////////////////////////// - int cb = (cbmask==0x2)? 1 : 0; int sshift= grid->CheckerBoardShift(rhs.checkerboard,dimension,shift,cb); - - std::vector comm_offnode(simd_layout); - std::vector comm_proc (simd_layout); //relative processor coord in dim=dimension - std::vector icoor(grid->Nd()); + // loop over outer coord planes orthog to dim for(int x=0;x= ld; - comm_any = comm_any | comm_offnode[s]; - comm_proc[s] = shifted_x/ld; + // FIXME call local permute copy if none are offnode. + + for(int i=0;i_ostride[dimension]; int sx = (x+sshift)%rd; + Gather_plane_extract(rhs,pointers,dimension,sx,cbmask); - if ( comm_any ) { + for(int i=0;i>(permute_type+1)); + int ic= (i&inner_bit)? 1:0; - for(int i=0;iShiftedRanks(dimension,nbr_proc,xmit_to_rank,recv_from_rank); + + grid->SendToRecvFrom((void *)&send_buf_extract[nbr_lane][0], + xmit_to_rank, + (void *)&recv_buf_extract[i][0], + recv_from_rank, + bytes); + + rpointers[i] = (scalar_type *)&recv_buf_extract[i][0]; + } else { + rpointers[i] = (scalar_type *)&send_buf_extract[nbr_lane][0]; } - Gather_plane_extract(rhs,pointers,dimension,sx,cbmask); - - for(int i=0;iiCoorFromIindex(icoor,i); - s = icoor[dimension]; - - if(comm_offnode[s]){ - - int rank = grid->_processor; - int recv_from_rank; - int xmit_to_rank; - grid->ShiftedRanks(dimension,comm_proc[s],xmit_to_rank,recv_from_rank); - - - grid->SendToRecvFrom((void *)&send_buf_extract[i][0], - xmit_to_rank, - (void *)&recv_buf_extract[i][0], - recv_from_rank, - bytes); - - rpointers[i] = (scalar_type *)&recv_buf_extract[i][0]; - - } else { - - rpointers[i] = (scalar_type *)&send_buf_extract[i][0]; - - } - - } - - // Permute by swizzling pointers in merge - int permute_slice=0; - int lshift=sshift%ld; - int wrap =lshift/rd; - int num =lshift%rd; - - if ( x< rd-num ) permute_slice=wrap; - else permute_slice = 1-wrap; - - int toggle_bit = (Nsimd>>(permute_type+1)); - int PermuteMap; - for(int i=0;i(in,comm_buf,compressor); for(int ss=0;ssoSites();ss++){ @@ -100,10 +105,13 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) vHalfSpinColourVector chi; vHalfSpinColourVector Uchi; vHalfSpinColourVector *chi_p; + + result=zero; + +#if 0 // Xp offset = Stencil._offsets [Xp][ss]; local = Stencil._is_local[Xp][ss]; - chi_p = &comm_buf[offset]; if ( local ) { spProjXp(chi,in._odata[offset]); @@ -112,7 +120,6 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) mult(&(Uchi()),&(Umu._odata[ss](Xp)),&(*chi_p)()); spReconXp(result,Uchi); -#if 0 // Yp offset = Stencil._offsets [Yp][ss]; local = Stencil._is_local[Yp][ss]; @@ -145,6 +152,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } mult(&(Uchi()),&(Umu._odata[ss](Tp)),&(*chi_p)()); accumReconTp(result,Uchi); +#endif // Xm offset = Stencil._offsets [Xm][ss]; @@ -156,6 +164,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } mult(&(Uchi()),&(Umu._odata[ss](Xm)),&(*chi_p)()); accumReconXm(result,Uchi); +#if 0 // Ym offset = Stencil._offsets [Ym][ss]; @@ -190,6 +199,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) mult(&(Uchi()),&(Umu._odata[ss](Tm)),&(*chi_p)()); accumReconTm(result,Uchi); #endif + out._odata[ss] = result; } diff --git a/tests/Grid_cshift.cc b/tests/Grid_cshift.cc index 995756d6..c0863965 100644 --- a/tests/Grid_cshift.cc +++ b/tests/Grid_cshift.cc @@ -1,7 +1,6 @@ #include #include -using namespace std; using namespace Grid; using namespace Grid::QCD; @@ -10,7 +9,7 @@ int main (int argc, char ** argv) Grid_init(&argc,&argv); std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({2,2,2,2}); + std::vector mpi_layout ({2,2,1,4}); std::vector latt_size ({8,8,8,16}); GridCartesian Fine(latt_size,simd_layout,mpi_layout); @@ -71,11 +70,11 @@ int main (int argc, char ** argv) Fine.CoorFromIndex(peer,index,latt_size); if (nrm > 0){ - cout<<"FAIL shift "<< shift<<" in dir "<< dir<<" ["<(funcPlus()); - std::cout << "==================================="<< std::endl; std::cout << "Testing vComplexF "< -#include using namespace std; using namespace Grid; @@ -10,13 +9,19 @@ struct scal { d internal; }; + Gamma::GammaMatrix Gmu [] = { + Gamma::GammaX, + Gamma::GammaY, + Gamma::GammaZ, + Gamma::GammaT + }; int main (int argc, char ** argv) { Grid_init(&argc,&argv); std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({1,1,1,1}); + std::vector mpi_layout ({2,1,1,2}); std::vector latt_size ({8,8,8,8}); GridCartesian Grid(latt_size,simd_layout,mpi_layout); @@ -29,19 +34,37 @@ int main (int argc, char ** argv) LatticeFermion src(&Grid); random(pRNG,src); LatticeFermion result(&Grid); result=zero; LatticeFermion ref(&Grid); ref=zero; + LatticeFermion tmp(&Grid); tmp=zero; LatticeGaugeField Umu(&Grid); random(pRNG,Umu); std::vector U(4,&Grid); for(int mu=0;mu(Umu,U[mu],mu); + // U[mu] = 1.0; + // pokeIndex<3>(Umu,U[mu],mu); + U[mu] = peekIndex<3>(Umu,mu); } - { - int mu=0; - // ref = src + Gamma(Gamma::GammaX)* src ; // 1-gamma_x - ref = src; - ref = U[0]*Cshift(ref,0,1); + std::vector mask({0,0,0,0,1,0,0,0}); + { // Naive wilson implementation + ref = zero; + for(int mu=0;mu Date: Tue, 28 Apr 2015 08:11:59 +0100 Subject: [PATCH 108/429] Shaken out stencil to the point where I think wilson dslash is correct. Need to audit code carefully, consolidate between stencil and cshift, and then benchmark and optimise. --- lib/Grid_comparison.h | 6 +- lib/Grid_extract.h | 193 ++++++++++++++++ lib/Grid_lattice.h | 1 + lib/Grid_simd.h | 62 ----- lib/Grid_stencil.h | 222 ++++++------------ lib/Grid_where.h | 21 +- lib/cshift/Grid_cshift_common.h | 320 +++++++++++--------------- lib/cshift/Grid_cshift_mpi.h | 20 +- lib/lattice/Grid_lattice_coordinate.h | 10 +- lib/lattice/Grid_lattice_peekpoke.h | 27 +-- lib/lattice/Grid_lattice_reduction.h | 4 +- lib/lattice/Grid_lattice_rng.h | 82 ++++--- lib/math/Grid_math_tensors.h | 59 ----- lib/math/Grid_math_traits.h | 12 +- lib/qcd/Grid_qcd_wilson_dop.cc | 97 ++++++-- lib/simd/Grid_vComplexD.h | 2 + lib/simd/Grid_vComplexF.h | 3 +- lib/simd/Grid_vInteger.h | 3 +- lib/simd/Grid_vRealD.h | 3 +- lib/simd/Grid_vRealF.h | 3 +- lib/stencil/Grid_stencil_common.cc | 7 +- tests/Grid_simd.cc | 8 +- tests/Grid_stencil.cc | 36 +-- tests/Grid_wilson.cc | 3 +- 24 files changed, 599 insertions(+), 605 deletions(-) create mode 100644 lib/Grid_extract.h diff --git a/lib/Grid_comparison.h b/lib/Grid_comparison.h index 530817c6..53dec1a0 100644 --- a/lib/Grid_comparison.h +++ b/lib/Grid_comparison.h @@ -101,12 +101,12 @@ namespace Grid { std::vector vlhs(vInteger::Nsimd()); // Use functors to reduce this to single implementation std::vector vrhs(vInteger::Nsimd()); vInteger ret; - extract(lhs,vlhs); - extract(rhs,vrhs); + extract(lhs,vlhs); + extract(rhs,vrhs); for(int s=0;s(ret,vlhs); return ret; } inline vInteger operator < (const vInteger & lhs, const vInteger & rhs) diff --git a/lib/Grid_extract.h b/lib/Grid_extract.h new file mode 100644 index 00000000..e29fbee7 --- /dev/null +++ b/lib/Grid_extract.h @@ -0,0 +1,193 @@ +#ifndef GRID_EXTRACT_H +#define GRID_EXTRACT_H +///////////////////////////////////////////////////////////////// +// Generic extract/merge/permute +///////////////////////////////////////////////////////////////// + +namespace Grid{ + +//////////////////////////////////////////////////////////////////////////////////////////////// +// Extract/merge a fundamental vector type, to pointer array with offset +//////////////////////////////////////////////////////////////////////////////////////////////// + +template +inline void extract(typename std::enable_if::notvalue, const vsimd >::type * y, + std::vector &extracted,int offset){ + // FIXME: bounce off memory is painful + int Nextr=extracted.size(); + int Nsimd=vsimd::Nsimd(); + int s=Nsimd/Nextr; + + scalar*buf = (scalar *)y; + for(int i=0;i +inline void merge(typename std::enable_if::notvalue, vsimd >::type * y, + std::vector &extracted,int offset){ + int Nextr=extracted.size(); + int Nsimd=vsimd::Nsimd(); + int s=Nsimd/Nextr; + + scalar *buf =(scalar *) y; + for(int i=0;i +inline void extract(typename std::enable_if::notvalue, const vsimd >::type &y,std::vector &extracted){ + + int Nextr=extracted.size(); + int Nsimd=vsimd::Nsimd(); + int s=Nsimd/Nextr; + + scalar *buf = (scalar *)&y; + for(int i=0;i +inline void merge(typename std::enable_if::notvalue, vsimd >::type &y,std::vector &extracted){ + int Nextr=extracted.size(); + int Nsimd=vsimd::Nsimd(); + int s=Nsimd/Nextr; + scalar *buf = (scalar *)&y; + + for(int i=0;i +inline void AmergeA(typename std::enable_if::notvalue, vsimd >::type &y,std::vector &extracted){ + int Nextr=extracted.size(); + int Nsimd=vsimd::Nsimd(); + int s=Nsimd/Nextr; + + scalar *buf = (scalar *)&y; + for(int i=0;i inline void extract(const vobj &vec,std::vector &extracted) +{ + typedef typename vobj::scalar_type scalar_type ; + typedef typename vobj::vector_type vector_type ; + + const int Nsimd=vobj::vector_type::Nsimd(); + const int words=sizeof(vobj)/sizeof(vector_type); + + extracted.resize(Nsimd); + + std::vector pointers(Nsimd); + for(int i=0;i(&vp[w],pointers,w); + } +} +//////////////////////////////////////////////////////////////////////// +// Extract to a bunch of scalar object pointers, with offset +//////////////////////////////////////////////////////////////////////// +template inline +void extract(const vobj &vec,std::vector &extracted, int offset) +{ + + typedef typename vobj::scalar_type scalar_type ; + typedef typename vobj::vector_type vector_type ; + + const int words=sizeof(vobj)/sizeof(vector_type); + const int Nsimd=vobj::vector_type::Nsimd(); + + assert(extracted.size()==Nsimd); + + std::vector pointers(Nsimd); + for(int i=0;i(&vp[w],pointers,w); + } +} + +//////////////////////////////////////////////////////////////////////// +// Merge a contiguous array of scalar objects +//////////////////////////////////////////////////////////////////////// +template inline +void merge(vobj &vec,std::vector &extracted) +{ + typedef typename vobj::scalar_type scalar_type ; + typedef typename vobj::vector_type vector_type ; + + const int Nsimd=vobj::vector_type::Nsimd(); + const int words=sizeof(vobj)/sizeof(vector_type); + + assert(extracted.size()==Nsimd); + + std::vector pointers(Nsimd); + for(int i=0;i(&vp[w],pointers,w); + } +} + +//////////////////////////////////////////////////////////////////////// +// Merge a bunch of different scalar object pointers, with offset +//////////////////////////////////////////////////////////////////////// +template inline +void merge(vobj &vec,std::vector &extracted,int offset) +{ + typedef typename vobj::scalar_type scalar_type ; + typedef typename vobj::vector_type vector_type ; + + const int Nsimd=vobj::vector_type::Nsimd(); + const int words=sizeof(vobj)/sizeof(vector_type); + + assert(extracted.size()==Nsimd); + + std::vector pointers(Nsimd); + for(int i=0;i(&vp[w],pointers,w); + } +} +} +#endif diff --git a/lib/Grid_lattice.h b/lib/Grid_lattice.h index 7256459c..c76fa0a9 100644 --- a/lib/Grid_lattice.h +++ b/lib/Grid_lattice.h @@ -95,6 +95,7 @@ public: #include #include #include +#include #include #include #include diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index a059cc23..4e33604d 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -133,68 +133,6 @@ namespace Grid { #endif -///////////////////////////////////////////////////////////////// -// Generic extract/merge/permute -///////////////////////////////////////////////////////////////// - -template -inline void Gextract(const vsimd &y,std::vector &extracted){ - // FIXME: bounce off memory is painful - int Nextr=extracted.size(); - int Nsimd=vsimd::Nsimd(); - int s=Nsimd/Nextr; - - std::vector > buf(Nsimd); - - vstore(y,&buf[0]); - for(int i=0;i -inline void Gextract(const vsimd &y,std::vector &extracted){ - int Nextr=extracted.size(); - int Nsimd=vsimd::Nsimd(); - int s=Nsimd/Nextr; - - std::vector > buf(Nsimd); - - vstore(y,&buf[0]); - for(int i=0;i -inline void Gmerge(vsimd &y,std::vector &extracted){ - int Nextr=extracted.size(); - int Nsimd=vsimd::Nsimd(); - int s=Nsimd/Nextr; - - std::vector buf(Nsimd); - for(int i=0;i -inline void Gmerge(vsimd &y,std::vector &extracted){ - int Nextr=extracted.size(); - int Nsimd=vsimd::Nsimd(); - int s=Nsimd/Nextr; - - std::vector buf(Nsimd); - for(int i=0;i BA DC FE HG diff --git a/lib/Grid_stencil.h b/lib/Grid_stencil.h index afb11db6..fdc8ece9 100644 --- a/lib/Grid_stencil.h +++ b/lib/Grid_stencil.h @@ -48,100 +48,6 @@ namespace Grid { } ; -/////////////////////////////////////////////////////////////////// -// Gather for when there is no need to SIMD split with compression -/////////////////////////////////////////////////////////////////// -template void -Gather_plane_simple (const Lattice &rhs,std::vector > &buffer,int dimension,int plane,int cbmask,compressor &compress) -{ - int rd = rhs._grid->_rdimensions[dimension]; - - if ( !rhs._grid->CheckerBoarded(dimension) ) { - - int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - int bo = 0; // offset in buffer - - // Simple block stride gather of SIMD objects -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - buffer[bo++]=compress(rhs._odata[so+o+b]); - } - o +=rhs._grid->_slice_stride[dimension]; - } - - } else { - - int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - int bo = 0; // offset in buffer - -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int ocb=1<CheckerBoardFromOindex(o+b);// Could easily be a table lookup - if ( ocb &cbmask ) { - buffer[bo]=compress(rhs._odata[so+o+b]); - bo++; - } - - } - o +=rhs._grid->_slice_stride[dimension]; - } - } -} - -/////////////////////////////////////////////////////////////////// -// Gather for when there *is* need to SIMD split with compression -/////////////////////////////////////////////////////////////////// -template void -Gather_plane_extract(const Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask,compressor &compress) -{ - int rd = rhs._grid->_rdimensions[dimension]; - - if ( !rhs._grid->CheckerBoarded(dimension) ) { - - int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - int bo = 0; // offset in buffer - - // Simple block stride gather of SIMD objects -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - cobj temp; - temp=compress(rhs._odata[so+o+b]); - extract(temp,pointers); - } - o +=rhs._grid->_slice_stride[dimension]; - } - - } else { - - int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - int bo = 0; // offset in buffer - -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int ocb=1<CheckerBoardFromOindex(o+b); - if ( ocb & cbmask ) { - cobj temp; - temp =compress(rhs._odata[so+o+b]); - extract(temp,pointers); - } - - } - o +=rhs._grid->_slice_stride[dimension]; - } - } -} - - class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal fill in. public: @@ -184,6 +90,7 @@ Gather_plane_extract(const Lattice &rhs,std::vector void HaloExchange(const Lattice &source,std::vector > &u_comm_buf,compressor &compress) { + std::cout<< "HaloExchange comm_buf.size()="<< u_comm_buf.size()<<" unified_buffer_size"<< _unified_buffer_size<< std::endl; // conformable(source._grid,_grid); assert(source._grid==_grid); if (u_comm_buf.size() != _unified_buffer_size ) u_comm_buf.resize(_unified_buffer_size); @@ -234,6 +141,7 @@ Gather_plane_extract(const Lattice &rhs,std::vector @@ -318,6 +226,7 @@ Gather_plane_extract(const Lattice &rhs,std::vector_fdimensions[dimension]; int rd = _grid->_rdimensions[dimension]; @@ -340,12 +249,12 @@ Gather_plane_extract(const Lattice &rhs,std::vector > send_buf_extract(Nsimd,std::vector(buffer_size*words) ); - std::vector > recv_buf_extract(Nsimd,std::vector(buffer_size*words) ); - int bytes = buffer_size*words*sizeof(scalar_type); + std::vector > send_buf_extract(Nsimd,std::vector(buffer_size) ); + std::vector > recv_buf_extract(Nsimd,std::vector(buffer_size) ); + int bytes = buffer_size*sizeof(scalar_object); - std::vector pointers(Nsimd); // - std::vector rpointers(Nsimd); // received pointers + std::vector pointers(Nsimd); // + std::vector rpointers(Nsimd); // received pointers /////////////////////////////////////////// // Work out what to send where @@ -353,62 +262,77 @@ Gather_plane_extract(const Lattice &rhs,std::vectorCheckerBoardShift(rhs.checkerboard,dimension,shift,cb); - + // loop over outer coord planes orthog to dim for(int x=0;x(rhs,pointers,dimension,sx,cbmask,compress); - std::cout<< "Gathered "<>(permute_type+1)); - int ic= (i&inner_bit)? 1:0; - - int my_coor = rd*ic + x; - int nbr_coor = my_coor+sshift; - int nbr_proc = ((nbr_coor)/ld) % pd;// relative shift in processors - - int nbr_ic = (nbr_coor%ld)/rd; // inner coord of peer - int nbr_ox = (nbr_coor%rd); // outer coord of peer - int nbr_lane = (i&(~inner_bit)); - - int recv_from_rank; - int xmit_to_rank; - - if (nbr_ic) nbr_lane|=inner_bit; - assert (sx == nbr_ox); - - if(nbr_proc){ - - std::cout<< "MPI sending "<ShiftedRanks(dimension,nbr_proc,xmit_to_rank,recv_from_rank); - - _grid->SendToRecvFrom((void *)&send_buf_extract[nbr_lane][0], - xmit_to_rank, - (void *)&recv_buf_extract[i][0], - recv_from_rank, - bytes); - std::cout<< "MPI complete "<= rd ); + std::cout<<"any_offnode ="<(rhs,pointers,dimension,sx,cbmask,compress); + std::cout<< "Gathered "< icoor; + _grid->iCoorFromIindex(icoor,i); - // Here we don't want to scatter, just place into a buffer. - std::cout<< "merging "<>(permute_type+1)); + int ic= (i&inner_bit)? 1:0; + assert(ic==icoor[dimension]); + int my_coor = rd*ic + x; + int nbr_coor = my_coor+sshift; + int nbr_proc = ((nbr_coor)/ld) % pd;// relative shift in processors + int nbr_lcoor= (nbr_coor%ld); + int nbr_ic = (nbr_lcoor)/rd; // inner coord of peer + int nbr_ox = (nbr_lcoor%rd); // outer coord of peer + int nbr_lane = (i&(~inner_bit)); + + int recv_from_rank; + int xmit_to_rank; + + if (nbr_ic) nbr_lane|=inner_bit; + assert (sx == nbr_ox); + + std::cout<<"nbr_proc "<ShiftedRanks(dimension,nbr_proc,xmit_to_rank,recv_from_rank); + + _grid->SendToRecvFrom((void *)&send_buf_extract[nbr_lane][0], + xmit_to_rank, + (void *)&recv_buf_extract[i][0], + recv_from_rank, + bytes); + std::cout<< "MPI complete "< &ret,const Lattice &predicate,Lattice &ret,const Lattice &predicate,Lattice mask(Nsimd); - std::vector > truevals (Nsimd,std::vector(words) ); - std::vector > falsevals(Nsimd,std::vector(words) ); - std::vector pointers(Nsimd); + std::vector truevals (Nsimd); + std::vector falsevals(Nsimd); #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ - for(int s=0;s(TensorRemove(predicate._odata[ss]),mask); for(int s=0;s +class SimpleCompressor { +public: + void Point(int) {}; + + vobj operator() (const vobj &arg) { + return arg; + } +}; + +/////////////////////////////////////////////////////////////////// +// Gather for when there is no need to SIMD split with compression +/////////////////////////////////////////////////////////////////// +template void +Gather_plane_simple (const Lattice &rhs,std::vector > &buffer,int dimension,int plane,int cbmask,compressor &compress) +{ + int rd = rhs._grid->_rdimensions[dimension]; + + if ( !rhs._grid->CheckerBoarded(dimension) ) { + cbmask = 0x3; + } + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + int ocb=1<CheckerBoardFromOindex(o+b);// Could easily be a table lookup + if ( ocb &cbmask ) { + buffer[bo]=compress(rhs._odata[so+o+b]); + bo++; + } + } + o +=rhs._grid->_slice_stride[dimension]; + } +} + + +/////////////////////////////////////////////////////////////////// +// Gather for when there *is* need to SIMD split with compression +/////////////////////////////////////////////////////////////////// +template void +Gather_plane_extract(const Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask,compressor &compress) +{ + int rd = rhs._grid->_rdimensions[dimension]; + + if ( !rhs._grid->CheckerBoarded(dimension) ) { + cbmask = 0x3; + } + + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer + +#pragma omp parallel for collapse(2) + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int offset = b+n*rhs._grid->_slice_block[dimension]; + + int ocb=1<CheckerBoardFromOindex(o+b); + if ( ocb & cbmask ) { + cobj temp; + temp =compress(rhs._odata[so+o+b]); + extract(temp,pointers,offset); + } + + } + o +=rhs._grid->_slice_stride[dimension]; + } +} + ////////////////////////////////////////////////////// // Gather for when there is no need to SIMD split ////////////////////////////////////////////////////// template void Gather_plane_simple (const Lattice &rhs,std::vector > &buffer, int dimension,int plane,int cbmask) { - int rd = rhs._grid->_rdimensions[dimension]; - - if ( !rhs._grid->CheckerBoarded(dimension) ) { - - int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - int bo = 0; // offset in buffer - - // Simple block stride gather of SIMD objects -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - buffer[bo++]=rhs._odata[so+o+b]; - } - o +=rhs._grid->_slice_stride[dimension]; - } - - } else { - - int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - int bo = 0; // offset in buffer - -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int ocb=1<CheckerBoardFromOindex(o+b);// Could easily be a table lookup - if ( ocb &cbmask ) { - buffer[bo]=rhs._odata[so+o+b]; - bo++; - } - - } - o +=rhs._grid->_slice_stride[dimension]; - } - } + SimpleCompressor dontcompress; + Gather_plane_simple (rhs,buffer,dimension,plane,cbmask,dontcompress); } ////////////////////////////////////////////////////// // Gather for when there *is* need to SIMD split ////////////////////////////////////////////////////// - template void Gather_plane_extract(const Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask) +template void Gather_plane_extract(const Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask) { - int rd = rhs._grid->_rdimensions[dimension]; - - if ( !rhs._grid->CheckerBoarded(dimension) ) { - - int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - int bo = 0; // offset in buffer - - // Simple block stride gather of SIMD objects -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - extract(rhs._odata[so+o+b],pointers); - } - o +=rhs._grid->_slice_stride[dimension]; - } - - } else { - - int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - int bo = 0; // offset in buffer - -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int ocb=1<CheckerBoardFromOindex(o+b); - if ( ocb & cbmask ) { - extract(rhs._odata[so+o+b],pointers); - } - - } - o +=rhs._grid->_slice_stride[dimension]; - } - } + SimpleCompressor dontcompress; + Gather_plane_extract(rhs,pointers,dimension,plane,cbmask,dontcompress); } ////////////////////////////////////////////////////// // Scatter for when there is no need to SIMD split ////////////////////////////////////////////////////// -template void Scatter_plane_simple (Lattice &rhs,std::vector > &buffer, int dimension,int plane,int cbmask) +template void Scatter_plane_simple (Lattice &rhs,std::vector > &buffer, int dimension,int plane,int cbmask) { int rd = rhs._grid->_rdimensions[dimension]; if ( !rhs._grid->CheckerBoarded(dimension) ) { + cbmask=0x3; + } - int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - int bo = 0; // offset in buffer - - // Simple block stride gather of SIMD objects -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - rhs._odata[so+o+b]=buffer[bo++]; - } - o +=rhs._grid->_slice_stride[dimension]; - } - - } else { - - int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - int bo = 0; // offset in buffer + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer #pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int ocb=1<CheckerBoardFromOindex(o+b);// Could easily be a table lookup - if ( ocb & cbmask ) { - rhs._odata[so+o+b]=buffer[bo++]; - } + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + int ocb=1<CheckerBoardFromOindex(o+b);// Could easily be a table lookup + if ( ocb & cbmask ) { + rhs._odata[so+o+b]=buffer[bo++]; } - o +=rhs._grid->_slice_stride[dimension]; + } + o +=rhs._grid->_slice_stride[dimension]; } } ////////////////////////////////////////////////////// // Scatter for when there *is* need to SIMD split ////////////////////////////////////////////////////// - template void Scatter_plane_merge(Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask) + template void Scatter_plane_merge(Lattice &rhs,std::vector pointers,int dimension,int plane,int cbmask) { int rd = rhs._grid->_rdimensions[dimension]; if ( !rhs._grid->CheckerBoarded(dimension) ) { + cbmask=0x3; + } - int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - int bo = 0; // offset in buffer - - // Simple block stride gather of SIMD objects -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - merge(rhs._odata[so+o+b],pointers); - } - o +=rhs._grid->_slice_stride[dimension]; - } - - } else { - - int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - int bo = 0; // offset in buffer + int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + int bo = 0; // offset in buffer #pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int ocb=1<CheckerBoardFromOindex(o+b); - if ( ocb&cbmask ) { - merge(rhs._odata[so+o+b],pointers); - } + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + int offset = b+n*rhs._grid->_slice_block[dimension]; + int ocb=1<CheckerBoardFromOindex(o+b); + if ( ocb&cbmask ) { + merge(rhs._odata[so+o+b],pointers,offset); } - o +=rhs._grid->_slice_stride[dimension]; + } + o +=rhs._grid->_slice_stride[dimension]; } } @@ -183,40 +162,26 @@ template void Copy_plane(Lattice& lhs,Lattice &rhs, int int rd = rhs._grid->_rdimensions[dimension]; if ( !rhs._grid->CheckerBoarded(dimension) ) { + cbmask=0x3; + } - int o = 0; // relative offset to base within plane - int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int lo = lplane*lhs._grid->_ostride[dimension]; // offset in buffer - // Simple block stride gather of SIMD objects + int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + #pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int ocb=1<CheckerBoardFromOindex(o+b); + + if ( ocb&cbmask ) { lhs._odata[lo+o+b]=rhs._odata[ro+o+b]; } - o +=rhs._grid->_slice_stride[dimension]; + } - - } else { - - int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int ocb=1<CheckerBoardFromOindex(o+b); - - if ( ocb&cbmask ) { - lhs._odata[lo+o+b]=rhs._odata[ro+o+b]; - } - - } - o +=rhs._grid->_slice_stride[dimension]; - } - + o +=rhs._grid->_slice_stride[dimension]; } } @@ -224,42 +189,25 @@ template void Copy_plane_permute(Lattice& lhs,Lattice &r { int rd = rhs._grid->_rdimensions[dimension]; - if ( !rhs._grid->CheckerBoarded(dimension) ) { + cbmask=0x3; + } - int o = 0; // relative offset to base within plane - int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int lo = lplane*rhs._grid->_ostride[dimension]; // offset in buffer - - // Simple block stride gather of SIMD objects + int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane + int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane + int o = 0; // relative offset to base within plane + #pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ + for(int n=0;n_slice_nblock[dimension];n++){ + for(int b=0;b_slice_block[dimension];b++){ + + int ocb=1<CheckerBoardFromOindex(o+b); + if ( ocb&cbmask ) { permute(lhs._odata[lo+o+b],rhs._odata[ro+o+b],permute_type); } - o +=rhs._grid->_slice_stride[dimension]; + } - - } else { - - int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane - int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - -#pragma omp parallel for collapse(2) - for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - - int ocb=1<CheckerBoardFromOindex(o+b); - - if ( ocb&cbmask ) { - permute(lhs._odata[lo+o+b],rhs._odata[ro+o+b],permute_type); - } - - } - o +=rhs._grid->_slice_stride[dimension]; - } - + o +=rhs._grid->_slice_stride[dimension]; } } diff --git a/lib/cshift/Grid_cshift_mpi.h b/lib/cshift/Grid_cshift_mpi.h index ab9237ad..7c77ebc9 100644 --- a/lib/cshift/Grid_cshift_mpi.h +++ b/lib/cshift/Grid_cshift_mpi.h @@ -133,6 +133,7 @@ template void Cshift_comms_simd(Lattice &ret,Lattice &r GridBase *grid=rhs._grid; const int Nsimd = grid->Nsimd(); typedef typename vobj::vector_type vector_type; + typedef typename vobj::scalar_object scalar_object; typedef typename vobj::scalar_type scalar_type; int fd = grid->_fdimensions[dimension]; @@ -155,12 +156,12 @@ template void Cshift_comms_simd(Lattice &ret,Lattice &r int buffer_size = grid->_slice_nblock[dimension]*grid->_slice_block[dimension]; int words = sizeof(vobj)/sizeof(vector_type); - std::vector > send_buf_extract(Nsimd,std::vector(buffer_size*words) ); - std::vector > recv_buf_extract(Nsimd,std::vector(buffer_size*words) ); - int bytes = buffer_size*words*sizeof(scalar_type); + std::vector > send_buf_extract(Nsimd,std::vector(buffer_size) ); + std::vector > recv_buf_extract(Nsimd,std::vector(buffer_size) ); + int bytes = buffer_size*sizeof(scalar_object); - std::vector pointers(Nsimd); // - std::vector rpointers(Nsimd); // received pointers + std::vector pointers(Nsimd); // + std::vector rpointers(Nsimd); // received pointers /////////////////////////////////////////// // Work out what to send where @@ -171,10 +172,9 @@ template void Cshift_comms_simd(Lattice &ret,Lattice &r // loop over outer coord planes orthog to dim for(int x=0;x void Cshift_comms_simd(Lattice &ret,Lattice &r recv_from_rank, bytes); - rpointers[i] = (scalar_type *)&recv_buf_extract[i][0]; + rpointers[i] = &recv_buf_extract[i][0]; } else { - rpointers[i] = (scalar_type *)&send_buf_extract[nbr_lane][0]; + rpointers[i] = &send_buf_extract[nbr_lane][0]; } } diff --git a/lib/lattice/Grid_lattice_coordinate.h b/lib/lattice/Grid_lattice_coordinate.h index 8fba8b1b..a9b381fa 100644 --- a/lib/lattice/Grid_lattice_coordinate.h +++ b/lib/lattice/Grid_lattice_coordinate.h @@ -5,21 +5,23 @@ namespace Grid { template inline void LatticeCoordinate(Lattice &l,int mu) { + typedef typename iobj::scalar_object scalar_object; typedef typename iobj::scalar_type scalar_type; typedef typename iobj::vector_type vector_type; + GridBase *grid = l._grid; int Nsimd = grid->iSites(); + std::vector gcoor; std::vector mergebuf(Nsimd); - std::vector mergeptr(Nsimd); + vector_type vI; for(int o=0;ooSites();o++){ for(int i=0;iiSites();i++){ grid->RankIndexToGlobalCoor(grid->ThisRank(),o,i,gcoor); - mergebuf[i]=gcoor[mu]; - mergeptr[i]=&mergebuf[i]; + mergebuf[i]=(Integer)gcoor[mu]; } - merge(vI,mergeptr); + AmergeA(vI,mergebuf); l._odata[o]=vI; } }; diff --git a/lib/lattice/Grid_lattice_peekpoke.h b/lib/lattice/Grid_lattice_peekpoke.h index 93245016..ae87c5d8 100644 --- a/lib/lattice/Grid_lattice_peekpoke.h +++ b/lib/lattice/Grid_lattice_peekpoke.h @@ -94,15 +94,12 @@ namespace Grid { grid->Broadcast(grid->BossRank(),s); std::vector buf(Nsimd); - std::vector pointers(Nsimd); // extract-modify-merge cycle is easiest way and this is not perf critical if ( rank == grid->ThisRank() ) { - for(int i=0;iGlobalCoorToRankIndex(rank,odx,idx,site); - std::vector buf(Nsimd); - std::vector pointers(Nsimd); - for(int i=0;i buf(Nsimd); + extract(l._odata[odx],buf); + s = buf[idx]; + grid->Broadcast(rank,s); return; @@ -160,10 +156,8 @@ namespace Grid { odx= grid->oIndex(site); std::vector buf(Nsimd); - std::vector pointers(Nsimd); - for(int i=0;ioIndex(site); std::vector buf(Nsimd); - std::vector pointers(Nsimd); - for(int i=0;i buf(Nsimd); - std::vector pointers(Nsimd); - for(int i=0;i void fillScalar(scalar &s,distribution &dist,generator & gen) + { + s=dist(gen); + } + template void fillScalar(ComplexF &s,distribution &dist, generator &gen) + { + s=ComplexF(dist(gen),dist(gen)); + } + template void fillScalar(ComplexD &s,distribution &dist,generator &gen) + { + s=ComplexD(dist(gen),dist(gen)); + } + class GridRNGbase { public: @@ -64,20 +77,6 @@ namespace Grid { } - // real scalars are one component - template void fillScalar(scalar &s,distribution &dist) - { - s=dist(_generators[0]); - } - template void fillScalar(ComplexF &s,distribution &dist) - { - s=ComplexF(dist(_generators[0]),dist(_generators[0])); - } - template void fillScalar(ComplexD &s,distribution &dist) - { - s=ComplexD(dist(_generators[0]),dist(_generators[0])); - } - template inline void fill(sobj &l,distribution &dist){ @@ -88,7 +87,7 @@ namespace Grid { scalar_type *buf = (scalar_type *) & l; for(int idx=0;idx inline void fill(ComplexF &l,distribution &dist){ - fillScalar(l,dist); + fillScalar(l,dist,_generators[0]); CartesianCommunicator::BroadcastWorld(0,(void *)&l,sizeof(l)); } template inline void fill(ComplexD &l,distribution &dist){ - fillScalar(l,dist); + fillScalar(l,dist,_generators[0]); CartesianCommunicator::BroadcastWorld(0,(void *)&l,sizeof(l)); } template inline void fill(RealF &l,distribution &dist){ - fillScalar(l,dist); + fillScalar(l,dist,_generators[0]); CartesianCommunicator::BroadcastWorld(0,(void *)&l,sizeof(l)); } template inline void fill(RealD &l,distribution &dist){ - fillScalar(l,dist); + fillScalar(l,dist,_generators[0]); CartesianCommunicator::BroadcastWorld(0,(void *)&l,sizeof(l)); } // vector fill template inline void fill(vComplexF &l,distribution &dist){ RealF *pointer=(RealF *)&l; for(int i=0;i<2*vComplexF::Nsimd();i++){ - fillScalar(pointer[i],dist); + fillScalar(pointer[i],dist,_generators[0]); } CartesianCommunicator::BroadcastWorld(0,(void *)&l,sizeof(l)); } template inline void fill(vComplexD &l,distribution &dist){ RealD *pointer=(RealD *)&l; for(int i=0;i<2*vComplexD::Nsimd();i++){ - fillScalar(pointer[i],dist); + fillScalar(pointer[i],dist,_generators[0]); } CartesianCommunicator::BroadcastWorld(0,(void *)&l,sizeof(l)); } template inline void fill(vRealF &l,distribution &dist){ RealF *pointer=(RealF *)&l; for(int i=0;i inline void fill(vRealD &l,distribution &dist){ RealD *pointer=(RealD *)&l; for(int i=0;i gcoor; - for(int gidx=0;gidx<_grid->_gsites;gidx++){ + int gsites = _grid->_gsites; + + typename source::result_type init = src(); + std::ranlux48 pseeder(init); + std::uniform_int_distribution ui; + + for(int gidx=0;gidxGlobalIndexToGlobalCoor(gidx,gcoor); _grid->GlobalCoorToRankIndex(rank,o_idx,i_idx,gcoor); int l_idx=generator_idx(o_idx,i_idx); + + std::vector site_seeds(4); + for(int i=0;i<4;i++){ + site_seeds[i]= ui(pseeder); + } - typename source::result_type init = src(); + _grid->Broadcast(0,(void *)&site_seeds[0],sizeof(int)*site_seeds.size()); - _grid->Broadcast(0,(void *)&init,sizeof(init)); if( rank == _grid->ThisRank() ){ - _generators[l_idx] = std::ranlux48(init); + fixedSeed ssrc(site_seeds); + typename source::result_type sinit = ssrc(); + _generators[l_idx] = std::ranlux48(sinit); } } _seeded=1; @@ -210,6 +222,7 @@ namespace Grid { template inline void fill(Lattice &l,distribution &dist){ + typedef typename vobj::scalar_object scalar_object; typedef typename vobj::scalar_type scalar_type; typedef typename vobj::vector_type vector_type; @@ -217,25 +230,22 @@ namespace Grid { int Nsimd =_grid->Nsimd(); int osites=_grid->oSites(); + int words=sizeof(scalar_object)/sizeof(scalar_type); - int words = sizeof(vobj)/sizeof(vector_type); - std::vector > buf(Nsimd,std::vector(words)); - std::vector pointers(Nsimd); + std::vector buf(Nsimd); for(int ss=0;ss &out,const iScalar &in,int permutetype){ permute(out._internal,in._internal,permutetype); } - friend void extract(const iScalar &in,std::vector &out){ - extract(in._internal,out); // extract advances the pointers in out - } - friend void merge(iScalar &in,std::vector &out){ - merge(in._internal,out); // extract advances the pointers in out - } // Unary negation friend inline iScalar operator -(const iScalar &r) { @@ -149,16 +143,6 @@ public: permute(out._internal[i],in._internal[i],permutetype); } } - friend void extract(const iVector &in,std::vector &out){ - for(int i=0;i &in,std::vector &out){ - for(int i=0;i operator -(const iVector &r) { iVector ret; @@ -232,18 +216,6 @@ public: permute(out._internal[i][j],in._internal[i][j],permutetype); }} } - friend void extract(const iMatrix &in,std::vector &out){ - for(int i=0;i &in,std::vector &out){ - for(int i=0;i operator -(const iMatrix &r) { iMatrix ret; @@ -285,37 +257,6 @@ public: }; -template inline -void extract(const vobj &vec,std::vector &extracted) -{ - typedef typename vobj::scalar_type scalar_type ; - typedef typename vobj::vector_type vector_type ; - - int Nsimd=vobj::vector_type::Nsimd(); - - extracted.resize(Nsimd); - - std::vector pointers(Nsimd); - for(int i=0;i inline -void merge(vobj &vec,std::vector &extracted) -{ - typedef typename vobj::scalar_type scalar_type ; - typedef typename vobj::vector_type vector_type ; - - int Nsimd=vobj::vector_type::Nsimd(); - assert(extracted.size()==Nsimd); - - std::vector pointers(Nsimd); - for(int i=0;i class GridTypeMapper { + public: + typedef Integer scalar_type; + typedef Integer vector_type; + typedef Integer tensor_reduced; + typedef Integer scalar_object; + enum { TensorLevel = 0 }; + }; template<> class GridTypeMapper { public: @@ -99,10 +107,10 @@ namespace Grid { }; template<> class GridTypeMapper { public: - typedef Integer scalar_type; + typedef Integer scalar_type; typedef vInteger vector_type; typedef vInteger tensor_reduced; - typedef Integer scalar_object; + typedef Integer scalar_object; enum { TensorLevel = 0 }; }; diff --git a/lib/qcd/Grid_qcd_wilson_dop.cc b/lib/qcd/Grid_qcd_wilson_dop.cc index b1d6d525..1e2741b4 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.cc +++ b/lib/qcd/Grid_qcd_wilson_dop.cc @@ -99,106 +99,159 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) for(int ss=0;ssoSites();ss++){ - int offset,local; + int offset,local,perm, ptype; vSpinColourVector result; vHalfSpinColourVector chi; + vHalfSpinColourVector tmp; vHalfSpinColourVector Uchi; vHalfSpinColourVector *chi_p; result=zero; -#if 0 // Xp offset = Stencil._offsets [Xp][ss]; local = Stencil._is_local[Xp][ss]; + perm = Stencil._permute[Xp][ss]; + ptype = Stencil._permute_type[Xp]; chi_p = &comm_buf[offset]; if ( local ) { - spProjXp(chi,in._odata[offset]); chi_p = χ - } + spProjXp(chi,in._odata[offset]); + if ( perm ) { + permute(tmp,chi,ptype); + chi_p = &tmp; + } + } mult(&(Uchi()),&(Umu._odata[ss](Xp)),&(*chi_p)()); spReconXp(result,Uchi); // Yp offset = Stencil._offsets [Yp][ss]; local = Stencil._is_local[Yp][ss]; + perm = Stencil._permute[Yp][ss]; + ptype = Stencil._permute_type[Yp]; chi_p = &comm_buf[offset]; if ( local ) { - spProjYp(chi,in._odata[offset]); chi_p = χ - } + spProjYp(chi,in._odata[offset]); + if ( perm ) { + permute(tmp,chi,ptype); + chi_p = &tmp; + } + } mult(&(Uchi()),&(Umu._odata[ss](Yp)),&(*chi_p)()); accumReconYp(result,Uchi); // Zp offset = Stencil._offsets [Zp][ss]; local = Stencil._is_local[Zp][ss]; + perm = Stencil._permute[Zp][ss]; + ptype = Stencil._permute_type[Zp]; chi_p = &comm_buf[offset]; + if ( local ) { - spProjZp(chi,in._odata[offset]); chi_p = χ - } - mult(&(Uchi()),&(Umu._odata[ss](Zp)),&(*chi_p)() ); + spProjZp(chi,in._odata[offset]); + if ( perm ) { + permute(tmp,chi,ptype); + chi_p = &tmp; + } + } + mult(&(Uchi()),&(Umu._odata[ss](Zp)),&(*chi_p)()); accumReconZp(result,Uchi); // Tp offset = Stencil._offsets [Tp][ss]; local = Stencil._is_local[Tp][ss]; + perm = Stencil._permute[Tp][ss]; + ptype = Stencil._permute_type[Tp]; chi_p = &comm_buf[offset]; + if ( local ) { - spProjTp(chi,in._odata[offset]); chi_p = χ - } + spProjTp(chi,in._odata[offset]); + if ( perm ) { + permute(tmp,chi,ptype); + chi_p = &tmp; + } + } mult(&(Uchi()),&(Umu._odata[ss](Tp)),&(*chi_p)()); accumReconTp(result,Uchi); -#endif // Xm offset = Stencil._offsets [Xm][ss]; local = Stencil._is_local[Xm][ss]; + perm = Stencil._permute[Xm][ss]; + ptype = Stencil._permute_type[Xm]; chi_p = &comm_buf[offset]; if ( local ) { - spProjXm(chi,in._odata[offset]); chi_p = χ - } + spProjXm(chi,in._odata[offset]); + if ( perm ) { + permute(tmp,chi,ptype); + chi_p = &tmp; + } + } + std::cout<<"Xm for site "<(y,b,perm); @@ -183,6 +184,7 @@ namespace Grid { { Gextract(y,extracted); } + */ /////////////////////// // Splat diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index fb9c5a67..c42e4029 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -412,6 +412,7 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ { Gpermute(y,b,perm); } + /* friend inline void merge(vComplexF &y,std::vector &extracted) { Gmerge(y,extracted); @@ -428,7 +429,7 @@ friend inline void vstore(const vComplexF &ret, ComplexF *a){ { Gextract(y,extracted); } - + */ }; diff --git a/lib/simd/Grid_vInteger.h b/lib/simd/Grid_vInteger.h index 5dc77444..6035aea1 100644 --- a/lib/simd/Grid_vInteger.h +++ b/lib/simd/Grid_vInteger.h @@ -221,6 +221,7 @@ namespace Grid { { Gpermute(y,b,perm); } + /* friend inline void merge(vInteger &y,std::vector &extracted) { Gmerge(y,extracted); @@ -237,7 +238,7 @@ namespace Grid { { Gextract(y,extracted); } - + */ public: static inline int Nsimd(void) { return sizeof(ivec)/sizeof(Integer);} diff --git a/lib/simd/Grid_vRealD.h b/lib/simd/Grid_vRealD.h index f6d68963..36e189e1 100644 --- a/lib/simd/Grid_vRealD.h +++ b/lib/simd/Grid_vRealD.h @@ -105,6 +105,7 @@ namespace Grid { // all subtypes; may not be a good assumption, but could // add the vector width as a template param for BG/Q for example //////////////////////////////////////////////////////////////////// + /* friend inline void permute(vRealD &y,vRealD b,int perm) { Gpermute(y,b,perm); @@ -125,7 +126,7 @@ namespace Grid { { Gextract(y,extracted); } - + */ friend inline void vsplat(vRealD &ret,double a){ #if defined (AVX1)|| defined (AVX2) diff --git a/lib/simd/Grid_vRealF.h b/lib/simd/Grid_vRealF.h index 86895492..70f76bc0 100644 --- a/lib/simd/Grid_vRealF.h +++ b/lib/simd/Grid_vRealF.h @@ -127,6 +127,7 @@ namespace Grid { // all subtypes; may not be a good assumption, but could // add the vector width as a template param for BG/Q for example //////////////////////////////////////////////////////////////////// + /* friend inline void permute(vRealF &y,vRealF b,int perm) { Gpermute(y,b,perm); @@ -147,7 +148,7 @@ namespace Grid { { Gextract(y,extracted); } - + */ ///////////////////////////////////////////////////// diff --git a/lib/stencil/Grid_stencil_common.cc b/lib/stencil/Grid_stencil_common.cc index c245aafb..fda4ef2e 100644 --- a/lib/stencil/Grid_stencil_common.cc +++ b/lib/stencil/Grid_stencil_common.cc @@ -118,6 +118,7 @@ namespace Grid { int fd = _grid->_fdimensions[dimension]; int rd = _grid->_rdimensions[dimension]; + int pd = _grid->_processors[dimension]; int simd_layout = _grid->_simd_layout[dimension]; int comm_dim = _grid->_processors[dimension] >1 ; @@ -136,10 +137,10 @@ namespace Grid { for(int x=0;x= rd ); + int comm_proc = ((x+sshift)/rd)%pd; + int offnode = (comm_proc!=0); int sx = (x+sshift)%rd; - int comm_proc = (x+sshift)/rd; - + if (!offnode) { int permute_slice=0; diff --git a/tests/Grid_simd.cc b/tests/Grid_simd.cc index 364b13e8..1de2ad1f 100644 --- a/tests/Grid_simd.cc +++ b/tests/Grid_simd.cc @@ -75,9 +75,9 @@ void Tester(const functor &func) random(sRNG,result[i]); } - Gmerge(v_input1,input1); - Gmerge(v_input2,input2); - Gmerge(v_result,result); + merge(v_input1,input1); + merge(v_input2,input2); + merge(v_result,result); func(v_result,v_input1,v_input2); @@ -85,7 +85,7 @@ void Tester(const functor &func) func(reference[i],input1[i],input2[i]); } - Gextract(v_result,result); + extract(v_result,result); std::cout << " " << func.name()< -class SimpleCompressor { -public: - void Point(int) {}; - - vobj operator() (const vobj &arg) { - return arg; - } -}; int main (int argc, char ** argv) { Grid_init(&argc,&argv); std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({2,2,2,2}); + std::vector mpi_layout ({2,2,1,2}); std::vector latt_size ({8,8,8,8}); double volume = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; @@ -26,7 +17,9 @@ int main (int argc, char ** argv) GridCartesian Fine(latt_size,simd_layout,mpi_layout); GridRedBlackCartesian rbFine(latt_size,simd_layout,mpi_layout); GridParallelRNG fRNG(&Fine); - fRNG.SeedRandomDevice(); + // fRNG.SeedRandomDevice(); + std::vector seeds({1,2,3,4}); + fRNG.SeedFixedIntegers(seeds); LatticeColourMatrix Foo(&Fine); LatticeColourMatrix Bar(&Fine); @@ -38,8 +31,9 @@ int main (int argc, char ** argv) for(int dir=0;dir<4;dir++){ - for(int disp=0;disp directions(npoint,dir); @@ -47,22 +41,13 @@ int main (int argc, char ** argv) CartesianStencil myStencil(&Fine,npoint,0,directions,displacements); - printf("STENCIL: osites %d %d dir %d disp %d\n",Fine.oSites(),(int)myStencil._offsets[0].size(),dir,disp); std::vector ocoor(4); for(int o=0;o > comm_buf(myStencil._unified_buffer_size); - printf("calling halo exchange\n");fflush(stdout); SimpleCompressor compress; myStencil.HaloExchange(Foo,comm_buf,compress); @@ -81,14 +66,12 @@ int main (int argc, char ** argv) Check._odata[i] = Foo._odata[offset]; else Check._odata[i] = comm_buf[offset]; - - } Real nrmC = norm2(Check); Real nrmB = norm2(Bar); Real nrm = norm2(Check-Bar); - printf("N2diff = %le (%le, %le) \n",nrm,nrmC,nrmB);fflush(stdout); + std::cout<<"N2diff ="< 0){ - printf("Coor (%d %d %d %d) \t rc %d%d \t %le %le %le\n", + printf("Coor (%d %d %d %d) \t rc %d%d \t %le (%le,%le) %le\n", coor[0],coor[1],coor[2],coor[3],r,c, nn, real(check()()(r,c)), + imag(check()()(r,c)), real(bar()()(r,c)) ); } @@ -124,7 +108,7 @@ int main (int argc, char ** argv) }}}} - printf("scalar N2diff = %le (%le, %le) \n",snrm,snrmC,snrmB);fflush(stdout); + std::cout<<"scalar N2diff = "< seeds({1,2,3,4}); GridParallelRNG pRNG(&Grid); + // std::vector seeds({1,2,3,4}); // pRNG.SeedFixedIntegers(seeds); pRNG.SeedRandomDevice(); @@ -44,7 +45,7 @@ int main (int argc, char ** argv) U[mu] = peekIndex<3>(Umu,mu); } - std::vector mask({0,0,0,0,1,0,0,0}); + std::vector mask({1,1,1,1,1,1,1,1}); { // Naive wilson implementation ref = zero; for(int mu=0;mu Date: Wed, 29 Apr 2015 06:23:56 +0100 Subject: [PATCH 109/429] Fixed the stencil sector and Wilson now agrees between stencil based implementation and the cshift based implementation. Managed to reduce the volume of code in this sector a little, but consolidation would be good, perhaps taking common logic out into simple helper functions --- lib/Grid_stencil.h | 40 ++++++------------------------ lib/qcd/Grid_qcd_wilson_dop.cc | 2 -- lib/stencil/Grid_stencil_common.cc | 21 ++++++---------- tests/Grid_wilson.cc | 5 ++-- 4 files changed, 17 insertions(+), 51 deletions(-) diff --git a/lib/Grid_stencil.h b/lib/Grid_stencil.h index fdc8ece9..4d32575f 100644 --- a/lib/Grid_stencil.h +++ b/lib/Grid_stencil.h @@ -39,13 +39,6 @@ namespace Grid { - struct CommsRequest { - int words; - int unified_buffer_offset; - int tag; - int to_rank; - int from_rank; - } ; class CartesianStencil { // Stencil runs along coordinate axes only; NO diagonal fill in. @@ -69,7 +62,6 @@ namespace Grid { int _unified_buffer_size; int _request_count; - std::vector CommsRequests; CartesianStencil(GridBase *grid, int npoints, @@ -90,7 +82,6 @@ namespace Grid { template void HaloExchange(const Lattice &source,std::vector > &u_comm_buf,compressor &compress) { - std::cout<< "HaloExchange comm_buf.size()="<< u_comm_buf.size()<<" unified_buffer_size"<< _unified_buffer_size<< std::endl; // conformable(source._grid,_grid); assert(source._grid==_grid); if (u_comm_buf.size() != _unified_buffer_size ) u_comm_buf.resize(_unified_buffer_size); @@ -141,7 +132,6 @@ namespace Grid { } } } - std::cout<< "HaloExchange complete"<< std::endl; } template @@ -194,24 +184,18 @@ namespace Grid { _grid->ShiftedRanks(dimension,comm_proc,xmit_to_rank,recv_from_rank); assert (xmit_to_rank != _grid->ThisRank()); assert (recv_from_rank != _grid->ThisRank()); + // FIXME Implement asynchronous send & also avoid buffer copy _grid->SendToRecvFrom((void *)&send_buf[0], xmit_to_rank, (void *)&recv_buf[0], recv_from_rank, bytes); - printf("GatherStartComms communicated offnode x %d\n",x);fflush(stdout); - printf("GatherStartComms inserting %le to u_comm_offset %d buf size %d for dim %d shift %d\n", - *( (RealF *) &recv_buf[0]), - u_comm_offset,buffer_size, - dimension,shift - ); fflush(stdout); for(int i=0;i_slice_nblock[dimension]*_grid->_slice_block[dimension]; int words = sizeof(cobj)/sizeof(vector_type); - /* FIXME ALTERNATE BUFFER DETERMINATION */ + /* FIXME ALTERNATE BUFFER DETERMINATION ; possibly slow to allocate*/ std::vector > send_buf_extract(Nsimd,std::vector(buffer_size) ); std::vector > recv_buf_extract(Nsimd,std::vector(buffer_size) ); int bytes = buffer_size*sizeof(scalar_object); @@ -267,25 +251,21 @@ namespace Grid { for(int x=0;x= rd ); - std::cout<<"any_offnode ="<(rhs,pointers,dimension,sx,cbmask,compress); - std::cout<< "Gathered "< icoor; - _grid->iCoorFromIindex(icoor,i); int inner_bit = (Nsimd>>(permute_type+1)); int ic= (i&inner_bit)? 1:0; - assert(ic==icoor[dimension]); int my_coor = rd*ic + x; int nbr_coor = my_coor+sshift; @@ -301,12 +281,9 @@ namespace Grid { if (nbr_ic) nbr_lane|=inner_bit; assert (sx == nbr_ox); - std::cout<<"nbr_proc "<ShiftedRanks(dimension,nbr_proc,xmit_to_rank,recv_from_rank); _grid->SendToRecvFrom((void *)&send_buf_extract[nbr_lane][0], @@ -314,23 +291,20 @@ namespace Grid { (void *)&recv_buf_extract[i][0], recv_from_rank, bytes); - std::cout<< "MPI complete "<oSites(); @@ -117,6 +116,7 @@ namespace Grid { GridBase *grid=_grid; int fd = _grid->_fdimensions[dimension]; + int ld = _grid->_ldimensions[dimension]; int rd = _grid->_rdimensions[dimension]; int pd = _grid->_processors[dimension]; int simd_layout = _grid->_simd_layout[dimension]; @@ -137,9 +137,10 @@ namespace Grid { for(int x=0;x= rd ); + // int comm_proc = ((x+sshift)/ld)%pd; + // int offnode = (comm_proc!=0); + int sx = (x+sshift)%rd; if (!offnode) { @@ -157,17 +158,9 @@ namespace Grid { int recv_from_rank; int xmit_to_rank; - CommsRequest cr; - - cr.tag = _request_count++; - cr.words = words; - cr.unified_buffer_offset = _unified_buffer_size; + int unified_buffer_offset = _unified_buffer_size; _unified_buffer_size += words; - grid->ShiftedRanks(dimension,comm_proc,cr.to_rank,cr.from_rank); - - CommsRequests.push_back(cr); - - ScatterPlane(point,dimension,x,cbmask,cr.unified_buffer_offset); // permute/extract/merge is done in comms phase + ScatterPlane(point,dimension,x,cbmask,unified_buffer_offset); // permute/extract/merge is done in comms phase } } diff --git a/tests/Grid_wilson.cc b/tests/Grid_wilson.cc index b510e9d2..4f926689 100644 --- a/tests/Grid_wilson.cc +++ b/tests/Grid_wilson.cc @@ -21,7 +21,7 @@ int main (int argc, char ** argv) Grid_init(&argc,&argv); std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({2,1,1,2}); + std::vector mpi_layout ({2,2,2,2}); std::vector latt_size ({8,8,8,8}); GridCartesian Grid(latt_size,simd_layout,mpi_layout); @@ -76,7 +76,8 @@ int main (int argc, char ** argv) std::cout << "norm result "<< norm2(result)< Date: Wed, 29 Apr 2015 06:50:18 +0100 Subject: [PATCH 110/429] Benchmark wilson dhop now; 14.6GF on one core, not as fast as SU(3)xSU(3) [23GF] but still not too shabby. Disassembling output shows ugly sequences in the permute sector. Could comparatively benchmark with and without the if-else structure to see how much I'm losing. Drops to 9GF as it falls out of cache. Moving to Lebesgue ordering should help there. Substantive progress. --- tests/Grid_wilson.cc | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/tests/Grid_wilson.cc b/tests/Grid_wilson.cc index 4f926689..ff1a9010 100644 --- a/tests/Grid_wilson.cc +++ b/tests/Grid_wilson.cc @@ -21,8 +21,8 @@ int main (int argc, char ** argv) Grid_init(&argc,&argv); std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({2,2,2,2}); - std::vector latt_size ({8,8,8,8}); + std::vector mpi_layout ({1,1,1,1}); + std::vector latt_size ({4,4,8,8}); GridCartesian Grid(latt_size,simd_layout,mpi_layout); std::vector seeds({1,2,3,4}); @@ -39,6 +39,11 @@ int main (int argc, char ** argv) LatticeGaugeField Umu(&Grid); random(pRNG,Umu); std::vector U(4,&Grid); + double volume=1; + for(int mu=0;mu(Umu,U[mu],mu); @@ -70,11 +75,21 @@ int main (int argc, char ** argv) RealD mass=0.1; WilsonMatrix Dw(Umu,mass); + std::cout << "Calling Dw"<(in,comm_buf,compressor); - for(int ss=0;ssoSites();ss++){ + vHalfSpinColourVector tmp; + vHalfSpinColourVector chi; + vSpinColourVector result; + vHalfSpinColourVector Uchi; + vHalfSpinColourVector *chi_p; + int offset,local,perm, ptype; - int offset,local,perm, ptype; + for(int sss=0;sssoSites();sss++){ - vSpinColourVector result; - vHalfSpinColourVector chi; - vHalfSpinColourVector tmp; - vHalfSpinColourVector Uchi; - vHalfSpinColourVector *chi_p; - - result=zero; + int ss = sss; + //int ss = Stencil._LebesgueReorder[sss]; // Xp offset = Stencil._offsets [Xp][ss]; @@ -114,15 +114,16 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) perm = Stencil._permute[Xp][ss]; ptype = Stencil._permute_type[Xp]; chi_p = &comm_buf[offset]; - if ( local ) { - chi_p = χ + if ( local && perm ) + { + spProjXp(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { spProjXp(chi,in._odata[offset]); - if ( perm ) { - permute(tmp,chi,ptype); - chi_p = &tmp; - } + } else { + chi=comm_buf[offset]; } - mult(&(Uchi()),&(Umu._odata[ss](Xp)),&(*chi_p)()); + mult(&Uchi(),&Umu._odata[ss](Xp),&chi()); spReconXp(result,Uchi); // Yp @@ -130,16 +131,17 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) local = Stencil._is_local[Yp][ss]; perm = Stencil._permute[Yp][ss]; ptype = Stencil._permute_type[Yp]; - chi_p = &comm_buf[offset]; - if ( local ) { - chi_p = χ + + if ( local && perm ) + { + spProjYp(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { spProjYp(chi,in._odata[offset]); - if ( perm ) { - permute(tmp,chi,ptype); - chi_p = &tmp; - } + } else { + chi=comm_buf[offset]; } - mult(&(Uchi()),&(Umu._odata[ss](Yp)),&(*chi_p)()); + mult(&Uchi(),&Umu._odata[ss](Yp),&chi()); accumReconYp(result,Uchi); // Zp @@ -147,17 +149,17 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) local = Stencil._is_local[Zp][ss]; perm = Stencil._permute[Zp][ss]; ptype = Stencil._permute_type[Zp]; - chi_p = &comm_buf[offset]; - if ( local ) { - chi_p = χ + if ( local && perm ) + { + spProjZp(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { spProjZp(chi,in._odata[offset]); - if ( perm ) { - permute(tmp,chi,ptype); - chi_p = &tmp; - } + } else { + chi=comm_buf[offset]; } - mult(&(Uchi()),&(Umu._odata[ss](Zp)),&(*chi_p)()); + mult(&Uchi(),&Umu._odata[ss](Zp),&chi()); accumReconZp(result,Uchi); // Tp @@ -165,17 +167,17 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) local = Stencil._is_local[Tp][ss]; perm = Stencil._permute[Tp][ss]; ptype = Stencil._permute_type[Tp]; - chi_p = &comm_buf[offset]; - if ( local ) { - chi_p = χ + if ( local && perm ) + { + spProjTp(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { spProjTp(chi,in._odata[offset]); - if ( perm ) { - permute(tmp,chi,ptype); - chi_p = &tmp; - } + } else { + chi=comm_buf[offset]; } - mult(&(Uchi()),&(Umu._odata[ss](Tp)),&(*chi_p)()); + mult(&Uchi(),&Umu._odata[ss](Tp),&chi()); accumReconTp(result,Uchi); // Xm @@ -183,16 +185,17 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) local = Stencil._is_local[Xm][ss]; perm = Stencil._permute[Xm][ss]; ptype = Stencil._permute_type[Xm]; - chi_p = &comm_buf[offset]; - if ( local ) { - chi_p = χ + + if ( local && perm ) + { + spProjXm(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { spProjXm(chi,in._odata[offset]); - if ( perm ) { - permute(tmp,chi,ptype); - chi_p = &tmp; - } + } else { + chi=comm_buf[offset]; } - mult(&(Uchi()),&(Umu._odata[ss](Xm)),&(*chi_p)()); + mult(&Uchi(),&Umu._odata[ss](Xm),&chi()); accumReconXm(result,Uchi); @@ -201,17 +204,17 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) local = Stencil._is_local[Ym][ss]; perm = Stencil._permute[Ym][ss]; ptype = Stencil._permute_type[Ym]; - chi_p = &comm_buf[offset]; - if ( local ) { - chi_p = χ + if ( local && perm ) + { + spProjYm(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { spProjYm(chi,in._odata[offset]); - if ( perm ) { - permute(tmp,chi,ptype); - chi_p = &tmp; - } + } else { + chi=comm_buf[offset]; } - mult(&(Uchi()),&(Umu._odata[ss](Ym)),&(*chi_p)()); + mult(&Uchi(),&Umu._odata[ss](Ym),&chi()); accumReconYm(result,Uchi); // Zm @@ -219,17 +222,17 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) local = Stencil._is_local[Zm][ss]; perm = Stencil._permute[Zm][ss]; ptype = Stencil._permute_type[Zm]; - chi_p = &comm_buf[offset]; - if ( local ) { - chi_p = χ + if ( local && perm ) + { + spProjZm(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { spProjZm(chi,in._odata[offset]); - if ( perm ) { - permute(tmp,chi,ptype); - chi_p = &tmp; - } + } else { + chi=comm_buf[offset]; } - mult(&(Uchi()),&(Umu._odata[ss](Zm)),&(*chi_p)()); + mult(&Uchi(),&Umu._odata[ss](Zm),&chi()); accumReconZm(result,Uchi); // Tm @@ -237,24 +240,25 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) local = Stencil._is_local[Tm][ss]; perm = Stencil._permute[Tm][ss]; ptype = Stencil._permute_type[Tm]; - chi_p = &comm_buf[offset]; - if ( local ) { - chi_p = χ + if ( local && perm ) + { + spProjTm(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { spProjTm(chi,in._odata[offset]); - if ( perm ) { - permute(tmp,chi,ptype); - chi_p = &tmp; - } + } else { + chi=comm_buf[offset]; } - mult(&(Uchi()),&(Umu._odata[ss](Tm)),&(*chi_p)()); + mult(&Uchi(),&Umu._odata[ss](Tm),&chi()); accumReconTm(result,Uchi); - out._odata[ss] = result; } } + + void WilsonMatrix::Dw(const LatticeFermion &in, LatticeFermion &out) { return; diff --git a/lib/qcd/Grid_qcd_wilson_dop.h b/lib/qcd/Grid_qcd_wilson_dop.h index dc3c80b9..900f1801 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.h +++ b/lib/qcd/Grid_qcd_wilson_dop.h @@ -48,6 +48,8 @@ namespace Grid { // m+4r -1/2 Dhop; both cb's void Dw(const LatticeFermion &in, LatticeFermion &out); + typedef iScalar > matrix; + // half checkerboard operaions void MpcDag (const LatticeFermion &in, LatticeFermion &out); void Mpc (const LatticeFermion &in, LatticeFermion &out); diff --git a/lib/stencil/Grid_stencil_common.cc b/lib/stencil/Grid_stencil_common.cc index 52daf466..6cbcc890 100644 --- a/lib/stencil/Grid_stencil_common.cc +++ b/lib/stencil/Grid_stencil_common.cc @@ -2,6 +2,96 @@ namespace Grid { + + +void CartesianStencil::LebesgueOrder(void) +{ + _LebesgueReorder.resize(0); + + // Align up dimensions to power of two. + const StencilInteger one=1; + StencilInteger ND = _grid->_ndimension; + std::vector dims(ND); + std::vector adims(ND); + std::vector > bitlist(ND); + + + for(StencilInteger mu=0;mu_rdimensions[mu]; + assert ( dims[mu] != 0 ); + adims[mu] = alignup(dims[mu]); + } + + // List which bits of padded volume coordinate contribute; this strategy + // i) avoids recursion + // ii) has loop lengths at most the width of a 32 bit word. + int sitebit=0; + int split=24; + for(int mu=0;mu ax(ND); + + for(StencilInteger asite=0;asitedims[mu]-1 ) contained = 0; + + } + + if ( contained ) { + int site = ax[0] + + dims[0]*ax[1] + +dims[0]*dims[1]*ax[2] + +dims[0]*dims[1]*dims[2]*ax[3]; + + _LebesgueReorder.push_back(site); + } + } + + assert( _LebesgueReorder.size() == vol ); +} + CartesianStencil::CartesianStencil(GridBase *grid, int npoints, int checkerboard, @@ -20,6 +110,8 @@ namespace Grid { _unified_buffer_size=0; _request_count =0; + LebesgueOrder(); + int osites = _grid->oSites(); for(int i=0;i simd_layout({1,1,2,2}); std::vector mpi_layout ({1,1,1,1}); - std::vector latt_size ({4,4,8,8}); + std::vector latt_size ({8,8,8,8}); GridCartesian Grid(latt_size,simd_layout,mpi_layout); std::vector seeds({1,2,3,4}); @@ -45,9 +45,7 @@ int main (int argc, char ** argv) } for(int mu=0;mu(Umu,U[mu],mu); - U[mu] = peekIndex<3>(Umu,mu); + U[mu] = peekIndex(Umu,mu); } std::vector mask({1,1,1,1,1,1,1,1}); From bdf18941a227fac51770e63363f6c0300646df77 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 1 May 2015 10:57:33 +0100 Subject: [PATCH 113/429] Improving the byte swap support for portability --- configure | 71 ++++++++++++++++++++++++++++++++++++ configure.ac | 3 ++ lib/Grid_config.h | 8 ++++ lib/Grid_config.h.in | 8 ++++ lib/parallelIO/GridNerscIO.h | 38 +++++++++++++++++-- 5 files changed, 125 insertions(+), 3 deletions(-) diff --git a/configure b/configure index 9e554925..6a6c4331 100755 --- a/configure +++ b/configure @@ -1785,6 +1785,52 @@ $as_echo "$ac_res" >&6; } } # ac_fn_c_check_header_compile +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl + # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache @@ -4958,6 +5004,31 @@ fi done +#AC_CHECK_HEADERS(machine/endian.h) +ac_fn_c_check_decl "$LINENO" "ntohll" "ac_cv_have_decl_ntohll" "#include +" +if test "x$ac_cv_have_decl_ntohll" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_NTOHLL $ac_have_decl +_ACEOF + +ac_fn_c_check_decl "$LINENO" "be64toh" "ac_cv_have_decl_be64toh" "#include +" +if test "x$ac_cv_have_decl_be64toh" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BE64TOH $ac_have_decl +_ACEOF + # Checks for typedefs, structures, and compiler characteristics. ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" diff --git a/configure.ac b/configure.ac index b6e73bcb..ffd37d87 100644 --- a/configure.ac +++ b/configure.ac @@ -18,6 +18,9 @@ AC_CHECK_HEADERS(stdint.h) AC_CHECK_HEADERS(malloc/malloc.h) AC_CHECK_HEADERS(malloc.h) AC_CHECK_HEADERS(endian.h) +#AC_CHECK_HEADERS(machine/endian.h) +AC_CHECK_DECLS([ntohll],[], [], [[#include ]]) +AC_CHECK_DECLS([be64toh],[], [], [[#include ]]) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_SIZE_T diff --git a/lib/Grid_config.h b/lib/Grid_config.h index 4152540e..c743bba0 100644 --- a/lib/Grid_config.h +++ b/lib/Grid_config.h @@ -16,6 +16,14 @@ /* GRID_COMMS_NONE */ /* #undef GRID_COMMS_NONE */ +/* Define to 1 if you have the declaration of `be64toh', and to 0 if you + don't. */ +#define HAVE_DECL_BE64TOH 0 + +/* Define to 1 if you have the declaration of `ntohll', and to 0 if you don't. + */ +#define HAVE_DECL_NTOHLL 1 + /* Define to 1 if you have the header file. */ /* #undef HAVE_ENDIAN_H */ diff --git a/lib/Grid_config.h.in b/lib/Grid_config.h.in index 2dc0bda4..437a6095 100644 --- a/lib/Grid_config.h.in +++ b/lib/Grid_config.h.in @@ -15,6 +15,14 @@ /* GRID_COMMS_NONE */ #undef GRID_COMMS_NONE +/* Define to 1 if you have the declaration of `be64toh', and to 0 if you + don't. */ +#undef HAVE_DECL_BE64TOH + +/* Define to 1 if you have the declaration of `ntohll', and to 0 if you don't. + */ +#undef HAVE_DECL_NTOHLL + /* Define to 1 if you have the header file. */ #undef HAVE_ENDIAN_H diff --git a/lib/parallelIO/GridNerscIO.h b/lib/parallelIO/GridNerscIO.h index 4dfa7979..4094ab70 100644 --- a/lib/parallelIO/GridNerscIO.h +++ b/lib/parallelIO/GridNerscIO.h @@ -9,10 +9,42 @@ #ifdef HAVE_ENDIAN_H #include +#endif + + #include -#define ntohll be64toh + +// 64bit endian swap is a portability pain +#ifndef __has_builtin // Optional of course. +#define __has_builtin(x) 0 // Compatibility with non-clang compilers. +#endif + +#if HAVE_DECL_BE64TOH +#undef Grid_ntohll +#define Grid_ntohll be64toh +#endif + +#if HAVE_DECL_NTOHLL +#undef Grid_ntohll +#define Grid_ntohll ntohll +#endif + +#ifndef Grid_ntohll + +#if BYTE_ORDER == BIG_ENDIAN + +#define Grid_ntohll(A) (A) + #else -#include + +#if __has_builtin(__builtin_bswap64) +#define Grid_ntohll(A) __builtin_bswap64(A) +#else +#error +#endif + +#endif + #endif namespace Grid { @@ -208,7 +240,7 @@ inline void reconstruct3(LorentzColourMatrix & cm) { uint64_t * f = (uint64_t *)file_object; for(int i=0;i*sizeof(uint64_t) Date: Sat, 2 May 2015 17:52:36 +0100 Subject: [PATCH 114/429] Starting a benchmarking sub dir --- Makefile.am | 2 +- Makefile.in | 2 +- {tests => benchmarks}/Grid_wilson.cc | 0 configure | 3 +++ configure.ac | 1 + tests/Makefile.am | 5 +---- 6 files changed, 7 insertions(+), 6 deletions(-) rename {tests => benchmarks}/Grid_wilson.cc (100%) diff --git a/Makefile.am b/Makefile.am index a55b2b92..fae10e5d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ # additional include paths necessary to compile the C++ library AM_CXXFLAGS = -I$(top_srcdir)/ -SUBDIRS = lib tests +SUBDIRS = lib tests benchmarks diff --git a/Makefile.in b/Makefile.in index 99b67fff..c9257ab2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -294,7 +294,7 @@ top_srcdir = @top_srcdir@ # additional include paths necessary to compile the C++ library AM_CXXFLAGS = -I$(top_srcdir)/ -SUBDIRS = lib tests +SUBDIRS = lib tests benchmarks all: all-recursive .SUFFIXES: diff --git a/tests/Grid_wilson.cc b/benchmarks/Grid_wilson.cc similarity index 100% rename from tests/Grid_wilson.cc rename to benchmarks/Grid_wilson.cc diff --git a/configure b/configure index 6a6c4331..3d25f6a9 100755 --- a/configure +++ b/configure @@ -5174,6 +5174,8 @@ ac_config_files="$ac_config_files lib/Makefile" ac_config_files="$ac_config_files tests/Makefile" +ac_config_files="$ac_config_files benchmarks/Makefile" + cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure @@ -5916,6 +5918,7 @@ do "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + "benchmarks/Makefile") CONFIG_FILES="$CONFIG_FILES benchmarks/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac diff --git a/configure.ac b/configure.ac index ffd37d87..ce73ffd9 100644 --- a/configure.ac +++ b/configure.ac @@ -80,4 +80,5 @@ AM_CONDITIONAL(BUILD_COMMS_NONE,[ test "X${ac_COMMS}X" == "XnoneX" ]) AC_CONFIG_FILES(Makefile) AC_CONFIG_FILES(lib/Makefile) AC_CONFIG_FILES(tests/Makefile) +AC_CONFIG_FILES(benchmarks/Makefile) AC_OUTPUT diff --git a/tests/Makefile.am b/tests/Makefile.am index aaaff613..b129d3d9 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -5,7 +5,7 @@ AM_LDFLAGS = -L$(top_srcdir)/lib # # Test code # -bin_PROGRAMS = Grid_main Grid_stencil Grid_nersc_io Grid_cshift Grid_gamma Grid_wilson Grid_simd +bin_PROGRAMS = Grid_main Grid_stencil Grid_nersc_io Grid_cshift Grid_gamma Grid_simd Grid_main_SOURCES = Grid_main.cc Grid_main_LDADD = -lGrid @@ -22,8 +22,5 @@ Grid_gamma_LDADD = -lGrid Grid_stencil_SOURCES = Grid_stencil.cc Grid_stencil_LDADD = -lGrid -Grid_wilson_SOURCES = Grid_wilson.cc -Grid_wilson_LDADD = -lGrid - Grid_simd_SOURCES = Grid_simd.cc Grid_simd_LDADD = -lGrid From ea52562527020556237340b0437d966264eef7ef Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 2 May 2015 23:42:30 +0100 Subject: [PATCH 115/429] Added a comms benchmark --- benchmarks/Grid_comms.cc | 83 +++++++++++++++++++++ benchmarks/Grid_wilson.cc | 10 +-- lib/Grid_communicator.h | 12 +++- lib/communicator/Grid_communicator_fake.cc | 15 +++- lib/communicator/Grid_communicator_mpi.cc | 84 +++++++++++++++------- 5 files changed, 173 insertions(+), 31 deletions(-) create mode 100644 benchmarks/Grid_comms.cc diff --git a/benchmarks/Grid_comms.cc b/benchmarks/Grid_comms.cc new file mode 100644 index 00000000..ecc1a92e --- /dev/null +++ b/benchmarks/Grid_comms.cc @@ -0,0 +1,83 @@ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector simd_layout({1,1,2,2}); + std::vector mpi_layout ({1,2,2,1}); + + + std::cout << " L "<<"\t\t"<<" Ls "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"< latt_size ({lat,lat,lat,lat}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + + + std::vector > xbuf(8,std::vector(lat*lat*lat*Ls)); + std::vector > rbuf(8,std::vector(lat*lat*lat*Ls)); + std::vector requests; + + ncomm=0; + for(int mu=0;mu<4;mu++){ + + if (mpi_layout[mu]>1 ) { + + ncomm++; + int comm_proc=1; + int xmit_to_rank; + int recv_from_rank; + + Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); + Grid.SendToRecvFromBegin(requests, + (void *)&xbuf[mu][0], + xmit_to_rank, + (void *)&rbuf[mu][0], + recv_from_rank, + bytes); + + comm_proc = mpi_layout[mu]-1; + + Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); + Grid.SendToRecvFromBegin(requests, + (void *)&xbuf[mu+4][0], + xmit_to_rank, + (void *)&rbuf[mu+4][0], + recv_from_rank, + bytes); + + } + } + + Grid.SendToRecvFromComplete(requests); + Grid.Barrier(); + } + + double stop=usecond(); + + double xbytes = Nloop*bytes*2*ncomm; + double rbytes = xbytes; + double bidibytes = xbytes+rbytes; + + double time = stop-start; + + std::cout << lat<<"\t\t"< U(4,&Grid); @@ -82,12 +83,14 @@ int main (int argc, char ** argv) } double t1=usecond(); double flops=1320*volume*ncall; - std::cout << "Called Dw"< &list, + void *xmit, + int xmit_to_rank, + void *recv, + int recv_from_rank, + int bytes); + void SendToRecvFromComplete(std::vector &waitall); //////////////////////////////////////////////////////////// // Barrier diff --git a/lib/communicator/Grid_communicator_fake.cc b/lib/communicator/Grid_communicator_fake.cc index c5b77620..962283ee 100644 --- a/lib/communicator/Grid_communicator_fake.cc +++ b/lib/communicator/Grid_communicator_fake.cc @@ -20,7 +20,7 @@ void CartesianCommunicator::GlobalSum(double &){} void CartesianCommunicator::GlobalSum(uint32_t &){} void CartesianCommunicator::GlobalSumVector(double *,int N){} -// Basic Halo comms primitive +// Basic Halo comms primitive -- should never call in single node void CartesianCommunicator::SendToRecvFrom(void *xmit, int dest, void *recv, @@ -29,6 +29,19 @@ void CartesianCommunicator::SendToRecvFrom(void *xmit, { exit(-1); } +void CartesianCommunicator::SendToRecvFromBegin(std::vector &list, + void *xmit, + int dest, + void *recv, + int from, + int bytes) +{ + exit(-1); +} +void CartesianCommunicator::SendToRecvFromComplete(std::vector &list) +{ + exit(-1); +} void CartesianCommunicator::Barrier(void) { diff --git a/lib/communicator/Grid_communicator_mpi.cc b/lib/communicator/Grid_communicator_mpi.cc index 6a3f69f2..c76fb76f 100644 --- a/lib/communicator/Grid_communicator_mpi.cc +++ b/lib/communicator/Grid_communicator_mpi.cc @@ -29,37 +29,45 @@ CartesianCommunicator::CartesianCommunicator(std::vector &processors) } void CartesianCommunicator::GlobalSum(uint32_t &u){ - MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT32_T,MPI_SUM,communicator); + int ierr=MPI_Allreduce(MPI_IN_PLACE,&u,1,MPI_UINT32_T,MPI_SUM,communicator); + assert(ierr==0); } void CartesianCommunicator::GlobalSum(float &f){ - MPI_Allreduce(MPI_IN_PLACE,&f,1,MPI_FLOAT,MPI_SUM,communicator); + int ierr=MPI_Allreduce(MPI_IN_PLACE,&f,1,MPI_FLOAT,MPI_SUM,communicator); + assert(ierr==0); } void CartesianCommunicator::GlobalSumVector(float *f,int N) { - MPI_Allreduce(MPI_IN_PLACE,f,N,MPI_FLOAT,MPI_SUM,communicator); + int ierr=MPI_Allreduce(MPI_IN_PLACE,f,N,MPI_FLOAT,MPI_SUM,communicator); + assert(ierr==0); } void CartesianCommunicator::GlobalSum(double &d) { - MPI_Allreduce(MPI_IN_PLACE,&d,1,MPI_DOUBLE,MPI_SUM,communicator); + int ierr = MPI_Allreduce(MPI_IN_PLACE,&d,1,MPI_DOUBLE,MPI_SUM,communicator); + assert(ierr==0); } void CartesianCommunicator::GlobalSumVector(double *d,int N) { - MPI_Allreduce(MPI_IN_PLACE,d,N,MPI_DOUBLE,MPI_SUM,communicator); + int ierr = MPI_Allreduce(MPI_IN_PLACE,d,N,MPI_DOUBLE,MPI_SUM,communicator); + assert(ierr==0); } void CartesianCommunicator::ShiftedRanks(int dim,int shift,int &source,int &dest) { - MPI_Cart_shift(communicator,dim,shift,&source,&dest); + int ierr=MPI_Cart_shift(communicator,dim,shift,&source,&dest); + assert(ierr==0); } int CartesianCommunicator::RankFromProcessorCoor(std::vector &coor) { int rank; - MPI_Cart_rank (communicator, &coor[0], &rank); + int ierr=MPI_Cart_rank (communicator, &coor[0], &rank); + assert(ierr==0); return rank; } void CartesianCommunicator::ProcessorCoorFromRank(int rank, std::vector &coor) { coor.resize(_ndimension); - MPI_Cart_coords (communicator, rank, _ndimension,&coor[0]); + int ierr=MPI_Cart_coords (communicator, rank, _ndimension,&coor[0]); + assert(ierr==0); } // Basic Halo comms primitive @@ -69,36 +77,64 @@ void CartesianCommunicator::SendToRecvFrom(void *xmit, int from, int bytes) { - MPI_Request reqs[2]; - MPI_Status OkeyDokey[2]; + std::vector reqs(0); + SendToRecvFromBegin(reqs,xmit,dest,recv,from,bytes); + SendToRecvFromComplete(reqs); +} +// Basic Halo comms primitive + void CartesianCommunicator::SendToRecvFromBegin(std::vector &list, + void *xmit, + int dest, + void *recv, + int from, + int bytes) +{ + MPI_Request xrq; + MPI_Request rrq; int rank = _processor; - MPI_Isend(xmit, bytes, MPI_CHAR,dest,_processor,communicator,&reqs[0]); - MPI_Irecv(recv, bytes, MPI_CHAR,from,from,communicator,&reqs[1]); - MPI_Waitall(2,reqs,OkeyDokey); + int ierr; + ierr=MPI_Isend(xmit, bytes, MPI_CHAR,dest,_processor,communicator,&xrq); + ierr|=MPI_Irecv(recv, bytes, MPI_CHAR,from,from,communicator,&rrq); + + assert(ierr==0); + list.push_back(xrq); + list.push_back(rrq); + +} +void CartesianCommunicator::SendToRecvFromComplete(std::vector &list) +{ + int nreq=list.size(); + std::vector status(nreq); + int ierr = MPI_Waitall(nreq,&list[0],&status[0]); + + assert(ierr==0); } void CartesianCommunicator::Barrier(void) { - MPI_Barrier(communicator); + int ierr = MPI_Barrier(communicator); + assert(ierr==0); } void CartesianCommunicator::Broadcast(int root,void* data, int bytes) { - MPI_Bcast(data, - bytes, - MPI_BYTE, - root, - communicator); + int ierr=MPI_Bcast(data, + bytes, + MPI_BYTE, + root, + communicator); + assert(ierr==0); } void CartesianCommunicator::BroadcastWorld(int root,void* data, int bytes) { - MPI_Bcast(data, - bytes, - MPI_BYTE, - root, - MPI_COMM_WORLD); + int ierr= MPI_Bcast(data, + bytes, + MPI_BYTE, + root, + MPI_COMM_WORLD); + assert(ierr==0); } } From 253362f9783831d01191eca518efdd764160c4ec Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 2 May 2015 23:51:43 +0100 Subject: [PATCH 116/429] Added a comms benchmark --- benchmarks/Grid_comms.cc | 87 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 2 deletions(-) diff --git a/benchmarks/Grid_comms.cc b/benchmarks/Grid_comms.cc index ecc1a92e..9963a6bf 100644 --- a/benchmarks/Grid_comms.cc +++ b/benchmarks/Grid_comms.cc @@ -12,8 +12,16 @@ int main (int argc, char ** argv) std::vector mpi_layout ({1,2,2,1}); - std::cout << " L "<<"\t\t"<<" Ls "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<1) nmu++; + std::cout << "===================================================================================================="< latt_size ({lat,lat,lat,lat}); - } + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + + + std::vector > xbuf(8,std::vector(lat*lat*lat*Ls)); + std::vector > rbuf(8,std::vector(lat*lat*lat*Ls)); + + ncomm=0; + for(int mu=0;mu<4;mu++){ + + if (mpi_layout[mu]>1 ) { + + ncomm++; + int comm_proc=1; + int xmit_to_rank; + int recv_from_rank; + + { + std::vector requests; + Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); + Grid.SendToRecvFromBegin(requests, + (void *)&xbuf[mu][0], + xmit_to_rank, + (void *)&rbuf[mu][0], + recv_from_rank, + bytes); + Grid.SendToRecvFromComplete(requests); + } + + comm_proc = mpi_layout[mu]-1; + + { + std::vector requests; + Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); + Grid.SendToRecvFromBegin(requests, + (void *)&xbuf[mu+4][0], + xmit_to_rank, + (void *)&rbuf[mu+4][0], + recv_from_rank, + bytes); + Grid.SendToRecvFromComplete(requests); + } + } + } + Grid.Barrier(); + } + + double stop=usecond(); + + double xbytes = Nloop*bytes*2*ncomm; + double rbytes = xbytes; + double bidibytes = xbytes+rbytes; + + double time = stop-start; + + std::cout << lat<<"\t\t"< Date: Sun, 3 May 2015 09:44:47 +0100 Subject: [PATCH 117/429] Comms and memory benchmarks added --- benchmarks/Grid_comms.cc | 38 +++--- benchmarks/Grid_memory_bandwidth.cc | 150 ++++++++++++++++++++++ lib/Grid.h | 1 + lib/Grid_lattice.h | 7 +- lib/communicator/Grid_communicator_mpi.cc | 2 +- lib/lattice/Grid_lattice_arith.h | 120 ++++++++++++++--- lib/math/Grid_math_arith_mac.h | 3 +- lib/math/Grid_math_arith_mul.h | 1 - lib/math/Grid_math_tensors.h | 8 +- lib/simd/Grid_vComplexD.h | 2 +- lib/simd/Grid_vComplexF.h | 2 +- lib/simd/Grid_vRealD.h | 5 +- lib/simd/Grid_vRealF.h | 6 +- tests/Grid_gamma.cc | 14 +- 14 files changed, 300 insertions(+), 59 deletions(-) create mode 100644 benchmarks/Grid_memory_bandwidth.cc diff --git a/benchmarks/Grid_comms.cc b/benchmarks/Grid_comms.cc index 9963a6bf..ef7c5491 100644 --- a/benchmarks/Grid_comms.cc +++ b/benchmarks/Grid_comms.cc @@ -25,17 +25,19 @@ int main (int argc, char ** argv) for(int lat=4;lat<=16;lat+=4){ for(int Ls=1;Ls<=16;Ls*=2){ + std::vector latt_size ({lat,lat,lat,lat}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + + std::vector > xbuf(8,std::vector(lat*lat*lat*Ls)); + std::vector > rbuf(8,std::vector(lat*lat*lat*Ls)); + + int ncomm; int bytes=lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD); + double start=usecond(); - int ncomm=0; for(int i=0;i latt_size ({lat,lat,lat,lat}); - - GridCartesian Grid(latt_size,simd_layout,mpi_layout); - - std::vector > xbuf(8,std::vector(lat*lat*lat*Ls)); - std::vector > rbuf(8,std::vector(lat*lat*lat*Ls)); std::vector requests; ncomm=0; @@ -68,11 +70,10 @@ int main (int argc, char ** argv) } } - Grid.SendToRecvFromComplete(requests); Grid.Barrier(); - } + } double stop=usecond(); double xbytes = Nloop*bytes*2*ncomm; @@ -96,18 +97,20 @@ int main (int argc, char ** argv) for(int lat=4;lat<=16;lat+=4){ for(int Ls=1;Ls<=16;Ls*=2){ + std::vector latt_size ({lat,lat,lat,lat}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + + std::vector > xbuf(8,std::vector(lat*lat*lat*Ls)); + std::vector > rbuf(8,std::vector(lat*lat*lat*Ls)); + + + int ncomm; int bytes=lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD); + double start=usecond(); - int ncomm=0; for(int i=0;i latt_size ({lat,lat,lat,lat}); - GridCartesian Grid(latt_size,simd_layout,mpi_layout); - - - std::vector > xbuf(8,std::vector(lat*lat*lat*Ls)); - std::vector > rbuf(8,std::vector(lat*lat*lat*Ls)); - ncomm=0; for(int mu=0;mu<4;mu++){ @@ -131,7 +134,6 @@ int main (int argc, char ** argv) } comm_proc = mpi_layout[mu]-1; - { std::vector requests; Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); diff --git a/benchmarks/Grid_memory_bandwidth.cc b/benchmarks/Grid_memory_bandwidth.cc new file mode 100644 index 00000000..e4e81445 --- /dev/null +++ b/benchmarks/Grid_memory_bandwidth.cc @@ -0,0 +1,150 @@ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector simd_layout({1,2,2,2}); + std::vector mpi_layout ({1,1,1,1}); + + const int Nvec=8; + typedef Lattice< iVector< vReal,Nvec> > LatticeVec; + + int Nloop=100; + + std::cout << "===================================================================================================="< latt_size ({lat,lat,lat,lat}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + + GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); + + LatticeVec z(&Grid); random(pRNG,z); + LatticeVec x(&Grid); random(pRNG,x); + LatticeVec y(&Grid); random(pRNG,y); + double a=1.0; + + + double start=usecond(); + for(int i=0;i &ret,double a,const Lattice &lhs,const Lattice &rhs){ + axpy(z,a,x,y); + } + double stop=usecond(); + double time = stop-start; + + double bytes=3*lat*lat*lat*lat*Nvec*sizeof(Real)*Nloop; + std::cout << lat<<"\t\t"< latt_size ({lat,lat,lat,lat}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + + GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); + + LatticeVec z(&Grid); random(pRNG,z); + LatticeVec x(&Grid); random(pRNG,x); + LatticeVec y(&Grid); random(pRNG,y); + double a=1.0; + + + double start=usecond(); + for(int i=0;i latt_size ({lat,lat,lat,lat}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + + GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); + + LatticeVec z(&Grid); random(pRNG,z); + LatticeVec x(&Grid); random(pRNG,x); + LatticeVec y(&Grid); random(pRNG,y); + RealD a=1.0; + + + double start=usecond(); + for(int i=0;i latt_size ({lat,lat,lat,lat}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + + GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); + + LatticeVec z(&Grid); random(pRNG,z); + LatticeVec x(&Grid); random(pRNG,x); + LatticeVec y(&Grid); random(pRNG,y); + RealD a=1.0; + ComplexD nn; + + double start=usecond(); + for(int i=0;i #include +#include #include #include #include diff --git a/lib/Grid_lattice.h b/lib/Grid_lattice.h index c76fa0a9..cf1c30c5 100644 --- a/lib/Grid_lattice.h +++ b/lib/Grid_lattice.h @@ -26,7 +26,8 @@ class Lattice public: GridBase *_grid; int checkerboard; - std::vector > _odata; + //std::vector > _odata; + std::valarray _odata; public: typedef typename vobj::scalar_type scalar_type; @@ -36,9 +37,9 @@ public: // Constructor requires "grid" passed. // what about a default grid? ////////////////////////////////////////////////////////////////// - Lattice(GridBase *grid) : _grid(grid) { + Lattice(GridBase *grid) : _grid(grid), _odata(_grid->oSites()) { // _odata.reserve(_grid->oSites()); - _odata.resize(_grid->oSites()); + // _odata.resize(_grid->oSites()); assert((((uint64_t)&_odata[0])&0xF) ==0); checkerboard=0; } diff --git a/lib/communicator/Grid_communicator_mpi.cc b/lib/communicator/Grid_communicator_mpi.cc index c76fb76f..6ef05c3d 100644 --- a/lib/communicator/Grid_communicator_mpi.cc +++ b/lib/communicator/Grid_communicator_mpi.cc @@ -93,7 +93,7 @@ void CartesianCommunicator::SendToRecvFrom(void *xmit, MPI_Request rrq; int rank = _processor; int ierr; - ierr=MPI_Isend(xmit, bytes, MPI_CHAR,dest,_processor,communicator,&xrq); + ierr =MPI_Isend(xmit, bytes, MPI_CHAR,dest,_processor,communicator,&xrq); ierr|=MPI_Irecv(recv, bytes, MPI_CHAR,from,from,communicator,&rrq); assert(ierr==0); diff --git a/lib/lattice/Grid_lattice_arith.h b/lib/lattice/Grid_lattice_arith.h index 26ed6a29..4d859173 100644 --- a/lib/lattice/Grid_lattice_arith.h +++ b/lib/lattice/Grid_lattice_arith.h @@ -3,6 +3,9 @@ namespace Grid { + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // unary negation + ////////////////////////////////////////////////////////////////////////////////////////////////////// template inline Lattice operator -(const Lattice &r) { @@ -13,25 +16,10 @@ namespace Grid { } return ret; } - - template - inline void axpy(Lattice &ret,double a,const Lattice &lhs,const Lattice &rhs){ - conformable(lhs,rhs); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - axpy(&ret._odata[ss],a,&lhs._odata[ss],&rhs._odata[ss]); - } - } - template - inline void axpy(Lattice &ret,std::complex a,const Lattice &lhs,const Lattice &rhs){ - conformable(lhs,rhs); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - axpy(&ret._odata[ss],a,&lhs._odata[ss],&rhs._odata[ss]); - } - } - - + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // avoid copy back routines for mult, mac, sub, add + ////////////////////////////////////////////////////////////////////////////////////////////////////// template void mult(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); @@ -69,7 +57,89 @@ namespace Grid { } } + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // avoid copy back routines for mult, mac, sub, add + ////////////////////////////////////////////////////////////////////////////////////////////////////// + template + void mult(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ + conformable(lhs,rhs); + uint32_t vec_len = lhs._grid->oSites(); +#pragma omp parallel for + for(int ss=0;ss + void mac(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ + conformable(lhs,rhs); + uint32_t vec_len = lhs._grid->oSites(); +#pragma omp parallel for + for(int ss=0;ss + void sub(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ + conformable(lhs,rhs); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + sub(&ret._odata[ss],&lhs._odata[ss],&rhs); + } + } + template + void add(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ + conformable(lhs,rhs); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + add(&ret._odata[ss],&lhs._odata[ss],&rhs); + } + } + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // avoid copy back routines for mult, mac, sub, add + ////////////////////////////////////////////////////////////////////////////////////////////////////// + template + void mult(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ + conformable(lhs,rhs); + uint32_t vec_len = lhs._grid->oSites(); +#pragma omp parallel for + for(int ss=0;ss + void mac(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ + conformable(lhs,rhs); + uint32_t vec_len = lhs._grid->oSites(); +#pragma omp parallel for + for(int ss=0;ss + void sub(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ + conformable(lhs,rhs); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + sub(&ret._odata[ss],&lhs,&rhs._odata[ss]); + } + } + template + void add(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ + conformable(lhs,rhs); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + add(&ret._odata[ss],&lhs,&rhs._odata[ss]); + } + } + + ///////////////////////////////////////////////////////////////////////////////////// // Lattice BinOp Lattice, + ///////////////////////////////////////////////////////////////////////////////////// template inline auto operator * (const Lattice &lhs,const Lattice &rhs)-> Lattice { @@ -156,5 +226,17 @@ namespace Grid { } return ret; } + + template + inline void axpy(Lattice &ret,sobj a,const Lattice &lhs,const Lattice &rhs){ + conformable(lhs,rhs); + vobj tmp; +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + tmp = a*lhs._odata[ss]; + ret._odata[ss]= tmp+rhs._odata[ss]; + } + } + } #endif diff --git a/lib/math/Grid_math_arith_mac.h b/lib/math/Grid_math_arith_mac.h index 59cb9a5e..6260b98f 100644 --- a/lib/math/Grid_math_arith_mac.h +++ b/lib/math/Grid_math_arith_mac.h @@ -7,6 +7,7 @@ namespace Grid { /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////// MAC /////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////// /////////////////////////// // Legal multiplication table @@ -74,8 +75,6 @@ inline void mac(iVector * __restrict__ ret,const iVector * __ } return; } - - } #endif diff --git a/lib/math/Grid_math_arith_mul.h b/lib/math/Grid_math_arith_mul.h index c8bb0b2c..66c8b121 100644 --- a/lib/math/Grid_math_arith_mul.h +++ b/lib/math/Grid_math_arith_mul.h @@ -7,7 +7,6 @@ namespace Grid { /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////// MUL /////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// - template inline void mult(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs){ diff --git a/lib/math/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h index b08d0c83..25da7954 100644 --- a/lib/math/Grid_math_tensors.h +++ b/lib/math/Grid_math_tensors.h @@ -16,7 +16,7 @@ namespace Grid { // However note that doing this eliminates some syntactical sugar such as // calling the constructor explicitly or implicitly // -#define TENSOR_IS_POD +#undef TENSOR_IS_POD template class iScalar { @@ -36,7 +36,7 @@ public: // template using tensor_reduce_level = typename iScalar::tensor_reduce_level >; #ifndef TENSOR_IS_POD - iScalar(){;}; + iScalar()=default; iScalar(scalar_type s) : _internal(s) {};// recurse down and hit the constructor for vector_type iScalar(const Zero &z){ *this = zero; }; #endif @@ -126,7 +126,7 @@ public: #ifndef TENSOR_IS_POD iVector(const Zero &z){ *this = zero; }; - iVector() {};// Empty constructure + iVector() =default; #endif iVector & operator= (const Zero &hero){ @@ -189,7 +189,7 @@ public: #ifndef TENSOR_IS_POD iMatrix(const Zero &z){ *this = zero; }; - iMatrix() {}; + iMatrix() =default; #endif iMatrix & operator= (const Zero &hero){ diff --git a/lib/simd/Grid_vComplexD.h b/lib/simd/Grid_vComplexD.h index 337b82c7..208e2640 100644 --- a/lib/simd/Grid_vComplexD.h +++ b/lib/simd/Grid_vComplexD.h @@ -13,7 +13,7 @@ namespace Grid { vzero(*this); return (*this); } - vComplexD(){}; + vComplexD()=default; vComplexD(ComplexD a){ vsplat(*this,a); }; diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index c42e4029..9c7922e3 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -28,7 +28,7 @@ namespace Grid { vzero(*this); return (*this); } - vComplexF(){}; + vComplexF()=default; vComplexF(ComplexF a){ vsplat(*this,a); }; diff --git a/lib/simd/Grid_vRealD.h b/lib/simd/Grid_vRealD.h index 36e189e1..0bdaa5e4 100644 --- a/lib/simd/Grid_vRealD.h +++ b/lib/simd/Grid_vRealD.h @@ -10,10 +10,13 @@ namespace Grid { typedef dvec vector_type; typedef RealD scalar_type; - vRealD(){}; + vRealD()=default; vRealD(RealD a){ vsplat(*this,a); }; + vRealD(Zero &zero){ + zeroit(*this); + } friend inline void mult(vRealD * __restrict__ y,const vRealD * __restrict__ l,const vRealD *__restrict__ r) {*y = (*l) * (*r);} friend inline void sub (vRealD * __restrict__ y,const vRealD * __restrict__ l,const vRealD *__restrict__ r) {*y = (*l) - (*r);} diff --git a/lib/simd/Grid_vRealF.h b/lib/simd/Grid_vRealF.h index 70f76bc0..e8d89cec 100644 --- a/lib/simd/Grid_vRealF.h +++ b/lib/simd/Grid_vRealF.h @@ -8,14 +8,16 @@ namespace Grid { fvec v; public: - typedef fvec vector_type; typedef RealF scalar_type; - vRealF(){}; + vRealF()=default; vRealF(RealF a){ vsplat(*this,a); }; + vRealF(Zero &zero){ + zeroit(*this); + } //////////////////////////////////// // Arithmetic operator overloads +,-,* //////////////////////////////////// diff --git a/tests/Grid_gamma.cc b/tests/Grid_gamma.cc index ab6307f3..af735856 100644 --- a/tests/Grid_gamma.cc +++ b/tests/Grid_gamma.cc @@ -5,11 +5,10 @@ using namespace std; using namespace Grid; using namespace Grid::QCD; -template -struct scal { - d internal; -}; - +//template class is_pod< iScalar > +//{ +// +//}; int main (int argc, char ** argv) { @@ -40,13 +39,16 @@ int main (int argc, char ** argv) std::cout << " Is pod " << std::is_pod::value << std::endl; std::cout << " Is pod double " << std::is_pod::value << std::endl; std::cout << " Is pod ComplexF " << std::is_pod::value << std::endl; - std::cout << " Is pod scal " << std::is_pod >::value << std::endl; + std::cout << " Is triv double " << std::is_trivially_default_constructible::value << std::endl; + std::cout << " Is triv ComplexF " << std::is_trivially_default_constructible::value << std::endl; std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; + std::cout << " Is triv Scalar " < >::value << std::endl; + std::cout << " Is triv Scalar "< >::value << std::endl; for(int a=0;a Date: Sun, 3 May 2015 09:48:13 +0100 Subject: [PATCH 118/429] Back to vector for now; cost of init loop is clear in the a*x + y loop in memory benchmark and must move to better container class. --- lib/Grid_lattice.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Grid_lattice.h b/lib/Grid_lattice.h index cf1c30c5..75a80ef8 100644 --- a/lib/Grid_lattice.h +++ b/lib/Grid_lattice.h @@ -26,8 +26,8 @@ class Lattice public: GridBase *_grid; int checkerboard; - //std::vector > _odata; - std::valarray _odata; + std::vector > _odata; + //std::valarray _odata; public: typedef typename vobj::scalar_type scalar_type; From 0e8415de1b2d2a61a742fd667dabe2f19a01ed5f Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 5 May 2015 17:56:42 +0100 Subject: [PATCH 119/429] Added a makefile --- benchmarks/Makefile.am | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 benchmarks/Makefile.am diff --git a/benchmarks/Makefile.am b/benchmarks/Makefile.am new file mode 100644 index 00000000..d6fad22d --- /dev/null +++ b/benchmarks/Makefile.am @@ -0,0 +1,19 @@ +# additional include paths necessary to compile the C++ library +AM_CXXFLAGS = -I$(top_srcdir)/lib +AM_LDFLAGS = -L$(top_srcdir)/lib + +# +# Test code +# +bin_PROGRAMS = Grid_wilson Grid_comms Grid_memory_bandwidth + + +Grid_wilson_SOURCES = Grid_wilson.cc +Grid_wilson_LDADD = -lGrid + +Grid_comms_SOURCES = Grid_comms.cc +Grid_comms_LDADD = -lGrid + +Grid_memory_bandwidth_SOURCES = Grid_memory_bandwidth.cc +Grid_memory_bandwidth_LDADD = -lGrid + From b720222d981a77d5e6d9459f05a0b1bf90fee967 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 5 May 2015 18:08:53 +0100 Subject: [PATCH 120/429] Updated bandwidth test --- benchmarks/Grid_memory_bandwidth.cc | 95 +++++++++++++++-------------- 1 file changed, 48 insertions(+), 47 deletions(-) diff --git a/benchmarks/Grid_memory_bandwidth.cc b/benchmarks/Grid_memory_bandwidth.cc index e4e81445..dc25fe51 100644 --- a/benchmarks/Grid_memory_bandwidth.cc +++ b/benchmarks/Grid_memory_bandwidth.cc @@ -14,26 +14,26 @@ int main (int argc, char ** argv) const int Nvec=8; typedef Lattice< iVector< vReal,Nvec> > LatticeVec; - int Nloop=100; + int Nloop=1000; std::cout << "===================================================================================================="< latt_size ({lat,lat,lat,lat}); GridCartesian Grid(latt_size,simd_layout,mpi_layout); - GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); + //GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); - LatticeVec z(&Grid); random(pRNG,z); - LatticeVec x(&Grid); random(pRNG,x); - LatticeVec y(&Grid); random(pRNG,y); - double a=1.0; + LatticeVec z(&Grid); //random(pRNG,z); + LatticeVec x(&Grid); //random(pRNG,x); + LatticeVec y(&Grid); //random(pRNG,y); + double a=2.0; double start=usecond(); @@ -43,31 +43,32 @@ int main (int argc, char ** argv) axpy(z,a,x,y); } double stop=usecond(); - double time = stop-start; + double time = (stop-start)/Nloop/1000; - double bytes=3*lat*lat*lat*lat*Nvec*sizeof(Real)*Nloop; - std::cout << lat<<"\t\t"< latt_size ({lat,lat,lat,lat}); GridCartesian Grid(latt_size,simd_layout,mpi_layout); - GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); + //GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); - LatticeVec z(&Grid); random(pRNG,z); - LatticeVec x(&Grid); random(pRNG,x); - LatticeVec y(&Grid); random(pRNG,y); - double a=1.0; + LatticeVec z(&Grid); //random(pRNG,z); + LatticeVec x(&Grid); //random(pRNG,x); + LatticeVec y(&Grid); //random(pRNG,y); + double a=2.0; double start=usecond(); @@ -75,63 +76,63 @@ int main (int argc, char ** argv) z=a*x+y; } double stop=usecond(); - double time = stop-start; + double time = (stop-start)/Nloop/1000; - double bytes=3*lat*lat*lat*lat*Nvec*sizeof(Real)*Nloop; - std::cout << lat<<"\t\t"< latt_size ({lat,lat,lat,lat}); GridCartesian Grid(latt_size,simd_layout,mpi_layout); - GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); + //GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); - LatticeVec z(&Grid); random(pRNG,z); - LatticeVec x(&Grid); random(pRNG,x); - LatticeVec y(&Grid); random(pRNG,y); - RealD a=1.0; + LatticeVec z(&Grid); //random(pRNG,z); + LatticeVec x(&Grid); //random(pRNG,x); + LatticeVec y(&Grid); //random(pRNG,y); + RealD a=2.0; double start=usecond(); for(int i=0;i latt_size ({lat,lat,lat,lat}); GridCartesian Grid(latt_size,simd_layout,mpi_layout); - GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); + //GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); - LatticeVec z(&Grid); random(pRNG,z); - LatticeVec x(&Grid); random(pRNG,x); - LatticeVec y(&Grid); random(pRNG,y); - RealD a=1.0; + LatticeVec z(&Grid); //random(pRNG,z); + LatticeVec x(&Grid); //random(pRNG,x); + LatticeVec y(&Grid); //random(pRNG,y); + RealD a=2.0; ComplexD nn; double start=usecond(); @@ -139,10 +140,10 @@ int main (int argc, char ** argv) nn=norm2(x); } double stop=usecond(); - double time = stop-start; + double time = (stop-start)/Nloop/1000; - double bytes=lat*lat*lat*lat*Nvec*sizeof(Real)*Nloop; - std::cout << lat<<"\t\t"< Date: Tue, 5 May 2015 18:09:28 +0100 Subject: [PATCH 121/429] Added streaming stores --- lib/simd/Grid_vComplexD.h | 15 +++++++++++++++ lib/simd/Grid_vComplexF.h | 29 ++++++++++++++++++++++------- lib/simd/Grid_vInteger.h | 4 ++++ lib/simd/Grid_vRealD.h | 15 +++++++++++++++ lib/simd/Grid_vRealF.h | 15 +++++++++++++++ 5 files changed, 71 insertions(+), 7 deletions(-) diff --git a/lib/simd/Grid_vComplexD.h b/lib/simd/Grid_vComplexD.h index 208e2640..f0108d59 100644 --- a/lib/simd/Grid_vComplexD.h +++ b/lib/simd/Grid_vComplexD.h @@ -242,6 +242,21 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ assert(0); #endif } + friend inline void vstream(vComplexD &out,const vComplexD &in){ +#if defined (AVX1)|| defined (AVX2) + _mm256_stream_pd((double *)&out.v,in.v); +#endif +#ifdef SSE4 + _mm_stream_pd((double *)&out.v,in.v); +#endif +#ifdef AVX512 + _mm512_stream_pd((double *)&out.v,in.v); + //Note v has a3 a2 a1 a0 +#endif +#ifdef QPX + assert(0); +#endif + } friend inline void vprefetch(const vComplexD &v) { _mm_prefetch((const char*)&v.v,_MM_HINT_T0); diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index 9c7922e3..5f52fc53 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -176,21 +176,36 @@ namespace Grid { vsplat(ret,a,b); } -friend inline void vstore(const vComplexF &ret, ComplexF *a){ + friend inline void vstore(const vComplexF &ret, ComplexF *a){ #if defined (AVX1)|| defined (AVX2) - _mm256_store_ps((float *)a,ret.v); + _mm256_store_ps((float *)a,ret.v); #endif #ifdef SSE4 - _mm_store_ps((float *)a,ret.v); + _mm_store_ps((float *)a,ret.v); #endif #ifdef AVX512 - _mm512_store_ps((float *)a,ret.v); -//Note v has a3 a2 a1 a0 + _mm512_store_ps((float *)a,ret.v); + //Note v has a3 a2 a1 a0 #endif #ifdef QPX - assert(0); + assert(0); #endif -} + } + friend inline void vstream(vComplexF &out,const vComplexF &in){ +#if defined (AVX1)|| defined (AVX2) + _mm256_stream_ps((float *)&out.v,in.v); +#endif +#ifdef SSE4 + _mm_stream_ps((float *)&out.v,in.v); +#endif +#ifdef AVX512 + _mm512_stream_ps((float *)&out.v,in.v); + //Note v has a3 a2 a1 a0 +#endif +#ifdef QPX + assert(0); +#endif + } friend inline void vprefetch(const vComplexF &v) { _mm_prefetch((const char*)&v.v,_MM_HINT_T0); diff --git a/lib/simd/Grid_vInteger.h b/lib/simd/Grid_vInteger.h index 6035aea1..5a429a9c 100644 --- a/lib/simd/Grid_vInteger.h +++ b/lib/simd/Grid_vInteger.h @@ -186,6 +186,10 @@ namespace Grid { #endif } + friend inline void vstream(vInteger & out,const vInteger &in){ + out=in; + } + friend inline void vprefetch(const vInteger &v) { _mm_prefetch((const char*)&v.v,_MM_HINT_T0); diff --git a/lib/simd/Grid_vRealD.h b/lib/simd/Grid_vRealD.h index 0bdaa5e4..ee51fa03 100644 --- a/lib/simd/Grid_vRealD.h +++ b/lib/simd/Grid_vRealD.h @@ -174,6 +174,21 @@ namespace Grid { #endif #ifdef QPX assert(0); +#endif + } + friend inline void vstream(vRealD &out,const vRealD &in){ +#if defined (AVX1)|| defined (AVX2) + _mm256_stream_pd((double *)&out.v,in.v); +#endif +#ifdef SSE4 + _mm_stream_pd((double *)&out.v,in.v); +#endif +#ifdef AVX512 + _mm512_stream_pd((double *)&out.v,in.v); + //Note v has a3 a2 a1 a0 +#endif +#ifdef QPX + assert(0); #endif } friend inline void vprefetch(const vRealD &v) diff --git a/lib/simd/Grid_vRealF.h b/lib/simd/Grid_vRealF.h index e8d89cec..48e5c134 100644 --- a/lib/simd/Grid_vRealF.h +++ b/lib/simd/Grid_vRealF.h @@ -208,6 +208,21 @@ friend inline void vstore(const vRealF &ret, float *a){ assert(0); #endif } + friend inline void vstream(vRealF &out,const vRealF &in){ +#if defined (AVX1)|| defined (AVX2) + _mm256_stream_ps((float *)&out.v,in.v); +#endif +#ifdef SSE4 + _mm_stream_ps((float *)&out.v,in.v); +#endif +#ifdef AVX512 + _mm512_stream_ps((float *)&out.v,in.v); + //Note v has a3 a2 a1 a0 +#endif +#ifdef QPX + assert(0); +#endif + } friend inline void vprefetch(const vRealF &v) From cd990ba13d000f19f0321fdc5582417caf6f9024 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 5 May 2015 18:13:06 +0100 Subject: [PATCH 122/429] Streaming store option --- lib/math/Grid_math_tensors.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/math/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h index 25da7954..564d5cb6 100644 --- a/lib/math/Grid_math_tensors.h +++ b/lib/math/Grid_math_tensors.h @@ -49,6 +49,9 @@ public: _internal=s; return *this; } + friend void vstream(iScalar &out,const iScalar &in){ + vstream(out._internal,in._internal); + } friend void zeroit(iScalar &that){ @@ -138,6 +141,12 @@ public: zeroit(that._internal[i]); } } + friend void vstream(iVector &out,const iVector &in){ + for(int i=0;i &out,const iVector &in,int permutetype){ for(int i=0;i &out,const iMatrix &in){ + for(int i=0;i &out,const iMatrix &in,int permutetype){ for(int i=0;i Date: Tue, 5 May 2015 18:14:09 +0100 Subject: [PATCH 123/429] streaming store cases --- lib/lattice/Grid_lattice_arith.h | 125 +++++++++++++++++++------------ 1 file changed, 76 insertions(+), 49 deletions(-) diff --git a/lib/lattice/Grid_lattice_arith.h b/lib/lattice/Grid_lattice_arith.h index 4d859173..63ad3335 100644 --- a/lib/lattice/Grid_lattice_arith.h +++ b/lib/lattice/Grid_lattice_arith.h @@ -12,7 +12,7 @@ namespace Grid { Lattice ret(r._grid); #pragma omp parallel for for(int ss=0;ssoSites();ss++){ - ret._odata[ss]= -r._odata[ss]; + vstream(ret._odata[ss], -r._odata[ss]); } return ret; } @@ -23,20 +23,22 @@ namespace Grid { template void mult(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); - uint32_t vec_len = lhs._grid->oSites(); #pragma omp parallel for - for(int ss=0;ssoSites();ss++){ + obj1 tmp; + mult(&tmp,&lhs._odata[ss],&rhs._odata[ss]); + vstream(ret._odata[ss],tmp); } } template void mac(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); - uint32_t vec_len = lhs._grid->oSites(); #pragma omp parallel for - for(int ss=0;ssoSites();ss++){ + obj1 tmp; + mac(&tmp,&lhs._odata[ss],&rhs._odata[ss]); + vstream(ret._odata[ss],tmp); } } @@ -45,7 +47,9 @@ namespace Grid { conformable(lhs,rhs); #pragma omp parallel for for(int ss=0;ssoSites();ss++){ - sub(&ret._odata[ss],&lhs._odata[ss],&rhs._odata[ss]); + obj1 tmp; + sub(&tmp,&lhs._odata[ss],&rhs._odata[ss]); + vstream(ret._odata[ss],tmp); } } template @@ -53,7 +57,9 @@ namespace Grid { conformable(lhs,rhs); #pragma omp parallel for for(int ss=0;ssoSites();ss++){ - add(&ret._odata[ss],&lhs._odata[ss],&rhs._odata[ss]); + obj1 tmp; + add(&tmp,&lhs._odata[ss],&rhs._odata[ss]); + vstream(ret._odata[ss],tmp); } } @@ -62,88 +68,100 @@ namespace Grid { ////////////////////////////////////////////////////////////////////////////////////////////////////// template void mult(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ - conformable(lhs,rhs); - uint32_t vec_len = lhs._grid->oSites(); + conformable(lhs,ret); #pragma omp parallel for - for(int ss=0;ssoSites();ss++){ + obj1 tmp; + mult(&tmp,&lhs._odata[ss],&rhs); + vstream(ret._odata[ss],tmp); } } template void mac(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ - conformable(lhs,rhs); - uint32_t vec_len = lhs._grid->oSites(); + conformable(lhs,ret); #pragma omp parallel for - for(int ss=0;ssoSites();ss++){ + obj1 tmp; + mac(&tmp,&lhs._odata[ss],&rhs); + vstream(ret._odata[ss],tmp); } } template void sub(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ - conformable(lhs,rhs); + conformable(lhs,ret); #pragma omp parallel for for(int ss=0;ssoSites();ss++){ - sub(&ret._odata[ss],&lhs._odata[ss],&rhs); + obj1 tmp; + sub(&tmp,&lhs._odata[ss],&rhs); + vstream(ret._odata[ss],tmp); } } template void add(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ - conformable(lhs,rhs); + conformable(lhs,ret); #pragma omp parallel for for(int ss=0;ssoSites();ss++){ - add(&ret._odata[ss],&lhs._odata[ss],&rhs); + obj1 tmp; + add(&tmp,&lhs._odata[ss],&rhs); + vstream(ret._odata[ss],tmp); } } ////////////////////////////////////////////////////////////////////////////////////////////////////// // avoid copy back routines for mult, mac, sub, add ////////////////////////////////////////////////////////////////////////////////////////////////////// - template + template void mult(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ - conformable(lhs,rhs); - uint32_t vec_len = lhs._grid->oSites(); + conformable(ret,rhs); #pragma omp parallel for - for(int ss=0;ssoSites();ss++){ + obj1 tmp; + mult(&tmp,&lhs,&rhs._odata[ss]); + vstream(ret._odata[ss],tmp); } } template void mac(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ - conformable(lhs,rhs); - uint32_t vec_len = lhs._grid->oSites(); + conformable(ret,rhs); #pragma omp parallel for - for(int ss=0;ssoSites();ss++){ + obj1 tmp; + mac(&tmp,&lhs,&rhs._odata[ss]); + vstream(ret._odata[ss],tmp); } } template void sub(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ - conformable(lhs,rhs); + conformable(ret,rhs); #pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - sub(&ret._odata[ss],&lhs,&rhs._odata[ss]); + for(int ss=0;ssoSites();ss++){ + obj1 tmp; + sub(&tmp,&lhs,&rhs._odata[ss]); + vstream(ret._odata[ss],tmp); } } template void add(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ - conformable(lhs,rhs); + conformable(ret,rhs); #pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - add(&ret._odata[ss],&lhs,&rhs._odata[ss]); + for(int ss=0;ssoSites();ss++){ + obj1 tmp; + add(&tmp,&lhs,&rhs._odata[ss]); + vstream(ret._odata[ss],tmp); } } ///////////////////////////////////////////////////////////////////////////////////// // Lattice BinOp Lattice, + //NB mult performs conformable check. Do not reapply here for performance. ///////////////////////////////////////////////////////////////////////////////////// template inline auto operator * (const Lattice &lhs,const Lattice &rhs)-> Lattice { - //NB mult performs conformable check. Do not reapply here for performance. Lattice ret(rhs._grid); mult(ret,lhs,rhs); return ret; @@ -151,7 +169,6 @@ namespace Grid { template inline auto operator + (const Lattice &lhs,const Lattice &rhs)-> Lattice { - //NB mult performs conformable check. Do not reapply here for performance. Lattice ret(rhs._grid); add(ret,lhs,rhs); return ret; @@ -159,7 +176,6 @@ namespace Grid { template inline auto operator - (const Lattice &lhs,const Lattice &rhs)-> Lattice { - //NB mult performs conformable check. Do not reapply here for performance. Lattice ret(rhs._grid); sub(ret,lhs,rhs); return ret; @@ -172,9 +188,11 @@ namespace Grid { Lattice ret(rhs._grid); #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=lhs*rhs._odata[ss]; + decltype(lhs*rhs._odata[0]) tmp=lhs*rhs._odata[ss]; + vstream(ret._odata[ss],tmp); + // ret._odata[ss]=lhs*rhs._odata[ss]; } - return ret; + return ret; } template inline auto operator + (const left &lhs,const Lattice &rhs) -> Lattice @@ -182,7 +200,9 @@ namespace Grid { Lattice ret(rhs._grid); #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=lhs+rhs._odata[ss]; + decltype(lhs+rhs._odata[0]) tmp =lhs-rhs._odata[ss]; + vstream(ret._odata[ss],tmp); + // ret._odata[ss]=lhs+rhs._odata[ss]; } return ret; } @@ -192,7 +212,9 @@ namespace Grid { Lattice ret(rhs._grid); #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=lhs-rhs._odata[ss]; + decltype(lhs-rhs._odata[0]) tmp=lhs-rhs._odata[ss]; + vstream(ret._odata[ss],tmp); + // ret._odata[ss]=lhs-rhs._odata[ss]; } return ret; } @@ -202,7 +224,9 @@ namespace Grid { Lattice ret(lhs._grid); #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=lhs._odata[ss]*rhs; + decltype(lhs._odata[0]*rhs) tmp =lhs._odata[ss]*rhs; + vstream(ret._odata[ss],tmp); + // ret._odata[ss]=lhs._odata[ss]*rhs; } return ret; } @@ -212,7 +236,9 @@ namespace Grid { Lattice ret(lhs._grid); #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=lhs._odata[ss]+rhs; + decltype(lhs._odata[0]+rhs) tmp=lhs._odata[ss]+rhs; + vstream(ret._odata[ss],tmp); + // ret._odata[ss]=lhs._odata[ss]+rhs; } return ret; } @@ -222,7 +248,9 @@ namespace Grid { Lattice ret(lhs._grid); #pragma omp parallel for for(int ss=0;ssoSites(); ss++){ - ret._odata[ss]=lhs._odata[ss]-rhs; + decltype(lhs._odata[0]-rhs) tmp=lhs._odata[ss]-rhs; + vstream(ret._odata[ss],tmp); + // ret._odata[ss]=lhs._odata[ss]-rhs; } return ret; } @@ -230,11 +258,10 @@ namespace Grid { template inline void axpy(Lattice &ret,sobj a,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); - vobj tmp; #pragma omp parallel for for(int ss=0;ssoSites();ss++){ - tmp = a*lhs._odata[ss]; - ret._odata[ss]= tmp+rhs._odata[ss]; + vobj tmp = a*lhs._odata[ss]; + vstream(ret._odata[ss],tmp+rhs._odata[ss]); } } From cdd5cdeda2113f6bf1af466835513de5f7839f38 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 5 May 2015 22:09:22 +0100 Subject: [PATCH 124/429] Cleaned up for Linux --- Makefile.in | 393 +-- TODO | 4 +- aclocal.m4 | 707 ++-- benchmarks/Grid_memory_bandwidth.cc | 24 +- configure | 5011 ++++++++++++++++----------- lib/Grid_config.h | 17 +- lib/Grid_config.h.in | 3 - lib/Grid_init.cc | 2 +- lib/qcd/Grid_qcd_wilson_dop.cc | 2 +- tests/Grid_gamma.cc | 8 +- 10 files changed, 3378 insertions(+), 2793 deletions(-) diff --git a/Makefile.in b/Makefile.in index c9257ab2..f9e18fe4 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. - +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,61 +15,6 @@ @SET_MAKE@ VPATH = @srcdir@ -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -86,86 +32,43 @@ NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ + ChangeLog INSTALL NEWS TODO compile depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ - $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/lib/Grid_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = SOURCES = DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-recursive dvi-recursive html-recursive info-recursive \ - install-data-recursive install-dvi-recursive \ - install-exec-recursive install-html-recursive \ - install-info-recursive install-pdf-recursive \ - install-ps-recursive install-recursive installcheck-recursive \ - installdirs-recursive pdf-recursive ps-recursive \ - tags-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - cscope distdir dist dist-all distcheck -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags -CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) -am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING ChangeLog \ - INSTALL NEWS README TODO compile depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ - if test -d "$(distdir)"; then \ - find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -rf "$(distdir)" \ - || { sleep 5 && rm -rf "$(distdir)"; }; \ - else :; fi -am__post_remove_distdir = $(am__remove_distdir) + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ @@ -193,14 +96,10 @@ am__relativize = \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best -DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print -am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ - | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -240,7 +139,6 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -298,7 +196,7 @@ SUBDIRS = lib tests benchmarks all: all-recursive .SUFFIXES: -am--refresh: Makefile +am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ @@ -313,6 +211,7 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -333,25 +232,22 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd -# into them and run 'make' without going through this Makefile. -# To change the values of 'make' variables: instead of editing Makefiles, -# (1) if the variable is set in 'config.status', edit 'config.status' -# (which will cause the Makefiles to be regenerated when you run 'make'); -# (2) otherwise, pass the desired values on the 'make' command line. -$(am__recursive_targets): - @fail=; \ - if $(am__make_keepgoing); then \ - failcom='fail=yes'; \ - else \ - failcom='exit 1'; \ - fi; \ +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - for subdir in $$list; do \ + list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ @@ -366,12 +262,57 @@ $(am__recursive_targets): $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive -TAGS: tags +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -387,7 +328,12 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - $(am__define_uniq_tagged_files); \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -399,11 +345,15 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $$unique; \ fi; \ fi -ctags: ctags-recursive - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -412,31 +362,9 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" -cscope: cscope.files - test ! -s cscope.files \ - || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) -clean-cscope: - -rm -f cscope.files -cscope.files: clean-cscope cscopelist -cscopelist: cscopelist-recursive - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) @@ -472,10 +400,13 @@ distdir: $(DISTFILES) done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ @@ -504,42 +435,36 @@ distdir: $(DISTFILES) || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__post_remove_distdir) + $(am__remove_distdir) dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 - $(am__post_remove_distdir) + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) -dist-lzip: distdir - tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz - $(am__post_remove_distdir) +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) dist-xz: distdir - tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz - $(am__post_remove_distdir) + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) dist-tarZ: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 - @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__post_remove_distdir) + $(am__remove_distdir) dist-shar: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 - @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__post_remove_distdir) + $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) - $(am__post_remove_distdir) + $(am__remove_distdir) -dist dist-all: - $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' - $(am__post_remove_distdir) +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another @@ -550,8 +475,8 @@ distcheck: dist GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lz*) \ - lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ @@ -561,19 +486,17 @@ distcheck: dist *.zip*) \ unzip $(distdir).zip ;;\ esac - chmod -R a-w $(distdir) - chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod -R a-w $(distdir); chmod u+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build/sub \ - && ../../configure \ - $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -596,21 +519,13 @@ distcheck: dist && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 - $(am__post_remove_distdir) + $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: - @test -n '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: trying to run $@ with an empty' \ - '$$(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - $(am__cd) '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ @@ -641,15 +556,10 @@ install-am: all-am installcheck: installcheck-recursive install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: @@ -730,24 +640,23 @@ ps-am: uninstall-am: -.MAKE: $(am__recursive_targets) install-am install-strip +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ - am--refresh check check-am clean clean-cscope clean-generic \ - cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ - dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ - distcheck distclean distclean-generic distclean-tags \ - distcleancheck distdir distuninstallcheck dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ + dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \ + distclean distclean-generic distclean-tags distcleancheck \ + distdir distuninstallcheck dvi dvi-am html html-am info \ + info-am install install-am install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ - pdf-am ps ps-am tags tags-am uninstall uninstall-am - -.PRECIOUS: Makefile + pdf-am ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/TODO b/TODO index ef3940ea..ee1dd897 100644 --- a/TODO +++ b/TODO @@ -2,9 +2,7 @@ - use protocol buffers? replace xmlReader/Writer ec.. - Binary use htonll, htonl -* Stencil -- do the permute for locally permuted in halo exchange. - - BUG cshift mpi; the "s" indexing is weird in the Cshift_comms_simd - as simd_layout or not is confusing +* Stencil -- DONE * Reduce implemention is poor * Bug in SeedFixedIntegers gives same output on each site. diff --git a/aclocal.m4 b/aclocal.m4 index f3018f6c..bcc213b4 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.15 -*- Autoconf -*- - -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -11,16 +11,15 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. -m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],, +[m4_warning([this file was generated for autoconf 2.63. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically 'autoreconf'.])]) +To do so, use the procedure documented by the package, typically `autoreconf'.])]) -# Copyright (C) 2002-2014 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -32,10 +31,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.15' +[am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.15], [], +m4_if([$1], [1.11.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,22 +50,22 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.15])dnl +[AM_AUTOMAKE_VERSION([1.11.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to -# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and @@ -85,7 +84,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is '.', but things will broke when you +# harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, @@ -103,26 +102,30 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -# Expand $ac_aux_dir to an absolute path. -am_aux_dir=`cd "$ac_aux_dir" && pwd` +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 9 + # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ([2.52])dnl - m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl @@ -141,14 +144,16 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 10 -# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing @@ -158,7 +163,7 @@ fi])]) # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was @@ -171,13 +176,12 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl -m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], - [$1], [CXX], [depcc="$CXX" am_compiler_list=], - [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], - [$1], [UPC], [depcc="$UPC" am_compiler_list=], - [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], @@ -185,9 +189,8 @@ AC_CACHE_CHECK([dependency style of $depcc], # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -226,16 +229,16 @@ AC_CACHE_CHECK([dependency style of $depcc], : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with '-c' and '-o' for the sake of the "dashmstdout" + # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -244,16 +247,16 @@ AC_CACHE_CHECK([dependency style of $depcc], test "$am__universal" = false || continue ;; nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -301,7 +304,7 @@ AM_CONDITIONAL([am__fastdep$1], [ # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl @@ -311,39 +314,34 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE([dependency-tracking], [dnl -AS_HELP_STRING( - [--enable-dependency-tracking], - [do not reject slow dependency extractors]) -AS_HELP_STRING( - [--disable-dependency-tracking], - [speeds up one-time build])]) +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' - am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -AC_SUBST([am__nodep])dnl -_AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +#serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Older Autoconf quotes --file arguments for eval, but not when files + # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -356,7 +354,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but + # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -368,19 +366,21 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. + # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue + test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` @@ -398,7 +398,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each '.P' file that we will +# is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], @@ -408,21 +408,18 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 16 + # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. -dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. -m4_define([AC_PROG_CC], -m4_defn([AC_PROG_CC]) -[_AM_PROG_CC_C_O -]) - # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- @@ -435,7 +432,7 @@ m4_defn([AC_PROG_CC]) # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.65])dnl +[AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -464,42 +461,33 @@ AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], -[AC_DIAGNOSE([obsolete], - [$0: two- and three-arguments forms are deprecated.]) -m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if( - m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), - [ok:ok],, +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) - AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -AM_MISSING_PROG([AUTOCONF], [autoconf]) -AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -AM_MISSING_PROG([AUTOHEADER], [autoheader]) -AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target (and possibly the TAP driver). The -# system "awk" is bad on some platforms. +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -508,82 +496,34 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES([CC])], - [m4_define([AC_PROG_CC], - m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES([CXX])], - [m4_define([AC_PROG_CXX], - m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES([OBJC])], - [m4_define([AC_PROG_OBJC], - m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], - [_AM_DEPENDENCIES([OBJCXX])], - [m4_define([AC_PROG_OBJCXX], - m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) -AC_REQUIRE([AM_SILENT_RULES])dnl -dnl The testsuite driver may need to know about EXEEXT, so add the -dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This -dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl - -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) - fi -fi -dnl The trailing newline in this macro's definition is deliberate, for -dnl backward compatibility and to allow trailing 'dnl'-style comments -dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) -dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. @@ -605,7 +545,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -616,7 +556,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh+set}" != xset; then +if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -624,14 +564,16 @@ if test x"${install_sh+set}" != xset; then install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi -AC_SUBST([install_sh])]) +AC_SUBST(install_sh)]) -# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 2 + # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], @@ -647,12 +589,14 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 4 + # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. @@ -670,7 +614,7 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. +# Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -697,12 +641,15 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 6 + # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], @@ -710,10 +657,11 @@ AC_DEFUN([AM_MISSING_PROG], $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) + # AM_MISSING_HAS_RUN # ------------------ -# Define MISSING if not defined so far and test if it is modern enough. -# If it is, set am_missing_run to use it, otherwise, to nothing. +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl @@ -726,35 +674,63 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " else am_missing_run= - AC_MSG_WARN(['missing' script is too old or missing]) + AC_MSG_WARN([`missing' script is too old or missing]) fi ]) -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) -# -------------------- +# ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) -# ------------------------ +# ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) @@ -765,82 +741,24 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_PROG_CC_C_O -# --------------- -# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC -# to automatically call this. -AC_DEFUN([_AM_PROG_CC_C_O], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -AC_LANG_PUSH([C])dnl -AC_CACHE_CHECK( - [whether $CC understands -c and -o together], - [am_cv_prog_cc_c_o], - [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i]) -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -AC_LANG_POP([C])]) - -# For backward compatibility. -AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) - -# Copyright (C) 2001-2014 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_RUN_LOG(COMMAND) -# ------------------- -# Run COMMAND, save the exit status in ac_status, and log it. -# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) -AC_DEFUN([AM_RUN_LOG], -[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD - ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - (exit $ac_status); }]) - # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 5 + # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -851,40 +769,32 @@ case `pwd` in esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac -# Do 'set' in a subshell so we don't clobber the current shell's +# Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken - alias in your environment]) - fi - if test "$[2]" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done test "$[2]" = conftest.file ) then @@ -894,85 +804,9 @@ else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi -AC_MSG_RESULT([yes]) -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi -AC_CONFIG_COMMANDS_PRE( - [AC_MSG_CHECKING([that generated files are newer than configure]) - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - AC_MSG_RESULT([done])]) -rm -f conftest.file -]) +AC_MSG_RESULT(yes)]) -# Copyright (C) 2009-2014 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_SILENT_RULES([DEFAULT]) -# -------------------------- -# Enable less verbose build rules; with the default set to DEFAULT -# ("yes" being less verbose, "no" or empty being verbose). -AC_DEFUN([AM_SILENT_RULES], -[AC_ARG_ENABLE([silent-rules], [dnl -AS_HELP_STRING( - [--enable-silent-rules], - [less verbose build output (undo: "make V=1")]) -AS_HELP_STRING( - [--disable-silent-rules], - [verbose build output (undo: "make V=0")])dnl -]) -case $enable_silent_rules in @%:@ ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; -esac -dnl -dnl A few 'make' implementations (e.g., NonStop OS and NextStep) -dnl do not support nested variable expansions. -dnl See automake bug#9928 and bug#10237. -am_make=${MAKE-make} -AC_CACHE_CHECK([whether $am_make supports nested variables], - [am_cv_make_support_nested_variables], - [if AS_ECHO([['TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi]) -if test $am_cv_make_support_nested_variables = yes; then - dnl Using '$V' instead of '$(V)' breaks IRIX make. - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AC_SUBST([AM_V])dnl -AM_SUBST_NOTMAKE([AM_V])dnl -AC_SUBST([AM_DEFAULT_V])dnl -AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl -AC_SUBST([AM_DEFAULT_VERBOSITY])dnl -AM_BACKSLASH='\' -AC_SUBST([AM_BACKSLASH])dnl -_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl -]) - -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -980,32 +814,34 @@ _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl # AM_PROG_INSTALL_STRIP # --------------------- -# One issue with vendor 'install' (even GNU) is that you can't +# One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in "make install-strip", and initialize +# always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 2 + # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. @@ -1013,22 +849,24 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])]) AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) -# -------------------------- +# --------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 2 + # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. -# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory @@ -1038,114 +876,75 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar -# AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AC_SUBST([AMTAR], ['$${TAR-tar}']) - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' - +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac - [m4_case([$1], - [ustar], - [# The POSIX 1988 'ustar' format is defined with fixed-size fields. - # There is notably a 21 bits limit for the UID and the GID. In fact, - # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 - # and bug#13588). - am_max_uid=2097151 # 2^21 - 1 - am_max_gid=$am_max_uid - # The $UID and $GID variables are not portable, so we need to resort - # to the POSIX-mandated id(1) utility. Errors in the 'id' calls - # below are definitely unexpected, so allow the users to see them - # (that is, avoid stderr redirection). - am_uid=`id -u || echo unknown` - am_gid=`id -g || echo unknown` - AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) - if test $am_uid -le $am_max_uid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi - AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) - if test $am_gid -le $am_max_gid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi], + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break - [pax], - [], - - [m4_fatal([Unknown tar format])]) - - AC_MSG_CHECKING([how to create a $1 tar archive]) - - # Go ahead even if we have the value already cached. We do so because we - # need to set the values for the 'am__tar' and 'am__untar' variables. - _am_tools=${am_cv_prog_tar_$1-$_am_tools} - - for _am_tool in $_am_tools; do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works. - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi - done + # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir - AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) - AC_MSG_RESULT([$am_cv_prog_tar_$1])]) - +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR diff --git a/benchmarks/Grid_memory_bandwidth.cc b/benchmarks/Grid_memory_bandwidth.cc index dc25fe51..3254e95b 100644 --- a/benchmarks/Grid_memory_bandwidth.cc +++ b/benchmarks/Grid_memory_bandwidth.cc @@ -22,7 +22,7 @@ int main (int argc, char ** argv) std::cout << " L "<<"\t\t"<<"bytes"<<"\t\t"<<"GB/s"< latt_size ({lat,lat,lat,lat}); @@ -43,10 +43,10 @@ int main (int argc, char ** argv) axpy(z,a,x,y); } double stop=usecond(); - double time = (stop-start)/Nloop/1000; + double time = (stop-start)/Nloop*1000; double bytes=3*lat*lat*lat*lat*Nvec*sizeof(Real); - std::cout< latt_size ({lat,lat,lat,lat}); @@ -76,11 +76,11 @@ int main (int argc, char ** argv) z=a*x+y; } double stop=usecond(); - double time = (stop-start)/Nloop/1000; + double time = (stop-start)/Nloop*1000; double effbytes=3*lat*lat*lat*lat*Nvec*sizeof(Real); double bytes=5*lat*lat*lat*lat*Nvec*sizeof(Real); - std::cout< latt_size ({lat,lat,lat,lat}); @@ -108,10 +108,10 @@ int main (int argc, char ** argv) x=a*z; } double stop=usecond(); - double time = (stop-start)/Nloop/1000; + double time = (stop-start)/Nloop*1000; double bytes=2*lat*lat*lat*lat*Nvec*sizeof(Real); - std::cout < latt_size ({lat,lat,lat,lat}); @@ -140,10 +140,10 @@ int main (int argc, char ** argv) nn=norm2(x); } double stop=usecond(); - double time = (stop-start)/Nloop/1000; + double time = (stop-start)/Nloop*1000; double bytes=lat*lat*lat*lat*Nvec*sizeof(Real); - std::cout<. # -# -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -# -# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -24,15 +22,23 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; esac + fi + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + as_nl=' ' export as_nl @@ -40,13 +46,7 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -57,7 +57,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in #( + case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -80,6 +80,13 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -89,16 +96,15 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( +case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done IFS=$as_save_IFS ;; @@ -110,16 +116,12 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 + { (exit 1); exit 1; } fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' @@ -131,294 +133,7 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: paboyle@ph.ed.ac.uk about your system, including any -$0: error possibly output before this message. Then install -$0: a modern shell, or manually run the script under such a -$0: shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - +# Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -432,12 +147,8 @@ else as_basename=false fi -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi +# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -457,19 +168,295 @@ $as_echo X/"$0" | } s/.*/./; q'` -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits +# CDPATH. +$as_unset CDPATH - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= @@ -486,12 +473,9 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). @@ -500,18 +484,29 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits exit } + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( +case `echo -n x` in -n*) - case `echo 'xy\c'` in + case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; + *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -526,29 +521,49 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' + as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -pR' + as_ln_s='cp -p' fi else - as_ln_s='cp -pR' + as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' + as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -as_test_x='test -x' -as_executable_p=as_fn_executable_p +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -557,11 +572,11 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -test -n "$DJDIR" || exec 7<&0 &1 + +exec 7<&0 &1 # Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` @@ -576,6 +591,7 @@ cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='Grid' @@ -583,7 +599,6 @@ PACKAGE_TARNAME='grid' PACKAGE_VERSION='1.0' PACKAGE_STRING='Grid 1.0' PACKAGE_BUGREPORT='paboyle@ph.ed.ac.uk' -PACKAGE_URL='' ac_unique_file="lib/Grid.h" # Factoring default headers for most tests. @@ -644,7 +659,6 @@ CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE -am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE @@ -658,10 +672,6 @@ CPPFLAGS LDFLAGS CXXFLAGS CXX -AM_BACKSLASH -AM_DEFAULT_VERBOSITY -AM_DEFAULT_V -AM_V am__untar am__tar AMTAR @@ -715,7 +725,6 @@ bindir program_transform_name prefix exec_prefix -PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION @@ -726,7 +735,6 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking -enable_silent_rules enable_dependency_tracking enable_openmp enable_simd @@ -806,9 +814,8 @@ do fi case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. @@ -853,7 +860,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -879,7 +887,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1083,7 +1092,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1099,7 +1109,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1129,17 +1140,17 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" + -*) { $as_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1148,7 +1159,7 @@ Try \`$0 --help' for more information" $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac @@ -1156,13 +1167,15 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" + { $as_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1185,7 +1198,8 @@ do [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" + { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' @@ -1199,6 +1213,8 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1213,9 +1229,11 @@ test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" + { $as_echo "$as_me: error: working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } # Find the source files, if location was not specified. @@ -1254,11 +1272,13 @@ else fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" + { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then @@ -1298,7 +1318,7 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages + -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files @@ -1358,12 +1378,8 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-silent-rules less verbose build output (undo: "make V=1") - --disable-silent-rules verbose build output (undo: "make V=0") - --enable-dependency-tracking - do not reject slow dependency extractors - --disable-dependency-tracking - speeds up one-time build + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors --disable-openmp do not use OpenMP --enable-simd=SSE|AVX|AVX2|AVX512|MIC Select instructions to be SSE4.0, AVX 1.0, AVX @@ -1376,7 +1392,7 @@ Some influential environment variables: LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags @@ -1449,568 +1465,21 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Grid configure 1.0 -generated by GNU Autoconf 2.69 +generated by GNU Autoconf 2.63 -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_cxx_try_compile LINENO -# ---------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_compile - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - -# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES -# --------------------------------------------- -# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR -# accordingly. -ac_fn_c_check_decl () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - as_decl_name=`echo $2|sed 's/ *(.*//'` - as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 -$as_echo_n "checking whether $as_decl_name is declared... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -#ifndef $as_decl_name -#ifdef __cplusplus - (void) $as_decl_use; -#else - (void) $as_decl_name; -#endif -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_decl - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_type - -# ac_fn_c_find_uintX_t LINENO BITS VAR -# ------------------------------------ -# Finds an unsigned integer type with width BITS, setting cache variable VAR -# accordingly. -ac_fn_c_find_uintX_t () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 -$as_echo_n "checking for uint$2_t... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - # Order is important - never check a type that is potentially smaller - # than half of the expected target width. - for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ - 'unsigned long long int' 'unsigned short int' 'unsigned char'; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - case $ac_type in #( - uint$2_t) : - eval "$3=yes" ;; #( - *) : - eval "$3=\$ac_type" ;; -esac -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if eval test \"x\$"$3"\" = x"no"; then : - -else - break -fi - done -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_find_uintX_t - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Grid $as_me 1.0, which was -generated by GNU Autoconf 2.69. Invocation command line was +generated by GNU Autoconf 2.63. Invocation command line was $ $0 $@ @@ -2046,8 +1515,8 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done + $as_echo "PATH: $as_dir" +done IFS=$as_save_IFS } >&5 @@ -2084,9 +1553,9 @@ do ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) - as_fn_append ac_configure_args1 " '$ac_arg'" + ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else @@ -2102,13 +1571,13 @@ do -* ) ac_must_keep_next=true ;; esac fi - as_fn_append ac_configure_args " '$ac_arg'" + ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there @@ -2120,9 +1589,11 @@ trap 'exit_status=$? { echo - $as_echo "## ---------------- ## + cat <<\_ASBOX +## ---------------- ## ## Cache variables. ## -## ---------------- ##" +## ---------------- ## +_ASBOX echo # The following way of writing the cache mishandles newlines in values, ( @@ -2131,13 +1602,13 @@ trap 'exit_status=$? case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; + *) $as_unset $ac_var ;; esac ;; esac done @@ -2156,9 +1627,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - $as_echo "## ----------------- ## + cat <<\_ASBOX +## ----------------- ## ## Output variables. ## -## ----------------- ##" +## ----------------- ## +_ASBOX echo for ac_var in $ac_subst_vars do @@ -2171,9 +1644,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; echo if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## + cat <<\_ASBOX +## ------------------- ## ## File substitutions. ## -## ------------------- ##" +## ------------------- ## +_ASBOX echo for ac_var in $ac_subst_files do @@ -2187,9 +1662,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; fi if test -s confdefs.h; then - $as_echo "## ----------- ## + cat <<\_ASBOX +## ----------- ## ## confdefs.h. ## -## ----------- ##" +## ----------- ## +_ASBOX echo cat confdefs.h echo @@ -2203,39 +1680,37 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; exit $exit_status ' 0 for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h -$as_echo "/* confdefs.h */" > confdefs.h - # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF + cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF + cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF + cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF @@ -2244,12 +1719,7 @@ _ACEOF ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac + ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site @@ -2260,23 +1730,19 @@ fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 + if test -r "$ac_site_file"; then + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } + . "$ac_site_file" fi done if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; @@ -2284,7 +1750,7 @@ $as_echo "$as_me: loading cache $cache_file" >&6;} esac fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi @@ -2299,11 +1765,11 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; @@ -2313,17 +1779,17 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 + { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 + { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 + { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac @@ -2335,20 +1801,43 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 + { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## + + + + + + + + + + + + + + + + + + + + + + + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -2357,7 +1846,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -am__api_version='1.15' +am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -2376,7 +1865,9 @@ for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do fi done if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} + { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, @@ -2402,10 +1893,10 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : +if test "${ac_cv_path_install+set}" = set; then $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -2413,11 +1904,11 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -2425,7 +1916,7 @@ case $as_dir/ in #(( # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -2454,7 +1945,7 @@ case $as_dir/ in #(( ;; esac - done +done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir @@ -2470,7 +1961,7 @@ fi INSTALL=$ac_install_sh fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. @@ -2481,73 +1972,68 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; + { { $as_echo "$as_me:$LINENO: error: unsafe absolute working directory name" >&5 +$as_echo "$as_me: error: unsafe absolute working directory name" >&2;} + { (exit 1); exit 1; }; };; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; + { { $as_echo "$as_me:$LINENO: error: unsafe srcdir value: \`$srcdir'" >&5 +$as_echo "$as_me: error: unsafe srcdir value: \`$srcdir'" >&2;} + { (exit 1); exit 1; }; };; esac -# Do 'set' in a subshell so we don't clobber the current shell's +# Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done test "$2" = conftest.file ) then # Ok. : else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +$as_echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +{ $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi - -rm -f conftest.file - test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. @@ -2558,8 +2044,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# Expand $ac_aux_dir to an absolute path. -am_aux_dir=`cd "$ac_aux_dir" && pwd` +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2570,15 +2056,15 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " else am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi -if test x"${install_sh+set}" != xset; then +if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2587,17 +2073,17 @@ if test x"${install_sh+set}" != xset; then esac fi -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. +# will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : +if test "${ac_cv_prog_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then @@ -2608,24 +2094,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -2635,9 +2121,9 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then @@ -2648,24 +2134,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -2674,7 +2160,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -2687,10 +2173,10 @@ fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : + if test "${ac_cv_path_mkdir+set}" = set; then $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -2698,9 +2184,9 @@ for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do + for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ @@ -2710,12 +2196,11 @@ do esac done done - done +done IFS=$as_save_IFS fi - test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else @@ -2723,19 +2208,26 @@ fi # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. + test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : +if test "${ac_cv_prog_AWK+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then @@ -2746,24 +2238,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 + { $as_echo "$as_me:$LINENO: result: $AWK" >&5 $as_echo "$AWK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -2771,11 +2263,11 @@ fi test -n "$AWK" && break done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF @@ -2783,7 +2275,7 @@ SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; @@ -2793,11 +2285,11 @@ esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -2811,52 +2303,15 @@ else fi rmdir .tst 2>/dev/null -# Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : - enableval=$enable_silent_rules; -fi - -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=1;; -esac -am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' - if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -2900,72 +2355,19 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -mkdir_p='$(MKDIR_P)' +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. -# We need awk for the "check" target (and possibly the TAP driver). The -# system "awk" is bad on some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' +AMTAR=${AMTAR-"${am_missing_run}tar"} - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar pax cpio none' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 - fi -fi - - ac_config_headers="$ac_config_headers lib/Grid_config.h" @@ -2985,9 +2387,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : +if test "${ac_cv_prog_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then @@ -2998,24 +2400,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 + { $as_echo "$as_me:$LINENO: result: $CXX" >&5 $as_echo "$CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3029,9 +2431,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then @@ -3042,24 +2444,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3072,7 +2474,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3083,31 +2485,48 @@ fi fi fi # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" +{ (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3123,8 +2542,8 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 -$as_echo_n "checking whether the C++ compiler works... " >&6; } +{ $as_echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5 +$as_echo_n "checking for C++ compiler default output file name... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: @@ -3140,17 +2559,17 @@ do done rm -f $ac_rmfiles -if { { ac_try="$ac_link_default" +if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -3167,7 +2586,7 @@ do # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -3186,41 +2605,84 @@ test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C++ compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +{ { $as_echo "$as_me:$LINENO: error: C++ compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C++ compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 -$as_echo_n "checking for C++ compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } + ac_exeext=$ac_cv_exeext +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5 +$as_echo_n "checking whether the C++ compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" +if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -3235,83 +2697,32 @@ for ac_file in conftest.exe conftest conftest.*; do esac done else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : +if test "${ac_cv_objext+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3323,17 +2734,17 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" +if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -3346,23 +2757,31 @@ else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } fi + rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3376,16 +2795,37 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else - ac_compiler_gnu=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes @@ -3394,16 +2834,20 @@ else fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : +if test "${ac_cv_prog_cxx_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3414,11 +2858,35 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3429,12 +2897,36 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3445,17 +2937,42 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS @@ -3489,14 +3006,14 @@ am__doit: .PHONY: am__doit END # If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. +# Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -3517,19 +3034,18 @@ if test "$am__include" = "#"; then fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : +if test "${enable_dependency_tracking+set}" = set; then enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' - am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= @@ -3543,18 +3059,17 @@ fi depcc="$CXX" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -3588,16 +3103,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with '-c' and '-o' for the sake of the "dashmstdout" + # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -3606,16 +3121,16 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -3654,7 +3169,7 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type @@ -3677,9 +3192,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3690,24 +3205,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3717,9 +3232,9 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3730,24 +3245,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3756,7 +3271,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3770,9 +3285,9 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3783,24 +3298,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3810,9 +3325,9 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3824,18 +3339,18 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then @@ -3854,10 +3369,10 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3869,9 +3384,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3882,24 +3397,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3913,9 +3428,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3926,24 +3441,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3956,7 +3471,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3967,42 +3482,62 @@ fi fi -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" +{ (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : +if test "${ac_cv_c_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -4016,16 +3551,37 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else - ac_compiler_gnu=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes @@ -4034,16 +3590,20 @@ else fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : +if test "${ac_cv_prog_cc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -4054,11 +3614,35 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -4069,12 +3653,36 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : else - ac_c_werror_flag=$ac_save_c_werror_flag + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -4085,17 +3693,42 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS @@ -4112,18 +3745,23 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : +if test "${ac_cv_prog_cc_c89+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include -struct stat; +#include +#include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); @@ -4175,9 +3813,32 @@ for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done @@ -4188,19 +3849,17 @@ fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 + { $as_echo "$as_me:$LINENO: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac -if test "x$ac_cv_prog_cc_c89" != xno; then : -fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -4208,79 +3867,19 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 - ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -4314,16 +3913,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with '-c' and '-o' for the sake of the "dashmstdout" + # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -4332,16 +3931,16 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -4380,7 +3979,7 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type @@ -4399,18 +3998,17 @@ fi OPENMP_CFLAGS= # Check whether --enable-openmp was given. -if test "${enable_openmp+set}" = set; then : +if test "${enable_openmp+set}" = set; then enableval=$enable_openmp; fi if test "$enable_openmp" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5 + { $as_echo "$as_me:$LINENO: checking for $CC option to support OpenMP" >&5 $as_echo_n "checking for $CC option to support OpenMP... " >&6; } -if ${ac_cv_prog_c_openmp+:} false; then : +if test "${ac_cv_prog_c_openmp+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + cat >conftest.$ac_ext <<_ACEOF #ifndef _OPENMP choke me @@ -4419,16 +4017,37 @@ else int main () { return omp_get_num_threads (); } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_prog_c_openmp='none needed' else - ac_cv_prog_c_openmp='unsupported' - for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ - -Popenmp --openmp; do + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_prog_c_openmp='unsupported' + for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp; do ac_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $ac_option" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + cat >conftest.$ac_ext <<_ACEOF #ifndef _OPENMP choke me @@ -4437,27 +4056,56 @@ else int main () { return omp_get_num_threads (); } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_prog_c_openmp=$ac_option +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext CFLAGS=$ac_save_CFLAGS if test "$ac_cv_prog_c_openmp" != unsupported; then break fi done fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_c_openmp" >&5 $as_echo "$ac_cv_prog_c_openmp" >&6; } case $ac_cv_prog_c_openmp in #( "none needed" | unsupported) - ;; #( + ;; #( *) - OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; + OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; esac fi @@ -4465,9 +4113,9 @@ $as_echo "$ac_cv_prog_c_openmp" >&6; } if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : +if test "${ac_cv_prog_RANLIB+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then @@ -4478,24 +4126,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 + { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4505,9 +4153,9 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then @@ -4518,24 +4166,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4544,7 +4192,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -4564,14 +4212,14 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : + if test "${ac_cv_prog_CPP+set}" = set; then $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded @@ -4586,7 +4234,11 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4595,34 +4247,78 @@ do #endif Syntax error _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then break fi @@ -4634,7 +4330,7 @@ fi else ac_cv_prog_CPP=$CPP fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes @@ -4645,7 +4341,11 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4654,40 +4354,87 @@ do #endif Syntax error _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } +{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } fi ac_ext=c @@ -4697,9 +4444,9 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : +if test "${ac_cv_path_GREP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then @@ -4710,10 +4457,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do + for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in @@ -4730,7 +4477,7 @@ case `"$ac_path_GREP" --version 2>&1` in $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val + ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" @@ -4745,24 +4492,26 @@ esac $ac_path_GREP_found && break 3 done done - done +done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : +if test "${ac_cv_path_EGREP+set}" = set; then $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 @@ -4776,10 +4525,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do + for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in @@ -4796,7 +4545,7 @@ case `"$ac_path_EGREP" --version 2>&1` in $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val + ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" @@ -4811,10 +4560,12 @@ esac $ac_path_EGREP_found && break 3 done done - done +done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP @@ -4822,17 +4573,21 @@ fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : +if test "${ac_cv_header_stdc+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include @@ -4847,23 +4602,48 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else - ac_cv_header_stdc=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - + $EGREP "memchr" >/dev/null 2>&1; then + : else ac_cv_header_stdc=no fi @@ -4873,14 +4653,18 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - + $EGREP "free" >/dev/null 2>&1; then + : else ac_cv_header_stdc=no fi @@ -4890,10 +4674,14 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes; then : else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include @@ -4920,33 +4708,118 @@ main () return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : else - ac_cv_header_stdc=no + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -$as_echo "#define STDC_HEADERS 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -4956,48 +4829,604 @@ fi done + for ac_header in stdint.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" -if test "x$ac_cv_header_stdint_h" = xyes; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_STDINT_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done + for ac_header in malloc/malloc.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" -if test "x$ac_cv_header_malloc_malloc_h" = xyes; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_MALLOC_MALLOC_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done + for ac_header in malloc.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" -if test "x$ac_cv_header_malloc_h" = xyes; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_MALLOC_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done + for ac_header in endian.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "endian.h" "ac_cv_header_endian_h" "$ac_includes_default" -if test "x$ac_cv_header_endian_h" = xyes; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_ENDIAN_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -5005,35 +5434,244 @@ fi done #AC_CHECK_HEADERS(machine/endian.h) -ac_fn_c_check_decl "$LINENO" "ntohll" "ac_cv_have_decl_ntohll" "#include -" -if test "x$ac_cv_have_decl_ntohll" = xyes; then : - ac_have_decl=1 +{ $as_echo "$as_me:$LINENO: checking whether ntohll is declared" >&5 +$as_echo_n "checking whether ntohll is declared... " >&6; } +if test "${ac_cv_have_decl_ntohll+set}" = set; then + $as_echo_n "(cached) " >&6 else - ac_have_decl=0 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef ntohll + (void) ntohll; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_ntohll=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_ntohll=no fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_ntohll" >&5 +$as_echo "$ac_cv_have_decl_ntohll" >&6; } +if test "x$ac_cv_have_decl_ntohll" = x""yes; then + cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_NTOHLL $ac_have_decl +#define HAVE_DECL_NTOHLL 1 _ACEOF -ac_fn_c_check_decl "$LINENO" "be64toh" "ac_cv_have_decl_be64toh" "#include -" -if test "x$ac_cv_have_decl_be64toh" = xyes; then : - ac_have_decl=1 + else - ac_have_decl=0 + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_NTOHLL 0 +_ACEOF + + fi -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_BE64TOH $ac_have_decl + +{ $as_echo "$as_me:$LINENO: checking whether be64toh is declared" >&5 +$as_echo_n "checking whether be64toh is declared... " >&6; } +if test "${ac_cv_have_decl_be64toh+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ _ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef be64toh + (void) be64toh; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_be64toh=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_be64toh=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_be64toh" >&5 +$as_echo "$ac_cv_have_decl_be64toh" >&6; } +if test "x$ac_cv_have_decl_be64toh" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BE64TOH 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BE64TOH 0 +_ACEOF + + +fi + # Checks for typedefs, structures, and compiler characteristics. -ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : +{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 +$as_echo_n "checking for size_t... " >&6; } +if test "${ac_cv_type_size_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_size_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (size_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((size_t))) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_type_size_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +$as_echo "$ac_cv_type_size_t" >&6; } +if test "x$ac_cv_type_size_t" = x""yes; then + : else cat >>confdefs.h <<_ACEOF @@ -5042,12 +5680,75 @@ _ACEOF fi -ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" -case $ac_cv_c_uint32_t in #( + + { $as_echo "$as_me:$LINENO: checking for uint32_t" >&5 +$as_echo_n "checking for uint32_t... " >&6; } +if test "${ac_cv_c_uint32_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_c_uint32_t=no + for ac_type in 'uint32_t' 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) -1 >> (32 - 1) == 1)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + case $ac_type in + uint32_t) ac_cv_c_uint32_t=yes ;; + *) ac_cv_c_uint32_t=$ac_type ;; +esac + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_uint32_t" != no && break + done +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_uint32_t" >&5 +$as_echo "$ac_cv_c_uint32_t" >&6; } + case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) -$as_echo "#define _UINT32_T 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define _UINT32_T 1 +_ACEOF cat >>confdefs.h <<_ACEOF @@ -5056,12 +5757,75 @@ _ACEOF ;; esac -ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" -case $ac_cv_c_uint64_t in #( + + { $as_echo "$as_me:$LINENO: checking for uint64_t" >&5 +$as_echo_n "checking for uint64_t... " >&6; } +if test "${ac_cv_c_uint64_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_c_uint64_t=no + for ac_type in 'uint64_t' 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) -1 >> (64 - 1) == 1)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + case $ac_type in + uint64_t) ac_cv_c_uint64_t=yes ;; + *) ac_cv_c_uint64_t=$ac_type ;; +esac + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_uint64_t" != no && break + done +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_uint64_t" >&5 +$as_echo "$ac_cv_c_uint64_t" >&6; } + case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) -$as_echo "#define _UINT64_T 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define _UINT64_T 1 +_ACEOF cat >>confdefs.h <<_ACEOF @@ -5072,12 +5836,102 @@ _ACEOF # Checks for library functions. + for ac_func in gettimeofday -do : - ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" -if test "x$ac_cv_func_gettimeofday" = xyes; then : +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_GETTIMEOFDAY 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -5085,7 +5939,7 @@ done # Check whether --enable-simd was given. -if test "${enable_simd+set}" = set; then : +if test "${enable_simd+set}" = set; then enableval=$enable_simd; \ ac_SIMD=${enable_simd} else @@ -5097,35 +5951,45 @@ case ${ac_SIMD} in SSE4) echo Configuring for SSE4 -$as_echo "#define SSE4 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define SSE4 1 +_ACEOF ;; AVX) echo Configuring for AVX -$as_echo "#define AVX1 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define AVX1 1 +_ACEOF ;; AVX2) echo Configuring for AVX2 -$as_echo "#define AVX2 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define AVX2 1 +_ACEOF ;; AVX512|MIC) echo Configuring for AVX512 and MIC -$as_echo "#define AVX512 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define AVX512 1 +_ACEOF ;; *) - as_fn_error $? "${ac_SIMD} unsupported --enable-simd option" "$LINENO" 5; + { { $as_echo "$as_me:$LINENO: error: ${ac_SIMD} unsupported --enable-simd option" >&5 +$as_echo "$as_me: error: ${ac_SIMD} unsupported --enable-simd option" >&2;} + { (exit 1); exit 1; }; }; ;; esac # Check whether --enable-comms was given. -if test "${enable_comms+set}" = set; then : +if test "${enable_comms+set}" = set; then enableval=$enable_comms; ac_COMMS=${enable_comms} else ac_COMMS=none @@ -5136,17 +6000,23 @@ case ${ac_COMMS} in none) echo Configuring for NO communications -$as_echo "#define GRID_COMMS_NONE 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define GRID_COMMS_NONE 1 +_ACEOF ;; mpi) echo Configuring for MPI communications -$as_echo "#define GRID_COMMS_MPI 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define GRID_COMMS_MPI 1 +_ACEOF ;; *) - as_fn_error $? "${ac_COMMS} unsupported --enable-comms option" "$LINENO" 5; + { { $as_echo "$as_me:$LINENO: error: ${ac_COMMS} unsupported --enable-comms option" >&5 +$as_echo "$as_me: error: ${ac_COMMS} unsupported --enable-comms option" >&2;} + { (exit 1); exit 1; }; }; ;; esac @@ -5203,13 +6073,13 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; + *) $as_unset $ac_var ;; esac ;; esac done @@ -5217,8 +6087,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" @@ -5240,23 +6110,12 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi + cat confcache >$cache_file else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi @@ -5270,29 +6129,20 @@ DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= -U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' @@ -5302,34 +6152,48 @@ else fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } fi if test -z "${BUILD_COMMS_MPI_TRUE}" && test -z "${BUILD_COMMS_MPI_FALSE}"; then - as_fn_error $? "conditional \"BUILD_COMMS_MPI\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_COMMS_MPI\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_COMMS_MPI\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } fi if test -z "${BUILD_COMMS_NONE_TRUE}" && test -z "${BUILD_COMMS_NONE_FALSE}"; then - as_fn_error $? "conditional \"BUILD_COMMS_NONE\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_COMMS_NONE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_COMMS_NONE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } fi -: "${CONFIG_STATUS=./config.status}" +: ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -5339,18 +6203,17 @@ cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 debug=false ac_cs_recheck=false ac_cs_silent=false - SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -5358,15 +6221,23 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; esac + fi + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + as_nl=' ' export as_nl @@ -5374,13 +6245,7 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -5391,7 +6256,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in #( + case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -5414,6 +6279,13 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -5423,16 +6295,15 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( +case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done IFS=$as_save_IFS ;; @@ -5444,16 +6315,12 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 + { (exit 1); exit 1; } fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' @@ -5465,89 +6332,7 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - +# Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -5561,12 +6346,8 @@ else as_basename=false fi -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi +# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -5586,25 +6367,76 @@ $as_echo X/"$0" | } s/.*/./; q'` -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( +case `echo -n x` in -n*) - case `echo 'xy\c'` in + case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; + *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -5619,85 +6451,49 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' + as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -pR' + as_ln_s='cp -p' fi else - as_ln_s='cp -pR' + as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' + as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -5707,19 +6503,13 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to +# Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Grid $as_me 1.0, which was -generated by GNU Autoconf 2.69. Invocation command line was +generated by GNU Autoconf 2.63. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -5751,15 +6541,13 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. +\`$as_me' instantiates files from templates according to the +current configuration. -Usage: $0 [OPTION]... [TAG]... +Usage: $0 [OPTION]... [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit - --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files @@ -5778,17 +6566,16 @@ $config_headers Configuration commands: $config_commands -Report bugs to ." +Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Grid config.status 1.0 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2008 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -5806,16 +6593,11 @@ ac_need_defaults=: while test $# != 0 do case $1 in - --*=?*) + --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; *) ac_option=$1 ac_optarg=$2 @@ -5829,29 +6611,27 @@ do ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; esac - as_fn_append CONFIG_FILES " '$ac_optarg'" + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ @@ -5859,10 +6639,11 @@ Try \`$0 --help' for more information.";; ac_cs_silent=: ;; # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; + -*) { $as_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; - *) as_fn_append ac_config_targets " $1" + *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac @@ -5879,7 +6660,7 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' @@ -5920,7 +6701,9 @@ do "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "benchmarks/Makefile") CONFIG_FILES="$CONFIG_FILES benchmarks/Makefile" ;; - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; esac done @@ -5943,24 +6726,26 @@ fi # after its creation but before its name has been assigned to `$tmp'. $debug || { - tmp= ac_tmp= + tmp= trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 - trap 'as_fn_exit 1' 1 2 13 15 + trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" + test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -5968,13 +6753,7 @@ ac_tmp=$tmp if test -n "$CONFIG_FILES"; then -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi +ac_cr=' ' ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' @@ -5982,7 +6761,7 @@ else ac_cs_awk_cr=$ac_cr fi -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF @@ -5991,18 +6770,24 @@ _ACEOF echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -6010,7 +6795,7 @@ done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h @@ -6024,7 +6809,7 @@ s/'"$ac_delim"'$// t delim :nl h -s/\(.\{148\}\)..*/\1/ +s/\(.\{148\}\).*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p @@ -6038,7 +6823,7 @@ s/.\{148\}// t nl :delim h -s/\(.\{148\}\)..*/\1/ +s/\(.\{148\}\).*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p @@ -6058,7 +6843,7 @@ t delim rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && +cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" @@ -6090,29 +6875,23 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } _ACEOF -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// s/^[^=]*=[ ]*$// }' fi @@ -6124,7 +6903,7 @@ fi # test -n "$CONFIG_FILES" # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || +cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF @@ -6136,11 +6915,13 @@ _ACEOF # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then break elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -6225,7 +7006,9 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } fi # test -n "$CONFIG_HEADERS" @@ -6238,7 +7021,9 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -6257,7 +7042,7 @@ do for ac_f do case $ac_f in - -) ac_f="$ac_tmp/stdin";; + -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. @@ -6266,10 +7051,12 @@ do [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" + ac_file_inputs="$ac_file_inputs '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't @@ -6280,7 +7067,7 @@ do `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. @@ -6292,8 +7079,10 @@ $as_echo "$as_me: creating $ac_file" >&6;} esac case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; esac ;; esac @@ -6321,7 +7110,47 @@ $as_echo X"$ac_file" | q } s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in @@ -6378,6 +7207,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= + ac_sed_dataroot=' /datarootdir/ { p @@ -6387,11 +7217,12 @@ ac_sed_dataroot=' /@docdir@/p /@infodir@/p /@localedir@/p -/@mandir@/p' +/@mandir@/p +' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 @@ -6401,7 +7232,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; + s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF @@ -6429,24 +7260,27 @@ s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} +which seems to be undefined. Please make sure it is defined." >&2;} - rm -f "$ac_tmp/stdin" + rm -f "$tmp/stdin" case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; :H) # @@ -6455,21 +7289,27 @@ which seems to be undefined. Please make sure it is defined" >&2;} if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } fi else $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" @@ -6507,7 +7347,7 @@ $as_echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac @@ -6515,7 +7355,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Older Autoconf quotes --file arguments for eval, but not when files + # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -6528,7 +7368,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but + # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -6562,19 +7402,21 @@ $as_echo X"$mf" | continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. + # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue + test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || @@ -6600,7 +7442,47 @@ $as_echo X"$file" | q } s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p + { as_dir=$dirpart/$fdir + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done @@ -6612,12 +7494,15 @@ $as_echo X"$file" | done # for ac_tag -as_fn_exit 0 +{ (exit 0); exit 0; } _ACEOF +chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } # configure is writing to config.log, and then calls config.status. @@ -6638,10 +7523,10 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 + $ac_cs_success || { (exit 1); exit 1; } fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 + { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi diff --git a/lib/Grid_config.h b/lib/Grid_config.h index c743bba0..fe3a5e60 100644 --- a/lib/Grid_config.h +++ b/lib/Grid_config.h @@ -11,21 +11,21 @@ /* #undef AVX512 */ /* GRID_COMMS_MPI */ -#define GRID_COMMS_MPI 1 +/* #undef GRID_COMMS_MPI */ /* GRID_COMMS_NONE */ -/* #undef GRID_COMMS_NONE */ +#define GRID_COMMS_NONE 1 /* Define to 1 if you have the declaration of `be64toh', and to 0 if you don't. */ -#define HAVE_DECL_BE64TOH 0 +#define HAVE_DECL_BE64TOH 1 /* Define to 1 if you have the declaration of `ntohll', and to 0 if you don't. */ -#define HAVE_DECL_NTOHLL 1 +#define HAVE_DECL_NTOHLL 0 /* Define to 1 if you have the header file. */ -/* #undef HAVE_ENDIAN_H */ +#define HAVE_ENDIAN_H 1 /* Define to 1 if you have the `gettimeofday' function. */ #define HAVE_GETTIMEOFDAY 1 @@ -34,10 +34,10 @@ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the header file. */ -/* #undef HAVE_MALLOC_H */ +#define HAVE_MALLOC_H 1 /* Define to 1 if you have the header file. */ -#define HAVE_MALLOC_MALLOC_H 1 +/* #undef HAVE_MALLOC_MALLOC_H */ /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 @@ -78,9 +78,6 @@ /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "grid" -/* Define to the home page for this package. */ -#define PACKAGE_URL "" - /* Define to the version of this package. */ #define PACKAGE_VERSION "1.0" diff --git a/lib/Grid_config.h.in b/lib/Grid_config.h.in index 437a6095..4b094250 100644 --- a/lib/Grid_config.h.in +++ b/lib/Grid_config.h.in @@ -77,9 +77,6 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME -/* Define to the home page for this package. */ -#undef PACKAGE_URL - /* Define to the version of this package. */ #undef PACKAGE_VERSION diff --git a/lib/Grid_init.cc b/lib/Grid_init.cc index 762f7568..47159d05 100644 --- a/lib/Grid_init.cc +++ b/lib/Grid_init.cc @@ -81,7 +81,7 @@ void * Grid_backtrace_buffer[_NBACKTRACE]; void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr) { printf("Caught signal %d\n",si->si_signo); - printf(" mem address %llx\n",(uint64_t)si->si_addr); + printf(" mem address %lx\n",(uint64_t)si->si_addr); printf(" code %d\n",si->si_code); #ifdef __X86_64 diff --git a/lib/qcd/Grid_qcd_wilson_dop.cc b/lib/qcd/Grid_qcd_wilson_dop.cc index 7ce41e57..ddc73c4a 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.cc +++ b/lib/qcd/Grid_qcd_wilson_dop.cc @@ -253,7 +253,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) mult(&Uchi(),&Umu._odata[ss](Tm),&chi()); accumReconTm(result,Uchi); - out._odata[ss] = result; + vstream(out._odata[ss],result); } } diff --git a/tests/Grid_gamma.cc b/tests/Grid_gamma.cc index af735856..9cda8855 100644 --- a/tests/Grid_gamma.cc +++ b/tests/Grid_gamma.cc @@ -39,16 +39,16 @@ int main (int argc, char ** argv) std::cout << " Is pod " << std::is_pod::value << std::endl; std::cout << " Is pod double " << std::is_pod::value << std::endl; std::cout << " Is pod ComplexF " << std::is_pod::value << std::endl; - std::cout << " Is triv double " << std::is_trivially_default_constructible::value << std::endl; - std::cout << " Is triv ComplexF " << std::is_trivially_default_constructible::value << std::endl; + std::cout << " Is triv double " << std::has_trivial_default_constructor::value << std::endl; + std::cout << " Is triv ComplexF " << std::has_trivial_default_constructor::value << std::endl; std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; - std::cout << " Is triv Scalar " < >::value << std::endl; - std::cout << " Is triv Scalar "< >::value << std::endl; + std::cout << " Is triv Scalar " < >::value << std::endl; + std::cout << " Is triv Scalar "< >::value << std::endl; for(int a=0;a Date: Wed, 6 May 2015 06:37:21 +0100 Subject: [PATCH 125/429] Wilson perf improvements with Gauge prefetching --- Makefile.in | 393 ++- aclocal.m4 | 705 +++-- benchmarks/Grid_wilson.cc | 2 +- configure | 5011 +++++++++++++------------------- lib/Grid_config.h | 17 +- lib/Grid_config.h.in | 3 + lib/math/Grid_math_tensors.h | 11 + lib/qcd/Grid_qcd_wilson_dop.cc | 27 +- lib/simd/Grid_vComplexD.h | 2 +- lib/simd/Grid_vComplexF.h | 2 +- lib/simd/Grid_vInteger.h | 2 +- lib/simd/Grid_vRealD.h | 2 +- lib/simd/Grid_vRealF.h | 2 +- tests/Grid_gamma.cc | 26 +- 14 files changed, 2819 insertions(+), 3386 deletions(-) diff --git a/Makefile.in b/Makefile.in index f9e18fe4..c9257ab2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,6 +14,61 @@ @SET_MAKE@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -32,43 +86,86 @@ NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . -DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ - ChangeLog INSTALL NEWS TODO compile depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/lib/Grid_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ - distdir dist dist-all distcheck +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags +CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING ChangeLog \ + INSTALL NEWS README TODO compile depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ - { test ! -d "$(distdir)" \ - || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr "$(distdir)"; }; } + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ @@ -96,10 +193,14 @@ am__relativize = \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best +DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -139,6 +240,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -196,7 +298,7 @@ SUBDIRS = lib tests benchmarks all: all-recursive .SUFFIXES: -am--refresh: +am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ @@ -211,7 +313,6 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -232,22 +333,25 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ @@ -262,57 +366,12 @@ $(RECURSIVE_TARGETS): $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -328,12 +387,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -345,15 +399,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -362,9 +412,31 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) @@ -400,13 +472,10 @@ distdir: $(DISTFILES) done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ @@ -435,36 +504,42 @@ distdir: $(DISTFILES) || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) + $(am__post_remove_distdir) dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) -dist-lzma: distdir - tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma - $(am__remove_distdir) +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) dist-xz: distdir - tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz - $(am__remove_distdir) + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) + $(am__post_remove_distdir) dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) + $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) + $(am__post_remove_distdir) -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another @@ -475,8 +550,8 @@ distcheck: dist GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lzma*) \ - lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ @@ -486,17 +561,19 @@ distcheck: dist *.zip*) \ unzip $(distdir).zip ;;\ esac - chmod -R a-w $(distdir); chmod u+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -519,13 +596,21 @@ distcheck: dist && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 - $(am__remove_distdir) + $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: - @$(am__cd) '$(distuninstallcheck_dir)' \ - && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ @@ -556,10 +641,15 @@ install-am: all-am installcheck: installcheck-recursive install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: clean-generic: @@ -640,23 +730,24 @@ ps-am: uninstall-am: -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ - install-am install-strip tags-recursive +.MAKE: $(am__recursive_targets) install-am install-strip -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-am clean clean-generic \ - ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ - dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \ - distclean distclean-generic distclean-tags distcleancheck \ - distdir distuninstallcheck dvi dvi-am html html-am info \ - info-am install install-am install-data install-data-am \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-html install-html-am install-info install-info-am \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ + distcheck distclean distclean-generic distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ - pdf-am ps ps-am tags tags-recursive uninstall uninstall-am + pdf-am ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/aclocal.m4 b/aclocal.m4 index bcc213b4..f3018f6c 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.11.1 -*- Autoconf -*- +# generated automatically by aclocal 1.15 -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -11,15 +11,16 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],, -[m4_warning([this file was generated for autoconf 2.63. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically `autoreconf'.])]) +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -31,10 +32,10 @@ To do so, use the procedure documented by the package, typically `autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.11' +[am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.11.1], [], +m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -50,22 +51,22 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.11.1])dnl +[AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and @@ -84,7 +85,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you +# harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, @@ -102,30 +103,26 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 9 - # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl @@ -144,16 +141,14 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 10 -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing @@ -163,7 +158,7 @@ fi])]) # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was @@ -176,12 +171,13 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], UPC, [depcc="$UPC" am_compiler_list=], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], @@ -189,8 +185,9 @@ AC_CACHE_CHECK([dependency style of $depcc], # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -229,16 +226,16 @@ AC_CACHE_CHECK([dependency style of $depcc], : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -247,16 +244,16 @@ AC_CACHE_CHECK([dependency style of $depcc], test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -304,7 +301,7 @@ AM_CONDITIONAL([am__fastdep$1], [ # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl @@ -314,34 +311,39 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' + am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -#serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -354,7 +356,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but + # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -366,21 +368,19 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. + # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue + test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` @@ -398,7 +398,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will +# is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], @@ -408,18 +408,21 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 16 - # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- @@ -432,7 +435,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.62])dnl +[AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -461,33 +464,42 @@ AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -496,34 +508,82 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The `parallel-tests' driver may need to know about EXEEXT, so add the -dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) -dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. @@ -545,7 +605,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -556,7 +616,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -564,16 +624,14 @@ if test x"${install_sh}" != xset; then install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi -AC_SUBST(install_sh)]) +AC_SUBST([install_sh])]) -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], @@ -589,14 +647,12 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 - # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. @@ -614,7 +670,7 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. +# Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -641,15 +697,12 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 6 - # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], @@ -657,11 +710,10 @@ AC_DEFUN([AM_MISSING_PROG], $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) - # AM_MISSING_HAS_RUN # ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl @@ -674,63 +726,35 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) + AC_MSG_WARN(['missing' script is too old or missing]) fi ]) -# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_MKDIR_P -# --------------- -# Check for `mkdir -p'. -AC_DEFUN([AM_PROG_MKDIR_P], -[AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) - # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 - # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) -# ------------------------------ +# -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) -# ---------------------------------- +# ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) @@ -741,24 +765,82 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -769,32 +851,40 @@ case `pwd` in esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac -# Do `set' in a subshell so we don't clobber the current shell's +# Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done test "$[2]" = conftest.file ) then @@ -804,9 +894,85 @@ else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi -AC_MSG_RESULT(yes)]) +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -814,34 +980,32 @@ AC_MSG_RESULT(yes)]) # AM_PROG_INSTALL_STRIP # --------------------- -# One issue with vendor `install' (even GNU) is that you can't +# One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize +# always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. @@ -849,24 +1013,22 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])]) AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- +# -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory @@ -876,75 +1038,114 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar +# AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. -AM_MISSING_PROG([AMTAR], [tar]) -m4_if([$1], [v7], - [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - # tar/untar a dummy directory, and stop if the command works + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR diff --git a/benchmarks/Grid_wilson.cc b/benchmarks/Grid_wilson.cc index 51255fcb..ecd7b65b 100644 --- a/benchmarks/Grid_wilson.cc +++ b/benchmarks/Grid_wilson.cc @@ -76,7 +76,7 @@ int main (int argc, char ** argv) WilsonMatrix Dw(Umu,mass); std::cout << "Calling Dw"<. # -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -22,23 +24,15 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; esac - fi - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - as_nl=' ' export as_nl @@ -46,7 +40,13 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -57,7 +57,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in + case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -80,13 +80,6 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -96,15 +89,16 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -case $0 in +as_myself= +case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done IFS=$as_save_IFS ;; @@ -116,12 +110,16 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } + exit 1 fi -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' @@ -133,7 +131,294 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# Required to use basename. +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: paboyle@ph.ed.ac.uk about your system, including any +$0: error possibly output before this message. Then install +$0: a modern shell, or manually run the script under such a +$0: shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -147,8 +432,12 @@ else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -168,295 +457,19 @@ $as_echo X/"$0" | } s/.*/./; q'` -# CDPATH. -$as_unset CDPATH +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits -if test "x$CONFIG_SHELL" = x; then - if (eval ":") 2>/dev/null; then - as_have_required=yes -else - as_have_required=no -fi - - if test $as_have_required = yes && (eval ": -(as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=\$LINENO - as_lineno_2=\$LINENO - test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && - test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } -") 2> /dev/null; then - : -else - as_candidate_shells= - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - case $as_dir in - /*) - for as_base in sh bash ksh sh5; do - as_candidate_shells="$as_candidate_shells $as_dir/$as_base" - done;; - esac -done -IFS=$as_save_IFS - - - for as_shell in $as_candidate_shells $SHELL; do - # Try only shells that exist, to save several forks. - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { ("$as_shell") 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -_ASEOF -}; then - CONFIG_SHELL=$as_shell - as_have_required=yes - if { "$as_shell" 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -(as_func_return () { - (exit $1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = "$1" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test $exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } - -_ASEOF -}; then - break -fi - -fi - - done - - if test "x$CONFIG_SHELL" != x; then - for as_var in BASH_ENV ENV - do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - done - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi - - - if test $as_have_required = no; then - echo This script requires a shell more modern than all the - echo shells that I found on your system. Please install a - echo modern shell, or manually run the script under such a - echo shell if you do have one. - { (exit 1); exit 1; } -fi - - -fi - -fi - - - -(eval "as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0") || { - echo No shell found that supports shell functions. - echo Please tell bug-autoconf@gnu.org about your system, - echo including any error possibly output before this message. - echo This can help us improve future autoconf versions. - echo Configuration will now proceed without shell functions. -} - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= @@ -473,9 +486,12 @@ test \$exitcode = 0") || { s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). @@ -484,29 +500,18 @@ test \$exitcode = 0") || { exit } - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in +case `echo -n x` in #((((( -n*) - case `echo 'x\c'` in + case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -521,49 +526,29 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -572,11 +557,11 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -exec 7<&0 &1 +test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` @@ -591,7 +576,6 @@ cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='Grid' @@ -599,6 +583,7 @@ PACKAGE_TARNAME='grid' PACKAGE_VERSION='1.0' PACKAGE_STRING='Grid 1.0' PACKAGE_BUGREPORT='paboyle@ph.ed.ac.uk' +PACKAGE_URL='' ac_unique_file="lib/Grid.h" # Factoring default headers for most tests. @@ -659,6 +644,7 @@ CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE +am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE @@ -672,6 +658,10 @@ CPPFLAGS LDFLAGS CXXFLAGS CXX +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V am__untar am__tar AMTAR @@ -725,6 +715,7 @@ bindir program_transform_name prefix exec_prefix +PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION @@ -735,6 +726,7 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking +enable_silent_rules enable_dependency_tracking enable_openmp enable_simd @@ -814,8 +806,9 @@ do fi case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. @@ -860,8 +853,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -887,8 +879,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1092,8 +1083,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1109,8 +1099,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1140,17 +1129,17 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) { $as_echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1159,7 +1148,7 @@ Try \`$0 --help' for more information." >&2 $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac @@ -1167,15 +1156,13 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { $as_echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; - fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 - { (exit 1); exit 1; }; } ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1198,8 +1185,7 @@ do [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' @@ -1213,8 +1199,6 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1229,11 +1213,9 @@ test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - { $as_echo "$as_me: error: working directory cannot be determined" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. @@ -1272,13 +1254,11 @@ else fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 - { (exit 1); exit 1; }; } + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then @@ -1318,7 +1298,7 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages + -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files @@ -1378,8 +1358,12 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build --disable-openmp do not use OpenMP --enable-simd=SSE|AVX|AVX2|AVX512|MIC Select instructions to be SSE4.0, AVX 1.0, AVX @@ -1392,7 +1376,7 @@ Some influential environment variables: LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags @@ -1465,21 +1449,568 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Grid configure 1.0 -generated by GNU Autoconf 2.63 +generated by GNU Autoconf 2.69 -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_find_uintX_t LINENO BITS VAR +# ------------------------------------ +# Finds an unsigned integer type with width BITS, setting cache variable VAR +# accordingly. +ac_fn_c_find_uintX_t () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 +$as_echo_n "checking for uint$2_t... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + # Order is important - never check a type that is potentially smaller + # than half of the expected target width. + for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + case $ac_type in #( + uint$2_t) : + eval "$3=yes" ;; #( + *) : + eval "$3=\$ac_type" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no"; then : + +else + break +fi + done +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_find_uintX_t + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Grid $as_me 1.0, which was -generated by GNU Autoconf 2.63. Invocation command line was +generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -1515,8 +2046,8 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" -done + $as_echo "PATH: $as_dir" + done IFS=$as_save_IFS } >&5 @@ -1553,9 +2084,9 @@ do ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" + as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else @@ -1571,13 +2102,13 @@ do -* ) ac_must_keep_next=true ;; esac fi - ac_configure_args="$ac_configure_args '$ac_arg'" + as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there @@ -1589,11 +2120,9 @@ trap 'exit_status=$? { echo - cat <<\_ASBOX -## ---------------- ## + $as_echo "## ---------------- ## ## Cache variables. ## -## ---------------- ## -_ASBOX +## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( @@ -1602,13 +2131,13 @@ _ASBOX case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; + *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done @@ -1627,11 +2156,9 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - cat <<\_ASBOX -## ----------------- ## + $as_echo "## ----------------- ## ## Output variables. ## -## ----------------- ## -_ASBOX +## ----------------- ##" echo for ac_var in $ac_subst_vars do @@ -1644,11 +2171,9 @@ _ASBOX echo if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## + $as_echo "## ------------------- ## ## File substitutions. ## -## ------------------- ## -_ASBOX +## ------------------- ##" echo for ac_var in $ac_subst_files do @@ -1662,11 +2187,9 @@ _ASBOX fi if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## + $as_echo "## ----------- ## ## confdefs.h. ## -## ----------- ## -_ASBOX +## ----------- ##" echo cat confdefs.h echo @@ -1680,46 +2203,53 @@ _ASBOX exit $exit_status ' 0 for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h +$as_echo "/* confdefs.h */" > confdefs.h + # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - ac_site_file1=$CONFIG_SITE + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site @@ -1730,19 +2260,23 @@ fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue - if test -r "$ac_site_file"; then - { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; @@ -1750,7 +2284,7 @@ $as_echo "$as_me: loading cache $cache_file" >&6;} esac fi else - { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi @@ -1765,11 +2299,11 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; @@ -1779,17 +2313,17 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac @@ -1801,43 +2335,20 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then - { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi - - - - - - - - - - - - - - - - - - - - - - - - +## -------------------- ## +## Main body of script. ## +## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -1846,7 +2357,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -am__api_version='1.11' +am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -1865,9 +2376,7 @@ for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do fi done if test -z "$ac_aux_dir"; then - { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 -$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, @@ -1893,10 +2402,10 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then +if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -1904,11 +2413,11 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -1916,7 +2425,7 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -1945,7 +2454,7 @@ case $as_dir/ in ;; esac -done + done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir @@ -1961,7 +2470,7 @@ fi INSTALL=$ac_install_sh fi fi -{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. @@ -1972,68 +2481,73 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) - { { $as_echo "$as_me:$LINENO: error: unsafe absolute working directory name" >&5 -$as_echo "$as_me: error: unsafe absolute working directory name" >&2;} - { (exit 1); exit 1; }; };; + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - { { $as_echo "$as_me:$LINENO: error: unsafe srcdir value: \`$srcdir'" >&5 -$as_echo "$as_me: error: unsafe srcdir value: \`$srcdir'" >&2;} - { (exit 1); exit 1; }; };; + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac -# Do `set' in a subshell so we don't clobber the current shell's +# Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&5 -$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&2;} - { (exit 1); exit 1; }; } - fi + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done test "$2" = conftest.file ) then # Ok. : else - { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! -Check your system clock" >&5 -$as_echo "$as_me: error: newly created file is older than distributed files! -Check your system clock" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 fi -{ $as_echo "$as_me:$LINENO: result: yes" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. @@ -2044,8 +2558,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2056,15 +2570,15 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2073,17 +2587,17 @@ if test x"${install_sh}" != xset; then esac fi -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. +# will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then +if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then @@ -2094,24 +2608,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2121,9 +2635,9 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then @@ -2134,24 +2648,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2160,7 +2674,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -2173,10 +2687,10 @@ fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then - if test "${ac_cv_path_mkdir+set}" = set; then + if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -2184,9 +2698,9 @@ for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do + for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ @@ -2196,11 +2710,12 @@ do esac done done -done + done IFS=$as_save_IFS fi + test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else @@ -2208,26 +2723,19 @@ fi # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. - test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi -{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AWK+set}" = set; then +if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then @@ -2238,24 +2746,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { $as_echo "$as_me:$LINENO: result: $AWK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2263,11 +2771,11 @@ fi test -n "$AWK" && break done -{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF @@ -2275,7 +2783,7 @@ SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; @@ -2285,11 +2793,11 @@ esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -2303,15 +2811,52 @@ else fi rmdir .tst 2>/dev/null +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then - { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi @@ -2355,19 +2900,72 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' -AMTAR=${AMTAR-"${am_missing_run}tar"} +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' -am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + ac_config_headers="$ac_config_headers lib/Grid_config.h" @@ -2387,9 +2985,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CXX+set}" = set; then +if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then @@ -2400,24 +2998,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then - { $as_echo "$as_me:$LINENO: result: $CXX" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2431,9 +3029,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then +if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then @@ -2444,24 +3042,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2474,7 +3072,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -2485,48 +3083,31 @@ fi fi fi # Provide some information about the compiler. -$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 -{ (ac_try="$ac_compiler --version >&5" +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler --version >&5") 2>&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2542,8 +3123,8 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5 -$as_echo_n "checking for C++ compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 +$as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: @@ -2559,17 +3140,17 @@ do done rm -f $ac_rmfiles -if { (ac_try="$ac_link_default" +if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -2586,7 +3167,7 @@ do # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -2605,84 +3186,41 @@ test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi - -{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -if test -z "$ac_file"; then - $as_echo "$as_me: failed program was:" >&5 +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C++ compiler cannot create executables -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C++ compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; }; } -fi - -ac_exeext=$ac_cv_exeext - -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5 -$as_echo_n "checking whether the C++ compiler works... " >&6; } -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } - fi - fi -fi -{ $as_echo "$as_me:$LINENO: result: yes" >&5 +as_fn_error 77 "C++ compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 +$as_echo_n "checking for C++ compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } -if { (ac_try="$ac_link" +if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -2697,32 +3235,83 @@ for ac_file in conftest.exe conftest conftest.*; do esac done else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } fi - -rm -f conftest$ac_cv_exeext -{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then +if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2734,17 +3323,17 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { (ac_try="$ac_compile" +if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -2757,31 +3346,23 @@ else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } fi - rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if test "${ac_cv_cxx_compiler_gnu+set}" = set; then +if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2795,37 +3376,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no + ac_compiler_gnu=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes @@ -2834,20 +3394,16 @@ else fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } -if test "${ac_cv_prog_cxx_g+set}" = set; then +if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2858,35 +3414,11 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CXXFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2897,36 +3429,12 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cxx_werror_flag=$ac_save_cxx_werror_flag +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2937,42 +3445,17 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS @@ -3006,14 +3489,14 @@ am__doit: .PHONY: am__doit END # If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. +# Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -3034,18 +3517,19 @@ if test "$am__include" = "#"; then fi -{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then +if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' + am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= @@ -3059,17 +3543,18 @@ fi depcc="$CXX" am_compiler_list= -{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -3103,16 +3588,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -3121,16 +3606,16 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -3169,7 +3654,7 @@ else fi fi -{ $as_echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type @@ -3192,9 +3677,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3205,24 +3690,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3232,9 +3717,9 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then +if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3245,24 +3730,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3271,7 +3756,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3285,9 +3770,9 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3298,24 +3783,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3325,9 +3810,9 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3339,18 +3824,18 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then @@ -3369,10 +3854,10 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3384,9 +3869,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3397,24 +3882,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3428,9 +3913,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then +if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3441,24 +3926,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3471,7 +3956,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3482,62 +3967,42 @@ fi fi -test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. -$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -{ (ac_try="$ac_compiler --version >&5" +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler --version >&5") 2>&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done -{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then +if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3551,37 +4016,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no + ac_compiler_gnu=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes @@ -3590,20 +4034,16 @@ else fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then +if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3614,35 +4054,11 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3653,36 +4069,12 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_compile "$LINENO"; then : - ac_c_werror_flag=$ac_save_c_werror_flag +else + ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3693,42 +4085,17 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS @@ -3745,23 +4112,18 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then +if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include -#include -#include +struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); @@ -3813,32 +4175,9 @@ for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then + if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done @@ -3849,17 +4188,19 @@ fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) - { $as_echo "$as_me:$LINENO: result: none needed" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) - { $as_echo "$as_me:$LINENO: result: unsupported" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac +if test "x$ac_cv_prog_cc_c89" != xno; then : +fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -3867,19 +4208,79 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then +if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -3913,16 +4314,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -3931,16 +4332,16 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -3979,7 +4380,7 @@ else fi fi -{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type @@ -3998,17 +4399,18 @@ fi OPENMP_CFLAGS= # Check whether --enable-openmp was given. -if test "${enable_openmp+set}" = set; then +if test "${enable_openmp+set}" = set; then : enableval=$enable_openmp; fi if test "$enable_openmp" != no; then - { $as_echo "$as_me:$LINENO: checking for $CC option to support OpenMP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5 $as_echo_n "checking for $CC option to support OpenMP... " >&6; } -if test "${ac_cv_prog_c_openmp+set}" = set; then +if ${ac_cv_prog_c_openmp+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ #ifndef _OPENMP choke me @@ -4017,37 +4419,16 @@ else int main () { return omp_get_num_threads (); } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_c_openmp='none needed' else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_prog_c_openmp='unsupported' - for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp; do + ac_cv_prog_c_openmp='unsupported' + for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ + -Popenmp --openmp; do ac_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $ac_option" - cat >conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ #ifndef _OPENMP choke me @@ -4056,56 +4437,27 @@ sed 's/^/| /' conftest.$ac_ext >&5 int main () { return omp_get_num_threads (); } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_c_openmp=$ac_option -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS=$ac_save_CFLAGS if test "$ac_cv_prog_c_openmp" != unsupported; then break fi done fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_c_openmp" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5 $as_echo "$ac_cv_prog_c_openmp" >&6; } case $ac_cv_prog_c_openmp in #( "none needed" | unsupported) - ;; #( + ;; #( *) - OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; + OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; esac fi @@ -4113,9 +4465,9 @@ $as_echo "$ac_cv_prog_c_openmp" >&6; } if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then +if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then @@ -4126,24 +4478,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -4153,9 +4505,9 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then @@ -4166,24 +4518,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -4192,7 +4544,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -4212,14 +4564,14 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then + if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded @@ -4234,11 +4586,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4247,78 +4595,34 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi - -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break fi - -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : break fi @@ -4330,7 +4634,7 @@ fi else ac_cv_prog_CPP=$CPP fi -{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes @@ -4341,11 +4645,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4354,87 +4654,40 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi - -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break fi - -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c @@ -4444,9 +4697,9 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then +if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then @@ -4457,10 +4710,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do + for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in @@ -4477,7 +4730,7 @@ case `"$ac_path_GREP" --version 2>&1` in $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" @@ -4492,26 +4745,24 @@ esac $ac_path_GREP_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" -{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then +if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 @@ -4525,10 +4776,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do + for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in @@ -4545,7 +4796,7 @@ case `"$ac_path_EGREP" --version 2>&1` in $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" @@ -4560,12 +4811,10 @@ esac $ac_path_EGREP_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP @@ -4573,21 +4822,17 @@ fi fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" -{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then +if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -4602,48 +4847,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdc=no + ac_cv_header_stdc=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -4653,18 +4873,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -4674,14 +4890,10 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -4708,118 +4920,33 @@ main () return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : +if ac_fn_c_try_run "$LINENO"; then : + else - $as_echo "$as_me: program exited with status $ac_status" >&5 -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -rf conftest.dSYM -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi - fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF +$as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -4829,604 +4956,48 @@ fi done - for ac_header in stdint.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_STDINT_H 1 _ACEOF fi done - for ac_header in malloc/malloc.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_malloc_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_MALLOC_MALLOC_H 1 _ACEOF fi done - for ac_header in malloc.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_MALLOC_H 1 _ACEOF fi done - for ac_header in endian.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "endian.h" "ac_cv_header_endian_h" "$ac_includes_default" +if test "x$ac_cv_header_endian_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_ENDIAN_H 1 _ACEOF fi @@ -5434,244 +5005,35 @@ fi done #AC_CHECK_HEADERS(machine/endian.h) -{ $as_echo "$as_me:$LINENO: checking whether ntohll is declared" >&5 -$as_echo_n "checking whether ntohll is declared... " >&6; } -if test "${ac_cv_have_decl_ntohll+set}" = set; then - $as_echo_n "(cached) " >&6 +ac_fn_c_check_decl "$LINENO" "ntohll" "ac_cv_have_decl_ntohll" "#include +" +if test "x$ac_cv_have_decl_ntohll" = xyes; then : + ac_have_decl=1 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -int -main () -{ -#ifndef ntohll - (void) ntohll; -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_have_decl_ntohll=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_have_decl_ntohll=no + ac_have_decl=0 fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_ntohll" >&5 -$as_echo "$ac_cv_have_decl_ntohll" >&6; } -if test "x$ac_cv_have_decl_ntohll" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_NTOHLL 1 +#define HAVE_DECL_NTOHLL $ac_have_decl _ACEOF - +ac_fn_c_check_decl "$LINENO" "be64toh" "ac_cv_have_decl_be64toh" "#include +" +if test "x$ac_cv_have_decl_be64toh" = xyes; then : + ac_have_decl=1 else - cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_NTOHLL 0 -_ACEOF - - + ac_have_decl=0 fi - -{ $as_echo "$as_me:$LINENO: checking whether be64toh is declared" >&5 -$as_echo_n "checking whether be64toh is declared... " >&6; } -if test "${ac_cv_have_decl_be64toh+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -int -main () -{ -#ifndef be64toh - (void) be64toh; -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_have_decl_be64toh=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_have_decl_be64toh=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_be64toh" >&5 -$as_echo "$ac_cv_have_decl_be64toh" >&6; } -if test "x$ac_cv_have_decl_be64toh" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_BE64TOH 1 +#define HAVE_DECL_BE64TOH $ac_have_decl _ACEOF -else - cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_BE64TOH 0 -_ACEOF - - -fi - - - # Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 -$as_echo_n "checking for size_t... " >&6; } -if test "${ac_cv_type_size_t+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_type_size_t=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if (sizeof (size_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if (sizeof ((size_t))) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : - ac_cv_type_size_t=yes -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 -$as_echo "$ac_cv_type_size_t" >&6; } -if test "x$ac_cv_type_size_t" = x""yes; then - : else cat >>confdefs.h <<_ACEOF @@ -5680,75 +5042,12 @@ _ACEOF fi - - { $as_echo "$as_me:$LINENO: checking for uint32_t" >&5 -$as_echo_n "checking for uint32_t... " >&6; } -if test "${ac_cv_c_uint32_t+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_c_uint32_t=no - for ac_type in 'uint32_t' 'unsigned int' 'unsigned long int' \ - 'unsigned long long int' 'unsigned short int' 'unsigned char'; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(($ac_type) -1 >> (32 - 1) == 1)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - case $ac_type in - uint32_t) ac_cv_c_uint32_t=yes ;; - *) ac_cv_c_uint32_t=$ac_type ;; -esac - -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_uint32_t" != no && break - done -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_uint32_t" >&5 -$as_echo "$ac_cv_c_uint32_t" >&6; } - case $ac_cv_c_uint32_t in #( +ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" +case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) -cat >>confdefs.h <<\_ACEOF -#define _UINT32_T 1 -_ACEOF +$as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF @@ -5757,75 +5056,12 @@ _ACEOF ;; esac - - { $as_echo "$as_me:$LINENO: checking for uint64_t" >&5 -$as_echo_n "checking for uint64_t... " >&6; } -if test "${ac_cv_c_uint64_t+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_c_uint64_t=no - for ac_type in 'uint64_t' 'unsigned int' 'unsigned long int' \ - 'unsigned long long int' 'unsigned short int' 'unsigned char'; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(($ac_type) -1 >> (64 - 1) == 1)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - case $ac_type in - uint64_t) ac_cv_c_uint64_t=yes ;; - *) ac_cv_c_uint64_t=$ac_type ;; -esac - -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_uint64_t" != no && break - done -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_uint64_t" >&5 -$as_echo "$ac_cv_c_uint64_t" >&6; } - case $ac_cv_c_uint64_t in #( +ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" +case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) -cat >>confdefs.h <<\_ACEOF -#define _UINT64_T 1 -_ACEOF +$as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF @@ -5836,102 +5072,12 @@ _ACEOF # Checks for library functions. - for ac_func in gettimeofday -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_GETTIMEOFDAY 1 _ACEOF fi @@ -5939,7 +5085,7 @@ done # Check whether --enable-simd was given. -if test "${enable_simd+set}" = set; then +if test "${enable_simd+set}" = set; then : enableval=$enable_simd; \ ac_SIMD=${enable_simd} else @@ -5951,45 +5097,35 @@ case ${ac_SIMD} in SSE4) echo Configuring for SSE4 -cat >>confdefs.h <<\_ACEOF -#define SSE4 1 -_ACEOF +$as_echo "#define SSE4 1" >>confdefs.h ;; AVX) echo Configuring for AVX -cat >>confdefs.h <<\_ACEOF -#define AVX1 1 -_ACEOF +$as_echo "#define AVX1 1" >>confdefs.h ;; AVX2) echo Configuring for AVX2 -cat >>confdefs.h <<\_ACEOF -#define AVX2 1 -_ACEOF +$as_echo "#define AVX2 1" >>confdefs.h ;; AVX512|MIC) echo Configuring for AVX512 and MIC -cat >>confdefs.h <<\_ACEOF -#define AVX512 1 -_ACEOF +$as_echo "#define AVX512 1" >>confdefs.h ;; *) - { { $as_echo "$as_me:$LINENO: error: ${ac_SIMD} unsupported --enable-simd option" >&5 -$as_echo "$as_me: error: ${ac_SIMD} unsupported --enable-simd option" >&2;} - { (exit 1); exit 1; }; }; + as_fn_error $? "${ac_SIMD} unsupported --enable-simd option" "$LINENO" 5; ;; esac # Check whether --enable-comms was given. -if test "${enable_comms+set}" = set; then +if test "${enable_comms+set}" = set; then : enableval=$enable_comms; ac_COMMS=${enable_comms} else ac_COMMS=none @@ -6000,23 +5136,17 @@ case ${ac_COMMS} in none) echo Configuring for NO communications -cat >>confdefs.h <<\_ACEOF -#define GRID_COMMS_NONE 1 -_ACEOF +$as_echo "#define GRID_COMMS_NONE 1" >>confdefs.h ;; mpi) echo Configuring for MPI communications -cat >>confdefs.h <<\_ACEOF -#define GRID_COMMS_MPI 1 -_ACEOF +$as_echo "#define GRID_COMMS_MPI 1" >>confdefs.h ;; *) - { { $as_echo "$as_me:$LINENO: error: ${ac_COMMS} unsupported --enable-comms option" >&5 -$as_echo "$as_me: error: ${ac_COMMS} unsupported --enable-comms option" >&2;} - { (exit 1); exit 1; }; }; + as_fn_error $? "${ac_COMMS} unsupported --enable-comms option" "$LINENO" 5; ;; esac @@ -6073,13 +5203,13 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; + *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done @@ -6087,8 +5217,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" @@ -6110,12 +5240,23 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && - { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi else - { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi @@ -6129,20 +5270,29 @@ DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= +U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. - ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' @@ -6152,48 +5302,34 @@ else fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_COMMS_MPI_TRUE}" && test -z "${BUILD_COMMS_MPI_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_COMMS_MPI\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"BUILD_COMMS_MPI\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"BUILD_COMMS_MPI\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_COMMS_NONE_TRUE}" && test -z "${BUILD_COMMS_NONE_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_COMMS_NONE\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"BUILD_COMMS_NONE\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"BUILD_COMMS_NONE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -: ${CONFIG_STATUS=./config.status} +: "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -6203,17 +5339,18 @@ cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 debug=false ac_cs_recheck=false ac_cs_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -6221,23 +5358,15 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; esac - fi - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - as_nl=' ' export as_nl @@ -6245,7 +5374,13 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -6256,7 +5391,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in + case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -6279,13 +5414,6 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -6295,15 +5423,16 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -case $0 in +as_myself= +case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done IFS=$as_save_IFS ;; @@ -6315,12 +5444,16 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } + exit 1 fi -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' @@ -6332,7 +5465,89 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# Required to use basename. +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -6346,8 +5561,12 @@ else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -6367,76 +5586,25 @@ $as_echo X/"$0" | } s/.*/./; q'` -# CDPATH. -$as_unset CDPATH - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in +case `echo -n x` in #((((( -n*) - case `echo 'x\c'` in + case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -6451,49 +5619,85 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -6503,13 +5707,19 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 -# Save the log message, to keep $[0] and so on meaningful, and to +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Grid $as_me 1.0, which was -generated by GNU Autoconf 2.63. Invocation command line was +generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -6541,13 +5751,15 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. -Usage: $0 [OPTION]... [FILE]... +Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit + --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files @@ -6566,16 +5778,17 @@ $config_headers Configuration commands: $config_commands -Report bugs to ." +Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Grid config.status 1.0 -configured by $0, generated by GNU Autoconf 2.63, - with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" -Copyright (C) 2008 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -6593,11 +5806,16 @@ ac_need_defaults=: while test $# != 0 do case $1 in - --*=*) + --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; *) ac_option=$1 ac_optarg=$2 @@ -6611,27 +5829,29 @@ do ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; esac - CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac - CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - { $as_echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; };; + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ @@ -6639,11 +5859,10 @@ Try \`$0 --help' for more information." >&2 ac_cs_silent=: ;; # This is an error. - -*) { $as_echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } ;; + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; - *) ac_config_targets="$ac_config_targets $1" + *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac @@ -6660,7 +5879,7 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' @@ -6701,9 +5920,7 @@ do "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "benchmarks/Makefile") CONFIG_FILES="$CONFIG_FILES benchmarks/Makefile" ;; - *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done @@ -6726,26 +5943,24 @@ fi # after its creation but before its name has been assigned to `$tmp'. $debug || { - tmp= + tmp= ac_tmp= trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 + trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" + test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") -} || -{ - $as_echo "$as_me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -6753,7 +5968,13 @@ $debug || if test -n "$CONFIG_FILES"; then -ac_cr=' ' +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' @@ -6761,7 +5982,7 @@ else ac_cs_awk_cr=$ac_cr fi -echo 'BEGIN {' >"$tmp/subs1.awk" && +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF @@ -6770,24 +5991,18 @@ _ACEOF echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -6795,7 +6010,7 @@ done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h @@ -6809,7 +6024,7 @@ s/'"$ac_delim"'$// t delim :nl h -s/\(.\{148\}\).*/\1/ +s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p @@ -6823,7 +6038,7 @@ s/.\{148\}// t nl :delim h -s/\(.\{148\}\).*/\1/ +s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p @@ -6843,7 +6058,7 @@ t delim rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK -cat >>"\$tmp/subs1.awk" <<_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" @@ -6875,23 +6090,29 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 -$as_echo "$as_me: error: could not setup config files machinery" >&2;} - { (exit 1); exit 1; }; } +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// s/^[^=]*=[ ]*$// }' fi @@ -6903,7 +6124,7 @@ fi # test -n "$CONFIG_FILES" # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then -cat >"$tmp/defines.awk" <<\_ACAWK || +cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF @@ -6915,13 +6136,11 @@ _ACEOF # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do - ac_t=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_t"; then + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then break elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -7006,9 +6225,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 -$as_echo "$as_me: error: could not setup config headers machinery" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" @@ -7021,9 +6238,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 -$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} - { (exit 1); exit 1; }; };; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -7042,7 +6257,7 @@ $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} for ac_f do case $ac_f in - -) ac_f="$tmp/stdin";; + -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. @@ -7051,12 +6266,10 @@ $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} - { (exit 1); exit 1; }; };; + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - ac_file_inputs="$ac_file_inputs '$ac_f'" + as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't @@ -7067,7 +6280,7 @@ $as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. @@ -7079,10 +6292,8 @@ $as_echo "$as_me: creating $ac_file" >&6;} esac case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } ;; + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac @@ -7110,47 +6321,7 @@ $as_echo X"$ac_file" | q } s/.*/./; q'` - { as_dir="$ac_dir" - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } + as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in @@ -7207,7 +6378,6 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= - ac_sed_dataroot=' /datarootdir/ { p @@ -7217,12 +6387,11 @@ ac_sed_dataroot=' /@docdir@/p /@infodir@/p /@localedir@/p -/@mandir@/p -' +/@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 @@ -7232,7 +6401,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; + s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF @@ -7260,27 +6429,24 @@ s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} +which seems to be undefined. Please make sure it is defined" >&2;} - rm -f "$tmp/stdin" + rm -f "$ac_tmp/stdin" case $ac_file in - -) cat "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # @@ -7289,27 +6455,21 @@ $as_echo "$as_me: error: could not create $ac_file" >&2;} if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" - } >"$tmp/config.h" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } - if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" - mv "$tmp/config.h" "$ac_file" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ - || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 -$as_echo "$as_me: error: could not create -" >&2;} - { (exit 1); exit 1; }; } + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" @@ -7347,7 +6507,7 @@ $as_echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac @@ -7355,7 +6515,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -7368,7 +6528,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but + # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -7402,21 +6562,19 @@ $as_echo X"$mf" | continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. + # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue + test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || @@ -7442,47 +6600,7 @@ $as_echo X"$file" | q } s/.*/./; q'` - { as_dir=$dirpart/$fdir - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } + as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done @@ -7494,15 +6612,12 @@ $as_echo "$as_me: error: cannot create directory $as_dir" >&2;} done # for ac_tag -{ (exit 0); exit 0; } +as_fn_exit 0 _ACEOF -chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || - { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. @@ -7523,10 +6638,10 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } + $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi diff --git a/lib/Grid_config.h b/lib/Grid_config.h index fe3a5e60..c743bba0 100644 --- a/lib/Grid_config.h +++ b/lib/Grid_config.h @@ -11,21 +11,21 @@ /* #undef AVX512 */ /* GRID_COMMS_MPI */ -/* #undef GRID_COMMS_MPI */ +#define GRID_COMMS_MPI 1 /* GRID_COMMS_NONE */ -#define GRID_COMMS_NONE 1 +/* #undef GRID_COMMS_NONE */ /* Define to 1 if you have the declaration of `be64toh', and to 0 if you don't. */ -#define HAVE_DECL_BE64TOH 1 +#define HAVE_DECL_BE64TOH 0 /* Define to 1 if you have the declaration of `ntohll', and to 0 if you don't. */ -#define HAVE_DECL_NTOHLL 0 +#define HAVE_DECL_NTOHLL 1 /* Define to 1 if you have the header file. */ -#define HAVE_ENDIAN_H 1 +/* #undef HAVE_ENDIAN_H */ /* Define to 1 if you have the `gettimeofday' function. */ #define HAVE_GETTIMEOFDAY 1 @@ -34,10 +34,10 @@ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the header file. */ -#define HAVE_MALLOC_H 1 +/* #undef HAVE_MALLOC_H */ /* Define to 1 if you have the header file. */ -/* #undef HAVE_MALLOC_MALLOC_H */ +#define HAVE_MALLOC_MALLOC_H 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 @@ -78,6 +78,9 @@ /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "grid" +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + /* Define to the version of this package. */ #define PACKAGE_VERSION "1.0" diff --git a/lib/Grid_config.h.in b/lib/Grid_config.h.in index 4b094250..437a6095 100644 --- a/lib/Grid_config.h.in +++ b/lib/Grid_config.h.in @@ -77,6 +77,9 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME +/* Define to the home page for this package. */ +#undef PACKAGE_URL + /* Define to the version of this package. */ #undef PACKAGE_VERSION diff --git a/lib/math/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h index 564d5cb6..09739555 100644 --- a/lib/math/Grid_math_tensors.h +++ b/lib/math/Grid_math_tensors.h @@ -57,6 +57,9 @@ public: friend void zeroit(iScalar &that){ zeroit(that._internal); } + friend void prefetch(iScalar &that){ + prefetch(that._internal); + } friend void permute(iScalar &out,const iScalar &in,int permutetype){ permute(out._internal,in._internal,permutetype); } @@ -141,6 +144,9 @@ public: zeroit(that._internal[i]); } } + friend void prefetch(iVector &that){ + for(int i=0;i &out,const iVector &in){ for(int i=0;i &that){ + for(int i=0;i &out,const iMatrix &in){ for(int i=0;ioSites();sss++){ int ss = sss; - //int ss = Stencil._LebesgueReorder[sss]; + int ssu= sss; + //int ss = 0; + //int ss = Stencil._LebesgueReorder[sss]; // Xp offset = Stencil._offsets [Xp][ss]; @@ -123,7 +125,8 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Xp),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Xp),&chi()); + prefetch(Umu._odata[ssu](Yp)); spReconXp(result,Uchi); // Yp @@ -141,7 +144,8 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Yp),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Yp),&chi()); + prefetch(Umu._odata[ssu](Zp)); accumReconYp(result,Uchi); // Zp @@ -159,7 +163,8 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Zp),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Zp),&chi()); + prefetch(Umu._odata[ssu](Tp)); accumReconZp(result,Uchi); // Tp @@ -177,7 +182,8 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Tp),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Tp),&chi()); + prefetch(Umu._odata[ssu](Xm)); accumReconTp(result,Uchi); // Xm @@ -195,7 +201,8 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Xm),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Xm),&chi()); + prefetch(Umu._odata[ssu](Ym)); accumReconXm(result,Uchi); @@ -214,7 +221,8 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Ym),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Ym),&chi()); + prefetch(Umu._odata[ssu](Zm)); accumReconYm(result,Uchi); // Zm @@ -232,7 +240,8 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Zm),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Zm),&chi()); + prefetch(Umu._odata[ssu](Tm)); accumReconZm(result,Uchi); // Tm @@ -250,7 +259,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Tm),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Tm),&chi()); accumReconTm(result,Uchi); vstream(out._odata[ss],result); diff --git a/lib/simd/Grid_vComplexD.h b/lib/simd/Grid_vComplexD.h index f0108d59..5dbb28e5 100644 --- a/lib/simd/Grid_vComplexD.h +++ b/lib/simd/Grid_vComplexD.h @@ -257,7 +257,7 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ assert(0); #endif } - friend inline void vprefetch(const vComplexD &v) + friend inline void prefetch(const vComplexD &v) { _mm_prefetch((const char*)&v.v,_MM_HINT_T0); } diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index 5f52fc53..66a1e1bf 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -206,7 +206,7 @@ namespace Grid { assert(0); #endif } - friend inline void vprefetch(const vComplexF &v) + friend inline void prefetch(const vComplexF &v) { _mm_prefetch((const char*)&v.v,_MM_HINT_T0); } diff --git a/lib/simd/Grid_vInteger.h b/lib/simd/Grid_vInteger.h index 5a429a9c..b7950873 100644 --- a/lib/simd/Grid_vInteger.h +++ b/lib/simd/Grid_vInteger.h @@ -190,7 +190,7 @@ namespace Grid { out=in; } - friend inline void vprefetch(const vInteger &v) + friend inline void prefetch(const vInteger &v) { _mm_prefetch((const char*)&v.v,_MM_HINT_T0); } diff --git a/lib/simd/Grid_vRealD.h b/lib/simd/Grid_vRealD.h index ee51fa03..8041c1f9 100644 --- a/lib/simd/Grid_vRealD.h +++ b/lib/simd/Grid_vRealD.h @@ -191,7 +191,7 @@ namespace Grid { assert(0); #endif } - friend inline void vprefetch(const vRealD &v) + friend inline void prefetch(const vRealD &v) { _mm_prefetch((const char*)&v.v,_MM_HINT_T0); } diff --git a/lib/simd/Grid_vRealF.h b/lib/simd/Grid_vRealF.h index 48e5c134..e1d5679a 100644 --- a/lib/simd/Grid_vRealF.h +++ b/lib/simd/Grid_vRealF.h @@ -225,7 +225,7 @@ friend inline void vstore(const vRealF &ret, float *a){ } - friend inline void vprefetch(const vRealF &v) + friend inline void prefetch(const vRealF &v) { _mm_prefetch((const char*)&v.v,_MM_HINT_T0); } diff --git a/tests/Grid_gamma.cc b/tests/Grid_gamma.cc index 9cda8855..3f350bc5 100644 --- a/tests/Grid_gamma.cc +++ b/tests/Grid_gamma.cc @@ -36,19 +36,19 @@ int main (int argc, char ** argv) SpinVector lv; random(sRNG,lv); SpinVector rv; random(sRNG,rv); - std::cout << " Is pod " << std::is_pod::value << std::endl; - std::cout << " Is pod double " << std::is_pod::value << std::endl; - std::cout << " Is pod ComplexF " << std::is_pod::value << std::endl; - std::cout << " Is triv double " << std::has_trivial_default_constructor::value << std::endl; - std::cout << " Is triv ComplexF " << std::has_trivial_default_constructor::value << std::endl; - std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; - std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; - std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; - std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; - std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; - std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; - std::cout << " Is triv Scalar " < >::value << std::endl; - std::cout << " Is triv Scalar "< >::value << std::endl; + // std::cout << " Is pod " << std::is_pod::value << std::endl; + // std::cout << " Is pod double " << std::is_pod::value << std::endl; + // std::cout << " Is pod ComplexF " << std::is_pod::value << std::endl; + // std::cout << " Is triv double " << std::has_trivial_default_constructor::value << std::endl; + // std::cout << " Is triv ComplexF " << std::has_trivial_default_constructor::value << std::endl; + // std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; + // std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; + // std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; + // std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; + // std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; + // std::cout << " Is pod Scalar " << std::is_pod >::value << std::endl; + // std::cout << " Is triv Scalar " < >::value << std::endl; + // std::cout << " Is triv Scalar "< >::value << std::endl; for(int a=0;a Date: Sun, 10 May 2015 15:13:50 +0100 Subject: [PATCH 126/429] Updated todo list --- TODO | 77 ++++++++++++++++++------------------------------------------ 1 file changed, 23 insertions(+), 54 deletions(-) diff --git a/TODO b/TODO index ee1dd897..9dc8fada 100644 --- a/TODO +++ b/TODO @@ -2,44 +2,17 @@ - use protocol buffers? replace xmlReader/Writer ec.. - Binary use htonll, htonl -* Stencil -- DONE +* CovariantShift support -----Use a class to store gauge field? (parallel transport?) + +* Strong test for norm2, conj and all primitive types. -- Grid_simd test is almost there * Reduce implemention is poor * Bug in SeedFixedIntegers gives same output on each site. * Bug in RNG with complex numbers ; only filling real values; need helper function -- DONE -* Stencil operator support -----Initial thoughts, trial implementation DONE. - -----some simple tests that Stencil matches Cshift. - -----do all permute in comms phase, so that copy permute - -----cases move into a buffer. - -----allow transform in/out buffers spproj - - -* CovariantShift support -----Use a class to store gauge field? (parallel transport?) - -* Strong test for norm2, conj and all primitive types. - -* Consider switch std::vector to boost arrays or something lighter weight - boost::multi_array A()... to replace multi1d, multi2d etc.. - - * norm2l is a hack. figure out syntax error and make this norm2 c.f. tests/Grid_gamma.cc -**** std::vector replacement; - - Had to change "reserve" back to "resize" on std::vector in Lattice class. - - This forces the constructor call on EVERY element of the array with negative - performance effects on temporaries. - - The reversion was required because copy constructur has to work. - - CONCLUSION: I must implement a similar to vector without construction/fill on - resize. Find out if valarray or alternative works differently prior to - doing this since there may still be something I can use.. - - -* Make the Tensor types and Complex etc... play more nicely. +** Make the Tensor types and Complex etc... play more nicely. - TensorRemove is a hack, come up with a long term rationalised approach to Complex vs. Scalar > > QDP forces use of "toDouble" to get back to non tensor scalar. This role is presently taken TensorRemove, but I @@ -60,24 +33,35 @@ - I have collated into single location at least. - Need to use _mm_*insert/extract routines. - * Conformable test in Cshift routines. - * Flavour matrices? * Pauli, SU subgroup, etc.. * su3 exponentiation & log etc.. [Jamie's code?] * TaProj - -* Fourspin, two spin project --- DONE - +* FFTnD ? * Parallel MPI2 IO + Plaquette checks into nersc reader. * rb4d support for 5th dimension in Mobius. * Check for missing functionality - partially audited against QDP++ layout + // Base class to share common code between vRealF, VComplexF etc... + // + // Unary functions + // cos,sin, tan, acos, asin, cosh, acosh, tanh, sinh, // Scalar only arg + // exp, log, sqrt, fabs + // + // transposeColor, transposeSpin, + // adjColor, adjSpin, + // + // copyMask. + // + // localMaxAbs + // + // Fourier transform equivalent. Algorithms * LinearOperator @@ -97,29 +81,14 @@ AUDITS: * Replace vset with a call to merge.; * care in Gmerge,Gextract over vset . * extract / merge extra implementation removal -* Test infrastructure - - // TODO - // - // Base class to share common code between vRealF, VComplexF etc... - // - // Unary functions - // cos,sin, tan, acos, asin, cosh, acosh, tanh, sinh, // Scalar only arg - // exp, log, sqrt, fabs - // - // transposeColor, transposeSpin, - // adjColor, adjSpin, - // - // copyMask. - // - // localMaxAbs - // - // Fourier transform equivalent. ====================================================================================================== FUNCTIONALITY: +* Stencil -- DONE +* Test infrastructure -- DONE +* Fourspin, two spin project --- DONE * Dirac Gamma/Dirac structures ---- DONE * Conditional execution, where etc... -----DONE, simple test * Integer relational support -----DONE From 3657f2303dc96818f62a7ed01a34fb7cc3143f56 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 10 May 2015 15:18:04 +0100 Subject: [PATCH 127/429] ET ready benchmark with bytes counted assuming loop interchange --- benchmarks/Grid_memory_bandwidth.cc | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/benchmarks/Grid_memory_bandwidth.cc b/benchmarks/Grid_memory_bandwidth.cc index 3254e95b..fb6db6d8 100644 --- a/benchmarks/Grid_memory_bandwidth.cc +++ b/benchmarks/Grid_memory_bandwidth.cc @@ -38,7 +38,6 @@ int main (int argc, char ** argv) double start=usecond(); for(int i=0;i &ret,double a,const Lattice &lhs,const Lattice &rhs){ axpy(z,a,x,y); } @@ -53,7 +52,7 @@ int main (int argc, char ** argv) std::cout << "===================================================================================================="< Date: Sun, 10 May 2015 15:22:31 +0100 Subject: [PATCH 128/429] Bringing expression templates for faster vector loops --- lib/Grid_lattice.h | 105 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 101 insertions(+), 4 deletions(-) diff --git a/lib/Grid_lattice.h b/lib/Grid_lattice.h index 75a80ef8..861a9e24 100644 --- a/lib/Grid_lattice.h +++ b/lib/Grid_lattice.h @@ -20,18 +20,106 @@ namespace Grid { extern int GridCshiftPermuteMap[4][16]; +//////////////////////////////////////////////// +// Basic expressions used in Expression Template +//////////////////////////////////////////////// + +class LatticeBase {}; +class LatticeExpressionBase {}; + +template +class LatticeUnaryExpression : public std::pair > , public LatticeExpressionBase { + public: + LatticeUnaryExpression(const std::pair > &arg): std::pair >(arg) {}; +}; + +template +class LatticeBinaryExpression : public std::pair > , public LatticeExpressionBase { + public: + LatticeBinaryExpression(const std::pair > &arg): std::pair >(arg) {}; +}; + +template +class LatticeTrinaryExpression :public std::pair >, public LatticeExpressionBase { + public: + LatticeTrinaryExpression(const std::pair > &arg): std::pair >(arg) {}; +}; + template -class Lattice +class Lattice : public LatticeBase { public: + GridBase *_grid; int checkerboard; std::vector > _odata; - //std::valarray _odata; -public: +public: typedef typename vobj::scalar_type scalar_type; typedef typename vobj::vector_type vector_type; + typedef vobj vector_object; + + //////////////////////////////////////////////////////////////////////////////// + // Expression Template closure support + //////////////////////////////////////////////////////////////////////////////// + template inline Lattice & operator=(const LatticeUnaryExpression &expr) + { +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + vobj tmp= eval(ss,expr); + vstream(_odata[ss] ,tmp); + } + return *this; + } + template inline Lattice & operator=(const LatticeBinaryExpression &expr) + { +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + vobj tmp= eval(ss,expr); + vstream(_odata[ss] ,tmp); + } + return *this; + } + template inline Lattice & operator=(const LatticeTrinaryExpression &expr) + { +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + vobj tmp= eval(ss,expr); + vstream(_odata[ss] ,tmp); + } + return *this; + } + //GridFromExpression is tricky to do + template + Lattice(const LatticeUnaryExpression & expr): _grid(nullptr){ + GridFromExpression(_grid,expr); + assert(_grid!=nullptr); + _odata.resize(_grid->oSites()); +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + _odata[ss] = eval(ss,expr); + } + }; + template + Lattice(const LatticeBinaryExpression & expr): _grid(nullptr){ + GridFromExpression(_grid,expr); + assert(_grid!=nullptr); + _odata.resize(_grid->oSites()); +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + _odata[ss] = eval(ss,expr); + } + }; + template + Lattice(const LatticeTrinaryExpression & expr): _grid(nullptr){ + GridFromExpression(_grid,expr); + assert(_grid!=nullptr); + _odata.resize(_grid->oSites()); +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + _odata[ss] = eval(ss,expr); + } + }; ////////////////////////////////////////////////////////////////// // Constructor requires "grid" passed. @@ -54,7 +142,7 @@ public: template inline Lattice & operator = (const Lattice & r){ conformable(*this,r); std::cout<<"Lattice operator ="<oSites();ss++){ this->_odata[ss]=r._odata[ss]; } @@ -88,8 +176,17 @@ public: }; // class Lattice } +#define GRID_LATTICE_EXPRESSION_TEMPLATES + #include + +#ifdef GRID_LATTICE_EXPRESSION_TEMPLATES +#include +#else +#include +#endif #include + #include #include #include From e02cbaa0162d9081937ea1987901b151e380eefa Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 10 May 2015 15:23:09 +0100 Subject: [PATCH 129/429] Fixing breakage in the Comms non compile --- lib/communicator/Grid_communicator_fake.cc | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/communicator/Grid_communicator_fake.cc b/lib/communicator/Grid_communicator_fake.cc index 962283ee..1cad9c1f 100644 --- a/lib/communicator/Grid_communicator_fake.cc +++ b/lib/communicator/Grid_communicator_fake.cc @@ -3,15 +3,17 @@ namespace Grid { CartesianCommunicator::CartesianCommunicator(std::vector &processors) { - _ndimension = _processors.size(); - _processor_coor.resize(_ndimension); _processors = processors; + _ndimension = processors.size(); + _processor_coor.resize(_ndimension); // Require 1^N processor grid for fake - for(int d=0;d<_ndimension;d++) if(_processors[d]!=1) exit(-1); - - _processor = 0;// I am the one. The only one.. - for(int d=0;d<_ndimension;d++) _processor_coor[d] = 0; + _Nprocessors=1; + _processor = 0; + for(int d=0;d<_ndimension;d++) { + assert(_processors[d]==1); + _processor_coor[d] = 0; + } } void CartesianCommunicator::GlobalSum(float &){} @@ -57,12 +59,12 @@ void CartesianCommunicator::BroadcastWorld(int root,void* data, int bytes) void CartesianCommunicator::ShiftedRanks(int dim,int shift,int &source,int &dest) { - source =1; - dest=1; + source =0; + dest=0; } int CartesianCommunicator::RankFromProcessorCoor(std::vector &coor) { - return 1; + return 0; } void CartesianCommunicator::ProcessorCoorFromRank(int rank, std::vector &coor) { From 4a8fd55f52fa9335c4de3b6d01bd09be338ffd9f Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 10 May 2015 15:23:49 +0100 Subject: [PATCH 130/429] Moving operator stuff into separate file so that we can switch on/off replacement with expression templates --- lib/lattice/Grid_lattice_arith.h | 113 ------------------------------- 1 file changed, 113 deletions(-) diff --git a/lib/lattice/Grid_lattice_arith.h b/lib/lattice/Grid_lattice_arith.h index 63ad3335..93801be5 100644 --- a/lib/lattice/Grid_lattice_arith.h +++ b/lib/lattice/Grid_lattice_arith.h @@ -3,19 +3,6 @@ namespace Grid { - ////////////////////////////////////////////////////////////////////////////////////////////////////// - // unary negation - ////////////////////////////////////////////////////////////////////////////////////////////////////// - template - inline Lattice operator -(const Lattice &r) - { - Lattice ret(r._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - vstream(ret._odata[ss], -r._odata[ss]); - } - return ret; - } ////////////////////////////////////////////////////////////////////////////////////////////////////// // avoid copy back routines for mult, mac, sub, add @@ -155,106 +142,6 @@ namespace Grid { } } - ///////////////////////////////////////////////////////////////////////////////////// - // Lattice BinOp Lattice, - //NB mult performs conformable check. Do not reapply here for performance. - ///////////////////////////////////////////////////////////////////////////////////// - template - inline auto operator * (const Lattice &lhs,const Lattice &rhs)-> Lattice - { - Lattice ret(rhs._grid); - mult(ret,lhs,rhs); - return ret; - } - template - inline auto operator + (const Lattice &lhs,const Lattice &rhs)-> Lattice - { - Lattice ret(rhs._grid); - add(ret,lhs,rhs); - return ret; - } - template - inline auto operator - (const Lattice &lhs,const Lattice &rhs)-> Lattice - { - Lattice ret(rhs._grid); - sub(ret,lhs,rhs); - return ret; - } - - // Scalar BinOp Lattice ;generate return type - template - inline auto operator * (const left &lhs,const Lattice &rhs) -> Lattice - { - Lattice ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - decltype(lhs*rhs._odata[0]) tmp=lhs*rhs._odata[ss]; - vstream(ret._odata[ss],tmp); - // ret._odata[ss]=lhs*rhs._odata[ss]; - } - return ret; - } - template - inline auto operator + (const left &lhs,const Lattice &rhs) -> Lattice - { - Lattice ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - decltype(lhs+rhs._odata[0]) tmp =lhs-rhs._odata[ss]; - vstream(ret._odata[ss],tmp); - // ret._odata[ss]=lhs+rhs._odata[ss]; - } - return ret; - } - template - inline auto operator - (const left &lhs,const Lattice &rhs) -> Lattice - { - Lattice ret(rhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - decltype(lhs-rhs._odata[0]) tmp=lhs-rhs._odata[ss]; - vstream(ret._odata[ss],tmp); - // ret._odata[ss]=lhs-rhs._odata[ss]; - } - return ret; - } - template - inline auto operator * (const Lattice &lhs,const right &rhs) -> Lattice - { - Lattice ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - decltype(lhs._odata[0]*rhs) tmp =lhs._odata[ss]*rhs; - vstream(ret._odata[ss],tmp); - // ret._odata[ss]=lhs._odata[ss]*rhs; - } - return ret; - } - template - inline auto operator + (const Lattice &lhs,const right &rhs) -> Lattice - { - Lattice ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - decltype(lhs._odata[0]+rhs) tmp=lhs._odata[ss]+rhs; - vstream(ret._odata[ss],tmp); - // ret._odata[ss]=lhs._odata[ss]+rhs; - } - return ret; - } - template - inline auto operator - (const Lattice &lhs,const right &rhs) -> Lattice - { - Lattice ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites(); ss++){ - decltype(lhs._odata[0]-rhs) tmp=lhs._odata[ss]-rhs; - vstream(ret._odata[ss],tmp); - // ret._odata[ss]=lhs._odata[ss]-rhs; - } - return ret; - } - template inline void axpy(Lattice &ret,sobj a,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); From 961fbb27186df91460fee501535cbf2d32d4a900 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 10 May 2015 15:24:37 +0100 Subject: [PATCH 131/429] Assertion should never hit, but did due to a bug --- lib/lattice/Grid_lattice_reduction.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/lattice/Grid_lattice_reduction.h b/lib/lattice/Grid_lattice_reduction.h index 6679f29b..679effb0 100644 --- a/lib/lattice/Grid_lattice_reduction.h +++ b/lib/lattice/Grid_lattice_reduction.h @@ -83,6 +83,7 @@ template inline void sliceSum(const Lattice &Data,std::vector< typedef typename vobj::scalar_object sobj; GridBase *grid = Data._grid; + assert(grid!=NULL); const int Nd = grid->_ndimension; const int Nsimd = grid->Nsimd(); From dc7132af717f894f7d0d52d3926aec820b9fb40d Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 10 May 2015 15:25:23 +0100 Subject: [PATCH 132/429] Small tweak to enable benchmarking to suppress gauge field bandwidth as a test. This is a short term hack while I benchmark. --- lib/qcd/Grid_qcd_wilson_dop.cc | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/qcd/Grid_qcd_wilson_dop.cc b/lib/qcd/Grid_qcd_wilson_dop.cc index ddc73c4a..a9ac6346 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.cc +++ b/lib/qcd/Grid_qcd_wilson_dop.cc @@ -106,6 +106,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) for(int sss=0;sssoSites();sss++){ int ss = sss; + int ssu= sss; //int ss = Stencil._LebesgueReorder[sss]; // Xp @@ -123,7 +124,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Xp),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Xp),&chi()); spReconXp(result,Uchi); // Yp @@ -141,7 +142,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Yp),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Yp),&chi()); accumReconYp(result,Uchi); // Zp @@ -159,7 +160,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Zp),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Zp),&chi()); accumReconZp(result,Uchi); // Tp @@ -177,7 +178,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Tp),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Tp),&chi()); accumReconTp(result,Uchi); // Xm @@ -195,7 +196,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Xm),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Xm),&chi()); accumReconXm(result,Uchi); @@ -214,7 +215,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Ym),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Ym),&chi()); accumReconYm(result,Uchi); // Zm @@ -232,7 +233,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Zm),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Zm),&chi()); accumReconZm(result,Uchi); // Tm @@ -250,7 +251,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ss](Tm),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Tm),&chi()); accumReconTm(result,Uchi); vstream(out._odata[ss],result); From cd90f55536a958dcf5550d424868e330f5fe12fe Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 10 May 2015 15:26:06 +0100 Subject: [PATCH 133/429] Single node default. Should expose this as command line args, but haven't sorted out Grid_initialize to handle this. Should put this on the TODO list. --- tests/Grid_cshift.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Grid_cshift.cc b/tests/Grid_cshift.cc index c0863965..fcee7b70 100644 --- a/tests/Grid_cshift.cc +++ b/tests/Grid_cshift.cc @@ -9,7 +9,7 @@ int main (int argc, char ** argv) Grid_init(&argc,&argv); std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({2,2,1,4}); + std::vector mpi_layout ({1,1,1,1}); std::vector latt_size ({8,8,8,16}); GridCartesian Fine(latt_size,simd_layout,mpi_layout); From 7119bce9f37147b55ccfb671c775d87d0d81a973 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 10 May 2015 15:27:38 +0100 Subject: [PATCH 134/429] Default to single node. Move to command line args. --- tests/Grid_nersc_io.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Grid_nersc_io.cc b/tests/Grid_nersc_io.cc index 06e51d41..95f9db88 100644 --- a/tests/Grid_nersc_io.cc +++ b/tests/Grid_nersc_io.cc @@ -11,7 +11,7 @@ int main (int argc, char ** argv) Grid_init(&argc,&argv); std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({2,2,2,2}); + std::vector mpi_layout ({1,1,1,1}); std::vector latt_size ({16,16,16,32}); std::vector clatt_size ({4,4,4,8}); int orthodir=3; @@ -52,6 +52,7 @@ int main (int argc, char ** argv) double vol = Fine.gSites(); Complex PlaqScale(1.0/vol/6.0/3.0); + std::cout <<"PlaqScale" << PlaqScale< Plaq_T(orthosz); sliceSum(Plaq,Plaq_T,Nd-1); From 79c51ac51f5f420db55e35ed53efb221fc9b6e5f Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 10 May 2015 15:30:29 +0100 Subject: [PATCH 135/429] Hack; must bring norm2 into the unary operator list. ET's are still incomplete. --- tests/Grid_stencil.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Grid_stencil.cc b/tests/Grid_stencil.cc index eb661487..64a4ee9d 100644 --- a/tests/Grid_stencil.cc +++ b/tests/Grid_stencil.cc @@ -70,7 +70,8 @@ int main (int argc, char ** argv) Real nrmC = norm2(Check); Real nrmB = norm2(Bar); - Real nrm = norm2(Check-Bar); + Diff = Check-Bar; + Real nrm = norm2(Diff); std::cout<<"N2diff ="< Date: Sun, 10 May 2015 15:32:56 +0100 Subject: [PATCH 136/429] Updated TODO list --- TODO | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/TODO b/TODO index 9dc8fada..0ef20444 100644 --- a/TODO +++ b/TODO @@ -2,6 +2,17 @@ - use protocol buffers? replace xmlReader/Writer ec.. - Binary use htonll, htonl +* Expression template engine: + + - Audit + - Introduce base clase for Grid Tensors. + - Introduce norm2 unary op. + - Introduce conversion automatic from expression to Lattice + - + +* Command line args for geometry, simd, etc. layout. Is it necessary to have + user pass these? Is this a QCD specific? + * CovariantShift support -----Use a class to store gauge field? (parallel transport?) * Strong test for norm2, conj and all primitive types. -- Grid_simd test is almost there From 1ab92563b912c1a0103bcec0f4b44f5bea428485 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 10 May 2015 15:34:20 +0100 Subject: [PATCH 137/429] Expression template engin --- lib/lattice/Grid_lattice_ET.h | 227 ++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 lib/lattice/Grid_lattice_ET.h diff --git a/lib/lattice/Grid_lattice_ET.h b/lib/lattice/Grid_lattice_ET.h new file mode 100644 index 00000000..d4fd7d05 --- /dev/null +++ b/lib/lattice/Grid_lattice_ET.h @@ -0,0 +1,227 @@ + +#ifndef GRID_LATTICE_ET_H +#define GRID_LATTICE_ET_H + +#include +#include +#include +#include + +namespace Grid { + +//////////////////////////////////////////// +// recursive evaluation of expressions; Could +// switch to generic approach with variadics, a la +// Antonin's Lat Sim but the repack to variadic with popped +// from tuple is hideous; C++14 introduces std::make_index_sequence for this +//////////////////////////////////////////// + + +//leaf eval of lattice ; should enable if protect using traits + +template using is_lattice = std::is_base_of; + +template using is_lattice_expr = std::is_base_of; + +template +inline sobj eval(const unsigned int ss, const sobj &arg) +{ + return arg; +} +template +inline const lobj &eval(const unsigned int ss, const Lattice &arg) +{ + return arg._odata[ss]; +} + +// handle nodes in syntax tree +template +auto inline eval(const unsigned int ss, const LatticeUnaryExpression &expr) // eval one operand + -> decltype(expr.first.func(eval(ss,std::get<0>(expr.second)))) +{ + return expr.first.func(eval(ss,std::get<0>(expr.second))); +} + +template +auto inline eval(const unsigned int ss, const LatticeBinaryExpression &expr) // eval two operands + -> decltype(expr.first.func(eval(ss,std::get<0>(expr.second)),eval(ss,std::get<1>(expr.second)))) +{ + return expr.first.func(eval(ss,std::get<0>(expr.second)),eval(ss,std::get<1>(expr.second))); +} + +template +auto inline eval(const unsigned int ss, const LatticeTrinaryExpression &expr) // eval three operands + -> decltype(expr.first.func(eval(ss,std::get<0>(expr.second)),eval(ss,std::get<1>(expr.second)),eval(ss,std::get<2>(expr.second)))) +{ + return expr.first.func(eval(ss,std::get<0>(expr.second)),eval(ss,std::get<1>(expr.second)),eval(ss,std::get<2>(expr.second)) ); +} + +////////////////////////////////////////////////////////////////////////// +// Obtain the grid from an expression, ensuring conformable. This must follow a tree recursion +////////////////////////////////////////////////////////////////////////// +template::value, T1>::type * =nullptr > +inline void GridFromExpression(GridBase * &grid,const T1& lat) // Lattice leaf +{ + if ( grid ) { + conformable(grid,lat._grid); + } + grid=lat._grid; +} +template +inline void GridFromExpression(GridBase * &grid,const LatticeUnaryExpression &expr) +{ + GridFromExpression(grid,std::get<0>(expr.second));// recurse +} + +template +inline void GridFromExpression(GridBase * &grid,const LatticeBinaryExpression &expr) +{ + GridFromExpression(grid,std::get<0>(expr.second));// recurse + GridFromExpression(grid,std::get<1>(expr.second)); +} +template +inline void GridFromExpression( GridBase * &grid,const LatticeTrinaryExpression &expr) +{ + GridFromExpression(grid,std::get<0>(expr.second));// recurse + GridFromExpression(grid,std::get<1>(expr.second)); + GridFromExpression(grid,std::get<2>(expr.second)); +} +template::value, T1>::type * = nullptr > +inline void GridFromExpression(GridBase * &grid,const T1& notlat) // non-lattice leaf +{ +} + +//////////////////////////////////////////// +// Unary operators and funcs +//////////////////////////////////////////// +#define GridUnopClass(name,ret)\ +template struct name\ +{\ + static auto inline func(const arg a)-> decltype(ret) { return ret; } \ +}; + +GridUnopClass(UnarySub,-a); +GridUnopClass(UnaryAdj,adj(a)); +GridUnopClass(UnaryConj,conj(a)); +GridUnopClass(UnaryTrace,trace(a)); +GridUnopClass(UnaryTranspose,transpose(a)); + +//////////////////////////////////////////// +// Binary operators +//////////////////////////////////////////// +#define GridBinOpClass(name,combination)\ +template \ +struct name\ +{\ + static auto inline func(const left &lhs,const right &rhs)-> decltype(combination) const \ + {\ + return combination;\ + }\ +} +GridBinOpClass(BinaryAdd,lhs+rhs); +GridBinOpClass(BinarySub,lhs-rhs); +GridBinOpClass(BinaryMul,lhs*rhs); + +//////////////////////////////////////////// +// Operator syntactical glue +//////////////////////////////////////////// + +#define GRID_UNOP(name) name +#define GRID_BINOP(name) name +#define GRID_TRINOP(name) name + +#define GRID_DEF_UNOP(op, name)\ +template ::value||is_lattice_expr::value, T1>::type* = nullptr> inline auto op(const T1 &arg) \ + -> decltype(LatticeUnaryExpression(std::make_pair(GRID_UNOP(name)(),std::forward_as_tuple(arg)))) \ +{ return LatticeUnaryExpression(std::make_pair(GRID_UNOP(name)(),std::forward_as_tuple(arg))); } + +#define GRID_BINOP_LEFT(op, name)\ +template ::value||is_lattice_expr::value, T1>::type* = nullptr>\ +inline auto op(const T1 &lhs,const T2&rhs) \ + -> decltype(LatticeBinaryExpression(std::make_pair(GRID_BINOP(name)(),\ + std::forward_as_tuple(lhs, rhs)))) \ +{\ + return LatticeBinaryExpression(std::make_pair(GRID_BINOP(name)(),\ + std::forward_as_tuple(lhs, rhs))); \ +} + +#define GRID_BINOP_RIGHT(op, name)\ + template ::value && !is_lattice_expr::value, T1>::type* = nullptr,\ + typename std::enable_if< is_lattice::value || is_lattice_expr::value, T2>::type* = nullptr> \ +inline auto op(const T1 &lhs,const T2&rhs) \ + -> decltype(LatticeBinaryExpression(std::make_pair(GRID_BINOP(name)(),\ + std::forward_as_tuple(lhs, rhs)))) \ +{\ + return LatticeBinaryExpression(std::make_pair(GRID_BINOP(name)(),\ + std::forward_as_tuple(lhs, rhs))); \ +} + +#define GRID_DEF_BINOP(op, name)\ + GRID_BINOP_LEFT(op,name);\ + GRID_BINOP_RIGHT(op,name); + + +#define GRID_DEF_TRINOP(op, name)\ +template inline auto op(const T1 &pred,const T2&lhs,const T3 &rhs) \ + -> decltype(LatticeTrinaryExpression(std::make_pair(GRID_TRINOP(name)(),\ + std::forward_as_tuple(pred,lhs,rhs)))) \ +{\ + return LatticeTrinaryExpression(std::make_pair(GRID_TRINOP(name)(), \ + std::forward_as_tuple(pred,lhs, rhs))); \ +} +//////////////////////// +//Operator definitions +//////////////////////// + +GRID_DEF_UNOP(operator -,UnarySub); +GRID_DEF_UNOP(adj,UnaryAdj); +GRID_DEF_UNOP(conj,UnaryConj); +GRID_DEF_UNOP(trace,UnaryTrace); +GRID_DEF_UNOP(transpose,UnaryTranspose); + +GRID_DEF_BINOP(operator+,BinaryAdd); +GRID_DEF_BINOP(operator-,BinarySub); +GRID_DEF_BINOP(operator*,BinaryMul); + +#undef GRID_UNOP +#undef GRID_BINOP +#undef GRID_TRINOP + +#undef GRID_DEF_UNOP +#undef GRID_DEF_BINOP +#undef GRID_DEF_TRINOP + +} + +#if 0 +using namespace Grid; + + int main(int argc,char **argv){ + + Lattice v1(16); + Lattice v2(16); + Lattice v3(16); + + BinaryAdd tmp; + LatticeBinaryExpression,Lattice &,Lattice &> + expr(std::make_pair(tmp, + std::forward_as_tuple(v1,v2))); + tmp.func(eval(0,v1),eval(0,v2)); + + auto var = v1+v2; + std::cout< &v1,Lattice &v2,Lattice &v3) +{ + v3=v1+v2+v1*v2; +} +#endif + +#endif From 1ec1b4ee440922ecaa5299a2b46bda01a8008d41 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 10 May 2015 15:35:30 +0100 Subject: [PATCH 138/429] Expression template hack --- lib/lattice/Grid_lattice_overload.h | 120 ++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 lib/lattice/Grid_lattice_overload.h diff --git a/lib/lattice/Grid_lattice_overload.h b/lib/lattice/Grid_lattice_overload.h new file mode 100644 index 00000000..512e45d1 --- /dev/null +++ b/lib/lattice/Grid_lattice_overload.h @@ -0,0 +1,120 @@ +#ifndef GRID_LATTICE_OVERLOAD_H +#define GRID_LATTICE_OVERLOAD_H + +namespace Grid { + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // unary negation + ////////////////////////////////////////////////////////////////////////////////////////////////////// + template + inline Lattice operator -(const Lattice &r) + { + Lattice ret(r._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + vstream(ret._odata[ss], -r._odata[ss]); + } + return ret; + } + ///////////////////////////////////////////////////////////////////////////////////// + // Lattice BinOp Lattice, + //NB mult performs conformable check. Do not reapply here for performance. + ///////////////////////////////////////////////////////////////////////////////////// + template + inline auto operator * (const Lattice &lhs,const Lattice &rhs)-> Lattice + { + Lattice ret(rhs._grid); + mult(ret,lhs,rhs); + return ret; + } + template + inline auto operator + (const Lattice &lhs,const Lattice &rhs)-> Lattice + { + Lattice ret(rhs._grid); + add(ret,lhs,rhs); + return ret; + } + template + inline auto operator - (const Lattice &lhs,const Lattice &rhs)-> Lattice + { + Lattice ret(rhs._grid); + sub(ret,lhs,rhs); + return ret; + } + + // Scalar BinOp Lattice ;generate return type + template + inline auto operator * (const left &lhs,const Lattice &rhs) -> Lattice + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + decltype(lhs*rhs._odata[0]) tmp=lhs*rhs._odata[ss]; + vstream(ret._odata[ss],tmp); + // ret._odata[ss]=lhs*rhs._odata[ss]; + } + return ret; + } + template + inline auto operator + (const left &lhs,const Lattice &rhs) -> Lattice + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + decltype(lhs+rhs._odata[0]) tmp =lhs-rhs._odata[ss]; + vstream(ret._odata[ss],tmp); + // ret._odata[ss]=lhs+rhs._odata[ss]; + } + return ret; + } + template + inline auto operator - (const left &lhs,const Lattice &rhs) -> Lattice + { + Lattice ret(rhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + decltype(lhs-rhs._odata[0]) tmp=lhs-rhs._odata[ss]; + vstream(ret._odata[ss],tmp); + // ret._odata[ss]=lhs-rhs._odata[ss]; + } + return ret; + } + template + inline auto operator * (const Lattice &lhs,const right &rhs) -> Lattice + { + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + decltype(lhs._odata[0]*rhs) tmp =lhs._odata[ss]*rhs; + vstream(ret._odata[ss],tmp); + // ret._odata[ss]=lhs._odata[ss]*rhs; + } + return ret; + } + template + inline auto operator + (const Lattice &lhs,const right &rhs) -> Lattice + { + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + decltype(lhs._odata[0]+rhs) tmp=lhs._odata[ss]+rhs; + vstream(ret._odata[ss],tmp); + // ret._odata[ss]=lhs._odata[ss]+rhs; + } + return ret; + } + template + inline auto operator - (const Lattice &lhs,const right &rhs) -> Lattice + { + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites(); ss++){ + decltype(lhs._odata[0]-rhs) tmp=lhs._odata[ss]-rhs; + vstream(ret._odata[ss],tmp); + // ret._odata[ss]=lhs._odata[ss]-rhs; + } + return ret; + } + + +} From 2203c6e5976e31eb83e9337f6bdbbf80152f1a6e Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 10 May 2015 23:29:21 +0100 Subject: [PATCH 139/429] Lots of changes required to compile for MIC under ICPC --- Makefile.in | 393 +- TODO | 2 + aclocal.m4 | 707 ++-- configure | 5011 +++++++++++++++---------- lib/Grid_config.h | 23 +- lib/Grid_config.h.in | 3 - lib/Grid_lattice.h | 2 +- lib/Grid_simd.h | 9 +- lib/cshift/Grid_cshift_common.h | 26 +- lib/lattice/Grid_lattice_coordinate.h | 15 +- lib/lattice/Grid_lattice_overload.h | 1 + lib/math/Grid_math_tensors.h | 8 +- lib/qcd/Grid_qcd_wilson_dop.cc | 37 +- lib/simd/Grid_vComplexD.h | 17 +- lib/simd/Grid_vComplexF.h | 5 +- lib/simd/Grid_vInteger.h | 7 +- lib/simd/Grid_vRealD.h | 2 +- lib/simd/Grid_vRealF.h | 3 +- tests/Grid_gamma.cc | 3 +- tests/Grid_main.cc | 22 +- 20 files changed, 3438 insertions(+), 2858 deletions(-) diff --git a/Makefile.in b/Makefile.in index c9257ab2..f9e18fe4 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. - +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,61 +15,6 @@ @SET_MAKE@ VPATH = @srcdir@ -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -86,86 +32,43 @@ NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ + ChangeLog INSTALL NEWS TODO compile depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ - $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/lib/Grid_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = SOURCES = DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-recursive dvi-recursive html-recursive info-recursive \ - install-data-recursive install-dvi-recursive \ - install-exec-recursive install-html-recursive \ - install-info-recursive install-pdf-recursive \ - install-ps-recursive install-recursive installcheck-recursive \ - installdirs-recursive pdf-recursive ps-recursive \ - tags-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - cscope distdir dist dist-all distcheck -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags -CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) -am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING ChangeLog \ - INSTALL NEWS README TODO compile depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ - if test -d "$(distdir)"; then \ - find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -rf "$(distdir)" \ - || { sleep 5 && rm -rf "$(distdir)"; }; \ - else :; fi -am__post_remove_distdir = $(am__remove_distdir) + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ @@ -193,14 +96,10 @@ am__relativize = \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best -DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print -am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ - | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -240,7 +139,6 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -298,7 +196,7 @@ SUBDIRS = lib tests benchmarks all: all-recursive .SUFFIXES: -am--refresh: Makefile +am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ @@ -313,6 +211,7 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -333,25 +232,22 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd -# into them and run 'make' without going through this Makefile. -# To change the values of 'make' variables: instead of editing Makefiles, -# (1) if the variable is set in 'config.status', edit 'config.status' -# (which will cause the Makefiles to be regenerated when you run 'make'); -# (2) otherwise, pass the desired values on the 'make' command line. -$(am__recursive_targets): - @fail=; \ - if $(am__make_keepgoing); then \ - failcom='fail=yes'; \ - else \ - failcom='exit 1'; \ - fi; \ +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - for subdir in $$list; do \ + list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ @@ -366,12 +262,57 @@ $(am__recursive_targets): $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive -TAGS: tags +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -387,7 +328,12 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - $(am__define_uniq_tagged_files); \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -399,11 +345,15 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $$unique; \ fi; \ fi -ctags: ctags-recursive - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -412,31 +362,9 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" -cscope: cscope.files - test ! -s cscope.files \ - || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) -clean-cscope: - -rm -f cscope.files -cscope.files: clean-cscope cscopelist -cscopelist: cscopelist-recursive - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) @@ -472,10 +400,13 @@ distdir: $(DISTFILES) done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ @@ -504,42 +435,36 @@ distdir: $(DISTFILES) || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__post_remove_distdir) + $(am__remove_distdir) dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 - $(am__post_remove_distdir) + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) -dist-lzip: distdir - tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz - $(am__post_remove_distdir) +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) dist-xz: distdir - tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz - $(am__post_remove_distdir) + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) dist-tarZ: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 - @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__post_remove_distdir) + $(am__remove_distdir) dist-shar: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 - @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__post_remove_distdir) + $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) - $(am__post_remove_distdir) + $(am__remove_distdir) -dist dist-all: - $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' - $(am__post_remove_distdir) +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another @@ -550,8 +475,8 @@ distcheck: dist GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lz*) \ - lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ @@ -561,19 +486,17 @@ distcheck: dist *.zip*) \ unzip $(distdir).zip ;;\ esac - chmod -R a-w $(distdir) - chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod -R a-w $(distdir); chmod u+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build/sub \ - && ../../configure \ - $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -596,21 +519,13 @@ distcheck: dist && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 - $(am__post_remove_distdir) + $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: - @test -n '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: trying to run $@ with an empty' \ - '$$(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - $(am__cd) '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ @@ -641,15 +556,10 @@ install-am: all-am installcheck: installcheck-recursive install-strip: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: @@ -730,24 +640,23 @@ ps-am: uninstall-am: -.MAKE: $(am__recursive_targets) install-am install-strip +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ - am--refresh check check-am clean clean-cscope clean-generic \ - cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ - dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ - distcheck distclean distclean-generic distclean-tags \ - distcleancheck distdir distuninstallcheck dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ + dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \ + distclean distclean-generic distclean-tags distcleancheck \ + distdir distuninstallcheck dvi dvi-am html html-am info \ + info-am install install-am install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ - pdf-am ps ps-am tags tags-am uninstall uninstall-am - -.PRECIOUS: Makefile + pdf-am ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/TODO b/TODO index 0ef20444..57769ae6 100644 --- a/TODO +++ b/TODO @@ -2,6 +2,8 @@ - use protocol buffers? replace xmlReader/Writer ec.. - Binary use htonll, htonl +* Had to hack assignment to 1.0 in the tests/Grid_gamma test +y * Expression template engine: - Audit diff --git a/aclocal.m4 b/aclocal.m4 index f3018f6c..bcc213b4 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.15 -*- Autoconf -*- - -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -11,16 +11,15 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. -m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],, +[m4_warning([this file was generated for autoconf 2.63. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically 'autoreconf'.])]) +To do so, use the procedure documented by the package, typically `autoreconf'.])]) -# Copyright (C) 2002-2014 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -32,10 +31,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.15' +[am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.15], [], +m4_if([$1], [1.11.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,22 +50,22 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.15])dnl +[AM_AUTOMAKE_VERSION([1.11.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to -# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and @@ -85,7 +84,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is '.', but things will broke when you +# harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, @@ -103,26 +102,30 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -# Expand $ac_aux_dir to an absolute path. -am_aux_dir=`cd "$ac_aux_dir" && pwd` +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 9 + # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ([2.52])dnl - m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl @@ -141,14 +144,16 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 10 -# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing @@ -158,7 +163,7 @@ fi])]) # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was @@ -171,13 +176,12 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl -m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], - [$1], [CXX], [depcc="$CXX" am_compiler_list=], - [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], - [$1], [UPC], [depcc="$UPC" am_compiler_list=], - [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], @@ -185,9 +189,8 @@ AC_CACHE_CHECK([dependency style of $depcc], # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -226,16 +229,16 @@ AC_CACHE_CHECK([dependency style of $depcc], : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with '-c' and '-o' for the sake of the "dashmstdout" + # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -244,16 +247,16 @@ AC_CACHE_CHECK([dependency style of $depcc], test "$am__universal" = false || continue ;; nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -301,7 +304,7 @@ AM_CONDITIONAL([am__fastdep$1], [ # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl @@ -311,39 +314,34 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE([dependency-tracking], [dnl -AS_HELP_STRING( - [--enable-dependency-tracking], - [do not reject slow dependency extractors]) -AS_HELP_STRING( - [--disable-dependency-tracking], - [speeds up one-time build])]) +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' - am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -AC_SUBST([am__nodep])dnl -_AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +#serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Older Autoconf quotes --file arguments for eval, but not when files + # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -356,7 +354,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but + # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -368,19 +366,21 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. + # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue + test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` @@ -398,7 +398,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each '.P' file that we will +# is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], @@ -408,21 +408,18 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 16 + # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. -dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. -m4_define([AC_PROG_CC], -m4_defn([AC_PROG_CC]) -[_AM_PROG_CC_C_O -]) - # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- @@ -435,7 +432,7 @@ m4_defn([AC_PROG_CC]) # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.65])dnl +[AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -464,42 +461,33 @@ AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], -[AC_DIAGNOSE([obsolete], - [$0: two- and three-arguments forms are deprecated.]) -m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if( - m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), - [ok:ok],, +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) - AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -AM_MISSING_PROG([AUTOCONF], [autoconf]) -AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -AM_MISSING_PROG([AUTOHEADER], [autoheader]) -AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target (and possibly the TAP driver). The -# system "awk" is bad on some platforms. +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -508,82 +496,34 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES([CC])], - [m4_define([AC_PROG_CC], - m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES([CXX])], - [m4_define([AC_PROG_CXX], - m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES([OBJC])], - [m4_define([AC_PROG_OBJC], - m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], - [_AM_DEPENDENCIES([OBJCXX])], - [m4_define([AC_PROG_OBJCXX], - m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) -AC_REQUIRE([AM_SILENT_RULES])dnl -dnl The testsuite driver may need to know about EXEEXT, so add the -dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This -dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl - -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) - fi -fi -dnl The trailing newline in this macro's definition is deliberate, for -dnl backward compatibility and to allow trailing 'dnl'-style comments -dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) -dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. @@ -605,7 +545,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -616,7 +556,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh+set}" != xset; then +if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -624,14 +564,16 @@ if test x"${install_sh+set}" != xset; then install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi -AC_SUBST([install_sh])]) +AC_SUBST(install_sh)]) -# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 2 + # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], @@ -647,12 +589,14 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 4 + # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. @@ -670,7 +614,7 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. +# Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -697,12 +641,15 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 6 + # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], @@ -710,10 +657,11 @@ AC_DEFUN([AM_MISSING_PROG], $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) + # AM_MISSING_HAS_RUN # ------------------ -# Define MISSING if not defined so far and test if it is modern enough. -# If it is, set am_missing_run to use it, otherwise, to nothing. +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl @@ -726,35 +674,63 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " else am_missing_run= - AC_MSG_WARN(['missing' script is too old or missing]) + AC_MSG_WARN([`missing' script is too old or missing]) fi ]) -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) -# -------------------- +# ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) -# ------------------------ +# ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) @@ -765,82 +741,24 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_PROG_CC_C_O -# --------------- -# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC -# to automatically call this. -AC_DEFUN([_AM_PROG_CC_C_O], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -AC_LANG_PUSH([C])dnl -AC_CACHE_CHECK( - [whether $CC understands -c and -o together], - [am_cv_prog_cc_c_o], - [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i]) -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -AC_LANG_POP([C])]) - -# For backward compatibility. -AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) - -# Copyright (C) 2001-2014 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_RUN_LOG(COMMAND) -# ------------------- -# Run COMMAND, save the exit status in ac_status, and log it. -# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) -AC_DEFUN([AM_RUN_LOG], -[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD - ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - (exit $ac_status); }]) - # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 5 + # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -851,40 +769,32 @@ case `pwd` in esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac -# Do 'set' in a subshell so we don't clobber the current shell's +# Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken - alias in your environment]) - fi - if test "$[2]" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done test "$[2]" = conftest.file ) then @@ -894,85 +804,9 @@ else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi -AC_MSG_RESULT([yes]) -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi -AC_CONFIG_COMMANDS_PRE( - [AC_MSG_CHECKING([that generated files are newer than configure]) - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - AC_MSG_RESULT([done])]) -rm -f conftest.file -]) +AC_MSG_RESULT(yes)]) -# Copyright (C) 2009-2014 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_SILENT_RULES([DEFAULT]) -# -------------------------- -# Enable less verbose build rules; with the default set to DEFAULT -# ("yes" being less verbose, "no" or empty being verbose). -AC_DEFUN([AM_SILENT_RULES], -[AC_ARG_ENABLE([silent-rules], [dnl -AS_HELP_STRING( - [--enable-silent-rules], - [less verbose build output (undo: "make V=1")]) -AS_HELP_STRING( - [--disable-silent-rules], - [verbose build output (undo: "make V=0")])dnl -]) -case $enable_silent_rules in @%:@ ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; -esac -dnl -dnl A few 'make' implementations (e.g., NonStop OS and NextStep) -dnl do not support nested variable expansions. -dnl See automake bug#9928 and bug#10237. -am_make=${MAKE-make} -AC_CACHE_CHECK([whether $am_make supports nested variables], - [am_cv_make_support_nested_variables], - [if AS_ECHO([['TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi]) -if test $am_cv_make_support_nested_variables = yes; then - dnl Using '$V' instead of '$(V)' breaks IRIX make. - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AC_SUBST([AM_V])dnl -AM_SUBST_NOTMAKE([AM_V])dnl -AC_SUBST([AM_DEFAULT_V])dnl -AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl -AC_SUBST([AM_DEFAULT_VERBOSITY])dnl -AM_BACKSLASH='\' -AC_SUBST([AM_BACKSLASH])dnl -_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl -]) - -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -980,32 +814,34 @@ _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl # AM_PROG_INSTALL_STRIP # --------------------- -# One issue with vendor 'install' (even GNU) is that you can't +# One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in "make install-strip", and initialize +# always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 2 + # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. @@ -1013,22 +849,24 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])]) AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) -# -------------------------- +# --------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 2 + # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. -# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory @@ -1038,114 +876,75 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar -# AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AC_SUBST([AMTAR], ['$${TAR-tar}']) - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' - +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], - [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac - [m4_case([$1], - [ustar], - [# The POSIX 1988 'ustar' format is defined with fixed-size fields. - # There is notably a 21 bits limit for the UID and the GID. In fact, - # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 - # and bug#13588). - am_max_uid=2097151 # 2^21 - 1 - am_max_gid=$am_max_uid - # The $UID and $GID variables are not portable, so we need to resort - # to the POSIX-mandated id(1) utility. Errors in the 'id' calls - # below are definitely unexpected, so allow the users to see them - # (that is, avoid stderr redirection). - am_uid=`id -u || echo unknown` - am_gid=`id -g || echo unknown` - AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) - if test $am_uid -le $am_max_uid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi - AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) - if test $am_gid -le $am_max_gid; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - _am_tools=none - fi], + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break - [pax], - [], - - [m4_fatal([Unknown tar format])]) - - AC_MSG_CHECKING([how to create a $1 tar archive]) - - # Go ahead even if we have the value already cached. We do so because we - # need to set the values for the 'am__tar' and 'am__untar' variables. - _am_tools=${am_cv_prog_tar_$1-$_am_tools} - - for _am_tool in $_am_tools; do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works. - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi - done + # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir - AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) - AC_MSG_RESULT([$am_cv_prog_tar_$1])]) - +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR diff --git a/configure b/configure index 3d25f6a9..3e71855d 100755 --- a/configure +++ b/configure @@ -1,22 +1,20 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for Grid 1.0. +# Generated by GNU Autoconf 2.63 for Grid 1.0. # # Report bugs to . # -# -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -# -# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -24,15 +22,23 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; esac + fi + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + as_nl=' ' export as_nl @@ -40,13 +46,7 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -57,7 +57,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in #( + case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -80,6 +80,13 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -89,16 +96,15 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( +case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done IFS=$as_save_IFS ;; @@ -110,16 +116,12 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 + { (exit 1); exit 1; } fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' @@ -131,294 +133,7 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: paboyle@ph.ed.ac.uk about your system, including any -$0: error possibly output before this message. Then install -$0: a modern shell, or manually run the script under such a -$0: shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - +# Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -432,12 +147,8 @@ else as_basename=false fi -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi +# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -457,19 +168,295 @@ $as_echo X/"$0" | } s/.*/./; q'` -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits +# CDPATH. +$as_unset CDPATH - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= @@ -486,12 +473,9 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). @@ -500,18 +484,29 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits exit } + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( +case `echo -n x` in -n*) - case `echo 'xy\c'` in + case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; + *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -526,29 +521,49 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' + as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -pR' + as_ln_s='cp -p' fi else - as_ln_s='cp -pR' + as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' + as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -as_test_x='test -x' -as_executable_p=as_fn_executable_p +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -557,11 +572,11 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -test -n "$DJDIR" || exec 7<&0 &1 + +exec 7<&0 &1 # Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` @@ -576,6 +591,7 @@ cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='Grid' @@ -583,7 +599,6 @@ PACKAGE_TARNAME='grid' PACKAGE_VERSION='1.0' PACKAGE_STRING='Grid 1.0' PACKAGE_BUGREPORT='paboyle@ph.ed.ac.uk' -PACKAGE_URL='' ac_unique_file="lib/Grid.h" # Factoring default headers for most tests. @@ -644,7 +659,6 @@ CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE -am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE @@ -658,10 +672,6 @@ CPPFLAGS LDFLAGS CXXFLAGS CXX -AM_BACKSLASH -AM_DEFAULT_VERBOSITY -AM_DEFAULT_V -AM_V am__untar am__tar AMTAR @@ -715,7 +725,6 @@ bindir program_transform_name prefix exec_prefix -PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION @@ -726,7 +735,6 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking -enable_silent_rules enable_dependency_tracking enable_openmp enable_simd @@ -806,9 +814,8 @@ do fi case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. @@ -853,7 +860,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -879,7 +887,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1083,7 +1092,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1099,7 +1109,8 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1129,17 +1140,17 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" + -*) { $as_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1148,7 +1159,7 @@ Try \`$0 --help' for more information" $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac @@ -1156,13 +1167,15 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" + { $as_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1185,7 +1198,8 @@ do [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" + { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' @@ -1199,6 +1213,8 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1213,9 +1229,11 @@ test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" + { $as_echo "$as_me: error: working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } # Find the source files, if location was not specified. @@ -1254,11 +1272,13 @@ else fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" + { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then @@ -1298,7 +1318,7 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages + -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files @@ -1358,12 +1378,8 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-silent-rules less verbose build output (undo: "make V=1") - --disable-silent-rules verbose build output (undo: "make V=0") - --enable-dependency-tracking - do not reject slow dependency extractors - --disable-dependency-tracking - speeds up one-time build + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors --disable-openmp do not use OpenMP --enable-simd=SSE|AVX|AVX2|AVX512|MIC Select instructions to be SSE4.0, AVX 1.0, AVX @@ -1376,7 +1392,7 @@ Some influential environment variables: LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags @@ -1449,568 +1465,21 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Grid configure 1.0 -generated by GNU Autoconf 2.69 +generated by GNU Autoconf 2.63 -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_cxx_try_compile LINENO -# ---------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_compile - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - -# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES -# --------------------------------------------- -# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR -# accordingly. -ac_fn_c_check_decl () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - as_decl_name=`echo $2|sed 's/ *(.*//'` - as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 -$as_echo_n "checking whether $as_decl_name is declared... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -#ifndef $as_decl_name -#ifdef __cplusplus - (void) $as_decl_use; -#else - (void) $as_decl_name; -#endif -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_decl - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_type - -# ac_fn_c_find_uintX_t LINENO BITS VAR -# ------------------------------------ -# Finds an unsigned integer type with width BITS, setting cache variable VAR -# accordingly. -ac_fn_c_find_uintX_t () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 -$as_echo_n "checking for uint$2_t... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - # Order is important - never check a type that is potentially smaller - # than half of the expected target width. - for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ - 'unsigned long long int' 'unsigned short int' 'unsigned char'; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - case $ac_type in #( - uint$2_t) : - eval "$3=yes" ;; #( - *) : - eval "$3=\$ac_type" ;; -esac -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if eval test \"x\$"$3"\" = x"no"; then : - -else - break -fi - done -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_find_uintX_t - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Grid $as_me 1.0, which was -generated by GNU Autoconf 2.69. Invocation command line was +generated by GNU Autoconf 2.63. Invocation command line was $ $0 $@ @@ -2046,8 +1515,8 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done + $as_echo "PATH: $as_dir" +done IFS=$as_save_IFS } >&5 @@ -2084,9 +1553,9 @@ do ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) - as_fn_append ac_configure_args1 " '$ac_arg'" + ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else @@ -2102,13 +1571,13 @@ do -* ) ac_must_keep_next=true ;; esac fi - as_fn_append ac_configure_args " '$ac_arg'" + ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there @@ -2120,9 +1589,11 @@ trap 'exit_status=$? { echo - $as_echo "## ---------------- ## + cat <<\_ASBOX +## ---------------- ## ## Cache variables. ## -## ---------------- ##" +## ---------------- ## +_ASBOX echo # The following way of writing the cache mishandles newlines in values, ( @@ -2131,13 +1602,13 @@ trap 'exit_status=$? case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; + *) $as_unset $ac_var ;; esac ;; esac done @@ -2156,9 +1627,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - $as_echo "## ----------------- ## + cat <<\_ASBOX +## ----------------- ## ## Output variables. ## -## ----------------- ##" +## ----------------- ## +_ASBOX echo for ac_var in $ac_subst_vars do @@ -2171,9 +1644,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; echo if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## + cat <<\_ASBOX +## ------------------- ## ## File substitutions. ## -## ------------------- ##" +## ------------------- ## +_ASBOX echo for ac_var in $ac_subst_files do @@ -2187,9 +1662,11 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; fi if test -s confdefs.h; then - $as_echo "## ----------- ## + cat <<\_ASBOX +## ----------- ## ## confdefs.h. ## -## ----------- ##" +## ----------- ## +_ASBOX echo cat confdefs.h echo @@ -2203,39 +1680,37 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; exit $exit_status ' 0 for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h -$as_echo "/* confdefs.h */" > confdefs.h - # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF + cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF + cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF + cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF @@ -2244,12 +1719,7 @@ _ACEOF ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac + ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site @@ -2260,23 +1730,19 @@ fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 + if test -r "$ac_site_file"; then + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } + . "$ac_site_file" fi done if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; @@ -2284,7 +1750,7 @@ $as_echo "$as_me: loading cache $cache_file" >&6;} esac fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi @@ -2299,11 +1765,11 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; @@ -2313,17 +1779,17 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 + { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 + { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 + { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac @@ -2335,20 +1801,43 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 + { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## + + + + + + + + + + + + + + + + + + + + + + + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -2357,7 +1846,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -am__api_version='1.15' +am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -2376,7 +1865,9 @@ for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do fi done if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} + { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, @@ -2402,10 +1893,10 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : +if test "${ac_cv_path_install+set}" = set; then $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -2413,11 +1904,11 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -2425,7 +1916,7 @@ case $as_dir/ in #(( # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -2454,7 +1945,7 @@ case $as_dir/ in #(( ;; esac - done +done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir @@ -2470,7 +1961,7 @@ fi INSTALL=$ac_install_sh fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. @@ -2481,73 +1972,68 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; + { { $as_echo "$as_me:$LINENO: error: unsafe absolute working directory name" >&5 +$as_echo "$as_me: error: unsafe absolute working directory name" >&2;} + { (exit 1); exit 1; }; };; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; + { { $as_echo "$as_me:$LINENO: error: unsafe srcdir value: \`$srcdir'" >&5 +$as_echo "$as_me: error: unsafe srcdir value: \`$srcdir'" >&2;} + { (exit 1); exit 1; }; };; esac -# Do 'set' in a subshell so we don't clobber the current shell's +# Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done test "$2" = conftest.file ) then # Ok. : else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +$as_echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +{ $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi - -rm -f conftest.file - test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. @@ -2558,8 +2044,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# Expand $ac_aux_dir to an absolute path. -am_aux_dir=`cd "$ac_aux_dir" && pwd` +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2570,15 +2056,15 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " else am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi -if test x"${install_sh+set}" != xset; then +if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2587,17 +2073,17 @@ if test x"${install_sh+set}" != xset; then esac fi -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. +# will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : +if test "${ac_cv_prog_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then @@ -2608,24 +2094,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -2635,9 +2121,9 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then @@ -2648,24 +2134,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -2674,7 +2160,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -2687,10 +2173,10 @@ fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then - if ${ac_cv_path_mkdir+:} false; then : + if test "${ac_cv_path_mkdir+set}" = set; then $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -2698,9 +2184,9 @@ for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do + for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ @@ -2710,12 +2196,11 @@ do esac done done - done +done IFS=$as_save_IFS fi - test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else @@ -2723,19 +2208,26 @@ fi # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. + test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : +if test "${ac_cv_prog_AWK+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then @@ -2746,24 +2238,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 + { $as_echo "$as_me:$LINENO: result: $AWK" >&5 $as_echo "$AWK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -2771,11 +2263,11 @@ fi test -n "$AWK" && break done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF @@ -2783,7 +2275,7 @@ SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; @@ -2793,11 +2285,11 @@ esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -2811,52 +2303,15 @@ else fi rmdir .tst 2>/dev/null -# Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : - enableval=$enable_silent_rules; -fi - -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=1;; -esac -am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' - if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } fi fi @@ -2900,72 +2355,19 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -mkdir_p='$(MKDIR_P)' +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. -# We need awk for the "check" target (and possibly the TAP driver). The -# system "awk" is bad on some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' +AMTAR=${AMTAR-"${am_missing_run}tar"} - -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar pax cpio none' - -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! - -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: - -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. - -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. - -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . - -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. - -END - as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 - fi -fi - - ac_config_headers="$ac_config_headers lib/Grid_config.h" @@ -2985,9 +2387,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : +if test "${ac_cv_prog_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then @@ -2998,24 +2400,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 + { $as_echo "$as_me:$LINENO: result: $CXX" >&5 $as_echo "$CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3029,9 +2431,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then @@ -3042,24 +2444,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3072,7 +2474,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3083,31 +2485,48 @@ fi fi fi # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" +{ (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3123,8 +2542,8 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 -$as_echo_n "checking whether the C++ compiler works... " >&6; } +{ $as_echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5 +$as_echo_n "checking for C++ compiler default output file name... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: @@ -3140,17 +2559,17 @@ do done rm -f $ac_rmfiles -if { { ac_try="$ac_link_default" +if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -3167,7 +2586,7 @@ do # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -3186,41 +2605,84 @@ test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C++ compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +{ { $as_echo "$as_me:$LINENO: error: C++ compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C++ compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 -$as_echo_n "checking for C++ compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } + ac_exeext=$ac_cv_exeext +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5 +$as_echo_n "checking whether the C++ compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" +if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -3235,83 +2697,32 @@ for ac_file in conftest.exe conftest conftest.*; do esac done else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : +if test "${ac_cv_objext+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3323,17 +2734,17 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" +if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -3346,23 +2757,31 @@ else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } fi + rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3376,16 +2795,37 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else - ac_compiler_gnu=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes @@ -3394,16 +2834,20 @@ else fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : +if test "${ac_cv_prog_cxx_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3414,11 +2858,35 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3429,12 +2897,36 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -3445,17 +2937,42 @@ main () return 0; } _ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS @@ -3489,14 +3006,14 @@ am__doit: .PHONY: am__doit END # If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. +# Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -3517,19 +3034,18 @@ if test "$am__include" = "#"; then fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : +if test "${enable_dependency_tracking+set}" = set; then enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' - am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= @@ -3543,18 +3059,17 @@ fi depcc="$CXX" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CXX_dependencies_compiler_type+:} false; then : +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -3588,16 +3103,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with '-c' and '-o' for the sake of the "dashmstdout" + # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -3606,16 +3121,16 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -3654,7 +3169,7 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type @@ -3677,9 +3192,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3690,24 +3205,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3717,9 +3232,9 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3730,24 +3245,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3756,7 +3271,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3770,9 +3285,9 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3783,24 +3298,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3810,9 +3325,9 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3824,18 +3339,18 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then @@ -3854,10 +3369,10 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3869,9 +3384,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3882,24 +3397,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3913,9 +3428,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3926,24 +3441,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -3956,7 +3471,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3967,42 +3482,62 @@ fi fi -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" +{ (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : +if test "${ac_cv_c_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -4016,16 +3551,37 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else - ac_compiler_gnu=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes @@ -4034,16 +3590,20 @@ else fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : +if test "${ac_cv_prog_cc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -4054,11 +3614,35 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -4069,12 +3653,36 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : else - ac_c_werror_flag=$ac_save_c_werror_flag + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int @@ -4085,17 +3693,42 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS @@ -4112,18 +3745,23 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : +if test "${ac_cv_prog_cc_c89+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include -struct stat; +#include +#include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); @@ -4175,9 +3813,32 @@ for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi + rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done @@ -4188,19 +3849,17 @@ fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 + { $as_echo "$as_me:$LINENO: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac -if test "x$ac_cv_prog_cc_c89" != xno; then : -fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -4208,79 +3867,19 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 - ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -4314,16 +3913,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with '-c' and '-o' for the sake of the "dashmstdout" + # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -4332,16 +3931,16 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -4380,7 +3979,7 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type @@ -4399,18 +3998,17 @@ fi OPENMP_CFLAGS= # Check whether --enable-openmp was given. -if test "${enable_openmp+set}" = set; then : +if test "${enable_openmp+set}" = set; then enableval=$enable_openmp; fi if test "$enable_openmp" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5 + { $as_echo "$as_me:$LINENO: checking for $CC option to support OpenMP" >&5 $as_echo_n "checking for $CC option to support OpenMP... " >&6; } -if ${ac_cv_prog_c_openmp+:} false; then : +if test "${ac_cv_prog_c_openmp+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + cat >conftest.$ac_ext <<_ACEOF #ifndef _OPENMP choke me @@ -4419,16 +4017,37 @@ else int main () { return omp_get_num_threads (); } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_prog_c_openmp='none needed' else - ac_cv_prog_c_openmp='unsupported' - for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ - -Popenmp --openmp; do + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_prog_c_openmp='unsupported' + for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp; do ac_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $ac_option" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + cat >conftest.$ac_ext <<_ACEOF #ifndef _OPENMP choke me @@ -4437,27 +4056,56 @@ else int main () { return omp_get_num_threads (); } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then ac_cv_prog_c_openmp=$ac_option +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext CFLAGS=$ac_save_CFLAGS if test "$ac_cv_prog_c_openmp" != unsupported; then break fi done fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_c_openmp" >&5 $as_echo "$ac_cv_prog_c_openmp" >&6; } case $ac_cv_prog_c_openmp in #( "none needed" | unsupported) - ;; #( + ;; #( *) - OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; + OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; esac fi @@ -4465,9 +4113,9 @@ $as_echo "$ac_cv_prog_c_openmp" >&6; } if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : +if test "${ac_cv_prog_RANLIB+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then @@ -4478,24 +4126,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 + { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4505,9 +4153,9 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then @@ -4518,24 +4166,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done - done +done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 + { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi @@ -4544,7 +4192,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -4564,14 +4212,14 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : + if test "${ac_cv_prog_CPP+set}" = set; then $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded @@ -4586,7 +4234,11 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4595,34 +4247,78 @@ do #endif Syntax error _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then break fi @@ -4634,7 +4330,7 @@ fi else ac_cv_prog_CPP=$CPP fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes @@ -4645,7 +4341,11 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4654,40 +4354,87 @@ do #endif Syntax error _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then # Broken: success on invalid input. continue else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break fi -rm -f conftest.err conftest.i conftest.$ac_ext + +rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } +{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } fi ac_ext=c @@ -4697,9 +4444,9 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : +if test "${ac_cv_path_GREP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then @@ -4710,10 +4457,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do + for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in @@ -4730,7 +4477,7 @@ case `"$ac_path_GREP" --version 2>&1` in $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val + ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" @@ -4745,24 +4492,26 @@ esac $ac_path_GREP_found && break 3 done done - done +done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : +if test "${ac_cv_path_EGREP+set}" = set; then $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 @@ -4776,10 +4525,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do + for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in @@ -4796,7 +4545,7 @@ case `"$ac_path_EGREP" --version 2>&1` in $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val + ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" @@ -4811,10 +4560,12 @@ esac $ac_path_EGREP_found && break 3 done done - done +done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP @@ -4822,17 +4573,21 @@ fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : +if test "${ac_cv_header_stdc+set}" = set; then $as_echo_n "(cached) " >&6 else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include @@ -4847,23 +4602,48 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else - ac_cv_header_stdc=no + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - + $EGREP "memchr" >/dev/null 2>&1; then + : else ac_cv_header_stdc=no fi @@ -4873,14 +4653,18 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - + $EGREP "free" >/dev/null 2>&1; then + : else ac_cv_header_stdc=no fi @@ -4890,10 +4674,14 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes; then : else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include @@ -4920,33 +4708,118 @@ main () return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : else - ac_cv_header_stdc=no + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi + fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -$as_echo "#define STDC_HEADERS 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -4956,48 +4829,604 @@ fi done + for ac_header in stdint.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" -if test "x$ac_cv_header_stdint_h" = xyes; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_STDINT_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done + for ac_header in malloc/malloc.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" -if test "x$ac_cv_header_malloc_malloc_h" = xyes; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_MALLOC_MALLOC_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done + for ac_header in malloc.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" -if test "x$ac_cv_header_malloc_h" = xyes; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_MALLOC_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done + for ac_header in endian.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "endian.h" "ac_cv_header_endian_h" "$ac_includes_default" -if test "x$ac_cv_header_endian_h" = xyes; then : +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_ENDIAN_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -5005,35 +5434,244 @@ fi done #AC_CHECK_HEADERS(machine/endian.h) -ac_fn_c_check_decl "$LINENO" "ntohll" "ac_cv_have_decl_ntohll" "#include -" -if test "x$ac_cv_have_decl_ntohll" = xyes; then : - ac_have_decl=1 +{ $as_echo "$as_me:$LINENO: checking whether ntohll is declared" >&5 +$as_echo_n "checking whether ntohll is declared... " >&6; } +if test "${ac_cv_have_decl_ntohll+set}" = set; then + $as_echo_n "(cached) " >&6 else - ac_have_decl=0 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef ntohll + (void) ntohll; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_ntohll=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_ntohll=no fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_ntohll" >&5 +$as_echo "$ac_cv_have_decl_ntohll" >&6; } +if test "x$ac_cv_have_decl_ntohll" = x""yes; then + cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_NTOHLL $ac_have_decl +#define HAVE_DECL_NTOHLL 1 _ACEOF -ac_fn_c_check_decl "$LINENO" "be64toh" "ac_cv_have_decl_be64toh" "#include -" -if test "x$ac_cv_have_decl_be64toh" = xyes; then : - ac_have_decl=1 + else - ac_have_decl=0 + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_NTOHLL 0 +_ACEOF + + fi -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_BE64TOH $ac_have_decl + +{ $as_echo "$as_me:$LINENO: checking whether be64toh is declared" >&5 +$as_echo_n "checking whether be64toh is declared... " >&6; } +if test "${ac_cv_have_decl_be64toh+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ _ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef be64toh + (void) be64toh; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_be64toh=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_be64toh=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_be64toh" >&5 +$as_echo "$ac_cv_have_decl_be64toh" >&6; } +if test "x$ac_cv_have_decl_be64toh" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BE64TOH 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_BE64TOH 0 +_ACEOF + + +fi + # Checks for typedefs, structures, and compiler characteristics. -ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : +{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 +$as_echo_n "checking for size_t... " >&6; } +if test "${ac_cv_type_size_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_size_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (size_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((size_t))) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_type_size_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +$as_echo "$ac_cv_type_size_t" >&6; } +if test "x$ac_cv_type_size_t" = x""yes; then + : else cat >>confdefs.h <<_ACEOF @@ -5042,12 +5680,75 @@ _ACEOF fi -ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" -case $ac_cv_c_uint32_t in #( + + { $as_echo "$as_me:$LINENO: checking for uint32_t" >&5 +$as_echo_n "checking for uint32_t... " >&6; } +if test "${ac_cv_c_uint32_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_c_uint32_t=no + for ac_type in 'uint32_t' 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) -1 >> (32 - 1) == 1)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + case $ac_type in + uint32_t) ac_cv_c_uint32_t=yes ;; + *) ac_cv_c_uint32_t=$ac_type ;; +esac + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_uint32_t" != no && break + done +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_uint32_t" >&5 +$as_echo "$ac_cv_c_uint32_t" >&6; } + case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) -$as_echo "#define _UINT32_T 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define _UINT32_T 1 +_ACEOF cat >>confdefs.h <<_ACEOF @@ -5056,12 +5757,75 @@ _ACEOF ;; esac -ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" -case $ac_cv_c_uint64_t in #( + + { $as_echo "$as_me:$LINENO: checking for uint64_t" >&5 +$as_echo_n "checking for uint64_t... " >&6; } +if test "${ac_cv_c_uint64_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_c_uint64_t=no + for ac_type in 'uint64_t' 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) -1 >> (64 - 1) == 1)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + case $ac_type in + uint64_t) ac_cv_c_uint64_t=yes ;; + *) ac_cv_c_uint64_t=$ac_type ;; +esac + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_uint64_t" != no && break + done +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_uint64_t" >&5 +$as_echo "$ac_cv_c_uint64_t" >&6; } + case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) -$as_echo "#define _UINT64_T 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define _UINT64_T 1 +_ACEOF cat >>confdefs.h <<_ACEOF @@ -5072,12 +5836,102 @@ _ACEOF # Checks for library functions. + for ac_func in gettimeofday -do : - ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" -if test "x$ac_cv_func_gettimeofday" = xyes; then : +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF -#define HAVE_GETTIMEOFDAY 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -5085,7 +5939,7 @@ done # Check whether --enable-simd was given. -if test "${enable_simd+set}" = set; then : +if test "${enable_simd+set}" = set; then enableval=$enable_simd; \ ac_SIMD=${enable_simd} else @@ -5097,35 +5951,45 @@ case ${ac_SIMD} in SSE4) echo Configuring for SSE4 -$as_echo "#define SSE4 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define SSE4 1 +_ACEOF ;; AVX) echo Configuring for AVX -$as_echo "#define AVX1 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define AVX1 1 +_ACEOF ;; AVX2) echo Configuring for AVX2 -$as_echo "#define AVX2 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define AVX2 1 +_ACEOF ;; AVX512|MIC) echo Configuring for AVX512 and MIC -$as_echo "#define AVX512 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define AVX512 1 +_ACEOF ;; *) - as_fn_error $? "${ac_SIMD} unsupported --enable-simd option" "$LINENO" 5; + { { $as_echo "$as_me:$LINENO: error: ${ac_SIMD} unsupported --enable-simd option" >&5 +$as_echo "$as_me: error: ${ac_SIMD} unsupported --enable-simd option" >&2;} + { (exit 1); exit 1; }; }; ;; esac # Check whether --enable-comms was given. -if test "${enable_comms+set}" = set; then : +if test "${enable_comms+set}" = set; then enableval=$enable_comms; ac_COMMS=${enable_comms} else ac_COMMS=none @@ -5136,17 +6000,23 @@ case ${ac_COMMS} in none) echo Configuring for NO communications -$as_echo "#define GRID_COMMS_NONE 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define GRID_COMMS_NONE 1 +_ACEOF ;; mpi) echo Configuring for MPI communications -$as_echo "#define GRID_COMMS_MPI 1" >>confdefs.h +cat >>confdefs.h <<\_ACEOF +#define GRID_COMMS_MPI 1 +_ACEOF ;; *) - as_fn_error $? "${ac_COMMS} unsupported --enable-comms option" "$LINENO" 5; + { { $as_echo "$as_me:$LINENO: error: ${ac_COMMS} unsupported --enable-comms option" >&5 +$as_echo "$as_me: error: ${ac_COMMS} unsupported --enable-comms option" >&2;} + { (exit 1); exit 1; }; }; ;; esac @@ -5203,13 +6073,13 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; + *) $as_unset $ac_var ;; esac ;; esac done @@ -5217,8 +6087,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" @@ -5240,23 +6110,12 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi + cat confcache >$cache_file else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi @@ -5270,29 +6129,20 @@ DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= -U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' @@ -5302,34 +6152,48 @@ else fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error $? "conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } fi if test -z "${BUILD_COMMS_MPI_TRUE}" && test -z "${BUILD_COMMS_MPI_FALSE}"; then - as_fn_error $? "conditional \"BUILD_COMMS_MPI\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_COMMS_MPI\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_COMMS_MPI\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } fi if test -z "${BUILD_COMMS_NONE_TRUE}" && test -z "${BUILD_COMMS_NONE_FALSE}"; then - as_fn_error $? "conditional \"BUILD_COMMS_NONE\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_COMMS_NONE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_COMMS_NONE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } fi -: "${CONFIG_STATUS=./config.status}" +: ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -5339,18 +6203,17 @@ cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 debug=false ac_cs_recheck=false ac_cs_silent=false - SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -5358,15 +6221,23 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; esac + fi + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + as_nl=' ' export as_nl @@ -5374,13 +6245,7 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -5391,7 +6256,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in #( + case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -5414,6 +6279,13 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -5423,16 +6295,15 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( +case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done IFS=$as_save_IFS ;; @@ -5444,16 +6315,12 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 + { (exit 1); exit 1; } fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' @@ -5465,89 +6332,7 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - +# Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -5561,12 +6346,8 @@ else as_basename=false fi -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi +# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -5586,25 +6367,76 @@ $as_echo X/"$0" | } s/.*/./; q'` -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( +case `echo -n x` in -n*) - case `echo 'xy\c'` in + case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; + *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -5619,85 +6451,49 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' + as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -pR' + as_ln_s='cp -p' fi else - as_ln_s='cp -pR' + as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' + as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -5707,19 +6503,13 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to +# Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Grid $as_me 1.0, which was -generated by GNU Autoconf 2.69. Invocation command line was +generated by GNU Autoconf 2.63. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -5751,15 +6541,13 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. +\`$as_me' instantiates files from templates according to the +current configuration. -Usage: $0 [OPTION]... [TAG]... +Usage: $0 [OPTION]... [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit - --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files @@ -5778,17 +6566,16 @@ $config_headers Configuration commands: $config_commands -Report bugs to ." +Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Grid config.status 1.0 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2008 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -5806,16 +6593,11 @@ ac_need_defaults=: while test $# != 0 do case $1 in - --*=?*) + --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; *) ac_option=$1 ac_optarg=$2 @@ -5829,29 +6611,27 @@ do ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; esac - as_fn_append CONFIG_FILES " '$ac_optarg'" + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ @@ -5859,10 +6639,11 @@ Try \`$0 --help' for more information.";; ac_cs_silent=: ;; # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; + -*) { $as_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; - *) as_fn_append ac_config_targets " $1" + *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac @@ -5879,7 +6660,7 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' @@ -5920,7 +6701,9 @@ do "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "benchmarks/Makefile") CONFIG_FILES="$CONFIG_FILES benchmarks/Makefile" ;; - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; esac done @@ -5943,24 +6726,26 @@ fi # after its creation but before its name has been assigned to `$tmp'. $debug || { - tmp= ac_tmp= + tmp= trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 - trap 'as_fn_exit 1' 1 2 13 15 + trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" + test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -5968,13 +6753,7 @@ ac_tmp=$tmp if test -n "$CONFIG_FILES"; then -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi +ac_cr=' ' ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' @@ -5982,7 +6761,7 @@ else ac_cs_awk_cr=$ac_cr fi -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF @@ -5991,18 +6770,24 @@ _ACEOF echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -6010,7 +6795,7 @@ done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h @@ -6024,7 +6809,7 @@ s/'"$ac_delim"'$// t delim :nl h -s/\(.\{148\}\)..*/\1/ +s/\(.\{148\}\).*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p @@ -6038,7 +6823,7 @@ s/.\{148\}// t nl :delim h -s/\(.\{148\}\)..*/\1/ +s/\(.\{148\}\).*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p @@ -6058,7 +6843,7 @@ t delim rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && +cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" @@ -6090,29 +6875,23 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } _ACEOF -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// s/^[^=]*=[ ]*$// }' fi @@ -6124,7 +6903,7 @@ fi # test -n "$CONFIG_FILES" # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || +cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF @@ -6136,11 +6915,13 @@ _ACEOF # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then break elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -6225,7 +7006,9 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } fi # test -n "$CONFIG_HEADERS" @@ -6238,7 +7021,9 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -6257,7 +7042,7 @@ do for ac_f do case $ac_f in - -) ac_f="$ac_tmp/stdin";; + -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. @@ -6266,10 +7051,12 @@ do [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" + ac_file_inputs="$ac_file_inputs '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't @@ -6280,7 +7067,7 @@ do `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. @@ -6292,8 +7079,10 @@ $as_echo "$as_me: creating $ac_file" >&6;} esac case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; esac ;; esac @@ -6321,7 +7110,47 @@ $as_echo X"$ac_file" | q } s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in @@ -6378,6 +7207,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= + ac_sed_dataroot=' /datarootdir/ { p @@ -6387,11 +7217,12 @@ ac_sed_dataroot=' /@docdir@/p /@infodir@/p /@localedir@/p -/@mandir@/p' +/@mandir@/p +' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 @@ -6401,7 +7232,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; + s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF @@ -6429,24 +7260,27 @@ s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} +which seems to be undefined. Please make sure it is defined." >&2;} - rm -f "$ac_tmp/stdin" + rm -f "$tmp/stdin" case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; :H) # @@ -6455,21 +7289,27 @@ which seems to be undefined. Please make sure it is defined" >&2;} if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } fi else $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" @@ -6507,7 +7347,7 @@ $as_echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac @@ -6515,7 +7355,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Older Autoconf quotes --file arguments for eval, but not when files + # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -6528,7 +7368,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but + # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -6562,19 +7402,21 @@ $as_echo X"$mf" | continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. + # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue + test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || @@ -6600,7 +7442,47 @@ $as_echo X"$file" | q } s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p + { as_dir=$dirpart/$fdir + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done @@ -6612,12 +7494,15 @@ $as_echo X"$file" | done # for ac_tag -as_fn_exit 0 +{ (exit 0); exit 0; } _ACEOF +chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } # configure is writing to config.log, and then calls config.status. @@ -6638,10 +7523,10 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 + $ac_cs_success || { (exit 1); exit 1; } fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 + { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi diff --git a/lib/Grid_config.h b/lib/Grid_config.h index c743bba0..8b51adce 100644 --- a/lib/Grid_config.h +++ b/lib/Grid_config.h @@ -2,42 +2,42 @@ /* lib/Grid_config.h.in. Generated from configure.ac by autoheader. */ /* AVX */ -#define AVX1 1 +/* #undef AVX1 */ /* AVX2 */ /* #undef AVX2 */ /* AVX512 */ -/* #undef AVX512 */ +#define AVX512 1 /* GRID_COMMS_MPI */ -#define GRID_COMMS_MPI 1 +/* #undef GRID_COMMS_MPI */ /* GRID_COMMS_NONE */ -/* #undef GRID_COMMS_NONE */ +#define GRID_COMMS_NONE 1 /* Define to 1 if you have the declaration of `be64toh', and to 0 if you don't. */ -#define HAVE_DECL_BE64TOH 0 +#define HAVE_DECL_BE64TOH 1 /* Define to 1 if you have the declaration of `ntohll', and to 0 if you don't. */ -#define HAVE_DECL_NTOHLL 1 +#define HAVE_DECL_NTOHLL 0 /* Define to 1 if you have the header file. */ -/* #undef HAVE_ENDIAN_H */ +#define HAVE_ENDIAN_H 1 /* Define to 1 if you have the `gettimeofday' function. */ -#define HAVE_GETTIMEOFDAY 1 +/* #undef HAVE_GETTIMEOFDAY */ /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the header file. */ -/* #undef HAVE_MALLOC_H */ +#define HAVE_MALLOC_H 1 /* Define to 1 if you have the header file. */ -#define HAVE_MALLOC_MALLOC_H 1 +/* #undef HAVE_MALLOC_MALLOC_H */ /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 @@ -78,9 +78,6 @@ /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "grid" -/* Define to the home page for this package. */ -#define PACKAGE_URL "" - /* Define to the version of this package. */ #define PACKAGE_VERSION "1.0" diff --git a/lib/Grid_config.h.in b/lib/Grid_config.h.in index 437a6095..4b094250 100644 --- a/lib/Grid_config.h.in +++ b/lib/Grid_config.h.in @@ -77,9 +77,6 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME -/* Define to the home page for this package. */ -#undef PACKAGE_URL - /* Define to the version of this package. */ #undef PACKAGE_VERSION diff --git a/lib/Grid_lattice.h b/lib/Grid_lattice.h index 861a9e24..356a25b8 100644 --- a/lib/Grid_lattice.h +++ b/lib/Grid_lattice.h @@ -176,7 +176,7 @@ public: }; // class Lattice } -#define GRID_LATTICE_EXPRESSION_TEMPLATES +#undef GRID_LATTICE_EXPRESSION_TEMPLATES #include diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index 4e33604d..6695eb0d 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -20,6 +20,7 @@ #endif #ifdef AVX512 #include +#include #endif namespace Grid { @@ -160,10 +161,10 @@ inline void Gpermute(vsimd &y,const vsimd &b,int perm){ // Permute 1 every abcd efgh ijkl mnop -> cdab ghef jkij opmn // Permute 2 every abcd efgh ijkl mnop -> efgh abcd mnop ijkl // Permute 3 every abcd efgh ijkl mnop -> ijkl mnop abcd efgh - case 3: y.v = _mm512_swizzle_ps(b.v,_MM_SWIZ_REG_CDAB); break; - case 2: y.v = _mm512_swizzle_ps(b.v,_MM_SWIZ_REG_BADC); break; - case 1: y.v = _mm512_permute4f128_ps(b.v,(_MM_PERM_ENUM)_MM_SHUFFLE(2,3,0,1)); break; - case 0: y.v = _mm512_permute4f128_ps(b.v,(_MM_PERM_ENUM)_MM_SHUFFLE(1,0,3,2)); break; + case 3: y.v =(decltype(y.v)) _mm512_swizzle_ps((__m512)b.v,_MM_SWIZ_REG_CDAB); break; + case 2: y.v =(decltype(y.v)) _mm512_swizzle_ps((__m512)b.v,_MM_SWIZ_REG_BADC); break; + case 1: y.v =(decltype(y.v)) _mm512_permute4f128_ps((__m512)b.v,(_MM_PERM_ENUM)_MM_SHUFFLE(2,3,0,1)); break; + case 0: y.v =(decltype(y.v)) _mm512_permute4f128_ps((__m512)b.v,(_MM_PERM_ENUM)_MM_SHUFFLE(1,0,3,2)); break; #endif #ifdef QPX #error not implemented diff --git a/lib/cshift/Grid_cshift_common.h b/lib/cshift/Grid_cshift_common.h index 6ae6df71..8320d2d0 100644 --- a/lib/cshift/Grid_cshift_common.h +++ b/lib/cshift/Grid_cshift_common.h @@ -26,19 +26,18 @@ Gather_plane_simple (const Lattice &rhs,std::vector_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane int bo = 0; // offset in buffer #pragma omp parallel for collapse(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ + int o = n*rhs._grid->_slice_stride[dimension]; int ocb=1<CheckerBoardFromOindex(o+b);// Could easily be a table lookup if ( ocb &cbmask ) { buffer[bo]=compress(rhs._odata[so+o+b]); bo++; } } - o +=rhs._grid->_slice_stride[dimension]; } } @@ -56,13 +55,13 @@ Gather_plane_extract(const Lattice &rhs,std::vector_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane int bo = 0; // offset in buffer #pragma omp parallel for collapse(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ + int o=n*rhs._grid->_slice_stride[dimension]; int offset = b+n*rhs._grid->_slice_block[dimension]; int ocb=1<CheckerBoardFromOindex(o+b); @@ -71,9 +70,7 @@ Gather_plane_extract(const Lattice &rhs,std::vector(temp,pointers,offset); } - } - o +=rhs._grid->_slice_stride[dimension]; } } @@ -107,20 +104,17 @@ template void Scatter_plane_simple (Lattice &rhs,std::vector_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane int bo = 0; // offset in buffer #pragma omp parallel for collapse(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ - + int o=n*rhs._grid->_slice_stride[dimension]; int ocb=1<CheckerBoardFromOindex(o+b);// Could easily be a table lookup if ( ocb & cbmask ) { rhs._odata[so+o+b]=buffer[bo++]; } - } - o +=rhs._grid->_slice_stride[dimension]; } } @@ -136,21 +130,18 @@ template void Scatter_plane_simple (Lattice &rhs,std::vector_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane - int bo = 0; // offset in buffer #pragma omp parallel for collapse(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ + int o = n*rhs._grid->_slice_stride[dimension]; int offset = b+n*rhs._grid->_slice_block[dimension]; int ocb=1<CheckerBoardFromOindex(o+b); if ( ocb&cbmask ) { merge(rhs._odata[so+o+b],pointers,offset); } - } - o +=rhs._grid->_slice_stride[dimension]; } } @@ -168,20 +159,18 @@ template void Copy_plane(Lattice& lhs,Lattice &rhs, int int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane #pragma omp parallel for collapse(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ + int o =n*rhs._grid->_slice_stride[dimension]; int ocb=1<CheckerBoardFromOindex(o+b); - if ( ocb&cbmask ) { lhs._odata[lo+o+b]=rhs._odata[ro+o+b]; } } - o +=rhs._grid->_slice_stride[dimension]; } } @@ -195,19 +184,16 @@ template void Copy_plane_permute(Lattice& lhs,Lattice &r int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane - int o = 0; // relative offset to base within plane #pragma omp parallel for collapse(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ - + int o =n*rhs._grid->_slice_stride[dimension]; int ocb=1<CheckerBoardFromOindex(o+b); if ( ocb&cbmask ) { permute(lhs._odata[lo+o+b],rhs._odata[ro+o+b],permute_type); } - } - o +=rhs._grid->_slice_stride[dimension]; } } diff --git a/lib/lattice/Grid_lattice_coordinate.h b/lib/lattice/Grid_lattice_coordinate.h index a9b381fa..c49aed89 100644 --- a/lib/lattice/Grid_lattice_coordinate.h +++ b/lib/lattice/Grid_lattice_coordinate.h @@ -3,6 +3,17 @@ namespace Grid { + /* + depbase=`echo Grid_main.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\ + icpc -DHAVE_CONFIG_H -I. -I../lib -I../lib -mmic -O3 -std=c++11 -fopenmp -MT Grid_main.o -MD -MP -MF $depbase.Tpo -c -o Grid_main.o Grid_main.cc &&\ + mv -f $depbase.Tpo $depbase.Po + ../lib/lattice/Grid_lattice_coordinate.h(25): error: no suitable user-defined conversion from "vector_type" to "const Grid::iScalar>>" exists + l._odata[o]=vI; + ^ + detected during instantiation of "void Grid::LatticeCoordinate(Grid::Lattice &, int) [with iobj=Grid::QCD::vTInteger]" at line 283 of "Grid_main.cc" + + compilation aborted for Grid_main.cc (code 2) +*/ template inline void LatticeCoordinate(Lattice &l,int mu) { typedef typename iobj::scalar_object scalar_object; @@ -21,8 +32,8 @@ namespace Grid { grid->RankIndexToGlobalCoor(grid->ThisRank(),o,i,gcoor); mergebuf[i]=(Integer)gcoor[mu]; } - AmergeA(vI,mergebuf); - l._odata[o]=vI; + merge(vI,mergebuf); + l._odata[o]._internal._internal._internal=vI; } }; diff --git a/lib/lattice/Grid_lattice_overload.h b/lib/lattice/Grid_lattice_overload.h index 512e45d1..c4dd3373 100644 --- a/lib/lattice/Grid_lattice_overload.h +++ b/lib/lattice/Grid_lattice_overload.h @@ -118,3 +118,4 @@ namespace Grid { } +#endif diff --git a/lib/math/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h index 09739555..97048d62 100644 --- a/lib/math/Grid_math_tensors.h +++ b/lib/math/Grid_math_tensors.h @@ -45,10 +45,6 @@ public: zeroit(*this); return *this; } - iScalar & operator= (const scalar_type s){ - _internal=s; - return *this; - } friend void vstream(iScalar &out,const iScalar &in){ vstream(out._internal,in._internal); } @@ -98,10 +94,10 @@ public: operator ComplexD () const { return(TensorRemove(_internal)); }; operator RealD () const { return(real(TensorRemove(_internal))); } - + // convert from a something to a scalar template::notvalue, T>::type* = nullptr > inline auto operator = (T arg) -> iScalar { - _internal = arg; + _internal = vtype(arg); return *this; } diff --git a/lib/qcd/Grid_qcd_wilson_dop.cc b/lib/qcd/Grid_qcd_wilson_dop.cc index 71b049ec..41718798 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.cc +++ b/lib/qcd/Grid_qcd_wilson_dop.cc @@ -107,12 +107,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) int ss = sss; int ssu= sss; -<<<<<<< HEAD - //int ss = Stencil._LebesgueReorder[sss]; -======= - //int ss = 0; //int ss = Stencil._LebesgueReorder[sss]; ->>>>>>> 55ccb8ccf4aa6b9d6e36e71aa19f89db0463254f // Xp offset = Stencil._offsets [Xp][ss]; @@ -130,10 +125,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) chi=comm_buf[offset]; } mult(&Uchi(),&Umu._odata[ssu](Xp),&chi()); -<<<<<<< HEAD -======= - prefetch(Umu._odata[ssu](Yp)); ->>>>>>> 55ccb8ccf4aa6b9d6e36e71aa19f89db0463254f + //prefetch(Umu._odata[ssu](Yp)); spReconXp(result,Uchi); // Yp @@ -152,10 +144,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) chi=comm_buf[offset]; } mult(&Uchi(),&Umu._odata[ssu](Yp),&chi()); -<<<<<<< HEAD -======= - prefetch(Umu._odata[ssu](Zp)); ->>>>>>> 55ccb8ccf4aa6b9d6e36e71aa19f89db0463254f + // prefetch(Umu._odata[ssu](Zp)); accumReconYp(result,Uchi); // Zp @@ -174,10 +163,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) chi=comm_buf[offset]; } mult(&Uchi(),&Umu._odata[ssu](Zp),&chi()); -<<<<<<< HEAD -======= - prefetch(Umu._odata[ssu](Tp)); ->>>>>>> 55ccb8ccf4aa6b9d6e36e71aa19f89db0463254f + // prefetch(Umu._odata[ssu](Tp)); accumReconZp(result,Uchi); // Tp @@ -196,10 +182,7 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) chi=comm_buf[offset]; } mult(&Uchi(),&Umu._odata[ssu](Tp),&chi()); -<<<<<<< HEAD -======= - prefetch(Umu._odata[ssu](Xm)); ->>>>>>> 55ccb8ccf4aa6b9d6e36e71aa19f89db0463254f + // prefetch(Umu._odata[ssu](Xm)); accumReconTp(result,Uchi); // Xm @@ -218,10 +201,6 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) chi=comm_buf[offset]; } mult(&Uchi(),&Umu._odata[ssu](Xm),&chi()); -<<<<<<< HEAD -======= - prefetch(Umu._odata[ssu](Ym)); ->>>>>>> 55ccb8ccf4aa6b9d6e36e71aa19f89db0463254f accumReconXm(result,Uchi); @@ -241,10 +220,6 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) chi=comm_buf[offset]; } mult(&Uchi(),&Umu._odata[ssu](Ym),&chi()); -<<<<<<< HEAD -======= - prefetch(Umu._odata[ssu](Zm)); ->>>>>>> 55ccb8ccf4aa6b9d6e36e71aa19f89db0463254f accumReconYm(result,Uchi); // Zm @@ -263,10 +238,6 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) chi=comm_buf[offset]; } mult(&Uchi(),&Umu._odata[ssu](Zm),&chi()); -<<<<<<< HEAD -======= - prefetch(Umu._odata[ssu](Tm)); ->>>>>>> 55ccb8ccf4aa6b9d6e36e71aa19f89db0463254f accumReconZm(result,Uchi); // Tm diff --git a/lib/simd/Grid_vComplexD.h b/lib/simd/Grid_vComplexD.h index 5dbb28e5..ef5da859 100644 --- a/lib/simd/Grid_vComplexD.h +++ b/lib/simd/Grid_vComplexD.h @@ -143,10 +143,10 @@ namespace Grid { * } */ zvec vzero,ymm0,ymm1,real,imag; - vzero = _mm512_setzero(); + vzero =(zvec)_mm512_setzero(); ymm0 = _mm512_swizzle_pd(a.v, _MM_SWIZ_REG_CDAB); // - real = _mm512_mask_or_epi64(a.v, 0xAAAA,vzero, ymm0); - imag = _mm512_mask_sub_pd(a.v, 0x5555,vzero, ymm0); + real =(zvec)_mm512_mask_or_epi64((__m512i)a.v, 0xAA,(__m512i)vzero,(__m512i) ymm0); + imag = _mm512_mask_sub_pd(a.v, 0x55,vzero, ymm0); ymm1 = _mm512_mul_pd(real, b.v); ymm0 = _mm512_swizzle_pd(b.v, _MM_SWIZ_REG_CDAB); // OK ret.v= _mm512_fmadd_pd(ymm0,imag,ymm1); @@ -250,7 +250,8 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ _mm_stream_pd((double *)&out.v,in.v); #endif #ifdef AVX512 - _mm512_stream_pd((double *)&out.v,in.v); + _mm512_storenrngo_pd((double *)&out.v,in.v); + // _mm512_stream_pd((double *)&out.v,in.v); //Note v has a3 a2 a1 a0 #endif #ifdef QPX @@ -277,7 +278,7 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ ret.v = _mm_shuffle_pd(tmp,tmp,0x1); #endif #ifdef AVX512 - ret.v = _mm512_mask_sub_pd(in.v, 0xaaaa,ret.v, in.v); + ret.v = _mm512_mask_sub_pd(in.v, 0xaa,ret.v, in.v); #endif #ifdef QPX assert(0); @@ -297,7 +298,7 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ ret.v =_mm_shuffle_pd(tmp.v,tmp.v,0x1); #endif #ifdef AVX512 - ret.v = _mm512_mask_sub_pd(in.v,0xaaaa,ret.v,in.v); // real -imag + ret.v = _mm512_mask_sub_pd(in.v,0xaa,ret.v,in.v); // real -imag ret.v = _mm512_swizzle_pd(ret.v, _MM_SWIZ_REG_CDAB);// OK #endif #ifdef QPX @@ -319,7 +320,7 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ #endif #ifdef AVX512 tmp.v = _mm512_swizzle_pd(in.v, _MM_SWIZ_REG_CDAB);// OK - ret.v = _mm512_mask_sub_pd(tmp.v,0xaaaa,ret.v,tmp.v); // real -imag + ret.v = _mm512_mask_sub_pd(tmp.v,0xaa,ret.v,tmp.v); // real -imag #endif #ifdef QPX assert(0); @@ -337,7 +338,7 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ return ComplexD(c_[0]+c_[2],c_[1]+c_[3]); #endif #ifdef AVX512 - return ComplexD(_mm512_mask_reduce_add_pd(0x5555, in.v),_mm512_mask_reduce_add_pd(0xAAAA, in.v)); + return ComplexD(_mm512_mask_reduce_add_pd(0x55, in.v),_mm512_mask_reduce_add_pd(0xAA, in.v)); #endif #ifdef QPX #endif diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index 66a1e1bf..34510333 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -133,7 +133,7 @@ namespace Grid { cvec vzero,ymm0,ymm1,real, imag; vzero = _mm512_setzero(); ymm0 = _mm512_swizzle_ps(a.v, _MM_SWIZ_REG_CDAB); // - real = _mm512_mask_or_epi32(a.v, 0xAAAA,vzero, ymm0); + real = (__m512)_mm512_mask_or_epi32((__m512i)a.v, 0xAAAA,(__m512i)vzero,(__m512i)ymm0); imag = _mm512_mask_sub_ps(a.v, 0x5555,vzero, ymm0); ymm1 = _mm512_mul_ps(real, b.v); ymm0 = _mm512_swizzle_ps(b.v, _MM_SWIZ_REG_CDAB); // OK @@ -199,7 +199,8 @@ namespace Grid { _mm_stream_ps((float *)&out.v,in.v); #endif #ifdef AVX512 - _mm512_stream_ps((float *)&out.v,in.v); + _mm512_storenrngo_ps((float *)&out.v,in.v); + // _mm512_stream_ps((float *)&out.v,in.v); //Note v has a3 a2 a1 a0 #endif #ifdef QPX diff --git a/lib/simd/Grid_vInteger.h b/lib/simd/Grid_vInteger.h index b7950873..7d558fe7 100644 --- a/lib/simd/Grid_vInteger.h +++ b/lib/simd/Grid_vInteger.h @@ -3,8 +3,10 @@ namespace Grid { -#define _mm256_set_m128i(hi,lo) _mm256_insertf128_si256(_mm256_castsi128_si256(lo),(hi),1) // _mm256_set_m128i(hi,lo); // not defined in all versions of immintrin.h +#ifndef _mm256_set_m128i +#define _mm256_set_m128i(hi,lo) _mm256_insertf128_si256(_mm256_castsi128_si256(lo),(hi),1) +#endif typedef uint32_t Integer; @@ -110,7 +112,8 @@ namespace Grid { ret.v = _mm_mul_epi32(a.v,b.v); #endif #ifdef AVX512 - ret.v = _mm512_mul_epi32(a.v,b.v); + // ret.v = _mm512_mul_epi32(a.v,b.v); + ret.v = _mm512_mullo_epi32(a.v,b.v); #endif #ifdef QPX // Implement as array of ints is only option diff --git a/lib/simd/Grid_vRealD.h b/lib/simd/Grid_vRealD.h index 8041c1f9..4d5e2f57 100644 --- a/lib/simd/Grid_vRealD.h +++ b/lib/simd/Grid_vRealD.h @@ -184,7 +184,7 @@ namespace Grid { _mm_stream_pd((double *)&out.v,in.v); #endif #ifdef AVX512 - _mm512_stream_pd((double *)&out.v,in.v); + _mm512_storenrngo_pd((double *)&out.v,in.v); //Note v has a3 a2 a1 a0 #endif #ifdef QPX diff --git a/lib/simd/Grid_vRealF.h b/lib/simd/Grid_vRealF.h index e1d5679a..79e1b91f 100644 --- a/lib/simd/Grid_vRealF.h +++ b/lib/simd/Grid_vRealF.h @@ -216,7 +216,8 @@ friend inline void vstore(const vRealF &ret, float *a){ _mm_stream_ps((float *)&out.v,in.v); #endif #ifdef AVX512 - _mm512_stream_ps((float *)&out.v,in.v); + _mm512_storenrngo_ps((float *)&out.v,in.v); + // _mm512_stream_ps((float *)&out.v,in.v); //Note v has a3 a2 a1 a0 #endif #ifdef QPX diff --git a/tests/Grid_gamma.cc b/tests/Grid_gamma.cc index 3f350bc5..731b2d10 100644 --- a/tests/Grid_gamma.cc +++ b/tests/Grid_gamma.cc @@ -50,8 +50,9 @@ int main (int argc, char ** argv) // std::cout << " Is triv Scalar " < >::value << std::endl; // std::cout << " Is triv Scalar "< >::value << std::endl; + std::complex c(1.0); for(int a=0;a, 4>>" to "const Grid::iScalar>>" exists +c_m = peekIdiot(scm,1,2); +*/ +template auto peekIdiot(const vobj &rhs,int i,int j) -> decltype(peekIndex<2>(rhs,0,0)) +{ + return peekIndex<2>(rhs,i,j); +} +template auto peekDumKopf(const vobj &rhs,int i,int j) -> decltype(peekIndex<3>(rhs,0,0)) +{ + return peekIndex<3>(rhs,i,j); +} +template auto peekDumKopf(const vobj &rhs,int i) -> decltype(peekIndex<3>(rhs,0)) +{ + return peekIndex<3>(rhs,i); +} int main (int argc, char ** argv) { @@ -224,7 +240,8 @@ int main (int argc, char ** argv) s_m = peekIndex<1>(scm,0,0); c_m = peekIndex<2>(scm,1,2); - c_m = peekSpin(scm,1,2); + // c_m = peekSpin(scm,1,2); + c_m = peekIdiot(scm,1,2); printf("c. Level %d\n",c_m.TensorLevel); printf("c. Level %d\n",c_m().TensorLevel); @@ -302,7 +319,8 @@ int main (int argc, char ** argv) int Nc = Grid::QCD::Nc; LatticeGaugeField U(&Fine); - LatticeColourMatrix Uy = peekLorentz(U,1); + // LatticeColourMatrix Uy = peekLorentz(U,1); + LatticeColourMatrix Uy = peekDumKopf(U,1); flops = ncall*1.0*volume*(8*Nc*Nc*Nc); bytes = ncall*1.0*volume*Nc*Nc *2*3*sizeof(Grid::Real); From 06dcbed6b15860d9c3510d3286dc7fba83339509 Mon Sep 17 00:00:00 2001 From: paboyle Date: Mon, 11 May 2015 09:44:50 +0100 Subject: [PATCH 140/429] Updated to do list --- TODO | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/TODO b/TODO index 57769ae6..980e331c 100644 --- a/TODO +++ b/TODO @@ -2,41 +2,39 @@ - use protocol buffers? replace xmlReader/Writer ec.. - Binary use htonll, htonl +*** Hacks and bug fixes to clean up * Had to hack assignment to 1.0 in the tests/Grid_gamma test -y +* norm2l is a hack. figure out syntax error and make this norm2 c.f. tests/Grid_gamma.cc +* Reduce implemention is poor +* Bug in SeedFixedIntegers gives same output on each site. +* Bug in RNG with complex numbers ; only filling real values; need helper function -- DONE +* Conformable test in Cshift routines. + +*** Functionality + +* Command line args for geometry, simd, etc. layout. Is it necessary to have + user pass these? Is this a QCD specific? + +* Strong test for norm2, conj and all primitive types. -- Grid_simd test is almost there + * Expression template engine: - Audit - Introduce base clase for Grid Tensors. - Introduce norm2 unary op. - Introduce conversion automatic from expression to Lattice - - -* Command line args for geometry, simd, etc. layout. Is it necessary to have - user pass these? Is this a QCD specific? * CovariantShift support -----Use a class to store gauge field? (parallel transport?) -* Strong test for norm2, conj and all primitive types. -- Grid_simd test is almost there - -* Reduce implemention is poor -* Bug in SeedFixedIntegers gives same output on each site. -* Bug in RNG with complex numbers ; only filling real values; need helper function -- DONE - -* norm2l is a hack. figure out syntax error and make this norm2 c.f. tests/Grid_gamma.cc - ** Make the Tensor types and Complex etc... play more nicely. - - TensorRemove is a hack, come up with a long term rationalised approach to Complex vs. Scalar > > QDP forces use of "toDouble" to get back to non tensor scalar. This role is presently taken TensorRemove, but I want to introduce a syntax that does not require this. - - Reductions that contract indices on a site should always demote the tensor structure. norm2(), innerProduct. - - Result of Sum(), SliceSum // spatial sums trace, traceIndex etc.. do not. - - problem arises because "trace" returns Lattice moving everything down to Scalar, and then Sum and SliceSum to not remove the Scalars. This would be fixed if we template specialize the scalar scalar scalar sum and SliceSum, on the basis of being @@ -46,7 +44,6 @@ y - I have collated into single location at least. - Need to use _mm_*insert/extract routines. -* Conformable test in Cshift routines. * Flavour matrices? * Pauli, SU subgroup, etc.. From b42453d1fd76e41a7ed4ac4f538c67b5edd34aba Mon Sep 17 00:00:00 2001 From: paboyle Date: Mon, 11 May 2015 12:43:10 +0100 Subject: [PATCH 141/429] Command line args and a general clean up --- TODO | 6 +- benchmarks/Grid_comms.cc | 6 +- benchmarks/Grid_memory_bandwidth.cc | 7 +- benchmarks/Grid_wilson.cc | 8 +- lib/Grid.h | 8 ++ lib/Grid_aligned_allocator.h | 15 ++- lib/Grid_comparison.h | 6 ++ lib/Grid_cshift.h | 4 - lib/Grid_init.cc | 96 +++++++++++++++---- lib/Makefile.am | 2 +- ...ator_fake.cc => Grid_communicator_none.cc} | 6 +- lib/math/Grid_math_arith_sub.h | 18 ---- lib/math/Grid_math_tensors.h | 44 +++++---- lib/qcd/Grid_qcd_wilson_dop.cc | 1 + tests/Grid_gamma.cc | 8 +- tests/Grid_main.cc | 32 +------ tests/Grid_nersc_io.cc | 8 +- tests/Grid_simd.cc | 8 +- tests/Grid_stencil.cc | 8 +- 19 files changed, 179 insertions(+), 112 deletions(-) rename lib/communicator/{Grid_communicator_fake.cc => Grid_communicator_none.cc} (97%) diff --git a/TODO b/TODO index 980e331c..1f5be83f 100644 --- a/TODO +++ b/TODO @@ -5,13 +5,17 @@ *** Hacks and bug fixes to clean up * Had to hack assignment to 1.0 in the tests/Grid_gamma test * norm2l is a hack. figure out syntax error and make this norm2 c.f. tests/Grid_gamma.cc -* Reduce implemention is poor + +* Reduce implemention is poor ; need threaded reductions; OMP isn't able to do it for generic objects. + * Bug in SeedFixedIntegers gives same output on each site. * Bug in RNG with complex numbers ; only filling real values; need helper function -- DONE * Conformable test in Cshift routines. *** Functionality +* Implement where to take template scheme. + * Command line args for geometry, simd, etc. layout. Is it necessary to have user pass these? Is this a QCD specific? diff --git a/benchmarks/Grid_comms.cc b/benchmarks/Grid_comms.cc index ef7c5491..b1e3848a 100644 --- a/benchmarks/Grid_comms.cc +++ b/benchmarks/Grid_comms.cc @@ -8,9 +8,11 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({1,2,2,1}); + std::vector latt_size; + std::vector simd_layout; + std::vector mpi_layout; + GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); int Nloop=10; int nmu=0; diff --git a/benchmarks/Grid_memory_bandwidth.cc b/benchmarks/Grid_memory_bandwidth.cc index fb6db6d8..eaffe83e 100644 --- a/benchmarks/Grid_memory_bandwidth.cc +++ b/benchmarks/Grid_memory_bandwidth.cc @@ -8,8 +8,11 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector simd_layout({1,2,2,2}); - std::vector mpi_layout ({1,1,1,1}); + std::vector tmp_latt_size; + std::vector simd_layout; + std::vector mpi_layout; + + GridParseLayout(argv,argc,mpi_layout,simd_layout,tmp_latt_size); const int Nvec=8; typedef Lattice< iVector< vReal,Nvec> > LatticeVec; diff --git a/benchmarks/Grid_wilson.cc b/benchmarks/Grid_wilson.cc index ecd7b65b..d0b96d1c 100644 --- a/benchmarks/Grid_wilson.cc +++ b/benchmarks/Grid_wilson.cc @@ -20,9 +20,11 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({1,1,1,1}); - std::vector latt_size ({8,8,8,8}); + std::vector latt_size; + std::vector simd_layout; + std::vector mpi_layout; + + GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); GridCartesian Grid(latt_size,simd_layout,mpi_layout); std::vector seeds({1,2,3,4}); diff --git a/lib/Grid.h b/lib/Grid.h index 05095f48..4b452051 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -57,6 +57,7 @@ namespace Grid { + void Grid_init(int *argc,char ***argv); void Grid_finalize(void); void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr); @@ -68,6 +69,13 @@ namespace Grid { double usecond(void); + // Common parsing chores + std::string GridCmdOptionPayload(char ** begin, char ** end, const std::string & option); + bool GridCmdOptionExists(char** begin, char** end, const std::string& option); + void GridParseIntVector(std::string &str,std::vector & vec); + void GridParseLayout(char **argv,int argc,std::vector &mpi,std::vector &simd,std::vector &latt); + + }; #endif diff --git a/lib/Grid_aligned_allocator.h b/lib/Grid_aligned_allocator.h index 9008105a..f0b93172 100644 --- a/lib/Grid_aligned_allocator.h +++ b/lib/Grid_aligned_allocator.h @@ -20,31 +20,36 @@ public: typedef _Tp value_type; template struct rebind { typedef alignedAllocator<_Tp1> other; }; + alignedAllocator() throw() { } + alignedAllocator(const alignedAllocator&) throw() { } + template alignedAllocator(const alignedAllocator<_Tp1>&) throw() { } + ~alignedAllocator() throw() { } - pointer address(reference __x) const { return &__x; } + + pointer address(reference __x) const { return &__x; } const_pointer address(const_reference __x) const { return &__x; } + size_type max_size() const throw() { return size_t(-1) / sizeof(_Tp); } - // Should override allocate and deallocate + pointer allocate(size_type __n, const void* = 0) { - //_Tp * ptr = (_Tp *) memalign(sizeof(_Tp),__n*sizeof(_Tp)); - // _Tp * ptr = (_Tp *) memalign(128,__n*sizeof(_Tp)); #ifdef AVX512 _Tp * ptr = (_Tp *) memalign(128,__n*sizeof(_Tp)); #else _Tp * ptr = (_Tp *) _mm_malloc(__n*sizeof(_Tp),128); #endif - return ptr; } + void deallocate(pointer __p, size_type) { free(__p); } void construct(pointer __p, const _Tp& __val) { }; void construct(pointer __p) { }; + void destroy(pointer __p) { }; }; diff --git a/lib/Grid_comparison.h b/lib/Grid_comparison.h index 53dec1a0..45311831 100644 --- a/lib/Grid_comparison.h +++ b/lib/Grid_comparison.h @@ -3,6 +3,12 @@ namespace Grid { + ///////////////////////////////////////// + // This implementation is a bit poor. + // Only support logical operations (== etc) + // on scalar objects. Strip any tensor structures. + // Should guard this with isGridTensor<> enable if? + ///////////////////////////////////////// // Generic list of functors template class veq { public: diff --git a/lib/Grid_cshift.h b/lib/Grid_cshift.h index 1c601b7d..10c7a3c4 100644 --- a/lib/Grid_cshift.h +++ b/lib/Grid_cshift.h @@ -7,10 +7,6 @@ #include #endif -#ifdef GRID_COMMS_FAKE -#include -#endif - #ifdef GRID_COMMS_MPI #include #endif diff --git a/lib/Grid_init.cc b/lib/Grid_init.cc index 47159d05..2382dc15 100644 --- a/lib/Grid_init.cc +++ b/lib/Grid_init.cc @@ -12,6 +12,7 @@ #include #include #include +#include #undef __X86_64 #define MAC @@ -22,21 +23,6 @@ namespace Grid { - std::streambuf *Grid_saved_stream_buf; -#if 0 - void Grid_quiesce_nodes(void) - { -#ifdef GRID_COMMS_MPI - int me; - MPI_Comm_rank(MPI_COMM_WORLD,&me); - std::streambuf* Grid_saved_stream_buf = std::cout.rdbuf(); - if ( me ) { - std::ofstream file("log.node"); - std::cout.rdbuf(file.rdbuf()); - } -#endif - } -#endif void Grid_quiesce_nodes(void) { #ifdef GRID_COMMS_MPI @@ -54,18 +40,95 @@ namespace Grid { #endif } +std::string GridCmdOptionPayload(char ** begin, char ** end, const std::string & option) +{ + char ** itr = std::find(begin, end, option); + if (itr != end && ++itr != end) { + std::string payload(*itr); + return payload; + } + return std::string(""); +} +bool GridCmdOptionExists(char** begin, char** end, const std::string& option) +{ + return std::find(begin, end, option) != end; +} void Grid_init(int *argc,char ***argv) { #ifdef GRID_COMMS_MPI MPI_Init(argc,argv); #endif - Grid_debug_handler_init(); + // Parse command line args. Grid_quiesce_nodes(); + } + +void GridCmdOptionIntVector(std::string &str,std::vector & vec) +{ + vec.resize(0); + std::stringstream ss(str); + int i; + while (ss >> i){ + vec.push_back(i); + if (ss.peek() == ',') + ss.ignore(); + } + return; +} + +void GridParseLayout(char **argv,int argc,std::vector &mpi,std::vector &simd,std::vector &latt) +{ + mpi =std::vector({1,1,1,1}); +#if defined(AVX) || defined (AVX2) + simd=std::vector({1,1,2,2}); +#endif +#if defined(SSE4) + simd=std::vector({1,1,1,2}); +#endif +#if defined(AVX512) + simd=std::vector({1,2,2,2}); +#endif + latt=std::vector({8,8,8,8}); + + std::string arg; + if( GridCmdOptionExists(argv,argv+argc,"--mpi-layout") ){ + arg = GridCmdOptionPayload(argv,argv+argc,"--mpi-layout"); + GridCmdOptionIntVector(arg,mpi); + } + if( GridCmdOptionExists(argv,argv+argc,"--simd-layout") ){ + arg= GridCmdOptionPayload(argv,argv+argc,"--simd-layout"); + GridCmdOptionIntVector(arg,simd); + } + if( GridCmdOptionExists(argv,argv+argc,"--lattice") ){ + arg= GridCmdOptionPayload(argv,argv+argc,"--lattice"); + GridCmdOptionIntVector(arg,latt); + } + std::cout<<"MPI layout"; + for(int i=0;i &list, void *xmit, @@ -38,11 +38,11 @@ void CartesianCommunicator::SendToRecvFromBegin(std::vector &lis int from, int bytes) { - exit(-1); + assert(0); } void CartesianCommunicator::SendToRecvFromComplete(std::vector &list) { - exit(-1); + assert(0); } void CartesianCommunicator::Barrier(void) diff --git a/lib/math/Grid_math_arith_sub.h b/lib/math/Grid_math_arith_sub.h index 3a58bf4c..de4ef9e5 100644 --- a/lib/math/Grid_math_arith_sub.h +++ b/lib/math/Grid_math_arith_sub.h @@ -68,24 +68,6 @@ template inline void sub(iMatrix void vprefetch(const iScalar &vv) -{ - vprefetch(vv._internal); -} -template void vprefetch(const iVector &vv) -{ - for(int i=0;i void vprefetch(const iMatrix &vv) -{ - for(int i=0;i inline auto operator - (const iScalar& lhs, const iScalar& rhs) -> iScalar diff --git a/lib/math/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h index 97048d62..b71b0047 100644 --- a/lib/math/Grid_math_tensors.h +++ b/lib/math/Grid_math_tensors.h @@ -16,9 +16,9 @@ namespace Grid { // However note that doing this eliminates some syntactical sugar such as // calling the constructor explicitly or implicitly // -#undef TENSOR_IS_POD +class GridTensorBase {}; -template class iScalar +template class iScalar :public GridTensorBase { public: vtype _internal; @@ -34,12 +34,9 @@ public: // Scalar no action // template using tensor_reduce_level = typename iScalar::tensor_reduce_level >; - -#ifndef TENSOR_IS_POD iScalar()=default; iScalar(scalar_type s) : _internal(s) {};// recurse down and hit the constructor for vector_type iScalar(const Zero &z){ *this = zero; }; -#endif iScalar & operator= (const Zero &hero){ zeroit(*this); @@ -87,15 +84,12 @@ public: inline const vtype & operator ()(void) const { return _internal; } - // inline vtype && operator ()(void) { - // return _internal; - // } operator ComplexD () const { return(TensorRemove(_internal)); }; operator RealD () const { return(real(TensorRemove(_internal))); } // convert from a something to a scalar - template::notvalue, T>::type* = nullptr > inline auto operator = (T arg) -> iScalar + template::value, T>::type* = nullptr > inline auto operator = (T arg) -> iScalar { _internal = vtype(arg); return *this; @@ -105,13 +99,13 @@ public: /////////////////////////////////////////////////////////// // Allows to turn scalar>>> back to double. /////////////////////////////////////////////////////////// -template inline typename std::enable_if::notvalue, T>::type TensorRemove(T arg) { return arg;} +template inline typename std::enable_if::value, T>::type TensorRemove(T arg) { return arg;} template inline auto TensorRemove(iScalar arg) -> decltype(TensorRemove(arg._internal)) { return TensorRemove(arg._internal); } -template class iVector +template class iVector :public GridTensorBase { public: vtype _internal[N]; @@ -125,11 +119,8 @@ public: enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; - -#ifndef TENSOR_IS_POD iVector(const Zero &z){ *this = zero; }; iVector() =default; -#endif iVector & operator= (const Zero &hero){ zeroit(*this); @@ -184,7 +175,7 @@ public: // } }; -template class iMatrix +template class iMatrix :public GridTensorBase { public: vtype _internal[N][N]; @@ -198,16 +189,16 @@ public: enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; -#ifndef TENSOR_IS_POD + iMatrix(const Zero &z){ *this = zero; }; iMatrix() =default; -#endif + iMatrix & operator= (const Zero &hero){ zeroit(*this); return *this; } - template::notvalue, T>::type* = nullptr > inline auto operator = (T arg) -> iMatrix + template::value, T>::type* = nullptr > inline auto operator = (T arg) -> iMatrix { zeroit(*this); for(int i=0;i void vprefetch(const iScalar &vv) +{ + vprefetch(vv._internal); +} +template void vprefetch(const iVector &vv) +{ + for(int i=0;i void vprefetch(const iMatrix &vv) +{ + for(int i=0;ioSites();sss++){ int ss = sss; diff --git a/tests/Grid_gamma.cc b/tests/Grid_gamma.cc index 731b2d10..2fd1d864 100644 --- a/tests/Grid_gamma.cc +++ b/tests/Grid_gamma.cc @@ -14,9 +14,11 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({1,1,1,1}); - std::vector latt_size ({8,8,8,8}); + std::vector latt_size; + std::vector simd_layout; + std::vector mpi_layout; + + GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); GridCartesian Grid(latt_size,simd_layout,mpi_layout); diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index 00b63e70..179694c6 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -25,15 +25,12 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector latt_size(4); + std::vector latt_size; + std::vector simd_layout; + std::vector mpi_layout; - std::vector simd_layout(4); - - std::vector mpi_layout(4); - mpi_layout[0]=1; - mpi_layout[1]=1; - mpi_layout[2]=1; - mpi_layout[3]=1; + GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); + latt_size.resize(4); #ifdef AVX512 for(int omp=128;omp<236;omp+=16){ @@ -52,25 +49,6 @@ int main (int argc, char ** argv) latt_size[3] = lat; double volume = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; -#ifdef AVX512 - simd_layout[0] = 1; - simd_layout[1] = 2; - simd_layout[2] = 2; - simd_layout[3] = 2; -#endif -#if defined (AVX1)|| defined (AVX2) - simd_layout[0] = 1; - simd_layout[1] = 1; - simd_layout[2] = 2; - simd_layout[3] = 2; -#endif -#if defined (SSE4) - simd_layout[0] = 1; - simd_layout[1] = 1; - simd_layout[2] = 1; - simd_layout[3] = 2; -#endif - GridCartesian Fine(latt_size,simd_layout,mpi_layout); GridRedBlackCartesian rbFine(latt_size,simd_layout,mpi_layout); GridParallelRNG FineRNG(&Fine); diff --git a/tests/Grid_nersc_io.cc b/tests/Grid_nersc_io.cc index 95f9db88..71cedd42 100644 --- a/tests/Grid_nersc_io.cc +++ b/tests/Grid_nersc_io.cc @@ -10,8 +10,12 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({1,1,1,1}); + std::vector tmp_latt_size; + std::vector simd_layout; + std::vector mpi_layout; + + GridParseLayout(argv,argc,mpi_layout,simd_layout,tmp_latt_size); + std::vector latt_size ({16,16,16,32}); std::vector clatt_size ({4,4,4,8}); int orthodir=3; diff --git a/tests/Grid_simd.cc b/tests/Grid_simd.cc index 1de2ad1f..fe90af2e 100644 --- a/tests/Grid_simd.cc +++ b/tests/Grid_simd.cc @@ -106,9 +106,11 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({1,1,1,1}); - std::vector latt_size ({8,8,8,8}); + std::vector latt_size; + std::vector simd_layout; + std::vector mpi_layout; + + GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); GridCartesian Grid(latt_size,simd_layout,mpi_layout); std::vector seeds({1,2,3,4}); diff --git a/tests/Grid_stencil.cc b/tests/Grid_stencil.cc index 64a4ee9d..16acf294 100644 --- a/tests/Grid_stencil.cc +++ b/tests/Grid_stencil.cc @@ -8,9 +8,11 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({2,2,1,2}); - std::vector latt_size ({8,8,8,8}); + std::vector latt_size; + std::vector simd_layout; + std::vector mpi_layout; + + GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); double volume = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; From 4eb08ac9de57cb72faea4c0bb42584d43514f07e Mon Sep 17 00:00:00 2001 From: paboyle Date: Mon, 11 May 2015 12:56:27 +0100 Subject: [PATCH 142/429] CML parse --- tests/Grid_cshift.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/Grid_cshift.cc b/tests/Grid_cshift.cc index fcee7b70..619808d6 100644 --- a/tests/Grid_cshift.cc +++ b/tests/Grid_cshift.cc @@ -8,9 +8,10 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector simd_layout({1,1,2,2}); - std::vector mpi_layout ({1,1,1,1}); - std::vector latt_size ({8,8,8,16}); + std::vector simd_layout; + std::vector mpi_layout; + std::vector latt_size; + GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); GridCartesian Fine(latt_size,simd_layout,mpi_layout); GridParallelRNG FineRNG(&Fine); From b613ed0bb817a9600063b87ad8607862abec3134 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 11 May 2015 14:36:48 +0100 Subject: [PATCH 143/429] Got command line args working --- Makefile.in | 393 ++- aclocal.m4 | 705 ++-- benchmarks/Grid_comms.cc | 2 +- benchmarks/Grid_memory_bandwidth.cc | 2 +- benchmarks/Grid_wilson.cc | 2 +- configure | 5011 +++++++++++---------------- lib/Grid.h | 6 +- lib/Grid_config.h | 23 +- lib/Grid_config.h.in | 3 + lib/Grid_init.cc | 61 +- lib/math/Grid_math_tensors.h | 6 +- tests/Grid_cshift.cc | 10 +- tests/Grid_gamma.cc | 2 +- tests/Grid_main.cc | 2 +- tests/Grid_nersc_io.cc | 2 +- tests/Grid_simd.cc | 2 +- tests/Grid_stencil.cc | 2 +- 17 files changed, 2827 insertions(+), 3407 deletions(-) diff --git a/Makefile.in b/Makefile.in index f9e18fe4..c9257ab2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,6 +14,61 @@ @SET_MAKE@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -32,43 +86,86 @@ NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . -DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ - ChangeLog INSTALL NEWS TODO compile depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/lib/Grid_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ - distdir dist dist-all distcheck +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags +CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING ChangeLog \ + INSTALL NEWS README TODO compile depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ - { test ! -d "$(distdir)" \ - || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr "$(distdir)"; }; } + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ @@ -96,10 +193,14 @@ am__relativize = \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best +DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -139,6 +240,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -196,7 +298,7 @@ SUBDIRS = lib tests benchmarks all: all-recursive .SUFFIXES: -am--refresh: +am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ @@ -211,7 +313,6 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -232,22 +333,25 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ @@ -262,57 +366,12 @@ $(RECURSIVE_TARGETS): $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -328,12 +387,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -345,15 +399,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -362,9 +412,31 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) @@ -400,13 +472,10 @@ distdir: $(DISTFILES) done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ @@ -435,36 +504,42 @@ distdir: $(DISTFILES) || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) + $(am__post_remove_distdir) dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) -dist-lzma: distdir - tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma - $(am__remove_distdir) +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) dist-xz: distdir - tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz - $(am__remove_distdir) + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) + $(am__post_remove_distdir) dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) + $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) + $(am__post_remove_distdir) -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another @@ -475,8 +550,8 @@ distcheck: dist GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lzma*) \ - lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ @@ -486,17 +561,19 @@ distcheck: dist *.zip*) \ unzip $(distdir).zip ;;\ esac - chmod -R a-w $(distdir); chmod u+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -519,13 +596,21 @@ distcheck: dist && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 - $(am__remove_distdir) + $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: - @$(am__cd) '$(distuninstallcheck_dir)' \ - && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ @@ -556,10 +641,15 @@ install-am: all-am installcheck: installcheck-recursive install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: clean-generic: @@ -640,23 +730,24 @@ ps-am: uninstall-am: -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ - install-am install-strip tags-recursive +.MAKE: $(am__recursive_targets) install-am install-strip -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-am clean clean-generic \ - ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ - dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \ - distclean distclean-generic distclean-tags distcleancheck \ - distdir distuninstallcheck dvi dvi-am html html-am info \ - info-am install install-am install-data install-data-am \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-html install-html-am install-info install-info-am \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ + distcheck distclean distclean-generic distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ - pdf-am ps ps-am tags tags-recursive uninstall uninstall-am + pdf-am ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/aclocal.m4 b/aclocal.m4 index bcc213b4..f3018f6c 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.11.1 -*- Autoconf -*- +# generated automatically by aclocal 1.15 -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -11,15 +11,16 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],, -[m4_warning([this file was generated for autoconf 2.63. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically `autoreconf'.])]) +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -31,10 +32,10 @@ To do so, use the procedure documented by the package, typically `autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.11' +[am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.11.1], [], +m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -50,22 +51,22 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.11.1])dnl +[AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and @@ -84,7 +85,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you +# harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, @@ -102,30 +103,26 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 9 - # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl @@ -144,16 +141,14 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 10 -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing @@ -163,7 +158,7 @@ fi])]) # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was @@ -176,12 +171,13 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], UPC, [depcc="$UPC" am_compiler_list=], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], @@ -189,8 +185,9 @@ AC_CACHE_CHECK([dependency style of $depcc], # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -229,16 +226,16 @@ AC_CACHE_CHECK([dependency style of $depcc], : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -247,16 +244,16 @@ AC_CACHE_CHECK([dependency style of $depcc], test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -304,7 +301,7 @@ AM_CONDITIONAL([am__fastdep$1], [ # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl @@ -314,34 +311,39 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' + am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -#serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -354,7 +356,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but + # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -366,21 +368,19 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. + # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue + test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` @@ -398,7 +398,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will +# is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], @@ -408,18 +408,21 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 16 - # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- @@ -432,7 +435,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.62])dnl +[AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -461,33 +464,42 @@ AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -496,34 +508,82 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The `parallel-tests' driver may need to know about EXEEXT, so add the -dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) -dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. @@ -545,7 +605,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -556,7 +616,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -564,16 +624,14 @@ if test x"${install_sh}" != xset; then install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi -AC_SUBST(install_sh)]) +AC_SUBST([install_sh])]) -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], @@ -589,14 +647,12 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 - # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. @@ -614,7 +670,7 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. +# Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -641,15 +697,12 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 6 - # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], @@ -657,11 +710,10 @@ AC_DEFUN([AM_MISSING_PROG], $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) - # AM_MISSING_HAS_RUN # ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl @@ -674,63 +726,35 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) + AC_MSG_WARN(['missing' script is too old or missing]) fi ]) -# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_MKDIR_P -# --------------- -# Check for `mkdir -p'. -AC_DEFUN([AM_PROG_MKDIR_P], -[AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) - # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 - # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) -# ------------------------------ +# -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) -# ---------------------------------- +# ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) @@ -741,24 +765,82 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -769,32 +851,40 @@ case `pwd` in esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac -# Do `set' in a subshell so we don't clobber the current shell's +# Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done test "$[2]" = conftest.file ) then @@ -804,9 +894,85 @@ else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi -AC_MSG_RESULT(yes)]) +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -814,34 +980,32 @@ AC_MSG_RESULT(yes)]) # AM_PROG_INSTALL_STRIP # --------------------- -# One issue with vendor `install' (even GNU) is that you can't +# One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize +# always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. @@ -849,24 +1013,22 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])]) AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- +# -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 2 - # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory @@ -876,75 +1038,114 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar +# AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. -AM_MISSING_PROG([AMTAR], [tar]) -m4_if([$1], [v7], - [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], - # tar/untar a dummy directory, and stop if the command works + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR diff --git a/benchmarks/Grid_comms.cc b/benchmarks/Grid_comms.cc index b1e3848a..5317e127 100644 --- a/benchmarks/Grid_comms.cc +++ b/benchmarks/Grid_comms.cc @@ -12,7 +12,7 @@ int main (int argc, char ** argv) std::vector simd_layout; std::vector mpi_layout; - GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); + GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); int Nloop=10; int nmu=0; diff --git a/benchmarks/Grid_memory_bandwidth.cc b/benchmarks/Grid_memory_bandwidth.cc index eaffe83e..dd6d1816 100644 --- a/benchmarks/Grid_memory_bandwidth.cc +++ b/benchmarks/Grid_memory_bandwidth.cc @@ -12,7 +12,7 @@ int main (int argc, char ** argv) std::vector simd_layout; std::vector mpi_layout; - GridParseLayout(argv,argc,mpi_layout,simd_layout,tmp_latt_size); + GridParseLayout(argv,argc,tmp_latt_size,simd_layout,mpi_layout); const int Nvec=8; typedef Lattice< iVector< vReal,Nvec> > LatticeVec; diff --git a/benchmarks/Grid_wilson.cc b/benchmarks/Grid_wilson.cc index d0b96d1c..ea3f597a 100644 --- a/benchmarks/Grid_wilson.cc +++ b/benchmarks/Grid_wilson.cc @@ -24,7 +24,7 @@ int main (int argc, char ** argv) std::vector simd_layout; std::vector mpi_layout; - GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); + GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); GridCartesian Grid(latt_size,simd_layout,mpi_layout); std::vector seeds({1,2,3,4}); diff --git a/configure b/configure index 3e71855d..3d25f6a9 100755 --- a/configure +++ b/configure @@ -1,20 +1,22 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.63 for Grid 1.0. +# Generated by GNU Autoconf 2.69 for Grid 1.0. # # Report bugs to . # -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -22,23 +24,15 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; esac - fi - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - as_nl=' ' export as_nl @@ -46,7 +40,13 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -57,7 +57,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in + case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -80,13 +80,6 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -96,15 +89,16 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -case $0 in +as_myself= +case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done IFS=$as_save_IFS ;; @@ -116,12 +110,16 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } + exit 1 fi -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' @@ -133,7 +131,294 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# Required to use basename. +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: paboyle@ph.ed.ac.uk about your system, including any +$0: error possibly output before this message. Then install +$0: a modern shell, or manually run the script under such a +$0: shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -147,8 +432,12 @@ else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -168,295 +457,19 @@ $as_echo X/"$0" | } s/.*/./; q'` -# CDPATH. -$as_unset CDPATH +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits -if test "x$CONFIG_SHELL" = x; then - if (eval ":") 2>/dev/null; then - as_have_required=yes -else - as_have_required=no -fi - - if test $as_have_required = yes && (eval ": -(as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=\$LINENO - as_lineno_2=\$LINENO - test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && - test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } -") 2> /dev/null; then - : -else - as_candidate_shells= - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - case $as_dir in - /*) - for as_base in sh bash ksh sh5; do - as_candidate_shells="$as_candidate_shells $as_dir/$as_base" - done;; - esac -done -IFS=$as_save_IFS - - - for as_shell in $as_candidate_shells $SHELL; do - # Try only shells that exist, to save several forks. - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { ("$as_shell") 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -_ASEOF -}; then - CONFIG_SHELL=$as_shell - as_have_required=yes - if { "$as_shell" 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -(as_func_return () { - (exit $1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = "$1" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test $exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } - -_ASEOF -}; then - break -fi - -fi - - done - - if test "x$CONFIG_SHELL" != x; then - for as_var in BASH_ENV ENV - do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - done - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi - - - if test $as_have_required = no; then - echo This script requires a shell more modern than all the - echo shells that I found on your system. Please install a - echo modern shell, or manually run the script under such a - echo shell if you do have one. - { (exit 1); exit 1; } -fi - - -fi - -fi - - - -(eval "as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0") || { - echo No shell found that supports shell functions. - echo Please tell bug-autoconf@gnu.org about your system, - echo including any error possibly output before this message. - echo This can help us improve future autoconf versions. - echo Configuration will now proceed without shell functions. -} - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= @@ -473,9 +486,12 @@ test \$exitcode = 0") || { s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). @@ -484,29 +500,18 @@ test \$exitcode = 0") || { exit } - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in +case `echo -n x` in #((((( -n*) - case `echo 'x\c'` in + case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -521,49 +526,29 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -572,11 +557,11 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -exec 7<&0 &1 +test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` @@ -591,7 +576,6 @@ cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='Grid' @@ -599,6 +583,7 @@ PACKAGE_TARNAME='grid' PACKAGE_VERSION='1.0' PACKAGE_STRING='Grid 1.0' PACKAGE_BUGREPORT='paboyle@ph.ed.ac.uk' +PACKAGE_URL='' ac_unique_file="lib/Grid.h" # Factoring default headers for most tests. @@ -659,6 +644,7 @@ CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE +am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE @@ -672,6 +658,10 @@ CPPFLAGS LDFLAGS CXXFLAGS CXX +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V am__untar am__tar AMTAR @@ -725,6 +715,7 @@ bindir program_transform_name prefix exec_prefix +PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION @@ -735,6 +726,7 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking +enable_silent_rules enable_dependency_tracking enable_openmp enable_simd @@ -814,8 +806,9 @@ do fi case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. @@ -860,8 +853,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -887,8 +879,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1092,8 +1083,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1109,8 +1099,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1140,17 +1129,17 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) { $as_echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1159,7 +1148,7 @@ Try \`$0 --help' for more information." >&2 $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac @@ -1167,15 +1156,13 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { $as_echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; - fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 - { (exit 1); exit 1; }; } ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1198,8 +1185,7 @@ do [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' @@ -1213,8 +1199,6 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1229,11 +1213,9 @@ test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - { $as_echo "$as_me: error: working directory cannot be determined" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. @@ -1272,13 +1254,11 @@ else fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 - { (exit 1); exit 1; }; } + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then @@ -1318,7 +1298,7 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages + -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files @@ -1378,8 +1358,12 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build --disable-openmp do not use OpenMP --enable-simd=SSE|AVX|AVX2|AVX512|MIC Select instructions to be SSE4.0, AVX 1.0, AVX @@ -1392,7 +1376,7 @@ Some influential environment variables: LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags @@ -1465,21 +1449,568 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Grid configure 1.0 -generated by GNU Autoconf 2.63 +generated by GNU Autoconf 2.69 -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------------- ## +## Report this to paboyle@ph.ed.ac.uk ## +## ---------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_find_uintX_t LINENO BITS VAR +# ------------------------------------ +# Finds an unsigned integer type with width BITS, setting cache variable VAR +# accordingly. +ac_fn_c_find_uintX_t () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 +$as_echo_n "checking for uint$2_t... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + # Order is important - never check a type that is potentially smaller + # than half of the expected target width. + for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + case $ac_type in #( + uint$2_t) : + eval "$3=yes" ;; #( + *) : + eval "$3=\$ac_type" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no"; then : + +else + break +fi + done +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_find_uintX_t + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Grid $as_me 1.0, which was -generated by GNU Autoconf 2.63. Invocation command line was +generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -1515,8 +2046,8 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" -done + $as_echo "PATH: $as_dir" + done IFS=$as_save_IFS } >&5 @@ -1553,9 +2084,9 @@ do ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" + as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else @@ -1571,13 +2102,13 @@ do -* ) ac_must_keep_next=true ;; esac fi - ac_configure_args="$ac_configure_args '$ac_arg'" + as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there @@ -1589,11 +2120,9 @@ trap 'exit_status=$? { echo - cat <<\_ASBOX -## ---------------- ## + $as_echo "## ---------------- ## ## Cache variables. ## -## ---------------- ## -_ASBOX +## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( @@ -1602,13 +2131,13 @@ _ASBOX case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; + *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done @@ -1627,11 +2156,9 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - cat <<\_ASBOX -## ----------------- ## + $as_echo "## ----------------- ## ## Output variables. ## -## ----------------- ## -_ASBOX +## ----------------- ##" echo for ac_var in $ac_subst_vars do @@ -1644,11 +2171,9 @@ _ASBOX echo if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## + $as_echo "## ------------------- ## ## File substitutions. ## -## ------------------- ## -_ASBOX +## ------------------- ##" echo for ac_var in $ac_subst_files do @@ -1662,11 +2187,9 @@ _ASBOX fi if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## + $as_echo "## ----------- ## ## confdefs.h. ## -## ----------- ## -_ASBOX +## ----------- ##" echo cat confdefs.h echo @@ -1680,46 +2203,53 @@ _ASBOX exit $exit_status ' 0 for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h +$as_echo "/* confdefs.h */" > confdefs.h + # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - ac_site_file1=$CONFIG_SITE + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site @@ -1730,19 +2260,23 @@ fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue - if test -r "$ac_site_file"; then - { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; @@ -1750,7 +2284,7 @@ $as_echo "$as_me: loading cache $cache_file" >&6;} esac fi else - { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi @@ -1765,11 +2299,11 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; @@ -1779,17 +2313,17 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac @@ -1801,43 +2335,20 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then - { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi - - - - - - - - - - - - - - - - - - - - - - - - +## -------------------- ## +## Main body of script. ## +## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -1846,7 +2357,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -am__api_version='1.11' +am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -1865,9 +2376,7 @@ for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do fi done if test -z "$ac_aux_dir"; then - { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 -$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, @@ -1893,10 +2402,10 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then +if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -1904,11 +2413,11 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -1916,7 +2425,7 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -1945,7 +2454,7 @@ case $as_dir/ in ;; esac -done + done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir @@ -1961,7 +2470,7 @@ fi INSTALL=$ac_install_sh fi fi -{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. @@ -1972,68 +2481,73 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) - { { $as_echo "$as_me:$LINENO: error: unsafe absolute working directory name" >&5 -$as_echo "$as_me: error: unsafe absolute working directory name" >&2;} - { (exit 1); exit 1; }; };; + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - { { $as_echo "$as_me:$LINENO: error: unsafe srcdir value: \`$srcdir'" >&5 -$as_echo "$as_me: error: unsafe srcdir value: \`$srcdir'" >&2;} - { (exit 1); exit 1; }; };; + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac -# Do `set' in a subshell so we don't clobber the current shell's +# Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&5 -$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&2;} - { (exit 1); exit 1; }; } - fi + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done test "$2" = conftest.file ) then # Ok. : else - { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! -Check your system clock" >&5 -$as_echo "$as_me: error: newly created file is older than distributed files! -Check your system clock" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 fi -{ $as_echo "$as_me:$LINENO: result: yes" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. @@ -2044,8 +2558,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2056,15 +2570,15 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2073,17 +2587,17 @@ if test x"${install_sh}" != xset; then esac fi -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. +# will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then +if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then @@ -2094,24 +2608,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2121,9 +2635,9 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then @@ -2134,24 +2648,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2160,7 +2674,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -2173,10 +2687,10 @@ fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then - if test "${ac_cv_path_mkdir+set}" = set; then + if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -2184,9 +2698,9 @@ for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do + for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ @@ -2196,11 +2710,12 @@ do esac done done -done + done IFS=$as_save_IFS fi + test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else @@ -2208,26 +2723,19 @@ fi # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. - test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi -{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AWK+set}" = set; then +if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then @@ -2238,24 +2746,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { $as_echo "$as_me:$LINENO: result: $AWK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2263,11 +2771,11 @@ fi test -n "$AWK" && break done -{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF @@ -2275,7 +2783,7 @@ SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; @@ -2285,11 +2793,11 @@ esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -2303,15 +2811,52 @@ else fi rmdir .tst 2>/dev/null +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then - { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi @@ -2355,19 +2900,72 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' -AMTAR=${AMTAR-"${am_missing_run}tar"} +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' -am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + ac_config_headers="$ac_config_headers lib/Grid_config.h" @@ -2387,9 +2985,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CXX+set}" = set; then +if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then @@ -2400,24 +2998,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then - { $as_echo "$as_me:$LINENO: result: $CXX" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2431,9 +3029,9 @@ if test -z "$CXX"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then +if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then @@ -2444,24 +3042,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -2474,7 +3072,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -2485,48 +3083,31 @@ fi fi fi # Provide some information about the compiler. -$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 -{ (ac_try="$ac_compiler --version >&5" +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler --version >&5") 2>&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2542,8 +3123,8 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5 -$as_echo_n "checking for C++ compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 +$as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: @@ -2559,17 +3140,17 @@ do done rm -f $ac_rmfiles -if { (ac_try="$ac_link_default" +if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -2586,7 +3167,7 @@ do # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -2605,84 +3186,41 @@ test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi - -{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -if test -z "$ac_file"; then - $as_echo "$as_me: failed program was:" >&5 +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C++ compiler cannot create executables -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C++ compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; }; } -fi - -ac_exeext=$ac_cv_exeext - -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5 -$as_echo_n "checking whether the C++ compiler works... " >&6; } -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } - fi - fi -fi -{ $as_echo "$as_me:$LINENO: result: yes" >&5 +as_fn_error 77 "C++ compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 +$as_echo_n "checking for C++ compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } -if { (ac_try="$ac_link" +if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -2697,32 +3235,83 @@ for ac_file in conftest.exe conftest conftest.*; do esac done else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } fi - -rm -f conftest$ac_cv_exeext -{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then +if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2734,17 +3323,17 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { (ac_try="$ac_compile" +if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -2757,31 +3346,23 @@ else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } fi - rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if test "${ac_cv_cxx_compiler_gnu+set}" = set; then +if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2795,37 +3376,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no + ac_compiler_gnu=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes @@ -2834,20 +3394,16 @@ else fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } -if test "${ac_cv_prog_cxx_g+set}" = set; then +if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2858,35 +3414,11 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CXXFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2897,36 +3429,12 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cxx_werror_flag=$ac_save_cxx_werror_flag +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2937,42 +3445,17 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS @@ -3006,14 +3489,14 @@ am__doit: .PHONY: am__doit END # If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. +# Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -3034,18 +3517,19 @@ if test "$am__include" = "#"; then fi -{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then +if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' + am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= @@ -3059,17 +3543,18 @@ fi depcc="$CXX" am_compiler_list= -{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -3103,16 +3588,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -3121,16 +3606,16 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -3169,7 +3654,7 @@ else fi fi -{ $as_echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type @@ -3192,9 +3677,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3205,24 +3690,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3232,9 +3717,9 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then +if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3245,24 +3730,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3271,7 +3756,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3285,9 +3770,9 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3298,24 +3783,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3325,9 +3810,9 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3339,18 +3824,18 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then @@ -3369,10 +3854,10 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3384,9 +3869,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3397,24 +3882,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3428,9 +3913,9 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then +if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3441,24 +3926,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -3471,7 +3956,7 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -3482,62 +3967,42 @@ fi fi -test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. -$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -{ (ac_try="$ac_compiler --version >&5" +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler --version >&5") 2>&5 +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done -{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then +if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3551,37 +4016,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no + ac_compiler_gnu=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes @@ -3590,20 +4034,16 @@ else fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then +if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3614,35 +4054,11 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3653,36 +4069,12 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_compile "$LINENO"; then : - ac_c_werror_flag=$ac_save_c_werror_flag +else + ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3693,42 +4085,17 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS @@ -3745,23 +4112,18 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then +if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include -#include -#include +struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); @@ -3813,32 +4175,9 @@ for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then + if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done @@ -3849,17 +4188,19 @@ fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) - { $as_echo "$as_me:$LINENO: result: none needed" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) - { $as_echo "$as_me:$LINENO: result: unsupported" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac +if test "x$ac_cv_prog_cc_c89" != xno; then : +fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -3867,19 +4208,79 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + depcc="$CC" am_compiler_list= -{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then +if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. @@ -3913,16 +4314,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with `-c' and `-o' for the sake of the "dashmstdout" + # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -3931,16 +4332,16 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -3979,7 +4380,7 @@ else fi fi -{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type @@ -3998,17 +4399,18 @@ fi OPENMP_CFLAGS= # Check whether --enable-openmp was given. -if test "${enable_openmp+set}" = set; then +if test "${enable_openmp+set}" = set; then : enableval=$enable_openmp; fi if test "$enable_openmp" != no; then - { $as_echo "$as_me:$LINENO: checking for $CC option to support OpenMP" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5 $as_echo_n "checking for $CC option to support OpenMP... " >&6; } -if test "${ac_cv_prog_c_openmp+set}" = set; then +if ${ac_cv_prog_c_openmp+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ #ifndef _OPENMP choke me @@ -4017,37 +4419,16 @@ else int main () { return omp_get_num_threads (); } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_c_openmp='none needed' else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_prog_c_openmp='unsupported' - for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp; do + ac_cv_prog_c_openmp='unsupported' + for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ + -Popenmp --openmp; do ac_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $ac_option" - cat >conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ #ifndef _OPENMP choke me @@ -4056,56 +4437,27 @@ sed 's/^/| /' conftest.$ac_ext >&5 int main () { return omp_get_num_threads (); } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_c_openmp=$ac_option -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext CFLAGS=$ac_save_CFLAGS if test "$ac_cv_prog_c_openmp" != unsupported; then break fi done fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_c_openmp" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5 $as_echo "$ac_cv_prog_c_openmp" >&6; } case $ac_cv_prog_c_openmp in #( "none needed" | unsupported) - ;; #( + ;; #( *) - OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; + OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; esac fi @@ -4113,9 +4465,9 @@ $as_echo "$ac_cv_prog_c_openmp" >&6; } if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then +if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then @@ -4126,24 +4478,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -4153,9 +4505,9 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then @@ -4166,24 +4518,24 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:$LINENO: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi @@ -4192,7 +4544,7 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac @@ -4212,14 +4564,14 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then + if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded @@ -4234,11 +4586,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4247,78 +4595,34 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi - -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break fi - -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : break fi @@ -4330,7 +4634,7 @@ fi else ac_cv_prog_CPP=$CPP fi -{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes @@ -4341,11 +4645,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4354,87 +4654,40 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi - -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break fi - -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c @@ -4444,9 +4697,9 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then +if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then @@ -4457,10 +4710,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do + for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in @@ -4477,7 +4730,7 @@ case `"$ac_path_GREP" --version 2>&1` in $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" @@ -4492,26 +4745,24 @@ esac $ac_path_GREP_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" -{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then +if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 @@ -4525,10 +4776,10 @@ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do + for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in @@ -4545,7 +4796,7 @@ case `"$ac_path_EGREP" --version 2>&1` in $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` + as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" @@ -4560,12 +4811,10 @@ esac $ac_path_EGREP_found && break 3 done done -done + done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP @@ -4573,21 +4822,17 @@ fi fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" -{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then +if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -4602,48 +4847,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdc=no + ac_cv_header_stdc=no fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -4653,18 +4873,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -4674,14 +4890,10 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -4708,118 +4920,33 @@ main () return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : +if ac_fn_c_try_run "$LINENO"; then : + else - $as_echo "$as_me: program exited with status $ac_status" >&5 -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -rf conftest.dSYM -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi - fi fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF +$as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -4829,604 +4956,48 @@ fi done - for ac_header in stdint.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_STDINT_H 1 _ACEOF fi done - for ac_header in malloc/malloc.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_malloc_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_MALLOC_MALLOC_H 1 _ACEOF fi done - for ac_header in malloc.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_MALLOC_H 1 _ACEOF fi done - for ac_header in endian.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( cat <<\_ASBOX -## ---------------------------------- ## -## Report this to paboyle@ph.ed.ac.uk ## -## ---------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "endian.h" "ac_cv_header_endian_h" "$ac_includes_default" +if test "x$ac_cv_header_endian_h" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_ENDIAN_H 1 _ACEOF fi @@ -5434,244 +5005,35 @@ fi done #AC_CHECK_HEADERS(machine/endian.h) -{ $as_echo "$as_me:$LINENO: checking whether ntohll is declared" >&5 -$as_echo_n "checking whether ntohll is declared... " >&6; } -if test "${ac_cv_have_decl_ntohll+set}" = set; then - $as_echo_n "(cached) " >&6 +ac_fn_c_check_decl "$LINENO" "ntohll" "ac_cv_have_decl_ntohll" "#include +" +if test "x$ac_cv_have_decl_ntohll" = xyes; then : + ac_have_decl=1 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -int -main () -{ -#ifndef ntohll - (void) ntohll; -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_have_decl_ntohll=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_have_decl_ntohll=no + ac_have_decl=0 fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_ntohll" >&5 -$as_echo "$ac_cv_have_decl_ntohll" >&6; } -if test "x$ac_cv_have_decl_ntohll" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_NTOHLL 1 +#define HAVE_DECL_NTOHLL $ac_have_decl _ACEOF - +ac_fn_c_check_decl "$LINENO" "be64toh" "ac_cv_have_decl_be64toh" "#include +" +if test "x$ac_cv_have_decl_be64toh" = xyes; then : + ac_have_decl=1 else - cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_NTOHLL 0 -_ACEOF - - + ac_have_decl=0 fi - -{ $as_echo "$as_me:$LINENO: checking whether be64toh is declared" >&5 -$as_echo_n "checking whether be64toh is declared... " >&6; } -if test "${ac_cv_have_decl_be64toh+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -int -main () -{ -#ifndef be64toh - (void) be64toh; -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_have_decl_be64toh=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_have_decl_be64toh=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_be64toh" >&5 -$as_echo "$ac_cv_have_decl_be64toh" >&6; } -if test "x$ac_cv_have_decl_be64toh" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_BE64TOH 1 +#define HAVE_DECL_BE64TOH $ac_have_decl _ACEOF -else - cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_BE64TOH 0 -_ACEOF - - -fi - - - # Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 -$as_echo_n "checking for size_t... " >&6; } -if test "${ac_cv_type_size_t+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_type_size_t=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if (sizeof (size_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if (sizeof ((size_t))) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : - ac_cv_type_size_t=yes -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 -$as_echo "$ac_cv_type_size_t" >&6; } -if test "x$ac_cv_type_size_t" = x""yes; then - : else cat >>confdefs.h <<_ACEOF @@ -5680,75 +5042,12 @@ _ACEOF fi - - { $as_echo "$as_me:$LINENO: checking for uint32_t" >&5 -$as_echo_n "checking for uint32_t... " >&6; } -if test "${ac_cv_c_uint32_t+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_c_uint32_t=no - for ac_type in 'uint32_t' 'unsigned int' 'unsigned long int' \ - 'unsigned long long int' 'unsigned short int' 'unsigned char'; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(($ac_type) -1 >> (32 - 1) == 1)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - case $ac_type in - uint32_t) ac_cv_c_uint32_t=yes ;; - *) ac_cv_c_uint32_t=$ac_type ;; -esac - -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_uint32_t" != no && break - done -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_uint32_t" >&5 -$as_echo "$ac_cv_c_uint32_t" >&6; } - case $ac_cv_c_uint32_t in #( +ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" +case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) -cat >>confdefs.h <<\_ACEOF -#define _UINT32_T 1 -_ACEOF +$as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF @@ -5757,75 +5056,12 @@ _ACEOF ;; esac - - { $as_echo "$as_me:$LINENO: checking for uint64_t" >&5 -$as_echo_n "checking for uint64_t... " >&6; } -if test "${ac_cv_c_uint64_t+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_c_uint64_t=no - for ac_type in 'uint64_t' 'unsigned int' 'unsigned long int' \ - 'unsigned long long int' 'unsigned short int' 'unsigned char'; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(($ac_type) -1 >> (64 - 1) == 1)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - case $ac_type in - uint64_t) ac_cv_c_uint64_t=yes ;; - *) ac_cv_c_uint64_t=$ac_type ;; -esac - -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_uint64_t" != no && break - done -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_uint64_t" >&5 -$as_echo "$ac_cv_c_uint64_t" >&6; } - case $ac_cv_c_uint64_t in #( +ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" +case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) -cat >>confdefs.h <<\_ACEOF -#define _UINT64_T 1 -_ACEOF +$as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF @@ -5836,102 +5072,12 @@ _ACEOF # Checks for library functions. - for ac_func in gettimeofday -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then +do : + ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_GETTIMEOFDAY 1 _ACEOF fi @@ -5939,7 +5085,7 @@ done # Check whether --enable-simd was given. -if test "${enable_simd+set}" = set; then +if test "${enable_simd+set}" = set; then : enableval=$enable_simd; \ ac_SIMD=${enable_simd} else @@ -5951,45 +5097,35 @@ case ${ac_SIMD} in SSE4) echo Configuring for SSE4 -cat >>confdefs.h <<\_ACEOF -#define SSE4 1 -_ACEOF +$as_echo "#define SSE4 1" >>confdefs.h ;; AVX) echo Configuring for AVX -cat >>confdefs.h <<\_ACEOF -#define AVX1 1 -_ACEOF +$as_echo "#define AVX1 1" >>confdefs.h ;; AVX2) echo Configuring for AVX2 -cat >>confdefs.h <<\_ACEOF -#define AVX2 1 -_ACEOF +$as_echo "#define AVX2 1" >>confdefs.h ;; AVX512|MIC) echo Configuring for AVX512 and MIC -cat >>confdefs.h <<\_ACEOF -#define AVX512 1 -_ACEOF +$as_echo "#define AVX512 1" >>confdefs.h ;; *) - { { $as_echo "$as_me:$LINENO: error: ${ac_SIMD} unsupported --enable-simd option" >&5 -$as_echo "$as_me: error: ${ac_SIMD} unsupported --enable-simd option" >&2;} - { (exit 1); exit 1; }; }; + as_fn_error $? "${ac_SIMD} unsupported --enable-simd option" "$LINENO" 5; ;; esac # Check whether --enable-comms was given. -if test "${enable_comms+set}" = set; then +if test "${enable_comms+set}" = set; then : enableval=$enable_comms; ac_COMMS=${enable_comms} else ac_COMMS=none @@ -6000,23 +5136,17 @@ case ${ac_COMMS} in none) echo Configuring for NO communications -cat >>confdefs.h <<\_ACEOF -#define GRID_COMMS_NONE 1 -_ACEOF +$as_echo "#define GRID_COMMS_NONE 1" >>confdefs.h ;; mpi) echo Configuring for MPI communications -cat >>confdefs.h <<\_ACEOF -#define GRID_COMMS_MPI 1 -_ACEOF +$as_echo "#define GRID_COMMS_MPI 1" >>confdefs.h ;; *) - { { $as_echo "$as_me:$LINENO: error: ${ac_COMMS} unsupported --enable-comms option" >&5 -$as_echo "$as_me: error: ${ac_COMMS} unsupported --enable-comms option" >&2;} - { (exit 1); exit 1; }; }; + as_fn_error $? "${ac_COMMS} unsupported --enable-comms option" "$LINENO" 5; ;; esac @@ -6073,13 +5203,13 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; + *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done @@ -6087,8 +5217,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" @@ -6110,12 +5240,23 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && - { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi else - { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi @@ -6129,20 +5270,29 @@ DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= +U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. - ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' @@ -6152,48 +5302,34 @@ else fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_COMMS_MPI_TRUE}" && test -z "${BUILD_COMMS_MPI_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_COMMS_MPI\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"BUILD_COMMS_MPI\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"BUILD_COMMS_MPI\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_COMMS_NONE_TRUE}" && test -z "${BUILD_COMMS_NONE_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_COMMS_NONE\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"BUILD_COMMS_NONE\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "conditional \"BUILD_COMMS_NONE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -: ${CONFIG_STATUS=./config.status} +: "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -6203,17 +5339,18 @@ cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 debug=false ac_cs_recheck=false ac_cs_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which @@ -6221,23 +5358,15 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; esac - fi - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - as_nl=' ' export as_nl @@ -6245,7 +5374,13 @@ export as_nl as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else @@ -6256,7 +5391,7 @@ else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; - case $arg in + case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; @@ -6279,13 +5414,6 @@ if test "${PATH_SEPARATOR+set}" != set; then } fi -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - # IFS # We need space, tab and new line, in precisely that order. Quoting is @@ -6295,15 +5423,16 @@ fi IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -case $0 in +as_myself= +case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done IFS=$as_save_IFS ;; @@ -6315,12 +5444,16 @@ if test "x$as_myself" = x; then fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } + exit 1 fi -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' @@ -6332,7 +5465,89 @@ export LC_ALL LANGUAGE=C export LANGUAGE -# Required to use basename. +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -6346,8 +5561,12 @@ else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ @@ -6367,76 +5586,25 @@ $as_echo X/"$0" | } s/.*/./; q'` -# CDPATH. -$as_unset CDPATH - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in +case `echo -n x` in #((((( -n*) - case `echo 'x\c'` in + case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then @@ -6451,49 +5619,85 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -6503,13 +5707,19 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 -# Save the log message, to keep $[0] and so on meaningful, and to +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Grid $as_me 1.0, which was -generated by GNU Autoconf 2.63. Invocation command line was +generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -6541,13 +5751,15 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. -Usage: $0 [OPTION]... [FILE]... +Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit + --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files @@ -6566,16 +5778,17 @@ $config_headers Configuration commands: $config_commands -Report bugs to ." +Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Grid config.status 1.0 -configured by $0, generated by GNU Autoconf 2.63, - with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" -Copyright (C) 2008 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -6593,11 +5806,16 @@ ac_need_defaults=: while test $# != 0 do case $1 in - --*=*) + --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; *) ac_option=$1 ac_optarg=$2 @@ -6611,27 +5829,29 @@ do ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; esac - CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac - CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - { $as_echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; };; + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ @@ -6639,11 +5859,10 @@ Try \`$0 --help' for more information." >&2 ac_cs_silent=: ;; # This is an error. - -*) { $as_echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } ;; + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; - *) ac_config_targets="$ac_config_targets $1" + *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac @@ -6660,7 +5879,7 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' @@ -6701,9 +5920,7 @@ do "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "benchmarks/Makefile") CONFIG_FILES="$CONFIG_FILES benchmarks/Makefile" ;; - *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done @@ -6726,26 +5943,24 @@ fi # after its creation but before its name has been assigned to `$tmp'. $debug || { - tmp= + tmp= ac_tmp= trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 + trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" + test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") -} || -{ - $as_echo "$as_me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -6753,7 +5968,13 @@ $debug || if test -n "$CONFIG_FILES"; then -ac_cr=' ' +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' @@ -6761,7 +5982,7 @@ else ac_cs_awk_cr=$ac_cr fi -echo 'BEGIN {' >"$tmp/subs1.awk" && +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF @@ -6770,24 +5991,18 @@ _ACEOF echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -6795,7 +6010,7 @@ done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h @@ -6809,7 +6024,7 @@ s/'"$ac_delim"'$// t delim :nl h -s/\(.\{148\}\).*/\1/ +s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p @@ -6823,7 +6038,7 @@ s/.\{148\}// t nl :delim h -s/\(.\{148\}\).*/\1/ +s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p @@ -6843,7 +6058,7 @@ t delim rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK -cat >>"\$tmp/subs1.awk" <<_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" @@ -6875,23 +6090,29 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 -$as_echo "$as_me: error: could not setup config files machinery" >&2;} - { (exit 1); exit 1; }; } +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// s/^[^=]*=[ ]*$// }' fi @@ -6903,7 +6124,7 @@ fi # test -n "$CONFIG_FILES" # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then -cat >"$tmp/defines.awk" <<\_ACAWK || +cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF @@ -6915,13 +6136,11 @@ _ACEOF # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do - ac_t=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_t"; then + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then break elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -7006,9 +6225,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 -$as_echo "$as_me: error: could not setup config headers machinery" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" @@ -7021,9 +6238,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 -$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} - { (exit 1); exit 1; }; };; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -7042,7 +6257,7 @@ $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} for ac_f do case $ac_f in - -) ac_f="$tmp/stdin";; + -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. @@ -7051,12 +6266,10 @@ $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} - { (exit 1); exit 1; }; };; + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - ac_file_inputs="$ac_file_inputs '$ac_f'" + as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't @@ -7067,7 +6280,7 @@ $as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. @@ -7079,10 +6292,8 @@ $as_echo "$as_me: creating $ac_file" >&6;} esac case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } ;; + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac @@ -7110,47 +6321,7 @@ $as_echo X"$ac_file" | q } s/.*/./; q'` - { as_dir="$ac_dir" - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } + as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in @@ -7207,7 +6378,6 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= - ac_sed_dataroot=' /datarootdir/ { p @@ -7217,12 +6387,11 @@ ac_sed_dataroot=' /@docdir@/p /@infodir@/p /@localedir@/p -/@mandir@/p -' +/@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 @@ -7232,7 +6401,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; + s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF @@ -7260,27 +6429,24 @@ s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} +which seems to be undefined. Please make sure it is defined" >&2;} - rm -f "$tmp/stdin" + rm -f "$ac_tmp/stdin" case $ac_file in - -) cat "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # @@ -7289,27 +6455,21 @@ $as_echo "$as_me: error: could not create $ac_file" >&2;} if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" - } >"$tmp/config.h" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } - if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" - mv "$tmp/config.h" "$ac_file" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ - || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 -$as_echo "$as_me: error: could not create -" >&2;} - { (exit 1); exit 1; }; } + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" @@ -7347,7 +6507,7 @@ $as_echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac @@ -7355,7 +6515,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -7368,7 +6528,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but + # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -7402,21 +6562,19 @@ $as_echo X"$mf" | continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. + # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue + test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || @@ -7442,47 +6600,7 @@ $as_echo X"$file" | q } s/.*/./; q'` - { as_dir=$dirpart/$fdir - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } + as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done @@ -7494,15 +6612,12 @@ $as_echo "$as_me: error: cannot create directory $as_dir" >&2;} done # for ac_tag -{ (exit 0); exit 0; } +as_fn_exit 0 _ACEOF -chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || - { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. @@ -7523,10 +6638,10 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } + $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi diff --git a/lib/Grid.h b/lib/Grid.h index 4b452051..cce56c0c 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -73,7 +73,11 @@ namespace Grid { std::string GridCmdOptionPayload(char ** begin, char ** end, const std::string & option); bool GridCmdOptionExists(char** begin, char** end, const std::string& option); void GridParseIntVector(std::string &str,std::vector & vec); - void GridParseLayout(char **argv,int argc,std::vector &mpi,std::vector &simd,std::vector &latt); + + void GridParseLayout(char **argv,int argc, + std::vector &simd, + std::vector &latt, + std::vector &mpi); }; diff --git a/lib/Grid_config.h b/lib/Grid_config.h index 8b51adce..c743bba0 100644 --- a/lib/Grid_config.h +++ b/lib/Grid_config.h @@ -2,42 +2,42 @@ /* lib/Grid_config.h.in. Generated from configure.ac by autoheader. */ /* AVX */ -/* #undef AVX1 */ +#define AVX1 1 /* AVX2 */ /* #undef AVX2 */ /* AVX512 */ -#define AVX512 1 +/* #undef AVX512 */ /* GRID_COMMS_MPI */ -/* #undef GRID_COMMS_MPI */ +#define GRID_COMMS_MPI 1 /* GRID_COMMS_NONE */ -#define GRID_COMMS_NONE 1 +/* #undef GRID_COMMS_NONE */ /* Define to 1 if you have the declaration of `be64toh', and to 0 if you don't. */ -#define HAVE_DECL_BE64TOH 1 +#define HAVE_DECL_BE64TOH 0 /* Define to 1 if you have the declaration of `ntohll', and to 0 if you don't. */ -#define HAVE_DECL_NTOHLL 0 +#define HAVE_DECL_NTOHLL 1 /* Define to 1 if you have the header file. */ -#define HAVE_ENDIAN_H 1 +/* #undef HAVE_ENDIAN_H */ /* Define to 1 if you have the `gettimeofday' function. */ -/* #undef HAVE_GETTIMEOFDAY */ +#define HAVE_GETTIMEOFDAY 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the header file. */ -#define HAVE_MALLOC_H 1 +/* #undef HAVE_MALLOC_H */ /* Define to 1 if you have the header file. */ -/* #undef HAVE_MALLOC_MALLOC_H */ +#define HAVE_MALLOC_MALLOC_H 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 @@ -78,6 +78,9 @@ /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "grid" +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + /* Define to the version of this package. */ #define PACKAGE_VERSION "1.0" diff --git a/lib/Grid_config.h.in b/lib/Grid_config.h.in index 4b094250..437a6095 100644 --- a/lib/Grid_config.h.in +++ b/lib/Grid_config.h.in @@ -77,6 +77,9 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME +/* Define to the home page for this package. */ +#undef PACKAGE_URL + /* Define to the version of this package. */ #undef PACKAGE_VERSION diff --git a/lib/Grid_init.cc b/lib/Grid_init.cc index 2382dc15..e80bbe64 100644 --- a/lib/Grid_init.cc +++ b/lib/Grid_init.cc @@ -76,54 +76,57 @@ void GridCmdOptionIntVector(std::string &str,std::vector & vec) return; } -void GridParseLayout(char **argv,int argc,std::vector &mpi,std::vector &simd,std::vector &latt) +void GridParseLayout(char **argv,int argc, + std::vector &latt, + std::vector &simd, + std::vector &mpi) { mpi =std::vector({1,1,1,1}); -#if defined(AVX) || defined (AVX2) - simd=std::vector({1,1,2,2}); -#endif + latt=std::vector({8,8,8,8}); + #if defined(SSE4) simd=std::vector({1,1,1,2}); #endif +#if defined(AVX1) || defined (AVX2) + simd=std::vector({1,1,2,2}); +#endif #if defined(AVX512) simd=std::vector({1,2,2,2}); #endif - latt=std::vector({8,8,8,8}); + std::string arg; - if( GridCmdOptionExists(argv,argv+argc,"--mpi-layout") ){ - arg = GridCmdOptionPayload(argv,argv+argc,"--mpi-layout"); + if( GridCmdOptionExists(argv,argv+argc,"--mpi") ){ + arg = GridCmdOptionPayload(argv,argv+argc,"--mpi"); GridCmdOptionIntVector(arg,mpi); + std::cout<<"MPI "; + for(int i=0;i class iScalar :public GridTensorBase +template class iScalar { public: vtype _internal; @@ -105,7 +105,7 @@ template inline auto TensorRemove(iScalar arg) -> decltype(T return TensorRemove(arg._internal); } -template class iVector :public GridTensorBase +template class iVector { public: vtype _internal[N]; @@ -175,7 +175,7 @@ public: // } }; -template class iMatrix :public GridTensorBase +template class iMatrix { public: vtype _internal[N][N]; diff --git a/tests/Grid_cshift.cc b/tests/Grid_cshift.cc index 619808d6..0eb6285a 100644 --- a/tests/Grid_cshift.cc +++ b/tests/Grid_cshift.cc @@ -11,11 +11,11 @@ int main (int argc, char ** argv) std::vector simd_layout; std::vector mpi_layout; std::vector latt_size; - GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); - - GridCartesian Fine(latt_size,simd_layout,mpi_layout); - GridParallelRNG FineRNG(&Fine); - FineRNG.SeedRandomDevice(); + + GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); + GridCartesian Fine(latt_size,simd_layout,mpi_layout); + + GridParallelRNG FineRNG(&Fine); FineRNG.SeedRandomDevice(); LatticeComplex U(&Fine); LatticeComplex ShiftU(&Fine); diff --git a/tests/Grid_gamma.cc b/tests/Grid_gamma.cc index 2fd1d864..f8f86242 100644 --- a/tests/Grid_gamma.cc +++ b/tests/Grid_gamma.cc @@ -18,7 +18,7 @@ int main (int argc, char ** argv) std::vector simd_layout; std::vector mpi_layout; - GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); + GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); GridCartesian Grid(latt_size,simd_layout,mpi_layout); diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index 179694c6..9a7aa70b 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -29,7 +29,7 @@ int main (int argc, char ** argv) std::vector simd_layout; std::vector mpi_layout; - GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); + GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); latt_size.resize(4); #ifdef AVX512 diff --git a/tests/Grid_nersc_io.cc b/tests/Grid_nersc_io.cc index 71cedd42..e8ff7209 100644 --- a/tests/Grid_nersc_io.cc +++ b/tests/Grid_nersc_io.cc @@ -14,7 +14,7 @@ int main (int argc, char ** argv) std::vector simd_layout; std::vector mpi_layout; - GridParseLayout(argv,argc,mpi_layout,simd_layout,tmp_latt_size); + GridParseLayout(argv,argc,tmp_latt_size,simd_layout,mpi_layout); std::vector latt_size ({16,16,16,32}); std::vector clatt_size ({4,4,4,8}); diff --git a/tests/Grid_simd.cc b/tests/Grid_simd.cc index fe90af2e..357e0fe8 100644 --- a/tests/Grid_simd.cc +++ b/tests/Grid_simd.cc @@ -110,7 +110,7 @@ int main (int argc, char ** argv) std::vector simd_layout; std::vector mpi_layout; - GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); + GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); GridCartesian Grid(latt_size,simd_layout,mpi_layout); std::vector seeds({1,2,3,4}); diff --git a/tests/Grid_stencil.cc b/tests/Grid_stencil.cc index 16acf294..c4b516dd 100644 --- a/tests/Grid_stencil.cc +++ b/tests/Grid_stencil.cc @@ -12,7 +12,7 @@ int main (int argc, char ** argv) std::vector simd_layout; std::vector mpi_layout; - GridParseLayout(argv,argc,mpi_layout,simd_layout,latt_size); + GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); double volume = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; From c8dc8ff89171ce86fc5cd5fe8be151ad02622722 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 11 May 2015 18:59:03 +0100 Subject: [PATCH 144/429] Adding a better controlled threading class, preparing to force in deterministic reduction. --- benchmarks/Grid_comms.cc | 7 +- benchmarks/Grid_memory_bandwidth.cc | 9 +- benchmarks/Grid_wilson.cc | 9 +- lib/Grid.h | 13 ++- lib/Grid_init.cc | 125 ++++++++++++++--------- lib/Grid_threads.h | 80 +++++++++++++++ lib/cartesian/Grid_cartesian_base.h | 5 +- lib/cartesian/Grid_cartesian_red_black.h | 2 +- tests/Grid_cshift.cc | 7 +- tests/Grid_gamma.cc | 10 +- tests/Grid_main.cc | 7 +- tests/Grid_nersc_io.cc | 7 +- tests/Grid_simd.cc | 8 +- tests/Grid_stencil.cc | 7 +- 14 files changed, 199 insertions(+), 97 deletions(-) create mode 100644 lib/Grid_threads.h diff --git a/benchmarks/Grid_comms.cc b/benchmarks/Grid_comms.cc index 5317e127..3dedfb5b 100644 --- a/benchmarks/Grid_comms.cc +++ b/benchmarks/Grid_comms.cc @@ -8,11 +8,8 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector latt_size; - std::vector simd_layout; - std::vector mpi_layout; - - GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); + std::vector simd_layout = GridDefaultSimd(); + std::vector mpi_layout = GridDefaultMpi(); int Nloop=10; int nmu=0; diff --git a/benchmarks/Grid_memory_bandwidth.cc b/benchmarks/Grid_memory_bandwidth.cc index dd6d1816..cb444128 100644 --- a/benchmarks/Grid_memory_bandwidth.cc +++ b/benchmarks/Grid_memory_bandwidth.cc @@ -8,17 +8,14 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector tmp_latt_size; - std::vector simd_layout; - std::vector mpi_layout; - - GridParseLayout(argv,argc,tmp_latt_size,simd_layout,mpi_layout); - const int Nvec=8; typedef Lattice< iVector< vReal,Nvec> > LatticeVec; int Nloop=1000; + std::vector simd_layout = GridDefaultSimd(); + std::vector mpi_layout = GridDefaultMpi(); + std::cout << "===================================================================================================="< latt_size; - std::vector simd_layout; - std::vector mpi_layout; - GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); - + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(); + std::vector mpi_layout = GridDefaultMpi(); GridCartesian Grid(latt_size,simd_layout,mpi_layout); + std::vector seeds({1,2,3,4}); GridParallelRNG pRNG(&Grid); diff --git a/lib/Grid.h b/lib/Grid.h index cce56c0c..da04438a 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -45,8 +45,11 @@ #include #include -#include +#include + #include + +#include #include #include #include @@ -60,6 +63,7 @@ namespace Grid { void Grid_init(int *argc,char ***argv); void Grid_finalize(void); + // internal, controled with --handle void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr); void Grid_debug_handler_init(void); void Grid_quiesce_nodes(void); @@ -68,6 +72,11 @@ namespace Grid { // C++11 time facilities better? double usecond(void); + const std::vector &GridDefaultSimd(void); + const std::vector &GridDefaultLatt(void); + const std::vector &GridDefaultMpi(void); + const int &GridThreads(void) ; + void GridSetThreads(int t) ; // Common parsing chores std::string GridCmdOptionPayload(char ** begin, char ** end, const std::string & option); @@ -75,8 +84,8 @@ namespace Grid { void GridParseIntVector(std::string &str,std::vector & vec); void GridParseLayout(char **argv,int argc, - std::vector &simd, std::vector &latt, + std::vector &simd, std::vector &mpi); diff --git a/lib/Grid_init.cc b/lib/Grid_init.cc index e80bbe64..9e977064 100644 --- a/lib/Grid_init.cc +++ b/lib/Grid_init.cc @@ -1,5 +1,5 @@ /****************************************************************************/ -/* PAB: Signal magic. Processor state dump is x86-64 specific */ +/* pab: Signal magic. Processor state dump is x86-64 specific */ /****************************************************************************/ #include @@ -23,23 +23,25 @@ namespace Grid { - void Grid_quiesce_nodes(void) - { -#ifdef GRID_COMMS_MPI - int me; - MPI_Comm_rank(MPI_COMM_WORLD,&me); - if ( me ) { - std::cout.setstate(std::ios::badbit); - } -#endif - } - void Grid_unquiesce_nodes(void) - { -#ifdef GRID_COMMS_MPI - std::cout.clear(); -#endif - } + ////////////////////////////////////////////////////// + // Convenience functions to access stadard command line arg + // driven parallelism controls + ////////////////////////////////////////////////////// + static std::vector Grid_default_simd; + static std::vector Grid_default_latt; + static std::vector Grid_default_mpi; + int GridThread::_threads; + + + const std::vector &GridDefaultSimd(void) {return Grid_default_simd;}; + const std::vector &GridDefaultLatt(void) {return Grid_default_latt;}; + const std::vector &GridDefaultMpi(void) {return Grid_default_mpi;}; + + + //////////////////////////////////////////////////////////// + // Command line parsing assist for stock controls + //////////////////////////////////////////////////////////// std::string GridCmdOptionPayload(char ** begin, char ** end, const std::string & option) { char ** itr = std::find(begin, end, option); @@ -53,15 +55,6 @@ bool GridCmdOptionExists(char** begin, char** end, const std::string& option) { return std::find(begin, end, option) != end; } -void Grid_init(int *argc,char ***argv) -{ -#ifdef GRID_COMMS_MPI - MPI_Init(argc,argv); -#endif - // Parse command line args. - Grid_quiesce_nodes(); - -} void GridCmdOptionIntVector(std::string &str,std::vector & vec) { @@ -70,7 +63,7 @@ void GridCmdOptionIntVector(std::string &str,std::vector & vec) int i; while (ss >> i){ vec.push_back(i); - if (ss.peek() == ',') + if(std::ispunct(ss.peek())) ss.ignore(); } return; @@ -94,38 +87,74 @@ void GridParseLayout(char **argv,int argc, simd=std::vector({1,2,2,2}); #endif - + GridThread::SetMaxThreads(); + std::string arg; if( GridCmdOptionExists(argv,argv+argc,"--mpi") ){ arg = GridCmdOptionPayload(argv,argv+argc,"--mpi"); GridCmdOptionIntVector(arg,mpi); - std::cout<<"MPI "; - for(int i=0;i ompthreads(0); + arg= GridCmdOptionPayload(argv,argv+argc,"--omp"); + GridCmdOptionIntVector(arg,ompthreads); + assert(ompthreads.size()==1); + GridThread::SetThreads(ompthreads[0]); + } + } + + ///////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////// +void Grid_init(int *argc,char ***argv) +{ +#ifdef GRID_COMMS_MPI + MPI_Init(argc,argv); +#endif + // Parse command line args. + + if( GridCmdOptionExists(*argv,*argv+*argc,"--debug-signals") ){ + Grid_debug_handler_init(); + } + if( !GridCmdOptionExists(*argv,*argv+*argc,"--debug-stdout") ){ + Grid_quiesce_nodes(); + } + GridParseLayout(*argv,*argc, + Grid_default_latt, + Grid_default_simd, + Grid_default_mpi); + +} + + + //////////////////////////////////////////////////////////// + // Verbose limiter on MPI tasks + //////////////////////////////////////////////////////////// + void Grid_quiesce_nodes(void) + { +#ifdef GRID_COMMS_MPI + int me; + MPI_Comm_rank(MPI_COMM_WORLD,&me); + if ( me ) { + std::cout.setstate(std::ios::badbit); + } +#endif + } + void Grid_unquiesce_nodes(void) + { +#ifdef GRID_COMMS_MPI + std::cout.clear(); +#endif + } + void Grid_finalize(void) { @@ -146,14 +175,14 @@ void * Grid_backtrace_buffer[_NBACKTRACE]; void Grid_sa_signal_handler(int sig,siginfo_t *si,void * ptr) { printf("Caught signal %d\n",si->si_signo); - printf(" mem address %lx\n",(uint64_t)si->si_addr); + printf(" mem address %llx\n",(unsigned long long)si->si_addr); printf(" code %d\n",si->si_code); #ifdef __X86_64 ucontext_t * uc= (ucontext_t *)ptr; struct sigcontext *sc = (struct sigcontext *)&uc->uc_mcontext; - printf(" instruction %llx\n",(uint64_t)sc->rip); -#define REG(A) printf(" %s %lx\n",#A, sc-> A); + printf(" instruction %llx\n",(unsigned long long)sc->rip); +#define REG(A) printf(" %s %lx\n",#A,sc-> A); REG(rdi); REG(rsi); REG(rbp); diff --git a/lib/Grid_threads.h b/lib/Grid_threads.h new file mode 100644 index 00000000..6c5f17e0 --- /dev/null +++ b/lib/Grid_threads.h @@ -0,0 +1,80 @@ +#ifndef GRID_THREADS_H +#define GRID_THREADS_H + +#ifdef HAVE_OPENMP +#include +#define PARALLEL_FOR_LOOP _Pragma("omp parallel for") +#define PARALLEL_NESTED_LOOP(n) _Pragma("omp parallel for collapse(" #n ")") +#else +#define PARALLEL_FOR_LOOP +#define PARALLEL_NESTED_LOOP(n) +#endif + +namespace Grid { + + // Introduce a class to gain deterministic bit reproducible reduction. + // make static; perhaps just a namespace is required. + +class GridThread { + public: + static int _threads; + + static void SetThreads(int thr) { +#ifdef HAVE_OPENMP + _threads = MIN(thr,omp_get_max_threads()) ; + omp_set_num_threads(_threads); +#else + _threads = 1; +#endif + }; + static void SetMaxThreads(void) { +#ifdef HAVE_OPENMP + _threads = omp_get_max_threads(); + omp_set_num_threads(_threads); +#else + _threads = 1; +#endif + }; + static int GetThreads(void) { return _threads; }; + static int SumArraySize(void) {return _threads;}; + + static void GetWork(int nwork, int me, int & mywork, int & myoff){ + int basework = nwork/_threads; + int backfill = _threads-(nwork%_threads); + if ( me >= _threads ) { + mywork = myoff = 0; + } else { + mywork = (nwork+me)/_threads; + myoff = basework * me; + if ( me > backfill ) + myoff+= (me-backfill); + } + return; + }; + + static void GetWorkBarrier(int nwork, int &me, int & mywork, int & myoff){ + me = ThreadBarrier(); + GetWork(nwork,me,mywork,myoff); + }; + + static int ThreadBarrier(void) { +#ifdef HAVE_OPENMP +#pragma omp barrier + return omp_get_thread_num(); +#else + return 0; +#endif + }; + + template static void ThreadSum( std::vector &sum_array,obj &val,int me){ + sum_array[me] = val; + val=zero; + ThreadBarrier(); + for(int i=0;i<_threads;i++) val+= sum_array[i]; + ThreadBarrier(); + }; + +}; + +} +#endif diff --git a/lib/cartesian/Grid_cartesian_base.h b/lib/cartesian/Grid_cartesian_base.h index c297cbb9..a74773f8 100644 --- a/lib/cartesian/Grid_cartesian_base.h +++ b/lib/cartesian/Grid_cartesian_base.h @@ -14,7 +14,7 @@ namespace Grid{ // int _processor; // linear processor rank // std::vector _processor_coor; // linear processor rank ////////////////////////////////////////////////////////////////////// - class GridBase : public CartesianCommunicator { + class GridBase : public CartesianCommunicator , public GridThread { public: @@ -22,7 +22,8 @@ public: template friend class Lattice; GridBase(std::vector & processor_grid) : CartesianCommunicator(processor_grid) {}; - + + // Physics Grid information. std::vector _simd_layout;// Which dimensions get relayed out over simd lanes. std::vector _fdimensions;// Global dimensions of array prior to cb removal diff --git a/lib/cartesian/Grid_cartesian_red_black.h b/lib/cartesian/Grid_cartesian_red_black.h index 55bd1f20..475b47c2 100644 --- a/lib/cartesian/Grid_cartesian_red_black.h +++ b/lib/cartesian/Grid_cartesian_red_black.h @@ -46,7 +46,7 @@ public: }; GridRedBlackCartesian(std::vector &dimensions, std::vector &simd_layout, - std::vector &processor_grid) : GridBase(processor_grid) + std::vector &processor_grid ) : GridBase(processor_grid) { /////////////////////// // Grid information diff --git a/tests/Grid_cshift.cc b/tests/Grid_cshift.cc index 0eb6285a..e92ff793 100644 --- a/tests/Grid_cshift.cc +++ b/tests/Grid_cshift.cc @@ -8,11 +8,10 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector simd_layout; - std::vector mpi_layout; - std::vector latt_size; + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(); + std::vector mpi_layout = GridDefaultMpi(); - GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); GridCartesian Fine(latt_size,simd_layout,mpi_layout); GridParallelRNG FineRNG(&Fine); FineRNG.SeedRandomDevice(); diff --git a/tests/Grid_gamma.cc b/tests/Grid_gamma.cc index f8f86242..9779ca07 100644 --- a/tests/Grid_gamma.cc +++ b/tests/Grid_gamma.cc @@ -14,12 +14,10 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector latt_size; - std::vector simd_layout; - std::vector mpi_layout; - - GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); - + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(); + std::vector mpi_layout = GridDefaultMpi(); + GridCartesian Grid(latt_size,simd_layout,mpi_layout); GridParallelRNG pRNG(&Grid); diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index 9a7aa70b..c3454dfc 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -25,11 +25,10 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector latt_size; - std::vector simd_layout; - std::vector mpi_layout; + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(); + std::vector mpi_layout = GridDefaultMpi(); - GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); latt_size.resize(4); #ifdef AVX512 diff --git a/tests/Grid_nersc_io.cc b/tests/Grid_nersc_io.cc index e8ff7209..73d7edfe 100644 --- a/tests/Grid_nersc_io.cc +++ b/tests/Grid_nersc_io.cc @@ -10,12 +10,9 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector tmp_latt_size; - std::vector simd_layout; - std::vector mpi_layout; - - GridParseLayout(argv,argc,tmp_latt_size,simd_layout,mpi_layout); + std::vector simd_layout = GridDefaultSimd(); + std::vector mpi_layout = GridDefaultMpi(); std::vector latt_size ({16,16,16,32}); std::vector clatt_size ({4,4,4,8}); int orthodir=3; diff --git a/tests/Grid_simd.cc b/tests/Grid_simd.cc index 357e0fe8..6a957d7e 100644 --- a/tests/Grid_simd.cc +++ b/tests/Grid_simd.cc @@ -106,11 +106,9 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector latt_size; - std::vector simd_layout; - std::vector mpi_layout; - - GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(); + std::vector mpi_layout = GridDefaultMpi(); GridCartesian Grid(latt_size,simd_layout,mpi_layout); std::vector seeds({1,2,3,4}); diff --git a/tests/Grid_stencil.cc b/tests/Grid_stencil.cc index c4b516dd..d9e779bf 100644 --- a/tests/Grid_stencil.cc +++ b/tests/Grid_stencil.cc @@ -8,11 +8,10 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector latt_size; - std::vector simd_layout; - std::vector mpi_layout; - GridParseLayout(argv,argc,latt_size,simd_layout,mpi_layout); + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(); + std::vector mpi_layout = GridDefaultMpi(); double volume = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; From 6e6843ac6910bbbfc9f3e3dc565304d99c116af5 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 11 May 2015 19:09:49 +0100 Subject: [PATCH 145/429] Moving some things around for pretty --- lib/Grid_communicator.h | 113 +----------- lib/Grid_lattice.h | 199 +-------------------- lib/communicator/Grid_communicator_base.h | 117 +++++++++++++ lib/lattice/Grid_lattice_base.h | 203 ++++++++++++++++++++++ lib/math/Grid_math_inner.h | 2 +- tests/Grid_gamma.cc | 26 +-- 6 files changed, 336 insertions(+), 324 deletions(-) create mode 100644 lib/communicator/Grid_communicator_base.h create mode 100644 lib/lattice/Grid_lattice_base.h diff --git a/lib/Grid_communicator.h b/lib/Grid_communicator.h index 661f39b8..cfa6e0a7 100644 --- a/lib/Grid_communicator.h +++ b/lib/Grid_communicator.h @@ -1,117 +1,6 @@ #ifndef GRID_COMMUNICATOR_H #define GRID_COMMUNICATOR_H -/////////////////////////////////// -// Processor layout information -/////////////////////////////////// -#ifdef GRID_COMMS_MPI -#include -#endif -namespace Grid { -class CartesianCommunicator { - public: - - // Communicator should know nothing of the physics grid, only processor grid. - - int _Nprocessors; // How many in all - std::vector _processors; // Which dimensions get relayed out over processors lanes. - int _processor; // linear processor rank - std::vector _processor_coor; // linear processor coordinate - unsigned long _ndimension; - -#ifdef GRID_COMMS_MPI - MPI_Comm communicator; - typedef MPI_Request CommsRequest_t; -#else - typedef int CommsRequest_t; -#endif - - // Constructor - CartesianCommunicator(std::vector &pdimensions_in); - - // Wraps MPI_Cart routines - void ShiftedRanks(int dim,int shift,int & source, int & dest); - int RankFromProcessorCoor(std::vector &coor); - void ProcessorCoorFromRank(int rank,std::vector &coor); - - ///////////////////////////////// - // Grid information queries - ///////////////////////////////// - int IsBoss(void) { return _processor==0; }; - int BossRank(void) { return 0; }; - int ThisRank(void) { return _processor; }; - const std::vector & ThisProcessorCoor(void) { return _processor_coor; }; - const std::vector & ProcessorGrid(void) { return _processors; }; - int ProcessorCount(void) { return _Nprocessors; }; - - //////////////////////////////////////////////////////////// - // Reduction - //////////////////////////////////////////////////////////// - void GlobalSum(RealF &); - void GlobalSumVector(RealF *,int N); - - void GlobalSum(RealD &); - void GlobalSumVector(RealD *,int N); - - void GlobalSum(uint32_t &); - - void GlobalSum(ComplexF &c) - { - GlobalSumVector((float *)&c,2); - } - void GlobalSumVector(ComplexF *c,int N) - { - GlobalSumVector((float *)c,2*N); - } - - void GlobalSum(ComplexD &c) - { - GlobalSumVector((double *)&c,2); - } - void GlobalSumVector(ComplexD *c,int N) - { - GlobalSumVector((double *)c,2*N); - } - - template void GlobalSum(obj &o){ - typedef typename obj::scalar_type scalar_type; - int words = sizeof(obj)/sizeof(scalar_type); - scalar_type * ptr = (scalar_type *)& o; - GlobalSumVector(ptr,words); - } - //////////////////////////////////////////////////////////// - // Face exchange, buffer swap in translational invariant way - //////////////////////////////////////////////////////////// - void SendToRecvFrom(void *xmit, - int xmit_to_rank, - void *recv, - int recv_from_rank, - int bytes); - void SendToRecvFromBegin(std::vector &list, - void *xmit, - int xmit_to_rank, - void *recv, - int recv_from_rank, - int bytes); - void SendToRecvFromComplete(std::vector &waitall); - - //////////////////////////////////////////////////////////// - // Barrier - //////////////////////////////////////////////////////////// - void Barrier(void); - - //////////////////////////////////////////////////////////// - // Broadcast a buffer and composite larger - //////////////////////////////////////////////////////////// - void Broadcast(int root,void* data, int bytes); - template void Broadcast(int root,obj &data) - { - Broadcast(root,(void *)&data,sizeof(data)); - }; - - static void BroadcastWorld(int root,void* data, int bytes); - -}; -} +#include #endif diff --git a/lib/Grid_lattice.h b/lib/Grid_lattice.h index 356a25b8..35664aee 100644 --- a/lib/Grid_lattice.h +++ b/lib/Grid_lattice.h @@ -1,203 +1,6 @@ #ifndef GRID_LATTICE_H #define GRID_LATTICE_H -namespace Grid { - -// TODO: -// mac,real,imag - -// Functionality: -// -=,+=,*=,() -// add,+,sub,-,mult,mac,* -// adj,conj -// real,imag -// transpose,transposeIndex -// trace,traceIndex -// peekIndex -// innerProduct,outerProduct, -// localNorm2 -// localInnerProduct - -extern int GridCshiftPermuteMap[4][16]; - -//////////////////////////////////////////////// -// Basic expressions used in Expression Template -//////////////////////////////////////////////// - -class LatticeBase {}; -class LatticeExpressionBase {}; - -template -class LatticeUnaryExpression : public std::pair > , public LatticeExpressionBase { - public: - LatticeUnaryExpression(const std::pair > &arg): std::pair >(arg) {}; -}; - -template -class LatticeBinaryExpression : public std::pair > , public LatticeExpressionBase { - public: - LatticeBinaryExpression(const std::pair > &arg): std::pair >(arg) {}; -}; - -template -class LatticeTrinaryExpression :public std::pair >, public LatticeExpressionBase { - public: - LatticeTrinaryExpression(const std::pair > &arg): std::pair >(arg) {}; -}; - -template -class Lattice : public LatticeBase -{ -public: - - GridBase *_grid; - int checkerboard; - std::vector > _odata; - -public: - typedef typename vobj::scalar_type scalar_type; - typedef typename vobj::vector_type vector_type; - typedef vobj vector_object; - - //////////////////////////////////////////////////////////////////////////////// - // Expression Template closure support - //////////////////////////////////////////////////////////////////////////////// - template inline Lattice & operator=(const LatticeUnaryExpression &expr) - { -#pragma omp parallel for - for(int ss=0;ss<_grid->oSites();ss++){ - vobj tmp= eval(ss,expr); - vstream(_odata[ss] ,tmp); - } - return *this; - } - template inline Lattice & operator=(const LatticeBinaryExpression &expr) - { -#pragma omp parallel for - for(int ss=0;ss<_grid->oSites();ss++){ - vobj tmp= eval(ss,expr); - vstream(_odata[ss] ,tmp); - } - return *this; - } - template inline Lattice & operator=(const LatticeTrinaryExpression &expr) - { -#pragma omp parallel for - for(int ss=0;ss<_grid->oSites();ss++){ - vobj tmp= eval(ss,expr); - vstream(_odata[ss] ,tmp); - } - return *this; - } - //GridFromExpression is tricky to do - template - Lattice(const LatticeUnaryExpression & expr): _grid(nullptr){ - GridFromExpression(_grid,expr); - assert(_grid!=nullptr); - _odata.resize(_grid->oSites()); -#pragma omp parallel for - for(int ss=0;ss<_grid->oSites();ss++){ - _odata[ss] = eval(ss,expr); - } - }; - template - Lattice(const LatticeBinaryExpression & expr): _grid(nullptr){ - GridFromExpression(_grid,expr); - assert(_grid!=nullptr); - _odata.resize(_grid->oSites()); -#pragma omp parallel for - for(int ss=0;ss<_grid->oSites();ss++){ - _odata[ss] = eval(ss,expr); - } - }; - template - Lattice(const LatticeTrinaryExpression & expr): _grid(nullptr){ - GridFromExpression(_grid,expr); - assert(_grid!=nullptr); - _odata.resize(_grid->oSites()); -#pragma omp parallel for - for(int ss=0;ss<_grid->oSites();ss++){ - _odata[ss] = eval(ss,expr); - } - }; - - ////////////////////////////////////////////////////////////////// - // Constructor requires "grid" passed. - // what about a default grid? - ////////////////////////////////////////////////////////////////// - Lattice(GridBase *grid) : _grid(grid), _odata(_grid->oSites()) { - // _odata.reserve(_grid->oSites()); - // _odata.resize(_grid->oSites()); - assert((((uint64_t)&_odata[0])&0xF) ==0); - checkerboard=0; - } - - template inline Lattice & operator = (const sobj & r){ -#pragma omp parallel for - for(int ss=0;ss<_grid->oSites();ss++){ - this->_odata[ss]=r; - } - return *this; - } - template inline Lattice & operator = (const Lattice & r){ - conformable(*this,r); - std::cout<<"Lattice operator ="<oSites();ss++){ - this->_odata[ss]=r._odata[ss]; - } - return *this; - } - - // *=,+=,-= operators inherit behvour from correspond */+/- operation - template inline Lattice &operator *=(const T &r) { - *this = (*this)*r; - return *this; - } - - template inline Lattice &operator -=(const T &r) { - *this = (*this)-r; - return *this; - } - template inline Lattice &operator +=(const T &r) { - *this = (*this)+r; - return *this; - } - - inline friend Lattice operator / (const Lattice &lhs,const Lattice &rhs){ - conformable(lhs,rhs); - Lattice ret(lhs._grid); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = lhs._odata[ss]/rhs._odata[ss]; - } - return ret; - }; - }; // class Lattice -} - -#undef GRID_LATTICE_EXPRESSION_TEMPLATES - -#include - -#ifdef GRID_LATTICE_EXPRESSION_TEMPLATES -#include -#else -#include -#endif -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - +#include #endif diff --git a/lib/communicator/Grid_communicator_base.h b/lib/communicator/Grid_communicator_base.h new file mode 100644 index 00000000..47c1f525 --- /dev/null +++ b/lib/communicator/Grid_communicator_base.h @@ -0,0 +1,117 @@ +#ifndef GRID_COMMUNICATOR_BASE_H +#define GRID_COMMUNICATOR_BASE_H + +/////////////////////////////////// +// Processor layout information +/////////////////////////////////// +#ifdef GRID_COMMS_MPI +#include +#endif +namespace Grid { +class CartesianCommunicator { + public: + + // Communicator should know nothing of the physics grid, only processor grid. + + int _Nprocessors; // How many in all + std::vector _processors; // Which dimensions get relayed out over processors lanes. + int _processor; // linear processor rank + std::vector _processor_coor; // linear processor coordinate + unsigned long _ndimension; + +#ifdef GRID_COMMS_MPI + MPI_Comm communicator; + typedef MPI_Request CommsRequest_t; +#else + typedef int CommsRequest_t; +#endif + + // Constructor + CartesianCommunicator(std::vector &pdimensions_in); + + // Wraps MPI_Cart routines + void ShiftedRanks(int dim,int shift,int & source, int & dest); + int RankFromProcessorCoor(std::vector &coor); + void ProcessorCoorFromRank(int rank,std::vector &coor); + + ///////////////////////////////// + // Grid information queries + ///////////////////////////////// + int IsBoss(void) { return _processor==0; }; + int BossRank(void) { return 0; }; + int ThisRank(void) { return _processor; }; + const std::vector & ThisProcessorCoor(void) { return _processor_coor; }; + const std::vector & ProcessorGrid(void) { return _processors; }; + int ProcessorCount(void) { return _Nprocessors; }; + + //////////////////////////////////////////////////////////// + // Reduction + //////////////////////////////////////////////////////////// + void GlobalSum(RealF &); + void GlobalSumVector(RealF *,int N); + + void GlobalSum(RealD &); + void GlobalSumVector(RealD *,int N); + + void GlobalSum(uint32_t &); + + void GlobalSum(ComplexF &c) + { + GlobalSumVector((float *)&c,2); + } + void GlobalSumVector(ComplexF *c,int N) + { + GlobalSumVector((float *)c,2*N); + } + + void GlobalSum(ComplexD &c) + { + GlobalSumVector((double *)&c,2); + } + void GlobalSumVector(ComplexD *c,int N) + { + GlobalSumVector((double *)c,2*N); + } + + template void GlobalSum(obj &o){ + typedef typename obj::scalar_type scalar_type; + int words = sizeof(obj)/sizeof(scalar_type); + scalar_type * ptr = (scalar_type *)& o; + GlobalSumVector(ptr,words); + } + //////////////////////////////////////////////////////////// + // Face exchange, buffer swap in translational invariant way + //////////////////////////////////////////////////////////// + void SendToRecvFrom(void *xmit, + int xmit_to_rank, + void *recv, + int recv_from_rank, + int bytes); + void SendToRecvFromBegin(std::vector &list, + void *xmit, + int xmit_to_rank, + void *recv, + int recv_from_rank, + int bytes); + void SendToRecvFromComplete(std::vector &waitall); + + //////////////////////////////////////////////////////////// + // Barrier + //////////////////////////////////////////////////////////// + void Barrier(void); + + //////////////////////////////////////////////////////////// + // Broadcast a buffer and composite larger + //////////////////////////////////////////////////////////// + void Broadcast(int root,void* data, int bytes); + template void Broadcast(int root,obj &data) + { + Broadcast(root,(void *)&data,sizeof(data)); + }; + + static void BroadcastWorld(int root,void* data, int bytes); + +}; +} + +#endif diff --git a/lib/lattice/Grid_lattice_base.h b/lib/lattice/Grid_lattice_base.h new file mode 100644 index 00000000..248bf1f7 --- /dev/null +++ b/lib/lattice/Grid_lattice_base.h @@ -0,0 +1,203 @@ +#ifndef GRID_LATTICE_BASE_H +#define GRID_LATTICE_BASE_H + +namespace Grid { + +// TODO: +// mac,real,imag + +// Functionality: +// -=,+=,*=,() +// add,+,sub,-,mult,mac,* +// adj,conj +// real,imag +// transpose,transposeIndex +// trace,traceIndex +// peekIndex +// innerProduct,outerProduct, +// localNorm2 +// localInnerProduct + +extern int GridCshiftPermuteMap[4][16]; + +//////////////////////////////////////////////// +// Basic expressions used in Expression Template +//////////////////////////////////////////////// + +class LatticeBase {}; +class LatticeExpressionBase {}; + +template +class LatticeUnaryExpression : public std::pair > , public LatticeExpressionBase { + public: + LatticeUnaryExpression(const std::pair > &arg): std::pair >(arg) {}; +}; + +template +class LatticeBinaryExpression : public std::pair > , public LatticeExpressionBase { + public: + LatticeBinaryExpression(const std::pair > &arg): std::pair >(arg) {}; +}; + +template +class LatticeTrinaryExpression :public std::pair >, public LatticeExpressionBase { + public: + LatticeTrinaryExpression(const std::pair > &arg): std::pair >(arg) {}; +}; + +template +class Lattice : public LatticeBase +{ +public: + + GridBase *_grid; + int checkerboard; + std::vector > _odata; + +public: + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + typedef vobj vector_object; + + //////////////////////////////////////////////////////////////////////////////// + // Expression Template closure support + //////////////////////////////////////////////////////////////////////////////// + template inline Lattice & operator=(const LatticeUnaryExpression &expr) + { +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + vobj tmp= eval(ss,expr); + vstream(_odata[ss] ,tmp); + } + return *this; + } + template inline Lattice & operator=(const LatticeBinaryExpression &expr) + { +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + vobj tmp= eval(ss,expr); + vstream(_odata[ss] ,tmp); + } + return *this; + } + template inline Lattice & operator=(const LatticeTrinaryExpression &expr) + { +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + vobj tmp= eval(ss,expr); + vstream(_odata[ss] ,tmp); + } + return *this; + } + //GridFromExpression is tricky to do + template + Lattice(const LatticeUnaryExpression & expr): _grid(nullptr){ + GridFromExpression(_grid,expr); + assert(_grid!=nullptr); + _odata.resize(_grid->oSites()); +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + _odata[ss] = eval(ss,expr); + } + }; + template + Lattice(const LatticeBinaryExpression & expr): _grid(nullptr){ + GridFromExpression(_grid,expr); + assert(_grid!=nullptr); + _odata.resize(_grid->oSites()); +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + _odata[ss] = eval(ss,expr); + } + }; + template + Lattice(const LatticeTrinaryExpression & expr): _grid(nullptr){ + GridFromExpression(_grid,expr); + assert(_grid!=nullptr); + _odata.resize(_grid->oSites()); +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + _odata[ss] = eval(ss,expr); + } + }; + + ////////////////////////////////////////////////////////////////// + // Constructor requires "grid" passed. + // what about a default grid? + ////////////////////////////////////////////////////////////////// + Lattice(GridBase *grid) : _grid(grid), _odata(_grid->oSites()) { + // _odata.reserve(_grid->oSites()); + // _odata.resize(_grid->oSites()); + assert((((uint64_t)&_odata[0])&0xF) ==0); + checkerboard=0; + } + + template inline Lattice & operator = (const sobj & r){ +#pragma omp parallel for + for(int ss=0;ss<_grid->oSites();ss++){ + this->_odata[ss]=r; + } + return *this; + } + template inline Lattice & operator = (const Lattice & r){ + conformable(*this,r); + std::cout<<"Lattice operator ="<oSites();ss++){ + this->_odata[ss]=r._odata[ss]; + } + return *this; + } + + // *=,+=,-= operators inherit behvour from correspond */+/- operation + template inline Lattice &operator *=(const T &r) { + *this = (*this)*r; + return *this; + } + + template inline Lattice &operator -=(const T &r) { + *this = (*this)-r; + return *this; + } + template inline Lattice &operator +=(const T &r) { + *this = (*this)+r; + return *this; + } + + inline friend Lattice operator / (const Lattice &lhs,const Lattice &rhs){ + conformable(lhs,rhs); + Lattice ret(lhs._grid); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + ret._odata[ss] = lhs._odata[ss]/rhs._odata[ss]; + } + return ret; + }; + }; // class Lattice +} + +#undef GRID_LATTICE_EXPRESSION_TEMPLATES + +#include + +#ifdef GRID_LATTICE_EXPRESSION_TEMPLATES +#include +#else +#include +#endif +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +#endif diff --git a/lib/math/Grid_math_inner.h b/lib/math/Grid_math_inner.h index 1e44032c..bbb35605 100644 --- a/lib/math/Grid_math_inner.h +++ b/lib/math/Grid_math_inner.h @@ -6,7 +6,7 @@ namespace Grid { // innerProduct Vector x Vector -> Scalar // innerProduct Matrix x Matrix -> Scalar /////////////////////////////////////////////////////////////////////////////////////// - template inline RealD norm2l(const sobj &arg){ + template inline RealD norm2(const sobj &arg){ typedef typename sobj::scalar_type scalar; decltype(innerProduct(arg,arg)) nrm; nrm = innerProduct(arg,arg); diff --git a/tests/Grid_gamma.cc b/tests/Grid_gamma.cc index 9779ca07..ba298b19 100644 --- a/tests/Grid_gamma.cc +++ b/tests/Grid_gamma.cc @@ -97,7 +97,7 @@ int main (int argc, char ** argv) for(int mu=0;mu<6;mu++){ result = Gamma(g[mu])* ident * Gamma(g[mu]); result = result - ident; - double mag = TensorRemove(norm2l(result)); + double mag = TensorRemove(norm2(result)); std::cout << list[mu]<<" " << mag< Date: Tue, 12 May 2015 07:51:41 +0100 Subject: [PATCH 146/429] Threading support rework. Placed parallel pragmas as macros; implemented deterministic thread reduction in style of BFM. --- TODO | 93 ++++++++------- lib/Grid.h | 1 - lib/Grid_comparison.h | 1 + lib/Grid_simd.h | 12 +- lib/Makefile.am | 4 +- lib/cshift/Grid_cshift_common.h | 12 +- lib/lattice/Grid_lattice_arith.h | 26 ++-- lib/lattice/Grid_lattice_base.h | 18 +-- lib/lattice/Grid_lattice_comparison.h | 6 +- lib/lattice/Grid_lattice_local.h | 6 +- lib/lattice/Grid_lattice_overload.h | 14 +-- lib/lattice/Grid_lattice_peekpoke.h | 12 +- lib/lattice/Grid_lattice_reality.h | 8 +- lib/lattice/Grid_lattice_reduction.h | 111 ++++++++++-------- lib/lattice/Grid_lattice_trace.h | 4 +- lib/lattice/Grid_lattice_transfer.h | 4 +- lib/lattice/Grid_lattice_transpose.h | 4 +- .../Grid_lattice_where.h} | 6 +- lib/math/Grid_math_reality.h | 54 +++++++-- lib/qcd/Grid_qcd_2spinor.h | 6 - lib/qcd/Grid_qcd_wilson_dop.cc | 2 +- lib/simd/Grid_vComplexD.h | 24 +++- lib/simd/Grid_vComplexF.h | 21 +++- lib/simd/Grid_vRealD.h | 4 + lib/simd/Grid_vRealF.h | 4 + tests/Grid_gamma.cc | 3 +- 26 files changed, 276 insertions(+), 184 deletions(-) rename lib/{Grid_where.h => lattice/Grid_lattice_where.h} (95%) diff --git a/TODO b/TODO index 1f5be83f..6a1624f7 100644 --- a/TODO +++ b/TODO @@ -1,33 +1,35 @@ +================================================================ +*** Hacks and bug fixes to clean up and Audits +================================================================ +* Base class to share common code between vRealF, VComplexF etc... + +* Performance check on Guido's reimplementation strategy + +* Bug in SeedFixedIntegers gives same output on each site. -- Think I fixed but NOT checked for sure + +* FIXME audit +* const audit + +* Replace vset with a call to merge.; +* care in Gmerge,Gextract over vset . +* extract / merge extra implementation removal + +* Strong test for norm2, conj and all primitive types. -- tests/Grid_simd.cc is almost there + +================================================================ +*** New Functionality +================================================================ + +* Implement where to take template scheme. + * - BinaryWriter, TextWriter etc... - use protocol buffers? replace xmlReader/Writer ec.. - Binary use htonll, htonl -*** Hacks and bug fixes to clean up -* Had to hack assignment to 1.0 in the tests/Grid_gamma test -* norm2l is a hack. figure out syntax error and make this norm2 c.f. tests/Grid_gamma.cc - -* Reduce implemention is poor ; need threaded reductions; OMP isn't able to do it for generic objects. - -* Bug in SeedFixedIntegers gives same output on each site. -* Bug in RNG with complex numbers ; only filling real values; need helper function -- DONE -* Conformable test in Cshift routines. - -*** Functionality - -* Implement where to take template scheme. - -* Command line args for geometry, simd, etc. layout. Is it necessary to have - user pass these? Is this a QCD specific? - -* Strong test for norm2, conj and all primitive types. -- Grid_simd test is almost there - * Expression template engine: - - Audit - - Introduce base clase for Grid Tensors. - - Introduce norm2 unary op. - - Introduce conversion automatic from expression to Lattice - + -- Audit + -- Norm2(expression) problem: introduce norm2 unary op, or Introduce conversion automatic from expression to Lattice * CovariantShift support -----Use a class to store gauge field? (parallel transport?) @@ -48,12 +50,10 @@ - I have collated into single location at least. - Need to use _mm_*insert/extract routines. - * Flavour matrices? * Pauli, SU subgroup, etc.. * su3 exponentiation & log etc.. [Jamie's code?] * TaProj - * FFTnD ? * Parallel MPI2 IO @@ -62,20 +62,23 @@ * rb4d support for 5th dimension in Mobius. * Check for missing functionality - partially audited against QDP++ layout - // Base class to share common code between vRealF, VComplexF etc... - // // Unary functions // cos,sin, tan, acos, asin, cosh, acosh, tanh, sinh, // Scalar only arg // exp, log, sqrt, fabs - // // transposeColor, transposeSpin, // adjColor, adjSpin, - // // copyMask. - // // localMaxAbs - // // Fourier transform equivalent. +Actions +* Fermion + - Wilson + - Clover + - DomainWall + - Mobius + - z-Mobius +* Gauge + - Wilson, symanzik, iwasaki Algorithms * LinearOperator @@ -83,23 +86,21 @@ Algorithms * Polynomial * Eigen * Pcg +* Adef2 +* DeflCG * fPcg * MCR * HDCG +* HMC, Heatbath * etc.. -AUDITS: - -* FIXME audit -* const audit -* Replace vset with a call to merge.; -* care in Gmerge,Gextract over vset . -* extract / merge extra implementation removal - - +====================================================================================================== +FUNCTIONALITY: it pleases me to keep track of things I have done (keeps sane) ====================================================================================================== -FUNCTIONALITY: +* Command line args for geometry, simd, etc. layout. Is it necessary to have -- DONE + user pass these? Is this a QCD specific? + * Stencil -- DONE * Test infrastructure -- DONE * Fourspin, two spin project --- DONE @@ -115,6 +116,7 @@ FUNCTIONALITY: * How to do U[mu] ... lorentz part of type structure or not. more like chroma if not. -- DONE * Twospin/Fourspin/Gamma/Proj/Recon ----- DONE +* norm2l is a hack. figure out syntax error and make this norm2 c.f. tests/Grid_gamma.cc -- DONE * subdirs lib, tests ?? ----- DONE - lib/math @@ -149,3 +151,10 @@ FUNCTIONALITY: * Controling std::cout ------- DONE +* Had to hack assignment to 1.0 in the tests/Grid_gamma test -- DONE +* Reduce implemention is poor ; need threaded reductions; OMP isn't able to do it for generic objects. -- DONE +* Bug in RNG with complex numbers ; only filling real values; need helper function -- DONE +* Conformable test in Cshift routines. -- none needed ; there is only one +* Conformable testing in expression templates -- DONE (recursive) + + diff --git a/lib/Grid.h b/lib/Grid.h index da04438a..4512f443 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -53,7 +53,6 @@ #include #include #include -#include #include #include #include diff --git a/lib/Grid_comparison.h b/lib/Grid_comparison.h index 45311831..3f9c206d 100644 --- a/lib/Grid_comparison.h +++ b/lib/Grid_comparison.h @@ -142,5 +142,6 @@ namespace Grid { } #include +#include #endif diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index 6695eb0d..39265896 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -68,10 +68,14 @@ namespace Grid { inline ComplexF adj(const ComplexF& r ){ return(conj(r)); } //conj already supported for complex - inline ComplexF timesI(const ComplexF r) { return(r*ComplexF(0.0,1.0));} - inline ComplexD timesI(const ComplexD r) { return(r*ComplexD(0.0,1.0));} - inline ComplexF timesMinusI(const ComplexF r){ return(r*ComplexF(0.0,-1.0));} - inline ComplexD timesMinusI(const ComplexD r){ return(r*ComplexD(0.0,-1.0));} + inline ComplexF timesI(const ComplexF &r) { return(r*ComplexF(0.0,1.0));} + inline ComplexD timesI(const ComplexD &r) { return(r*ComplexD(0.0,1.0));} + inline ComplexF timesMinusI(const ComplexF &r){ return(r*ComplexF(0.0,-1.0));} + inline ComplexD timesMinusI(const ComplexD &r){ return(r*ComplexD(0.0,-1.0));} + inline void timesI(ComplexF &ret,const ComplexF &r) { ret = timesI(r);} + inline void timesI(ComplexD &ret,const ComplexD &r) { ret = timesI(r);} + inline void timesMinusI(ComplexF &ret,const ComplexF &r){ ret = timesMinusI(r);} + inline void timesMinusI(ComplexD &ret,const ComplexD &r){ ret = timesMinusI(r);} inline void mac (RealD * __restrict__ y,const RealD * __restrict__ a,const RealD *__restrict__ x){ *y = (*a) * (*x)+(*y);} inline void mult(RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) * (*r);} diff --git a/lib/Makefile.am b/lib/Makefile.am index 46795a33..f76b0b64 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -35,8 +35,7 @@ include_HEADERS =\ Grid_lattice.h\ Grid_math.h\ Grid_simd.h\ - Grid_stencil.h\ - Grid_where.h + Grid_stencil.h nobase_include_HEADERS=\ cartesian/Grid_cartesian_base.h\ @@ -56,6 +55,7 @@ nobase_include_HEADERS=\ lattice/Grid_lattice_trace.h\ lattice/Grid_lattice_transfer.h\ lattice/Grid_lattice_transpose.h\ + lattice/Grid_lattice_where.h\ math/Grid_math_arith.h\ math/Grid_math_arith_add.h\ math/Grid_math_arith_mac.h\ diff --git a/lib/cshift/Grid_cshift_common.h b/lib/cshift/Grid_cshift_common.h index 8320d2d0..9864df73 100644 --- a/lib/cshift/Grid_cshift_common.h +++ b/lib/cshift/Grid_cshift_common.h @@ -28,7 +28,7 @@ Gather_plane_simple (const Lattice &rhs,std::vector_ostride[dimension]; // base offset for start of plane int bo = 0; // offset in buffer -#pragma omp parallel for collapse(2) +PARALLEL_NESTED_LOOP(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ int o = n*rhs._grid->_slice_stride[dimension]; @@ -57,7 +57,7 @@ Gather_plane_extract(const Lattice &rhs,std::vector_ostride[dimension]; // base offset for start of plane int bo = 0; // offset in buffer -#pragma omp parallel for collapse(2) +PARALLEL_NESTED_LOOP(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ @@ -106,7 +106,7 @@ template void Scatter_plane_simple (Lattice &rhs,std::vector_ostride[dimension]; // base offset for start of plane int bo = 0; // offset in buffer -#pragma omp parallel for collapse(2) +PARALLEL_NESTED_LOOP(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ int o=n*rhs._grid->_slice_stride[dimension]; @@ -131,7 +131,7 @@ template void Scatter_plane_simple (Lattice &rhs,std::vector_ostride[dimension]; // base offset for start of plane -#pragma omp parallel for collapse(2) +PARALLEL_NESTED_LOOP(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ @@ -160,7 +160,7 @@ template void Copy_plane(Lattice& lhs,Lattice &rhs, int int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane -#pragma omp parallel for collapse(2) +PARALLEL_NESTED_LOOP(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ @@ -185,7 +185,7 @@ template void Copy_plane_permute(Lattice& lhs,Lattice &r int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane -#pragma omp parallel for collapse(2) +PARALLEL_NESTED_LOOP(2) for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ int o =n*rhs._grid->_slice_stride[dimension]; diff --git a/lib/lattice/Grid_lattice_arith.h b/lib/lattice/Grid_lattice_arith.h index 93801be5..c1d58b86 100644 --- a/lib/lattice/Grid_lattice_arith.h +++ b/lib/lattice/Grid_lattice_arith.h @@ -10,7 +10,7 @@ namespace Grid { template void mult(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ obj1 tmp; mult(&tmp,&lhs._odata[ss],&rhs._odata[ss]); @@ -21,7 +21,7 @@ namespace Grid { template void mac(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ obj1 tmp; mac(&tmp,&lhs._odata[ss],&rhs._odata[ss]); @@ -32,7 +32,7 @@ namespace Grid { template void sub(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ obj1 tmp; sub(&tmp,&lhs._odata[ss],&rhs._odata[ss]); @@ -42,7 +42,7 @@ namespace Grid { template void add(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ obj1 tmp; add(&tmp,&lhs._odata[ss],&rhs._odata[ss]); @@ -56,7 +56,7 @@ namespace Grid { template void mult(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ conformable(lhs,ret); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ obj1 tmp; mult(&tmp,&lhs._odata[ss],&rhs); @@ -67,7 +67,7 @@ namespace Grid { template void mac(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ conformable(lhs,ret); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ obj1 tmp; mac(&tmp,&lhs._odata[ss],&rhs); @@ -78,7 +78,7 @@ namespace Grid { template void sub(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ conformable(lhs,ret); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ obj1 tmp; sub(&tmp,&lhs._odata[ss],&rhs); @@ -88,7 +88,7 @@ namespace Grid { template void add(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ conformable(lhs,ret); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ obj1 tmp; add(&tmp,&lhs._odata[ss],&rhs); @@ -102,7 +102,7 @@ namespace Grid { template void mult(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ conformable(ret,rhs); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ obj1 tmp; mult(&tmp,&lhs,&rhs._odata[ss]); @@ -113,7 +113,7 @@ namespace Grid { template void mac(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ conformable(ret,rhs); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ obj1 tmp; mac(&tmp,&lhs,&rhs._odata[ss]); @@ -124,7 +124,7 @@ namespace Grid { template void sub(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ conformable(ret,rhs); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ obj1 tmp; sub(&tmp,&lhs,&rhs._odata[ss]); @@ -134,7 +134,7 @@ namespace Grid { template void add(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ conformable(ret,rhs); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ obj1 tmp; add(&tmp,&lhs,&rhs._odata[ss]); @@ -145,7 +145,7 @@ namespace Grid { template inline void axpy(Lattice &ret,sobj a,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ vobj tmp = a*lhs._odata[ss]; vstream(ret._odata[ss],tmp+rhs._odata[ss]); diff --git a/lib/lattice/Grid_lattice_base.h b/lib/lattice/Grid_lattice_base.h index 248bf1f7..cd376b32 100644 --- a/lib/lattice/Grid_lattice_base.h +++ b/lib/lattice/Grid_lattice_base.h @@ -64,7 +64,7 @@ public: //////////////////////////////////////////////////////////////////////////////// template inline Lattice & operator=(const LatticeUnaryExpression &expr) { -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ vobj tmp= eval(ss,expr); vstream(_odata[ss] ,tmp); @@ -73,7 +73,7 @@ public: } template inline Lattice & operator=(const LatticeBinaryExpression &expr) { -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ vobj tmp= eval(ss,expr); vstream(_odata[ss] ,tmp); @@ -82,7 +82,7 @@ public: } template inline Lattice & operator=(const LatticeTrinaryExpression &expr) { -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ vobj tmp= eval(ss,expr); vstream(_odata[ss] ,tmp); @@ -95,7 +95,7 @@ public: GridFromExpression(_grid,expr); assert(_grid!=nullptr); _odata.resize(_grid->oSites()); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ _odata[ss] = eval(ss,expr); } @@ -105,7 +105,7 @@ public: GridFromExpression(_grid,expr); assert(_grid!=nullptr); _odata.resize(_grid->oSites()); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ _odata[ss] = eval(ss,expr); } @@ -115,7 +115,7 @@ public: GridFromExpression(_grid,expr); assert(_grid!=nullptr); _odata.resize(_grid->oSites()); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ _odata[ss] = eval(ss,expr); } @@ -133,7 +133,7 @@ public: } template inline Lattice & operator = (const sobj & r){ -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ this->_odata[ss]=r; } @@ -142,7 +142,7 @@ public: template inline Lattice & operator = (const Lattice & r){ conformable(*this,r); std::cout<<"Lattice operator ="<oSites();ss++){ this->_odata[ss]=r._odata[ss]; } @@ -167,7 +167,7 @@ public: inline friend Lattice operator / (const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); Lattice ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ ret._odata[ss] = lhs._odata[ss]/rhs._odata[ss]; } diff --git a/lib/lattice/Grid_lattice_comparison.h b/lib/lattice/Grid_lattice_comparison.h index 82c98572..431cf911 100644 --- a/lib/lattice/Grid_lattice_comparison.h +++ b/lib/lattice/Grid_lattice_comparison.h @@ -15,7 +15,7 @@ namespace Grid { inline Lattice LLComparison(vfunctor op,const Lattice &lhs,const Lattice &rhs) { Lattice ret(rhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites(); ss++){ ret._odata[ss]=op(lhs._odata[ss],rhs._odata[ss]); } @@ -25,7 +25,7 @@ namespace Grid { inline Lattice LSComparison(vfunctor op,const Lattice &lhs,const robj &rhs) { Lattice ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites(); ss++){ ret._odata[ss]=op(lhs._odata[ss],rhs); } @@ -35,7 +35,7 @@ namespace Grid { inline Lattice SLComparison(vfunctor op,const lobj &lhs,const Lattice &rhs) { Lattice ret(rhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites(); ss++){ ret._odata[ss]=op(lhs._odata[ss],rhs); } diff --git a/lib/lattice/Grid_lattice_local.h b/lib/lattice/Grid_lattice_local.h index 181f5be2..7b8bdf9b 100644 --- a/lib/lattice/Grid_lattice_local.h +++ b/lib/lattice/Grid_lattice_local.h @@ -16,7 +16,7 @@ namespace Grid { inline auto localNorm2 (const Lattice &rhs)-> Lattice { Lattice ret(rhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites(); ss++){ ret._odata[ss]=innerProduct(rhs._odata[ss],rhs._odata[ss]); } @@ -29,7 +29,7 @@ namespace Grid { -> Lattice { Lattice ret(rhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites(); ss++){ ret._odata[ss]=innerProduct(lhs._odata[ss],rhs._odata[ss]); } @@ -42,7 +42,7 @@ namespace Grid { inline auto outerProduct (const Lattice &lhs,const Lattice &rhs) -> Lattice { Lattice ret(rhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites(); ss++){ ret._odata[ss]=outerProduct(lhs._odata[ss],rhs._odata[ss]); } diff --git a/lib/lattice/Grid_lattice_overload.h b/lib/lattice/Grid_lattice_overload.h index c4dd3373..24bdd70a 100644 --- a/lib/lattice/Grid_lattice_overload.h +++ b/lib/lattice/Grid_lattice_overload.h @@ -10,7 +10,7 @@ namespace Grid { inline Lattice operator -(const Lattice &r) { Lattice ret(r._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ vstream(ret._odata[ss], -r._odata[ss]); } @@ -47,7 +47,7 @@ namespace Grid { inline auto operator * (const left &lhs,const Lattice &rhs) -> Lattice { Lattice ret(rhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites(); ss++){ decltype(lhs*rhs._odata[0]) tmp=lhs*rhs._odata[ss]; vstream(ret._odata[ss],tmp); @@ -59,7 +59,7 @@ namespace Grid { inline auto operator + (const left &lhs,const Lattice &rhs) -> Lattice { Lattice ret(rhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites(); ss++){ decltype(lhs+rhs._odata[0]) tmp =lhs-rhs._odata[ss]; vstream(ret._odata[ss],tmp); @@ -71,7 +71,7 @@ namespace Grid { inline auto operator - (const left &lhs,const Lattice &rhs) -> Lattice { Lattice ret(rhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites(); ss++){ decltype(lhs-rhs._odata[0]) tmp=lhs-rhs._odata[ss]; vstream(ret._odata[ss],tmp); @@ -83,7 +83,7 @@ namespace Grid { inline auto operator * (const Lattice &lhs,const right &rhs) -> Lattice { Lattice ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites(); ss++){ decltype(lhs._odata[0]*rhs) tmp =lhs._odata[ss]*rhs; vstream(ret._odata[ss],tmp); @@ -95,7 +95,7 @@ namespace Grid { inline auto operator + (const Lattice &lhs,const right &rhs) -> Lattice { Lattice ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites(); ss++){ decltype(lhs._odata[0]+rhs) tmp=lhs._odata[ss]+rhs; vstream(ret._odata[ss],tmp); @@ -107,7 +107,7 @@ namespace Grid { inline auto operator - (const Lattice &lhs,const right &rhs) -> Lattice { Lattice ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites(); ss++){ decltype(lhs._odata[0]-rhs) tmp=lhs._odata[ss]-rhs; vstream(ret._odata[ss],tmp); diff --git a/lib/lattice/Grid_lattice_peekpoke.h b/lib/lattice/Grid_lattice_peekpoke.h index ae87c5d8..ad7dfc50 100644 --- a/lib/lattice/Grid_lattice_peekpoke.h +++ b/lib/lattice/Grid_lattice_peekpoke.h @@ -15,7 +15,7 @@ namespace Grid { -> Lattice(lhs._odata[0]))> { Lattice(lhs._odata[0]))> ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ ret._odata[ss] = peekIndex(lhs._odata[ss]); } @@ -26,7 +26,7 @@ namespace Grid { -> Lattice(lhs._odata[0],i))> { Lattice(lhs._odata[0],i))> ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ ret._odata[ss] = peekIndex(lhs._odata[ss],i); } @@ -37,7 +37,7 @@ namespace Grid { -> Lattice(lhs._odata[0],i,j))> { Lattice(lhs._odata[0],i,j))> ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ ret._odata[ss] = peekIndex(lhs._odata[ss],i,j); } @@ -50,7 +50,7 @@ namespace Grid { template inline void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0]))> & rhs) { -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ pokeIndex(lhs._odata[ss],rhs._odata[ss]); } @@ -58,7 +58,7 @@ namespace Grid { template inline void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0],0))> & rhs,int i) { -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ pokeIndex(lhs._odata[ss],rhs._odata[ss],i); } @@ -66,7 +66,7 @@ namespace Grid { template inline void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0],0,0))> & rhs,int i,int j) { -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ pokeIndex(lhs._odata[ss],rhs._odata[ss],i,j); } diff --git a/lib/lattice/Grid_lattice_reality.h b/lib/lattice/Grid_lattice_reality.h index a3a7a27f..cf86d700 100644 --- a/lib/lattice/Grid_lattice_reality.h +++ b/lib/lattice/Grid_lattice_reality.h @@ -11,7 +11,7 @@ namespace Grid { template inline Lattice adj(const Lattice &lhs){ Lattice ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ ret._odata[ss] = adj(lhs._odata[ss]); } @@ -20,7 +20,7 @@ namespace Grid { template inline Lattice conj(const Lattice &lhs){ Lattice ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ ret._odata[ss] = conj(lhs._odata[ss]); } @@ -30,7 +30,7 @@ namespace Grid { template inline auto real(const Lattice &z) -> Lattice { Lattice ret(z._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ ret._odata[ss] = real(z._odata[ss]); } @@ -40,7 +40,7 @@ namespace Grid { template inline auto imag(const Lattice &z) -> Lattice { Lattice ret(z._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ ret._odata[ss] = imag(z._odata[ss]); } diff --git a/lib/lattice/Grid_lattice_reduction.h b/lib/lattice/Grid_lattice_reduction.h index 679effb0..a6d3e0dc 100644 --- a/lib/lattice/Grid_lattice_reduction.h +++ b/lib/lattice/Grid_lattice_reduction.h @@ -7,69 +7,85 @@ namespace Grid { #endif //////////////////////////////////////////////////////////////////////////////////////////////////// - // Reduction operations + // Deterministic Reduction operations //////////////////////////////////////////////////////////////////////////////////////////////////// - template - inline RealD norm2(const Lattice &arg){ - - typedef typename vobj::scalar_type scalar; - typedef typename vobj::vector_type vector; - decltype(innerProduct(arg._odata[0],arg._odata[0])) vnrm; - scalar nrm; - //FIXME make this loop parallelisable - vnrm=zero; - for(int ss=0;ssoSites(); ss++){ - vnrm = vnrm + innerProduct(arg._odata[ss],arg._odata[ss]); - } - vector vvnrm =TensorRemove(vnrm) ; - nrm = Reduce(vvnrm); - arg._grid->GlobalSum(nrm); - return real(nrm); - } + template inline RealD norm2(const Lattice &arg){ + ComplexD nrm = innerProduct(arg,arg); + return real(nrm); + } template inline ComplexD innerProduct(const Lattice &left,const Lattice &right) - // inline auto innerProduct(const Lattice &left,const Lattice &right) - //->decltype(innerProduct(left._odata[0],right._odata[0])) { - typedef typename vobj::scalar_type scalar; - decltype(innerProduct(left._odata[0],right._odata[0])) vnrm; + typedef typename vobj::scalar_type scalar_type; + typedef typename vobj::vector_type vector_type; + vector_type vnrm; + scalar_type nrm; - scalar nrm; - //FIXME make this loop parallelisable - vnrm=zero; - for(int ss=0;ssoSites(); ss++){ - vnrm = vnrm + innerProduct(left._odata[ss],right._odata[ss]); + GridBase *grid = left._grid; + + std::vector > sumarray(grid->SumArraySize()); + for(int i=0;iSumArraySize();i++){ + sumarray[i]=zero; } - nrm = Reduce(vnrm); + +PARALLEL_FOR_LOOP + for(int thr=0;thrSumArraySize();thr++){ + + int nwork, mywork, myoff; + GridThread::GetWork(left._grid->oSites(),thr,mywork,myoff); + + decltype(innerProduct(left._odata[0],right._odata[0])) vnrm=zero; // private to thread; sub summation + for(int ss=myoff;ssSumArraySize();i++){ + vvnrm = vvnrm+sumarray[i]; + } + nrm = Reduce(vvnrm);// sum across simd right._grid->GlobalSum(nrm); return nrm; } template - inline typename vobj::scalar_object sum(const Lattice &arg){ + inline typename vobj::scalar_object sum(const Lattice &arg){ GridBase *grid=arg._grid; int Nsimd = grid->Nsimd(); - typedef typename vobj::scalar_object sobj; - typedef typename vobj::scalar_type scalar_type; - - vobj vsum; - sobj ssum; - - vsum=zero; - ssum=zero; - //FIXME make this loop parallelisable - for(int ss=0;ssoSites(); ss++){ - vsum = vsum + arg._odata[ss]; + std::vector > sumarray(grid->SumArraySize()); + for(int i=0;iSumArraySize();i++){ + sumarray[i]=zero; } - + +PARALLEL_FOR_LOOP + for(int thr=0;thrSumArraySize();thr++){ + int nwork, mywork, myoff; + GridThread::GetWork(grid->oSites(),thr,mywork,myoff); + + vobj vvsum=zero; + for(int ss=myoff;ssSumArraySize();i++){ + vsum = vsum+sumarray[i]; + } + + typedef typename vobj::scalar_object sobj; + sobj ssum=zero; + std::vector buf(Nsimd); extract(vsum,buf); for(int i=0;iGlobalSum(ssum); return ssum; @@ -77,13 +93,15 @@ namespace Grid { - template inline void sliceSum(const Lattice &Data,std::vector &result,int orthogdim) { typedef typename vobj::scalar_object sobj; - GridBase *grid = Data._grid; assert(grid!=NULL); + + // FIXME + std::cout<<"WARNING ! SliceSum is unthreaded "<SumArraySize()<<" threads "<_ndimension; const int Nsimd = grid->Nsimd(); @@ -94,10 +112,8 @@ template inline void sliceSum(const Lattice &Data,std::vector< int ld=grid->_ldimensions[orthogdim]; int rd=grid->_rdimensions[orthogdim]; - sobj szero; szero=zero; - std::vector > lvSum(rd); // will locally sum vectors first - std::vector lsSum(ld,szero); // sum across these down to scalars + std::vector lsSum(ld,zero); // sum across these down to scalars std::vector extracted(Nsimd); // splitting the SIMD result.resize(fd); // And then global sum to return the same vector to every node for IO to file @@ -108,6 +124,7 @@ template inline void sliceSum(const Lattice &Data,std::vector< std::vector coor(Nd); // sum over reduced dimension planes, breaking out orthog dir + for(int ss=0;ssoSites();ss++){ GridBase::CoorFromIndex(coor,ss,grid->_rdimensions); int r = coor[orthogdim]; diff --git a/lib/lattice/Grid_lattice_trace.h b/lib/lattice/Grid_lattice_trace.h index 8c7607d8..72f984f9 100644 --- a/lib/lattice/Grid_lattice_trace.h +++ b/lib/lattice/Grid_lattice_trace.h @@ -15,7 +15,7 @@ namespace Grid { -> Lattice { Lattice ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ ret._odata[ss] = trace(lhs._odata[ss]); } @@ -30,7 +30,7 @@ namespace Grid { -> Lattice(lhs._odata[0]))> { Lattice(lhs._odata[0]))> ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ ret._odata[ss] = traceIndex(lhs._odata[ss]); } diff --git a/lib/lattice/Grid_lattice_transfer.h b/lib/lattice/Grid_lattice_transfer.h index 53973741..27ae27e1 100644 --- a/lib/lattice/Grid_lattice_transfer.h +++ b/lib/lattice/Grid_lattice_transfer.h @@ -23,7 +23,7 @@ inline void subdivides(GridBase *coarse,GridBase *fine) template inline void pickCheckerboard(int cb,Lattice &half,const Lattice &full){ half.checkerboard = cb; int ssh=0; -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ std::vector coor; int cbos; @@ -41,7 +41,7 @@ inline void subdivides(GridBase *coarse,GridBase *fine) template inline void setCheckerboard(Lattice &full,const Lattice &half){ int cb = half.checkerboard; int ssh=0; -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ std::vector coor; int cbos; diff --git a/lib/lattice/Grid_lattice_transpose.h b/lib/lattice/Grid_lattice_transpose.h index 7166d2b5..c8e7433f 100644 --- a/lib/lattice/Grid_lattice_transpose.h +++ b/lib/lattice/Grid_lattice_transpose.h @@ -13,7 +13,7 @@ namespace Grid { template inline Lattice transpose(const Lattice &lhs){ Lattice ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ ret._odata[ss] = transpose(lhs._odata[ss]); } @@ -28,7 +28,7 @@ namespace Grid { -> Lattice(lhs._odata[0]))> { Lattice(lhs._odata[0]))> ret(lhs._grid); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ ret._odata[ss] = transposeIndex(lhs._odata[ss]); } diff --git a/lib/Grid_where.h b/lib/lattice/Grid_lattice_where.h similarity index 95% rename from lib/Grid_where.h rename to lib/lattice/Grid_lattice_where.h index 588c0596..84d7471c 100644 --- a/lib/Grid_where.h +++ b/lib/lattice/Grid_lattice_where.h @@ -1,5 +1,5 @@ -#ifndef GRID_WHERE_H -#define GRID_WHERE_H +#ifndef GRID_LATTICE_WHERE_H +#define GRID_LATTICE_WHERE_H namespace Grid { // Must implement the predicate gating the // Must be able to reduce the predicate down to a single vInteger per site. @@ -27,7 +27,7 @@ inline void where(Lattice &ret,const Lattice &predicate,Lattice truevals (Nsimd); std::vector falsevals(Nsimd); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites(); ss++){ extract(iftrue._odata[ss] ,truevals); diff --git a/lib/math/Grid_math_reality.h b/lib/math/Grid_math_reality.h index 1bf34f2a..18a2f89b 100644 --- a/lib/math/Grid_math_reality.h +++ b/lib/math/Grid_math_reality.h @@ -6,23 +6,20 @@ namespace Grid { /////////////////////////////////////////// CONJ /////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// -#ifdef GRID_WARN_SUBOPTIMAL -#warning "Optimisation alert switch over to two argument form to avoid copy back in perf critical timesI " -#endif /////////////////////////////////////////////// // multiply by I; make recursive. /////////////////////////////////////////////// template inline iScalar timesI(const iScalar&r) { iScalar ret; - ret._internal = timesI(r._internal); + timesI(ret._internal,r._internal); return ret; } template inline iVector timesI(const iVector&r) { iVector ret; for(int i=0;i inline iMatrix timesI(const iMatrix ret; for(int i=0;i inline void timesI(iScalar &ret,const iScalar&r) +{ + timesI(ret._internal,r._internal); +} +template inline void timesI(iVector &ret,const iVector&r) +{ + for(int i=0;i inline void timesI(iMatrix &ret,const iMatrix&r) +{ + for(int i=0;i inline iScalar timesMinusI(const iScalar&r) { iScalar ret; - ret._internal = timesMinusI(r._internal); + timesMinusI(ret._internal,r._internal); return ret; } template inline iVector timesMinusI(const iVector&r) { iVector ret; for(int i=0;i inline iMatrix timesMinusI(const iMatrix ret; for(int i=0;i inline void timesMinusI(iScalar &ret,const iScalar&r) +{ + timesMinusI(ret._internal,r._internal); +} +template inline void timesMinusI(iVector &ret,const iVector&r) +{ + for(int i=0;i inline void timesMinusI(iMatrix &ret,const iMatrix&r) +{ + for(int i=0;ioSites();sss++){ int ss = sss; diff --git a/lib/simd/Grid_vComplexD.h b/lib/simd/Grid_vComplexD.h index ef5da859..f0bc2da4 100644 --- a/lib/simd/Grid_vComplexD.h +++ b/lib/simd/Grid_vComplexD.h @@ -13,6 +13,9 @@ namespace Grid { vzero(*this); return (*this); } + vComplexD( Zero & z){ + vzero(*this); + } vComplexD()=default; vComplexD(ComplexD a){ vsplat(*this,a); @@ -286,8 +289,8 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ return ret; } - friend inline vComplexD timesMinusI(const vComplexD &in){ - vComplexD ret; vzero(ret); + friend inline void timesMinusI(vComplexD &ret,const vComplexD &in){ + vzero(ret); vComplexD tmp; #if defined (AVX1)|| defined (AVX2) tmp.v =_mm256_addsub_pd(ret.v,in.v); // r,-i @@ -304,11 +307,10 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ #ifdef QPX assert(0); #endif - return ret; } - friend inline vComplexD timesI(const vComplexD &in){ - vComplexD ret; vzero(ret); + friend inline void timesI(vComplexD &ret, const vComplexD &in){ + vzero(ret); vComplexD tmp; #if defined (AVX1)|| defined (AVX2) tmp.v =_mm256_shuffle_pd(in.v,in.v,0x5); @@ -325,9 +327,21 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ #ifdef QPX assert(0); #endif + } + + friend inline vComplexD timesMinusI(const vComplexD &in){ + vComplexD ret; + timesMinusI(ret,in); return ret; } + friend inline vComplexD timesI(const vComplexD &in){ + vComplexD ret; + timesI(ret,in); + return ret; + } + + // REDUCE FIXME must be a cleaner implementation friend inline ComplexD Reduce(const vComplexD & in) { diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index 34510333..202dce43 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -28,6 +28,9 @@ namespace Grid { vzero(*this); return (*this); } + vComplexF( Zero & z){ + vzero(*this); + } vComplexF()=default; vComplexF(ComplexF a){ vsplat(*this,a); @@ -363,8 +366,7 @@ namespace Grid { #endif return ret; } - friend inline vComplexF timesMinusI(const vComplexF &in){ - vComplexF ret; + friend inline void timesMinusI( vComplexF &ret,const vComplexF &in){ vzero(ret); #if defined (AVX1)|| defined (AVX2) cvec tmp =_mm256_addsub_ps(ret.v,in.v); // r,-i @@ -381,10 +383,9 @@ namespace Grid { #ifdef QPX assert(0); #endif - return ret; } - friend inline vComplexF timesI(const vComplexF &in){ - vComplexF ret; vzero(ret); + friend inline void timesI(vComplexF &ret,const vComplexF &in){ + vzero(ret); #if defined (AVX1)|| defined (AVX2) cvec tmp =_mm256_shuffle_ps(in.v,in.v,_MM_SHUFFLE(2,3,0,1));//i,r ret.v =_mm256_addsub_ps(ret.v,tmp); //i,-r @@ -400,8 +401,18 @@ namespace Grid { #ifdef QPX assert(0); #endif + } + friend inline vComplexF timesMinusI(const vComplexF &in){ + vComplexF ret; + timesMinusI(ret,in); return ret; } + friend inline vComplexF timesI(const vComplexF &in){ + vComplexF ret; + timesI(ret,in); + return ret; + } + // Unary negation friend inline vComplexF operator -(const vComplexF &r) { diff --git a/lib/simd/Grid_vRealD.h b/lib/simd/Grid_vRealD.h index 4d5e2f57..aef143f8 100644 --- a/lib/simd/Grid_vRealD.h +++ b/lib/simd/Grid_vRealD.h @@ -17,6 +17,10 @@ namespace Grid { vRealD(Zero &zero){ zeroit(*this); } + vRealD & operator = ( Zero & z){ + vzero(*this); + return (*this); + } friend inline void mult(vRealD * __restrict__ y,const vRealD * __restrict__ l,const vRealD *__restrict__ r) {*y = (*l) * (*r);} friend inline void sub (vRealD * __restrict__ y,const vRealD * __restrict__ l,const vRealD *__restrict__ r) {*y = (*l) - (*r);} diff --git a/lib/simd/Grid_vRealF.h b/lib/simd/Grid_vRealF.h index 79e1b91f..559a9eda 100644 --- a/lib/simd/Grid_vRealF.h +++ b/lib/simd/Grid_vRealF.h @@ -18,6 +18,10 @@ namespace Grid { vRealF(Zero &zero){ zeroit(*this); } + vRealF & operator = ( Zero & z){ + vzero(*this); + return (*this); + } //////////////////////////////////// // Arithmetic operator overloads +,-,* //////////////////////////////////// diff --git a/tests/Grid_gamma.cc b/tests/Grid_gamma.cc index ba298b19..f5582955 100644 --- a/tests/Grid_gamma.cc +++ b/tests/Grid_gamma.cc @@ -50,9 +50,8 @@ int main (int argc, char ** argv) // std::cout << " Is triv Scalar " < >::value << std::endl; // std::cout << " Is triv Scalar "< >::value << std::endl; - std::complex c(1.0); for(int a=0;a Date: Tue, 12 May 2015 20:41:44 +0100 Subject: [PATCH 147/429] Enhanced SIMD interfacing --- benchmarks/Grid_comms.cc | 2 +- benchmarks/Grid_memory_bandwidth.cc | 4 +--- benchmarks/Grid_wilson.cc | 2 +- lib/Grid.h | 2 +- lib/Grid_init.cc | 34 ++++++++++++++--------------- lib/lattice/Grid_lattice_ET.h | 8 +++---- lib/lattice/Grid_lattice_arith.h | 2 +- lib/lattice/Grid_lattice_base.h | 14 +++++++----- lib/simd/Grid_vComplexF.h | 6 ++--- tests/Grid_cshift.cc | 2 +- tests/Grid_gamma.cc | 2 +- tests/Grid_main.cc | 2 +- tests/Grid_nersc_io.cc | 2 +- tests/Grid_simd.cc | 2 +- tests/Grid_stencil.cc | 2 +- 15 files changed, 43 insertions(+), 43 deletions(-) diff --git a/benchmarks/Grid_comms.cc b/benchmarks/Grid_comms.cc index 3dedfb5b..810cfd06 100644 --- a/benchmarks/Grid_comms.cc +++ b/benchmarks/Grid_comms.cc @@ -8,7 +8,7 @@ int main (int argc, char ** argv) { Grid_init(&argc,&argv); - std::vector simd_layout = GridDefaultSimd(); + std::vector simd_layout = GridDefaultSimd(Nd,vComplexD::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); int Nloop=10; diff --git a/benchmarks/Grid_memory_bandwidth.cc b/benchmarks/Grid_memory_bandwidth.cc index cb444128..5a4d1f18 100644 --- a/benchmarks/Grid_memory_bandwidth.cc +++ b/benchmarks/Grid_memory_bandwidth.cc @@ -13,7 +13,7 @@ int main (int argc, char ** argv) int Nloop=1000; - std::vector simd_layout = GridDefaultSimd(); + std::vector simd_layout = GridDefaultSimd(Nd,vReal::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); std::cout << "===================================================================================================="< latt_size = GridDefaultLatt(); - std::vector simd_layout = GridDefaultSimd(); + std::vector simd_layout = GridDefaultSimd(Nd,vComplexF::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); GridCartesian Grid(latt_size,simd_layout,mpi_layout); diff --git a/lib/Grid.h b/lib/Grid.h index 4512f443..bd7b371a 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -71,7 +71,7 @@ namespace Grid { // C++11 time facilities better? double usecond(void); - const std::vector &GridDefaultSimd(void); + const std::vector GridDefaultSimd(int dims,int nsimd); const std::vector &GridDefaultLatt(void); const std::vector &GridDefaultMpi(void); const int &GridThreads(void) ; diff --git a/lib/Grid_init.cc b/lib/Grid_init.cc index 9e977064..c804e810 100644 --- a/lib/Grid_init.cc +++ b/lib/Grid_init.cc @@ -27,14 +27,28 @@ namespace Grid { // Convenience functions to access stadard command line arg // driven parallelism controls ////////////////////////////////////////////////////// - static std::vector Grid_default_simd; static std::vector Grid_default_latt; static std::vector Grid_default_mpi; int GridThread::_threads; + const std::vector GridDefaultSimd(int dims,int nsimd) + { + std::vector layout(dims); + int nn=nsimd; + for(int d=dims-1;d>=0;d--){ + if ( nn>=2) { + layout[d]=2; + nn/=2; + } else { + layout[d]=1; + } + } + assert(nn==1); + return layout; + } - const std::vector &GridDefaultSimd(void) {return Grid_default_simd;}; + const std::vector &GridDefaultLatt(void) {return Grid_default_latt;}; const std::vector &GridDefaultMpi(void) {return Grid_default_mpi;}; @@ -71,22 +85,11 @@ void GridCmdOptionIntVector(std::string &str,std::vector & vec) void GridParseLayout(char **argv,int argc, std::vector &latt, - std::vector &simd, std::vector &mpi) { mpi =std::vector({1,1,1,1}); latt=std::vector({8,8,8,8}); -#if defined(SSE4) - simd=std::vector({1,1,1,2}); -#endif -#if defined(AVX1) || defined (AVX2) - simd=std::vector({1,1,2,2}); -#endif -#if defined(AVX512) - simd=std::vector({1,2,2,2}); -#endif - GridThread::SetMaxThreads(); std::string arg; @@ -94,10 +97,6 @@ void GridParseLayout(char **argv,int argc, arg = GridCmdOptionPayload(argv,argv+argc,"--mpi"); GridCmdOptionIntVector(arg,mpi); } - if( GridCmdOptionExists(argv,argv+argc,"--simd") ){ - arg= GridCmdOptionPayload(argv,argv+argc,"--simd"); - GridCmdOptionIntVector(arg,simd); - } if( GridCmdOptionExists(argv,argv+argc,"--grid") ){ arg= GridCmdOptionPayload(argv,argv+argc,"--grid"); GridCmdOptionIntVector(arg,latt); @@ -129,7 +128,6 @@ void Grid_init(int *argc,char ***argv) } GridParseLayout(*argv,*argc, Grid_default_latt, - Grid_default_simd, Grid_default_mpi); } diff --git a/lib/lattice/Grid_lattice_ET.h b/lib/lattice/Grid_lattice_ET.h index d4fd7d05..c0b5f97d 100644 --- a/lib/lattice/Grid_lattice_ET.h +++ b/lib/lattice/Grid_lattice_ET.h @@ -67,6 +67,10 @@ inline void GridFromExpression(GridBase * &grid,const T1& lat) // Lattice leaf } grid=lat._grid; } +template::value, T1>::type * = nullptr > +inline void GridFromExpression(GridBase * &grid,const T1& notlat) // non-lattice leaf +{ +} template inline void GridFromExpression(GridBase * &grid,const LatticeUnaryExpression &expr) { @@ -86,10 +90,6 @@ inline void GridFromExpression( GridBase * &grid,const LatticeTrinaryExpression< GridFromExpression(grid,std::get<1>(expr.second)); GridFromExpression(grid,std::get<2>(expr.second)); } -template::value, T1>::type * = nullptr > -inline void GridFromExpression(GridBase * &grid,const T1& notlat) // non-lattice leaf -{ -} //////////////////////////////////////////// // Unary operators and funcs diff --git a/lib/lattice/Grid_lattice_arith.h b/lib/lattice/Grid_lattice_arith.h index c1d58b86..10f31025 100644 --- a/lib/lattice/Grid_lattice_arith.h +++ b/lib/lattice/Grid_lattice_arith.h @@ -145,7 +145,7 @@ PARALLEL_FOR_LOOP template inline void axpy(Lattice &ret,sobj a,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); -PARALLEL_FOR_LOOP +#pragma omp parallel for for(int ss=0;ssoSites();ss++){ vobj tmp = a*lhs._odata[ss]; vstream(ret._odata[ss],tmp+rhs._odata[ss]); diff --git a/lib/lattice/Grid_lattice_base.h b/lib/lattice/Grid_lattice_base.h index cd376b32..ace7565d 100644 --- a/lib/lattice/Grid_lattice_base.h +++ b/lib/lattice/Grid_lattice_base.h @@ -64,7 +64,8 @@ public: //////////////////////////////////////////////////////////////////////////////// template inline Lattice & operator=(const LatticeUnaryExpression &expr) { -PARALLEL_FOR_LOOP + //PARALLEL_FOR_LOOP +#pragma omp parallel for for(int ss=0;ss<_grid->oSites();ss++){ vobj tmp= eval(ss,expr); vstream(_odata[ss] ,tmp); @@ -73,7 +74,8 @@ PARALLEL_FOR_LOOP } template inline Lattice & operator=(const LatticeBinaryExpression &expr) { -PARALLEL_FOR_LOOP + // PARALLEL_FOR_LOOP +#pragma omp parallel for for(int ss=0;ss<_grid->oSites();ss++){ vobj tmp= eval(ss,expr); vstream(_odata[ss] ,tmp); @@ -82,7 +84,8 @@ PARALLEL_FOR_LOOP } template inline Lattice & operator=(const LatticeTrinaryExpression &expr) { -PARALLEL_FOR_LOOP + //PARALLEL_FOR_LOOP +#pragma omp parallel for for(int ss=0;ss<_grid->oSites();ss++){ vobj tmp= eval(ss,expr); vstream(_odata[ss] ,tmp); @@ -176,15 +179,16 @@ PARALLEL_FOR_LOOP }; // class Lattice } -#undef GRID_LATTICE_EXPRESSION_TEMPLATES #include -#ifdef GRID_LATTICE_EXPRESSION_TEMPLATES +#define GRID_LATTICE_EXPRESSION_TEMPLATES +#ifdef GRID_LATTICE_EXPRESSION_TEMPLATES #include #else #include #endif + #include #include diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index 202dce43..cd757916 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -28,9 +28,9 @@ namespace Grid { vzero(*this); return (*this); } - vComplexF( Zero & z){ - vzero(*this); - } + // vComplexF( Zero & z){ + // vzero(*this); + // } vComplexF()=default; vComplexF(ComplexF a){ vsplat(*this,a); diff --git a/tests/Grid_cshift.cc b/tests/Grid_cshift.cc index e92ff793..d0c83e30 100644 --- a/tests/Grid_cshift.cc +++ b/tests/Grid_cshift.cc @@ -9,7 +9,7 @@ int main (int argc, char ** argv) Grid_init(&argc,&argv); std::vector latt_size = GridDefaultLatt(); - std::vector simd_layout = GridDefaultSimd(); + std::vector simd_layout = GridDefaultSimd(4,vComplexF::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); GridCartesian Fine(latt_size,simd_layout,mpi_layout); diff --git a/tests/Grid_gamma.cc b/tests/Grid_gamma.cc index f5582955..e803029b 100644 --- a/tests/Grid_gamma.cc +++ b/tests/Grid_gamma.cc @@ -15,7 +15,7 @@ int main (int argc, char ** argv) Grid_init(&argc,&argv); std::vector latt_size = GridDefaultLatt(); - std::vector simd_layout = GridDefaultSimd(); + std::vector simd_layout = GridDefaultSimd(4,vComplexF::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); GridCartesian Grid(latt_size,simd_layout,mpi_layout); diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index c3454dfc..7515ebd1 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -26,7 +26,7 @@ int main (int argc, char ** argv) Grid_init(&argc,&argv); std::vector latt_size = GridDefaultLatt(); - std::vector simd_layout = GridDefaultSimd(); + std::vector simd_layout = GridDefaultSimd(4,vComplexF::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); latt_size.resize(4); diff --git a/tests/Grid_nersc_io.cc b/tests/Grid_nersc_io.cc index 73d7edfe..fbef3cb1 100644 --- a/tests/Grid_nersc_io.cc +++ b/tests/Grid_nersc_io.cc @@ -11,7 +11,7 @@ int main (int argc, char ** argv) Grid_init(&argc,&argv); - std::vector simd_layout = GridDefaultSimd(); + std::vector simd_layout = GridDefaultSimd(4,vComplexF::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); std::vector latt_size ({16,16,16,32}); std::vector clatt_size ({4,4,4,8}); diff --git a/tests/Grid_simd.cc b/tests/Grid_simd.cc index 6a957d7e..32f4cdfb 100644 --- a/tests/Grid_simd.cc +++ b/tests/Grid_simd.cc @@ -107,7 +107,7 @@ int main (int argc, char ** argv) Grid_init(&argc,&argv); std::vector latt_size = GridDefaultLatt(); - std::vector simd_layout = GridDefaultSimd(); + std::vector simd_layout = GridDefaultSimd(4,vComplexF::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); GridCartesian Grid(latt_size,simd_layout,mpi_layout); diff --git a/tests/Grid_stencil.cc b/tests/Grid_stencil.cc index d9e779bf..1fdb7265 100644 --- a/tests/Grid_stencil.cc +++ b/tests/Grid_stencil.cc @@ -10,7 +10,7 @@ int main (int argc, char ** argv) std::vector latt_size = GridDefaultLatt(); - std::vector simd_layout = GridDefaultSimd(); + std::vector simd_layout = GridDefaultSimd(Nd,vComplexF::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); double volume = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; From 541d52ab9754db9bfd1eaeef537d45549455aa4f Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 13 May 2015 00:31:00 +0100 Subject: [PATCH 148/429] I have made the Cshift work successfully with open mp threading in every routine. Collapse(2) is now working under clang-omp++. --- Makefile.in | 8 +- TODO | 23 +- aclocal.m4 | 64 -- benchmarks/Grid_wilson.cc | 2 +- configure | 1004 ++++--------------------------- configure-commands | 1 + configure.ac | 1 + lib/Grid.h | 10 +- lib/Grid_stencil.h | 6 +- lib/Grid_threads.h | 16 +- lib/cshift/Grid_cshift_common.h | 26 +- lib/cshift/Grid_cshift_mpi.h | 4 - lib/qcd/Grid_qcd_wilson_dop.cc | 7 +- 13 files changed, 166 insertions(+), 1006 deletions(-) diff --git a/Makefile.in b/Makefile.in index c9257ab2..c9b848f3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -205,12 +205,9 @@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ +CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ @@ -234,7 +231,7 @@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ -OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -252,7 +249,6 @@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ diff --git a/TODO b/TODO index 6a1624f7..b596c605 100644 --- a/TODO +++ b/TODO @@ -2,10 +2,7 @@ *** Hacks and bug fixes to clean up and Audits ================================================================ * Base class to share common code between vRealF, VComplexF etc... - -* Performance check on Guido's reimplementation strategy - -* Bug in SeedFixedIntegers gives same output on each site. -- Think I fixed but NOT checked for sure + - Performance check on Guido's reimplementation strategy * FIXME audit * const audit @@ -20,15 +17,16 @@ *** New Functionality ================================================================ -* Implement where to take template scheme. +* Implement where within expression template scheme. * - BinaryWriter, TextWriter etc... - use protocol buffers? replace xmlReader/Writer ec.. - Binary use htonll, htonl -* Expression template engine: +* Bug in SeedFixedIntegers gave same output on each site. -- Think I fixed but NOT checked for sure + Implement and use lattice IO to verify this. - -- Audit +* Expression template engine: -- DONE -- Norm2(expression) problem: introduce norm2 unary op, or Introduce conversion automatic from expression to Lattice * CovariantShift support -----Use a class to store gauge field? (parallel transport?) @@ -56,9 +54,10 @@ * TaProj * FFTnD ? -* Parallel MPI2 IO - Plaquette checks into nersc reader. - +* Parallel io improvements + - optional parallel MPI2 IO + - move Plaquette and link trace checks into nersc reader from the Grid_nersc_io.cc test. + * rb4d support for 5th dimension in Mobius. * Check for missing functionality - partially audited against QDP++ layout @@ -70,13 +69,15 @@ // copyMask. // localMaxAbs // Fourier transform equivalent. -Actions + +Actions -- coherent framework for implementing actions and their forces. * Fermion - Wilson - Clover - DomainWall - Mobius - z-Mobius + * Gauge - Wilson, symanzik, iwasaki diff --git a/aclocal.m4 b/aclocal.m4 index f3018f6c..bf79d078 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -765,70 +765,6 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# _AM_PROG_CC_C_O -# --------------- -# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC -# to automatically call this. -AC_DEFUN([_AM_PROG_CC_C_O], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -AC_LANG_PUSH([C])dnl -AC_CACHE_CHECK( - [whether $CC understands -c and -o together], - [am_cv_prog_cc_c_o], - [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i]) -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -AC_LANG_POP([C])]) - -# For backward compatibility. -AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) - -# Copyright (C) 2001-2014 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_RUN_LOG(COMMAND) -# ------------------- -# Run COMMAND, save the exit status in ac_status, and log it. -# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) -AC_DEFUN([AM_RUN_LOG], -[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD - ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD - (exit $ac_status); }]) - # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. diff --git a/benchmarks/Grid_wilson.cc b/benchmarks/Grid_wilson.cc index de31413f..9ce13090 100644 --- a/benchmarks/Grid_wilson.cc +++ b/benchmarks/Grid_wilson.cc @@ -77,7 +77,7 @@ int main (int argc, char ** argv) WilsonMatrix Dw(Umu,mass); std::cout << "Calling Dw"< CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory - CC C compiler command - CFLAGS C compiler flags - CPP C preprocessor + CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -1500,48 +1490,10 @@ fi } # ac_fn_cxx_try_compile -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_c_try_link LINENO -# ----------------------- +# ac_fn_cxx_try_link LINENO +# ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () +ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext @@ -1561,7 +1513,7 @@ $as_echo "$ac_try_echo"; } >&5 fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || + test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || @@ -1582,12 +1534,12 @@ fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval -} # ac_fn_c_try_link +} # ac_fn_cxx_try_link -# ac_fn_c_try_cpp LINENO -# ---------------------- +# ac_fn_cxx_try_cpp LINENO +# ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () +ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" @@ -1606,7 +1558,7 @@ $as_echo "$ac_try_echo"; } >&5 fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 @@ -1619,14 +1571,14 @@ fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval -} # ac_fn_c_try_cpp +} # ac_fn_cxx_try_cpp -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- +# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES +# --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. -ac_fn_c_check_header_mongrel () +ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : @@ -1647,7 +1599,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext $4 #include <$2> _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no @@ -1663,7 +1615,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no @@ -1673,7 +1625,7 @@ rm -f conftest.err conftest.i conftest.$ac_ext $as_echo "$ac_header_preproc" >&6; } # So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( +case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} @@ -1710,13 +1662,13 @@ $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -} # ac_fn_c_check_header_mongrel +} # ac_fn_cxx_check_header_mongrel -# ac_fn_c_try_run LINENO -# ---------------------- +# ac_fn_cxx_try_run LINENO +# ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. -ac_fn_c_try_run () +ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" @@ -1752,13 +1704,13 @@ fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval -} # ac_fn_c_try_run +} # ac_fn_cxx_try_run -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- +# ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES +# --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () +ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 @@ -1771,7 +1723,7 @@ else $4 #include <$2> _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" @@ -1783,13 +1735,13 @@ eval ac_res=\$$3 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -} # ac_fn_c_check_header_compile +} # ac_fn_cxx_check_header_compile -# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES -# --------------------------------------------- +# ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES +# ----------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. -ac_fn_c_check_decl () +ac_fn_cxx_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` @@ -1817,7 +1769,7 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" @@ -1829,13 +1781,13 @@ eval ac_res=\$$3 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -} # ac_fn_c_check_decl +} # ac_fn_cxx_check_decl -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- +# ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES +# --------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. -ac_fn_c_check_type () +ac_fn_cxx_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 @@ -1856,7 +1808,7 @@ if (sizeof ($2)) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @@ -1869,7 +1821,7 @@ if (sizeof (($2))) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO"; then : else eval "$3=yes" @@ -1883,7 +1835,7 @@ eval ac_res=\$$3 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -} # ac_fn_c_check_type +} # ac_fn_cxx_check_type # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ @@ -1916,7 +1868,7 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( @@ -1939,10 +1891,10 @@ $as_echo "$ac_res" >&6; } } # ac_fn_c_find_uintX_t -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- +# ac_fn_cxx_check_func LINENO FUNC VAR +# ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () +ac_fn_cxx_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 @@ -1991,7 +1943,7 @@ return $2 (); return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_cxx_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" @@ -2004,7 +1956,7 @@ eval ac_res=\$$3 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -} # ac_fn_c_check_func +} # ac_fn_cxx_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. @@ -2971,6 +2923,12 @@ ac_config_headers="$ac_config_headers lib/Grid_config.h" # Checks for programs. +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -3472,11 +3430,11 @@ else CXXFLAGS= fi fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" @@ -3669,744 +3627,18 @@ else fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } -if ${am_cv_prog_cc_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 - ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -$as_echo "$am_cv_prog_cc_c_o" >&6; } -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if ${am_cv_CC_dependencies_compiler_type+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - - - - OPENMP_CFLAGS= + OPENMP_CXXFLAGS= # Check whether --enable-openmp was given. if test "${enable_openmp+set}" = set; then : enableval=$enable_openmp; fi if test "$enable_openmp" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5 -$as_echo_n "checking for $CC option to support OpenMP... " >&6; } -if ${ac_cv_prog_c_openmp+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CXX option to support OpenMP" >&5 +$as_echo_n "checking for $CXX option to support OpenMP... " >&6; } +if ${ac_cv_prog_cxx_openmp+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4419,14 +3651,14 @@ else int main () { return omp_get_num_threads (); } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_prog_c_openmp='none needed' +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_prog_cxx_openmp='none needed' else - ac_cv_prog_c_openmp='unsupported' + ac_cv_prog_cxx_openmp='unsupported' for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ -Popenmp --openmp; do - ac_save_CFLAGS=$CFLAGS - CFLAGS="$CFLAGS $ac_option" + ac_save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $ac_option" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4437,13 +3669,13 @@ else int main () { return omp_get_num_threads (); } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_prog_c_openmp=$ac_option +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_prog_cxx_openmp=$ac_option fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext - CFLAGS=$ac_save_CFLAGS - if test "$ac_cv_prog_c_openmp" != unsupported; then + CXXFLAGS=$ac_save_CXXFLAGS + if test "$ac_cv_prog_cxx_openmp" != unsupported; then break fi done @@ -4451,13 +3683,13 @@ fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5 -$as_echo "$ac_cv_prog_c_openmp" >&6; } - case $ac_cv_prog_c_openmp in #( +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_openmp" >&5 +$as_echo "$ac_cv_prog_cxx_openmp" >&6; } + case $ac_cv_prog_cxx_openmp in #( "none needed" | unsupported) ;; #( *) - OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; + OPENMP_CXXFLAGS=$ac_cv_prog_cxx_openmp ;; esac fi @@ -4559,26 +3791,22 @@ fi #AX_GCC_VAR_ATTRIBUTE(aligned) # Checks for header files. -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes +for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. @@ -4595,7 +3823,7 @@ do #endif Syntax error _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. @@ -4609,7 +3837,7 @@ rm -f conftest.err conftest.i conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else @@ -4627,17 +3855,17 @@ if $ac_preproc_ok; then : fi done - ac_cv_prog_CPP=$CPP + ac_cv_prog_CXXCPP=$CXXCPP fi - CPP=$ac_cv_prog_CPP + CXXCPP=$ac_cv_prog_CXXCPP else - ac_cv_prog_CPP=$CPP + ac_cv_prog_CXXCPP=$CXXCPP fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes +for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. @@ -4654,7 +3882,7 @@ do #endif Syntax error _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. @@ -4668,7 +3896,7 @@ rm -f conftest.err conftest.i conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else @@ -4686,15 +3914,15 @@ if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 @@ -4847,7 +4075,7 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no @@ -4920,7 +4148,7 @@ main () return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no @@ -4944,7 +4172,7 @@ for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF @@ -4958,7 +4186,7 @@ done for ac_header in stdint.h do : - ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" + ac_fn_cxx_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H 1 @@ -4970,7 +4198,7 @@ done for ac_header in malloc/malloc.h do : - ac_fn_c_check_header_mongrel "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" + ac_fn_cxx_check_header_mongrel "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" if test "x$ac_cv_header_malloc_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MALLOC_MALLOC_H 1 @@ -4982,7 +4210,7 @@ done for ac_header in malloc.h do : - ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" + ac_fn_cxx_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" if test "x$ac_cv_header_malloc_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MALLOC_H 1 @@ -4994,7 +4222,7 @@ done for ac_header in endian.h do : - ac_fn_c_check_header_mongrel "$LINENO" "endian.h" "ac_cv_header_endian_h" "$ac_includes_default" + ac_fn_cxx_check_header_mongrel "$LINENO" "endian.h" "ac_cv_header_endian_h" "$ac_includes_default" if test "x$ac_cv_header_endian_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ENDIAN_H 1 @@ -5005,7 +4233,7 @@ fi done #AC_CHECK_HEADERS(machine/endian.h) -ac_fn_c_check_decl "$LINENO" "ntohll" "ac_cv_have_decl_ntohll" "#include +ac_fn_cxx_check_decl "$LINENO" "ntohll" "ac_cv_have_decl_ntohll" "#include " if test "x$ac_cv_have_decl_ntohll" = xyes; then : ac_have_decl=1 @@ -5017,7 +4245,7 @@ cat >>confdefs.h <<_ACEOF #define HAVE_DECL_NTOHLL $ac_have_decl _ACEOF -ac_fn_c_check_decl "$LINENO" "be64toh" "ac_cv_have_decl_be64toh" "#include +ac_fn_cxx_check_decl "$LINENO" "be64toh" "ac_cv_have_decl_be64toh" "#include " if test "x$ac_cv_have_decl_be64toh" = xyes; then : ac_have_decl=1 @@ -5031,7 +4259,7 @@ _ACEOF # Checks for typedefs, structures, and compiler characteristics. -ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +ac_fn_cxx_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else @@ -5074,7 +4302,7 @@ _ACEOF # Checks for library functions. for ac_func in gettimeofday do : - ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" + ac_fn_cxx_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" if test "x$ac_cv_func_gettimeofday" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETTIMEOFDAY 1 @@ -5309,10 +4537,6 @@ if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error $? "conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi if test -z "${BUILD_COMMS_MPI_TRUE}" && test -z "${BUILD_COMMS_MPI_FALSE}"; then as_fn_error $? "conditional \"BUILD_COMMS_MPI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 diff --git a/configure-commands b/configure-commands index d22e9fdd..8ba2dac1 100644 --- a/configure-commands +++ b/configure-commands @@ -1,3 +1,4 @@ +CXX=clang-omp++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx" --enable-comms=mpi CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -g -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx" --enable-comms=mpi CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -g -std=c++11" LDFLAGS= LIBS=-lmpi --enable-comms=fake diff --git a/configure.ac b/configure.ac index ce73ffd9..86f4b70c 100644 --- a/configure.ac +++ b/configure.ac @@ -6,6 +6,7 @@ AC_CONFIG_SRCDIR([lib/Grid.h]) AC_CONFIG_HEADERS([lib/Grid_config.h]) # Checks for programs. +AC_LANG(C++) AC_PROG_CXX AC_OPENMP AC_PROG_RANLIB diff --git a/lib/Grid.h b/lib/Grid.h index bd7b371a..f46f7bf5 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -24,21 +24,21 @@ #include #include +#ifndef MAX +#define MAX(x,y) ((x)>(y)?(x):(y)) +#define MIN(x,y) ((x)>(y)?(y):(x)) +#endif + #include //////////////////////////////////////////////////////////// // Tunable header includes //////////////////////////////////////////////////////////// -#ifdef HAVE_OPENMP -#define OMP -#include -#endif #ifdef HAVE_MALLOC_MALLOC_H #include #endif - #ifdef HAVE_MALLOC_H #include #endif diff --git a/lib/Grid_stencil.h b/lib/Grid_stencil.h index fa537f65..ce987746 100644 --- a/lib/Grid_stencil.h +++ b/lib/Grid_stencil.h @@ -250,7 +250,11 @@ namespace Grid { int buffer_size = _grid->_slice_nblock[dimension]*_grid->_slice_block[dimension]; int words = sizeof(cobj)/sizeof(vector_type); - /* FIXME ALTERNATE BUFFER DETERMINATION ; possibly slow to allocate*/ + /* + * possibly slow to allocate + * Doesn't matter in this test, but may want to preallocate in the + * dirac operators + */ std::vector > send_buf_extract(Nsimd,std::vector(buffer_size) ); std::vector > recv_buf_extract(Nsimd,std::vector(buffer_size) ); int bytes = buffer_size*sizeof(scalar_object); diff --git a/lib/Grid_threads.h b/lib/Grid_threads.h index 6c5f17e0..89a56d80 100644 --- a/lib/Grid_threads.h +++ b/lib/Grid_threads.h @@ -1,13 +1,17 @@ #ifndef GRID_THREADS_H #define GRID_THREADS_H -#ifdef HAVE_OPENMP +#ifdef _OPENMP +#define GRID_OMP +#endif + +#ifdef GRID_OMP #include #define PARALLEL_FOR_LOOP _Pragma("omp parallel for") -#define PARALLEL_NESTED_LOOP(n) _Pragma("omp parallel for collapse(" #n ")") +#define PARALLEL_NESTED_LOOP2 _Pragma("omp parallel for collapse(2)") #else #define PARALLEL_FOR_LOOP -#define PARALLEL_NESTED_LOOP(n) +#define PARALLEL_NESTED_LOOP2 #endif namespace Grid { @@ -20,7 +24,7 @@ class GridThread { static int _threads; static void SetThreads(int thr) { -#ifdef HAVE_OPENMP +#ifdef GRID_OMP _threads = MIN(thr,omp_get_max_threads()) ; omp_set_num_threads(_threads); #else @@ -28,7 +32,7 @@ class GridThread { #endif }; static void SetMaxThreads(void) { -#ifdef HAVE_OPENMP +#ifdef GRID_OMP _threads = omp_get_max_threads(); omp_set_num_threads(_threads); #else @@ -58,7 +62,7 @@ class GridThread { }; static int ThreadBarrier(void) { -#ifdef HAVE_OPENMP +#ifdef GRID_OMP #pragma omp barrier return omp_get_thread_num(); #else diff --git a/lib/cshift/Grid_cshift_common.h b/lib/cshift/Grid_cshift_common.h index 9864df73..c212171e 100644 --- a/lib/cshift/Grid_cshift_common.h +++ b/lib/cshift/Grid_cshift_common.h @@ -26,16 +26,15 @@ Gather_plane_simple (const Lattice &rhs,std::vector_ostride[dimension]; // base offset for start of plane - int bo = 0; // offset in buffer -PARALLEL_NESTED_LOOP(2) +PARALLEL_NESTED_LOOP2 for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ - int o = n*rhs._grid->_slice_stride[dimension]; + int o = n*rhs._grid->_slice_stride[dimension]; + int bo = n*rhs._grid->_slice_block[dimension]; int ocb=1<CheckerBoardFromOindex(o+b);// Could easily be a table lookup if ( ocb &cbmask ) { - buffer[bo]=compress(rhs._odata[so+o+b]); - bo++; + buffer[bo+b]=compress(rhs._odata[so+o+b]); } } } @@ -55,9 +54,8 @@ Gather_plane_extract(const Lattice &rhs,std::vector_ostride[dimension]; // base offset for start of plane - int bo = 0; // offset in buffer -PARALLEL_NESTED_LOOP(2) +PARALLEL_NESTED_LOOP2 for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ @@ -104,15 +102,15 @@ template void Scatter_plane_simple (Lattice &rhs,std::vector_ostride[dimension]; // base offset for start of plane - int bo = 0; // offset in buffer -PARALLEL_NESTED_LOOP(2) +PARALLEL_NESTED_LOOP2 for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ - int o=n*rhs._grid->_slice_stride[dimension]; + int o =n*rhs._grid->_slice_stride[dimension]; + int bo =n*rhs._grid->_slice_block[dimension]; int ocb=1<CheckerBoardFromOindex(o+b);// Could easily be a table lookup if ( ocb & cbmask ) { - rhs._odata[so+o+b]=buffer[bo++]; + rhs._odata[so+o+b]=buffer[bo+b]; } } } @@ -131,7 +129,7 @@ PARALLEL_NESTED_LOOP(2) int so = plane*rhs._grid->_ostride[dimension]; // base offset for start of plane -PARALLEL_NESTED_LOOP(2) +PARALLEL_NESTED_LOOP2 for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ @@ -160,7 +158,7 @@ template void Copy_plane(Lattice& lhs,Lattice &rhs, int int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane -PARALLEL_NESTED_LOOP(2) +PARALLEL_NESTED_LOOP2 for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ @@ -185,7 +183,7 @@ template void Copy_plane_permute(Lattice& lhs,Lattice &r int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane -PARALLEL_NESTED_LOOP(2) +PARALLEL_NESTED_LOOP2 for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ int o =n*rhs._grid->_slice_stride[dimension]; diff --git a/lib/cshift/Grid_cshift_mpi.h b/lib/cshift/Grid_cshift_mpi.h index 7c77ebc9..569017d8 100644 --- a/lib/cshift/Grid_cshift_mpi.h +++ b/lib/cshift/Grid_cshift_mpi.h @@ -1,10 +1,6 @@ #ifndef _GRID_CSHIFT_MPI_H_ #define _GRID_CSHIFT_MPI_H_ -#ifndef MAX -#define MAX(x,y) ((x)>(y)?(x):(y)) -#define MIN(x,y) ((x)>(y)?(y):(x)) -#endif namespace Grid { diff --git a/lib/qcd/Grid_qcd_wilson_dop.cc b/lib/qcd/Grid_qcd_wilson_dop.cc index f657208a..25f1d914 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.cc +++ b/lib/qcd/Grid_qcd_wilson_dop.cc @@ -100,22 +100,21 @@ void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) vHalfSpinColourVector chi; vSpinColourVector result; vHalfSpinColourVector Uchi; - vHalfSpinColourVector *chi_p; int offset,local,perm, ptype; PARALLEL_FOR_LOOP for(int sss=0;sssoSites();sss++){ int ss = sss; - int ssu= sss; - //int ss = Stencil._LebesgueReorder[sss]; + int ssu= ss; + // int ss = Stencil._LebesgueReorder[sss]; // Xp offset = Stencil._offsets [Xp][ss]; local = Stencil._is_local[Xp][ss]; perm = Stencil._permute[Xp][ss]; ptype = Stencil._permute_type[Xp]; - chi_p = &comm_buf[offset]; + if ( local && perm ) { spProjXp(tmp,in._odata[offset]); From add4495a4a0241805a22dcdd2c8e3e53542a5113 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 13 May 2015 09:24:10 +0100 Subject: [PATCH 149/429] cout IO for all types --- TODO | 18 ++++++---- lib/Grid_simd.h | 55 +++++++++++++++++++++++++++++ lib/lattice/Grid_lattice_base.h | 20 +++++++++++ lib/lattice/Grid_lattice_peekpoke.h | 2 +- lib/math/Grid_math_tensors.h | 26 ++++++++++++++ tests/Makefile.am | 5 ++- 6 files changed, 118 insertions(+), 8 deletions(-) diff --git a/TODO b/TODO index b596c605..a75c867d 100644 --- a/TODO +++ b/TODO @@ -5,6 +5,7 @@ - Performance check on Guido's reimplementation strategy * FIXME audit + * const audit * Replace vset with a call to merge.; @@ -13,6 +14,8 @@ * Strong test for norm2, conj and all primitive types. -- tests/Grid_simd.cc is almost there +* Thread scaling tests Xeon, XeonPhi + ================================================================ *** New Functionality ================================================================ @@ -23,9 +26,6 @@ - use protocol buffers? replace xmlReader/Writer ec.. - Binary use htonll, htonl -* Bug in SeedFixedIntegers gave same output on each site. -- Think I fixed but NOT checked for sure - Implement and use lattice IO to verify this. - * Expression template engine: -- DONE -- Norm2(expression) problem: introduce norm2 unary op, or Introduce conversion automatic from expression to Lattice @@ -33,6 +33,7 @@ ** Make the Tensor types and Complex etc... play more nicely. - TensorRemove is a hack, come up with a long term rationalised approach to Complex vs. Scalar > > + QDP forces use of "toDouble" to get back to non tensor scalar. This role is presently taken TensorRemove, but I want to introduce a syntax that does not require this. - Reductions that contract indices on a site should always demote the tensor structure. @@ -71,6 +72,7 @@ // Fourier transform equivalent. Actions -- coherent framework for implementing actions and their forces. + * Fermion - Wilson - Clover @@ -81,22 +83,24 @@ Actions -- coherent framework for implementing actions and their forces. * Gauge - Wilson, symanzik, iwasaki -Algorithms +Algorithms (lots of reuse/port from BFM) * LinearOperator * LinearSolver * Polynomial * Eigen +* CG * Pcg * Adef2 * DeflCG * fPcg * MCR * HDCG -* HMC, Heatbath +* HMC, +* Heatbath * etc.. ====================================================================================================== -FUNCTIONALITY: it pleases me to keep track of things I have done (keeps sane) +FUNCTIONALITY: it pleases me to keep track of things I have done (keeps me arguably sane) ====================================================================================================== * Command line args for geometry, simd, etc. layout. Is it necessary to have -- DONE @@ -158,4 +162,6 @@ FUNCTIONALITY: it pleases me to keep track of things I have done (keeps sane) * Conformable test in Cshift routines. -- none needed ; there is only one * Conformable testing in expression templates -- DONE (recursive) +* Bug in SeedFixedIntegers gave same output on each site. -- DONE + Implement and use lattice IO to verify this. -- cout for lattice types DONE diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index 39265896..7ad7367b 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -234,5 +234,60 @@ namespace Grid { typedef vRealF vReal; typedef vComplexF vComplex; #endif + + + inline std::ostream& operator<< (std::ostream& stream, const vComplexF &o){ + int nn=vComplexF::Nsimd(); + std::vector > buf(nn); + vstore(o,&buf[0]); + stream<<"<"; + for(int i=0;i"; + return stream; + } + + inline std::ostream& operator<< (std::ostream& stream, const vComplexD &o){ + int nn=vComplexD::Nsimd(); + std::vector > buf(nn); + vstore(o,&buf[0]); + stream<<"<"; + for(int i=0;i"; + return stream; + } + + inline std::ostream& operator<< (std::ostream& stream, const vRealF &o){ + int nn=vRealF::Nsimd(); + std::vector > buf(nn); + vstore(o,&buf[0]); + stream<<"<"; + for(int i=0;i"; + return stream; + } + + inline std::ostream& operator<< (std::ostream& stream, const vRealD &o){ + int nn=vRealD::Nsimd(); + std::vector > buf(nn); + vstore(o,&buf[0]); + stream<<"<"; + for(int i=0;i"; + return stream; + } + + } #endif diff --git a/lib/lattice/Grid_lattice_base.h b/lib/lattice/Grid_lattice_base.h index ace7565d..915879cb 100644 --- a/lib/lattice/Grid_lattice_base.h +++ b/lib/lattice/Grid_lattice_base.h @@ -176,7 +176,27 @@ PARALLEL_FOR_LOOP } return ret; }; + }; // class Lattice + + template inline std::ostream& operator<< (std::ostream& stream, const Lattice &o){ + std::vector gcoor; + typedef typename vobj::scalar_object sobj; + sobj ss; + for(int g=0;g_gsites;g++){ + o._grid->GlobalIndexToGlobalCoor(g,gcoor); + peekSite(ss,o,gcoor); + stream<<"["; + for(int d=0;d - void peekSite(sobj &s,Lattice &l,std::vector &site){ + void peekSite(sobj &s,const Lattice &l,std::vector &site){ GridBase *grid=l._grid; diff --git a/lib/math/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h index 0c1d67d1..8b3e4b1b 100644 --- a/lib/math/Grid_math_tensors.h +++ b/lib/math/Grid_math_tensors.h @@ -95,6 +95,10 @@ public: return *this; } + friend std::ostream& operator<< (std::ostream& stream, const iScalar &o){ + stream<< "S {"<>>> back to double. @@ -170,6 +174,15 @@ public: inline const vtype & operator ()(int i) const { return _internal[i]; } + friend std::ostream& operator<< (std::ostream& stream, const iVector &o){ + stream<< "V<"<{"; + for(int i=0;i &o){ + stream<< "M<"<{"; + for(int i=0;i Date: Wed, 13 May 2015 09:24:30 +0100 Subject: [PATCH 150/429] RNG test --- tests/Grid_rng.cc | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 tests/Grid_rng.cc diff --git a/tests/Grid_rng.cc b/tests/Grid_rng.cc new file mode 100644 index 00000000..97f6c6b7 --- /dev/null +++ b/tests/Grid_rng.cc @@ -0,0 +1,51 @@ +#include +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(4,vComplexF::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + + std::vector seeds({1,2,3,4}); + + GridSerialRNG sRNG; sRNG.SeedRandomDevice(); + GridSerialRNG fsRNG; fsRNG.SeedFixedIntegers(seeds); + + GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); + GridParallelRNG fpRNG(&Grid); fpRNG.SeedFixedIntegers(seeds); + + SpinMatrix rnd ; + random(sRNG,rnd); + std::cout<<"Random Spin Matrix (random_device)\n"<< rnd< Date: Wed, 13 May 2015 10:59:22 +0100 Subject: [PATCH 151/429] OMP dslash working --- TODO | 77 ++++++++++++++++++---------------- benchmarks/Grid_wilson.cc | 2 +- lib/qcd/Grid_qcd_wilson_dop.cc | 26 ++++++++---- lib/qcd/Grid_qcd_wilson_dop.h | 12 +++--- 4 files changed, 64 insertions(+), 53 deletions(-) diff --git a/TODO b/TODO index a75c867d..ed4dedd4 100644 --- a/TODO +++ b/TODO @@ -8,60 +8,39 @@ * const audit +Insert/Extract * Replace vset with a call to merge.; * care in Gmerge,Gextract over vset . * extract / merge extra implementation removal - -* Strong test for norm2, conj and all primitive types. -- tests/Grid_simd.cc is almost there +* Optimise the extract/merge SIMD routines; Azusa?? + - I have collated into single location at least. + - Need to use _mm_*insert/extract routines. * Thread scaling tests Xeon, XeonPhi -================================================================ -*** New Functionality -================================================================ - -* Implement where within expression template scheme. - -* - BinaryWriter, TextWriter etc... - - use protocol buffers? replace xmlReader/Writer ec.. - - Binary use htonll, htonl - -* Expression template engine: -- DONE - -- Norm2(expression) problem: introduce norm2 unary op, or Introduce conversion automatic from expression to Lattice - -* CovariantShift support -----Use a class to store gauge field? (parallel transport?) - ** Make the Tensor types and Complex etc... play more nicely. - TensorRemove is a hack, come up with a long term rationalised approach to Complex vs. Scalar > > - QDP forces use of "toDouble" to get back to non tensor scalar. This role is presently taken TensorRemove, but I want to introduce a syntax that does not require this. + - Reductions that contract indices on a site should always demote the tensor structure. norm2(), innerProduct. + - Result of Sum(), SliceSum // spatial sums trace, traceIndex etc.. do not. + - problem arises because "trace" returns Lattice moving everything down to Scalar, and then Sum and SliceSum to not remove the Scalars. This would be fixed if we template specialize the scalar scalar scalar sum and SliceSum, on the basis of being pure scalar. -* Optimise the extract/merge SIMD routines; Azusa?? - - I have collated into single location at least. - - Need to use _mm_*insert/extract routines. - -* Flavour matrices? -* Pauli, SU subgroup, etc.. -* su3 exponentiation & log etc.. [Jamie's code?] -* TaProj -* FFTnD ? - -* Parallel io improvements - - optional parallel MPI2 IO - - move Plaquette and link trace checks into nersc reader from the Grid_nersc_io.cc test. - -* rb4d support for 5th dimension in Mobius. +*** Expression template engine: -- DONE +[ -- Norm2(expression) problem: introduce norm2 unary op, or Introduce conversion automatic from expression to Lattice +* Strong test for norm2, conj and all primitive types. -- tests/Grid_simd.cc is almost there +* Implement where within expression template scheme. * Check for missing functionality - partially audited against QDP++ layout + // Unary functions // cos,sin, tan, acos, asin, cosh, acosh, tanh, sinh, // Scalar only arg // exp, log, sqrt, fabs @@ -69,7 +48,21 @@ // adjColor, adjSpin, // copyMask. // localMaxAbs - // Fourier transform equivalent. + // Fourier transform equivalent.] + +================================================================ +*** New Functionality +================================================================ + +* - BinaryWriter, TextWriter etc... + - use protocol buffers? replace xmlReader/Writer ec.. + - Binary use htonll, htonl + +* CovariantShift support -----Use a class to store gauge field? (parallel transport?) + +* Parallel io improvements + - optional parallel MPI2 IO + - move Plaquette and link trace checks into nersc reader from the Grid_nersc_io.cc test. Actions -- coherent framework for implementing actions and their forces. @@ -80,9 +73,6 @@ Actions -- coherent framework for implementing actions and their forces. - Mobius - z-Mobius -* Gauge - - Wilson, symanzik, iwasaki - Algorithms (lots of reuse/port from BFM) * LinearOperator * LinearSolver @@ -97,8 +87,21 @@ Algorithms (lots of reuse/port from BFM) * HDCG * HMC, * Heatbath +* Integrators, leapfrog, omelyan, force gradient etc... * etc.. +* Gauge + - Wilson, symanzik, iwasaki + +* rb4d support for 5th dimension in Mobius. + +* Flavour matrices? +* Pauli, SU subgroup, etc.. +* su3 exponentiation & log etc.. [Jamie's code?] +* TaProj +* FFTnD ? + + ====================================================================================================== FUNCTIONALITY: it pleases me to keep track of things I have done (keeps me arguably sane) ====================================================================================================== diff --git a/benchmarks/Grid_wilson.cc b/benchmarks/Grid_wilson.cc index 9ce13090..7718eb19 100644 --- a/benchmarks/Grid_wilson.cc +++ b/benchmarks/Grid_wilson.cc @@ -80,7 +80,7 @@ int main (int argc, char ** argv) int ncall=1000; double t0=usecond(); for(int i=0;i(in,comm_buf,compressor); - vHalfSpinColourVector tmp; - vHalfSpinColourVector chi; - vSpinColourVector result; - vHalfSpinColourVector Uchi; - int offset,local,perm, ptype; - PARALLEL_FOR_LOOP for(int sss=0;sssoSites();sss++){ + vHalfSpinColourVector tmp; + vHalfSpinColourVector chi; + vSpinColourVector result; + vHalfSpinColourVector Uchi; + int offset,local,perm, ptype; + + // int ss = Stencil._LebesgueReorder[sss]; int ss = sss; int ssu= ss; - // int ss = Stencil._LebesgueReorder[sss]; // Xp offset = Stencil._offsets [Xp][ss]; diff --git a/lib/qcd/Grid_qcd_wilson_dop.h b/lib/qcd/Grid_qcd_wilson_dop.h index 900f1801..e19cbabe 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.h +++ b/lib/qcd/Grid_qcd_wilson_dop.h @@ -3,16 +3,12 @@ #include +#include + namespace Grid { namespace QCD { - - template class LinearOperatorBase { - public: - void multiply(const Lattice &in, Lattice &out){ assert(0);} - }; - class WilsonMatrix : public LinearOperatorBase { //NB r=1; @@ -40,7 +36,9 @@ namespace Grid { void DoubleStore(LatticeDoubledGaugeField &Uds,const LatticeGaugeField &Umu); // override multiply - void multiply(const LatticeFermion &in, LatticeFermion &out); + virtual void M (const LatticeFermion &in, LatticeFermion &out); + virtual void Mdag (const LatticeFermion &in, LatticeFermion &out); + virtual void MdagM(const LatticeFermion &in, LatticeFermion &out); // non-hermitian hopping term; half cb or both void Dhop(const LatticeFermion &in, LatticeFermion &out); From 5166888c0a69c86476f1021dd108193480a0013b Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Wed, 13 May 2015 11:25:34 +0100 Subject: [PATCH 152/429] Linear op added --- lib/algorithms/LinearOperator.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 lib/algorithms/LinearOperator.h diff --git a/lib/algorithms/LinearOperator.h b/lib/algorithms/LinearOperator.h new file mode 100644 index 00000000..5929570f --- /dev/null +++ b/lib/algorithms/LinearOperator.h @@ -0,0 +1,18 @@ +#ifndef GRID_ALGORITHM_LINEAR_OP_H +#define GRID_ALGORITHM_LINEAR_OP_H + +#include + +namespace Grid { + + // Red black cases? + template class LinearOperatorBase { + public: + void M(const Lattice &in, Lattice &out){ assert(0);} + void Mdag(const Lattice &in, Lattice &out){ assert(0);} + void MdagM(const Lattice &in, Lattice &out){ assert(0);} + }; + +} + +#endif From cc6218a692e7ebb03ddaf9cb15d41958f726c52d Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:31:41 +0100 Subject: [PATCH 153/429] strong inline required to force icpc --- lib/Grid.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Grid.h b/lib/Grid.h index f46f7bf5..2936dd27 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -29,13 +29,14 @@ #define MIN(x,y) ((x)>(y)?(y):(x)) #endif +#define strong_inline __attribute__((always_inline)) inline + #include //////////////////////////////////////////////////////////// // Tunable header includes //////////////////////////////////////////////////////////// - #ifdef HAVE_MALLOC_MALLOC_H #include #endif From 8d1b26dd4b2d97f9b6aba144082f5d50f71971ed Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:32:11 +0100 Subject: [PATCH 154/429] Key of mm_malloc.h --- lib/Grid_aligned_allocator.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/Grid_aligned_allocator.h b/lib/Grid_aligned_allocator.h index f0b93172..0e74e842 100644 --- a/lib/Grid_aligned_allocator.h +++ b/lib/Grid_aligned_allocator.h @@ -2,6 +2,9 @@ #define GRID_ALIGNED_ALLOCATOR_H #include +#ifdef HAVE_MM_MALLOC_H +#include +#endif namespace Grid { @@ -36,16 +39,20 @@ public: pointer allocate(size_type __n, const void* = 0) { -#ifdef AVX512 - _Tp * ptr = (_Tp *) memalign(128,__n*sizeof(_Tp)); -#else +#ifdef HAVE_MM_MALLOC_H _Tp * ptr = (_Tp *) _mm_malloc(__n*sizeof(_Tp),128); +#else + _Tp * ptr = (_Tp *) memalign(128,__n*sizeof(_Tp)); #endif return ptr; } void deallocate(pointer __p, size_type) { - free(__p); +#ifdef HAVE_MM_MALLOC_H + _mm_free(__p); +#else + free(__p); +#endif } void construct(pointer __p, const _Tp& __val) { }; void construct(pointer __p) { }; From 4e462209c7ea187a6913b24e830d52575529b9f9 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:32:45 +0100 Subject: [PATCH 155/429] Using boolean logic inside enable_if is more elegant --- lib/Grid_extract.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/Grid_extract.h b/lib/Grid_extract.h index e29fbee7..75868463 100644 --- a/lib/Grid_extract.h +++ b/lib/Grid_extract.h @@ -11,7 +11,7 @@ namespace Grid{ //////////////////////////////////////////////////////////////////////////////////////////////// template -inline void extract(typename std::enable_if::notvalue, const vsimd >::type * y, +inline void extract(typename std::enable_if::value, const vsimd >::type * y, std::vector &extracted,int offset){ // FIXME: bounce off memory is painful int Nextr=extracted.size(); @@ -27,7 +27,7 @@ inline void extract(typename std::enable_if::notvalue, const // Merge simd vector from array of scalars to pointer array with offset //////////////////////////////////////////////////////////////////////// template -inline void merge(typename std::enable_if::notvalue, vsimd >::type * y, +inline void merge(typename std::enable_if::value, vsimd >::type * y, std::vector &extracted,int offset){ int Nextr=extracted.size(); int Nsimd=vsimd::Nsimd(); @@ -47,7 +47,7 @@ inline void merge(typename std::enable_if::notvalue, vsimd > // Extract a fundamental vector type to scalar array //////////////////////////////////////////////////////////////////////////////////////////////// template -inline void extract(typename std::enable_if::notvalue, const vsimd >::type &y,std::vector &extracted){ +inline void extract(typename std::enable_if::value, const vsimd >::type &y,std::vector &extracted){ int Nextr=extracted.size(); int Nsimd=vsimd::Nsimd(); @@ -66,7 +66,7 @@ inline void extract(typename std::enable_if::notvalue, const // Merge simd vector from array of scalars //////////////////////////////////////////////////////////////////////// template -inline void merge(typename std::enable_if::notvalue, vsimd >::type &y,std::vector &extracted){ +inline void merge(typename std::enable_if::value, vsimd >::type &y,std::vector &extracted){ int Nextr=extracted.size(); int Nsimd=vsimd::Nsimd(); int s=Nsimd/Nextr; @@ -80,7 +80,7 @@ inline void merge(typename std::enable_if::notvalue, vsimd > }; template -inline void AmergeA(typename std::enable_if::notvalue, vsimd >::type &y,std::vector &extracted){ +inline void AmergeA(typename std::enable_if::value, vsimd >::type &y,std::vector &extracted){ int Nextr=extracted.size(); int Nsimd=vsimd::Nsimd(); int s=Nsimd/Nextr; From 051b23fe10e91ecec64f19e78dd1750986a35d92 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:35:02 +0100 Subject: [PATCH 156/429] ICPC and GCC5 fixes --- lib/Grid_simd.h | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index 7ad7367b..af77591c 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -10,17 +10,29 @@ // // Vector types are arch dependent //////////////////////////////////////////////////////////////////////// - + +typedef uint32_t Integer; #ifdef SSE4 #include #endif #if defined(AVX1) || defined (AVX2) #include + +// _mm256_set_m128i(hi,lo); // not defined in all versions of immintrin.h +#ifndef _mm256_set_m128i +#define _mm256_set_m128i(hi,lo) _mm256_insertf128_si256(_mm256_castsi128_si256(lo),(hi),1) #endif + +#endif + #ifdef AVX512 #include -#include +#ifndef KNC_ONLY_STORES +#define _mm512_storenrngo_ps _mm512_store_ps // not present in AVX512 +#define _mm512_storenrngo_pd _mm512_store_pd // not present in AVX512 +#endif + #endif namespace Grid { @@ -148,16 +160,23 @@ namespace Grid { ////////////////////////////////////////////////////////// template inline void Gpermute(vsimd &y,const vsimd &b,int perm){ + union { + fvec f; + decltype(vsimd::v) v; + } conv; + conv.v = b.v; switch (perm){ #if defined(AVX1)||defined(AVX2) // 8x32 bits=>3 permutes - case 2: y.v = _mm256_shuffle_ps(b.v,b.v,_MM_SHUFFLE(2,3,0,1)); break; - case 1: y.v = _mm256_shuffle_ps(b.v,b.v,_MM_SHUFFLE(1,0,3,2)); break; - case 0: y.v = _mm256_permute2f128_ps(b.v,b.v,0x01); break; + case 2: + conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); + break; + case 1: conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2)); break; + case 0: conv.f = _mm256_permute2f128_ps(conv.f,conv.f,0x01); break; #endif #ifdef SSE4 - case 1: y.v = _mm_shuffle_ps(b.v,b.v,_MM_SHUFFLE(2,3,0,1)); break; - case 0: y.v = _mm_shuffle_ps(b.v,b.v,_MM_SHUFFLE(1,0,3,2));break; + case 1: conv.f = _mm_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); break; + case 0: conv.f = _mm_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2));break; #endif #ifdef AVX512 // 16 floats=> permutes @@ -165,16 +184,18 @@ inline void Gpermute(vsimd &y,const vsimd &b,int perm){ // Permute 1 every abcd efgh ijkl mnop -> cdab ghef jkij opmn // Permute 2 every abcd efgh ijkl mnop -> efgh abcd mnop ijkl // Permute 3 every abcd efgh ijkl mnop -> ijkl mnop abcd efgh - case 3: y.v =(decltype(y.v)) _mm512_swizzle_ps((__m512)b.v,_MM_SWIZ_REG_CDAB); break; - case 2: y.v =(decltype(y.v)) _mm512_swizzle_ps((__m512)b.v,_MM_SWIZ_REG_BADC); break; - case 1: y.v =(decltype(y.v)) _mm512_permute4f128_ps((__m512)b.v,(_MM_PERM_ENUM)_MM_SHUFFLE(2,3,0,1)); break; - case 0: y.v =(decltype(y.v)) _mm512_permute4f128_ps((__m512)b.v,(_MM_PERM_ENUM)_MM_SHUFFLE(1,0,3,2)); break; + case 3: conv.f = _mm512_swizzle_ps(conv.f,_MM_SWIZ_REG_CDAB); break; + case 2: conv.f = _mm512_swizzle_ps(conv.f,_MM_SWIZ_REG_BADC); break; + case 1: conv.f = _mm512_permute4f128_ps(conv.f,(_MM_PERM_ENUM)_MM_SHUFFLE(2,3,0,1)); break; + case 0: conv.f = _mm512_permute4f128_ps(conv.f,(_MM_PERM_ENUM)_MM_SHUFFLE(1,0,3,2)); break; #endif #ifdef QPX #error not implemented #endif default: assert(0); break; } + y.v=conv.v; + }; }; From 6c7eb60d6fe4b6534f604ea93c98483c3d2af104 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:36:22 +0100 Subject: [PATCH 157/429] gcc doesn't like collapse(2) for some reason I can't figure --- lib/cshift/Grid_cshift_common.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/cshift/Grid_cshift_common.h b/lib/cshift/Grid_cshift_common.h index c212171e..cf1f88af 100644 --- a/lib/cshift/Grid_cshift_common.h +++ b/lib/cshift/Grid_cshift_common.h @@ -185,14 +185,15 @@ template void Copy_plane_permute(Lattice& lhs,Lattice &r PARALLEL_NESTED_LOOP2 for(int n=0;n_slice_nblock[dimension];n++){ - for(int b=0;b_slice_block[dimension];b++){ - int o =n*rhs._grid->_slice_stride[dimension]; + for(int b=0;b_slice_block [dimension];b++){ + + int o =n*rhs._grid->_slice_stride[dimension]; int ocb=1<CheckerBoardFromOindex(o+b); if ( ocb&cbmask ) { permute(lhs._odata[lo+o+b],rhs._odata[ro+o+b],permute_type); } - } - } + + }} } ////////////////////////////////////////////////////// From c28551f40f36d2c85d4bc3c9ac0a47244ea21c91 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:37:07 +0100 Subject: [PATCH 158/429] Silly formatting change --- lib/lattice/Grid_lattice_arith.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/lattice/Grid_lattice_arith.h b/lib/lattice/Grid_lattice_arith.h index 10f31025..c9599582 100644 --- a/lib/lattice/Grid_lattice_arith.h +++ b/lib/lattice/Grid_lattice_arith.h @@ -7,7 +7,7 @@ namespace Grid { ////////////////////////////////////////////////////////////////////////////////////////////////////// // avoid copy back routines for mult, mac, sub, add ////////////////////////////////////////////////////////////////////////////////////////////////////// - template + template void mult(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); PARALLEL_FOR_LOOP From e7d25647e6a1dd098a14fb7d24802962514e29c5 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:38:04 +0100 Subject: [PATCH 159/429] Filed bug report Bug 66153 on GCC-5. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66153 --- lib/lattice/Grid_lattice_peekpoke.h | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/lib/lattice/Grid_lattice_peekpoke.h b/lib/lattice/Grid_lattice_peekpoke.h index 44d2a71f..7bffdbb8 100644 --- a/lib/lattice/Grid_lattice_peekpoke.h +++ b/lib/lattice/Grid_lattice_peekpoke.h @@ -10,9 +10,8 @@ namespace Grid { //////////////////////////////////////////////////////////////////////////////////////////////////// // Peek internal indices of a Lattice object //////////////////////////////////////////////////////////////////////////////////////////////////// - template - inline auto peekIndex(const Lattice &lhs) - -> Lattice(lhs._odata[0]))> + template + auto peekIndex(const Lattice &lhs) -> Lattice(lhs._odata[0]))> { Lattice(lhs._odata[0]))> ret(lhs._grid); PARALLEL_FOR_LOOP @@ -22,8 +21,7 @@ PARALLEL_FOR_LOOP return ret; }; template - inline auto peekIndex(const Lattice &lhs,int i) - -> Lattice(lhs._odata[0],i))> + auto peekIndex(const Lattice &lhs,int i) -> Lattice(lhs._odata[0],i))> { Lattice(lhs._odata[0],i))> ret(lhs._grid); PARALLEL_FOR_LOOP @@ -33,8 +31,7 @@ PARALLEL_FOR_LOOP return ret; }; template - inline auto peekIndex(const Lattice &lhs,int i,int j) - -> Lattice(lhs._odata[0],i,j))> + auto peekIndex(const Lattice &lhs,int i,int j) -> Lattice(lhs._odata[0],i,j))> { Lattice(lhs._odata[0],i,j))> ret(lhs._grid); PARALLEL_FOR_LOOP @@ -47,7 +44,7 @@ PARALLEL_FOR_LOOP //////////////////////////////////////////////////////////////////////////////////////////////////// // Poke internal indices of a Lattice object //////////////////////////////////////////////////////////////////////////////////////////////////// - template inline + template void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0]))> & rhs) { PARALLEL_FOR_LOOP @@ -55,7 +52,7 @@ PARALLEL_FOR_LOOP pokeIndex(lhs._odata[ss],rhs._odata[ss]); } } - template inline + template void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0],0))> & rhs,int i) { PARALLEL_FOR_LOOP @@ -63,8 +60,8 @@ PARALLEL_FOR_LOOP pokeIndex(lhs._odata[ss],rhs._odata[ss],i); } } - template inline - void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0],0,0))> & rhs,int i,int j) + template + void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0],0,0))> & rhs,int i,int j) { PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ From 5b46992a15ffed15198f35dd2f1de1000a9d40fa Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:38:54 +0100 Subject: [PATCH 160/429] Formatting change --- lib/lattice/Grid_lattice_trace.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/lattice/Grid_lattice_trace.h b/lib/lattice/Grid_lattice_trace.h index 72f984f9..75cc5b87 100644 --- a/lib/lattice/Grid_lattice_trace.h +++ b/lib/lattice/Grid_lattice_trace.h @@ -26,8 +26,7 @@ PARALLEL_FOR_LOOP // Trace Index level dependent operation //////////////////////////////////////////////////////////////////////////////////////////////////// template - inline auto traceIndex(const Lattice &lhs) - -> Lattice(lhs._odata[0]))> + inline auto traceIndex(const Lattice &lhs) -> Lattice(lhs._odata[0]))> { Lattice(lhs._odata[0]))> ret(lhs._grid); PARALLEL_FOR_LOOP From adc4f86020dbb21cff29cad6966ba267b9dc4191 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:39:25 +0100 Subject: [PATCH 161/429] Promote to strong inline to force ICPC's hand. Annoying. --- lib/math/Grid_math_arith_add.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/math/Grid_math_arith_add.h b/lib/math/Grid_math_arith_add.h index 93449402..19a2f407 100644 --- a/lib/math/Grid_math_arith_add.h +++ b/lib/math/Grid_math_arith_add.h @@ -13,13 +13,13 @@ namespace Grid { // Scalar +/- Scalar // Vector +/- Vector // Matrix +/- Matrix - template inline void add(iScalar * __restrict__ ret, + template strong_inline void add(iScalar * __restrict__ ret, const iScalar * __restrict__ lhs, const iScalar * __restrict__ rhs) { add(&ret->_internal,&lhs->_internal,&rhs->_internal); } - template inline void add(iVector * __restrict__ ret, + template strong_inline void add(iVector * __restrict__ ret, const iVector * __restrict__ lhs, const iVector * __restrict__ rhs) { @@ -29,7 +29,7 @@ namespace Grid { return; } - template inline void add(iMatrix * __restrict__ ret, + template strong_inline void add(iMatrix * __restrict__ ret, const iMatrix * __restrict__ lhs, const iMatrix * __restrict__ rhs) { @@ -39,7 +39,7 @@ namespace Grid { }} return; } - template inline void add(iMatrix * __restrict__ ret, + template strong_inline void add(iMatrix * __restrict__ ret, const iScalar * __restrict__ lhs, const iMatrix * __restrict__ rhs) { @@ -49,7 +49,7 @@ namespace Grid { }} return; } - template inline void add(iMatrix * __restrict__ ret, + template strong_inline void add(iMatrix * __restrict__ ret, const iMatrix * __restrict__ lhs, const iScalar * __restrict__ rhs) { @@ -66,8 +66,8 @@ namespace Grid { // + operator for scalar, vector, matrix template - //inline auto operator + (iScalar& lhs,iScalar&& rhs) -> iScalar - inline auto operator + (const iScalar& lhs,const iScalar& rhs) -> iScalar + //strong_inline auto operator + (iScalar& lhs,iScalar&& rhs) -> iScalar + strong_inline auto operator + (const iScalar& lhs,const iScalar& rhs) -> iScalar { typedef iScalar ret_t; ret_t ret; @@ -75,7 +75,7 @@ namespace Grid { return ret; } template - inline auto operator + (const iVector& lhs,const iVector& rhs) ->iVector + strong_inline auto operator + (const iVector& lhs,const iVector& rhs) ->iVector { typedef iVector ret_t; ret_t ret; @@ -83,7 +83,7 @@ namespace Grid { return ret; } template - inline auto operator + (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix + strong_inline auto operator + (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix { typedef iMatrix ret_t; ret_t ret; @@ -91,7 +91,7 @@ namespace Grid { return ret; } template -inline auto operator + (const iScalar& lhs,const iMatrix& rhs)->iMatrix +strong_inline auto operator + (const iScalar& lhs,const iMatrix& rhs)->iMatrix { typedef iMatrix ret_t; ret_t ret; @@ -100,7 +100,7 @@ inline auto operator + (const iScalar& lhs,const iMatrix& rhs)-> } template - inline auto operator + (const iMatrix& lhs,const iScalar& rhs)->iMatrix + strong_inline auto operator + (const iMatrix& lhs,const iScalar& rhs)->iMatrix { typedef iMatrix ret_t; ret_t ret; From b38bf82d483a7c1f59ac0e279829d77a62f4b902 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:40:00 +0100 Subject: [PATCH 162/429] Switch to strong_inline macro to force icpc's hand --- lib/math/Grid_math_arith_mac.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/math/Grid_math_arith_mac.h b/lib/math/Grid_math_arith_mac.h index 6260b98f..68b0acf1 100644 --- a/lib/math/Grid_math_arith_mac.h +++ b/lib/math/Grid_math_arith_mac.h @@ -21,12 +21,12 @@ namespace Grid { // scal x vec = vec /////////////////////////// template -inline void mac(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs) +strong_inline void mac(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs) { mac(&ret->_internal,&lhs->_internal,&rhs->_internal); } template -inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ +strong_inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ for(int c2=0;c2 * __restrict__ ret,const iMatrix * __ return; } template -inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ +strong_inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ for(int c1=0;c1_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); @@ -43,7 +43,7 @@ inline void mac(iMatrix * __restrict__ ret,const iMatrix * __ return; } template -inline void mac(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ +strong_inline void mac(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ for(int c1=0;c1_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); @@ -51,7 +51,7 @@ inline void mac(iMatrix * __restrict__ ret,const iScalar * __re return; } template -inline void mac(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) +strong_inline void mac(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) { for(int c1=0;c1 * __restrict__ ret,const iMatrix * __ return; } template -inline void mac(iVector * __restrict__ ret,const iScalar * __restrict__ lhs,const iVector * __restrict__ rhs) +strong_inline void mac(iVector * __restrict__ ret,const iScalar * __restrict__ lhs,const iVector * __restrict__ rhs) { for(int c1=0;c1_internal[c1],&lhs->_internal,&rhs->_internal[c1]); @@ -68,7 +68,7 @@ inline void mac(iVector * __restrict__ ret,const iScalar * __re return; } template -inline void mac(iVector * __restrict__ ret,const iVector * __restrict__ lhs,const iScalar * __restrict__ rhs) +strong_inline void mac(iVector * __restrict__ ret,const iVector * __restrict__ lhs,const iScalar * __restrict__ rhs) { for(int c1=0;c1_internal[c1],&lhs->_internal[c1],&rhs->_internal); From 8c40dd9c4f9029630d49c3f5cc1e3a191a00ee2f Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:40:31 +0100 Subject: [PATCH 163/429] Force strong_inline to force ipcc's hand --- lib/math/Grid_math_arith_mul.h | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/math/Grid_math_arith_mul.h b/lib/math/Grid_math_arith_mul.h index 66c8b121..7b883cf4 100644 --- a/lib/math/Grid_math_arith_mul.h +++ b/lib/math/Grid_math_arith_mul.h @@ -9,12 +9,12 @@ namespace Grid { /////////////////////////////////////////////////////////////////////////////////////////////////// template -inline void mult(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs){ +strong_inline void mult(iScalar * __restrict__ ret,const iScalar * __restrict__ lhs,const iScalar * __restrict__ rhs){ mult(&ret->_internal,&lhs->_internal,&rhs->_internal); } template -inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ +strong_inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][0],&rhs->_internal[0][c2]); @@ -25,7 +25,7 @@ inline void mult(iMatrix * __restrict__ ret,const iMatrix * _ return; } template -inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ +strong_inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c2],&rhs->_internal); @@ -34,7 +34,7 @@ inline void mult(iMatrix * __restrict__ ret,const iMatrix * _ } template -inline void mult(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ +strong_inline void mult(iMatrix * __restrict__ ret,const iScalar * __restrict__ lhs,const iMatrix * __restrict__ rhs){ for(int c2=0;c2_internal[c1][c2],&lhs->_internal,&rhs->_internal[c1][c2]); @@ -43,7 +43,7 @@ inline void mult(iMatrix * __restrict__ ret,const iScalar * _ } // Matrix left multiplies vector template -inline void mult(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) +strong_inline void mult(iVector * __restrict__ ret,const iMatrix * __restrict__ lhs,const iVector * __restrict__ rhs) { for(int c1=0;c1_internal[c1],&lhs->_internal[c1][0],&rhs->_internal[0]); @@ -54,7 +54,7 @@ inline void mult(iVector * __restrict__ ret,const iMatrix * __ return; } template -inline void mult(iVector * __restrict__ ret, +strong_inline void mult(iVector * __restrict__ ret, const iScalar * __restrict__ lhs, const iVector * __restrict__ rhs){ for(int c1=0;c1 * __restrict__ ret, } } template -inline void mult(iVector * __restrict__ ret, +strong_inline void mult(iVector * __restrict__ ret, const iVector * __restrict__ rhs, const iScalar * __restrict__ lhs){ mult(ret,lhs,rhs); @@ -70,7 +70,7 @@ inline void mult(iVector * __restrict__ ret, -template inline +template strong_inline iVector operator * (const iMatrix& lhs,const iVector& rhs) { iVector ret; @@ -78,7 +78,7 @@ iVector operator * (const iMatrix& lhs,const iVector& return ret; } -template inline +template strong_inline iVector operator * (const iScalar& lhs,const iVector& rhs) { iVector ret; @@ -86,7 +86,7 @@ iVector operator * (const iScalar& lhs,const iVector& r return ret; } -template inline +template strong_inline iVector operator * (const iVector& lhs,const iScalar& rhs) { iVector ret; @@ -110,14 +110,14 @@ iVector operator * (const iVector& lhs,const iScalar& r // // We can special case scalar_type ?? template -inline auto operator * (const iScalar& lhs,const iScalar& rhs) -> iScalar +strong_inline auto operator * (const iScalar& lhs,const iScalar& rhs) -> iScalar { typedef iScalar ret_t; ret_t ret; mult(&ret,&lhs,&rhs); return ret; } -template inline +template strong_inline auto operator * (const iMatrix& lhs,const iMatrix& rhs) -> iMatrix { typedef decltype(lhs._internal[0][0]*rhs._internal[0][0]) ret_t; @@ -125,7 +125,7 @@ auto operator * (const iMatrix& lhs,const iMatrix& rhs) -> iMatrix inline +template strong_inline auto operator * (const iMatrix& lhs,const iScalar& rhs) -> iMatrix { typedef decltype(lhs._internal[0][0]*rhs._internal) ret_t; @@ -137,7 +137,7 @@ auto operator * (const iMatrix& lhs,const iScalar& rhs) -> iMatrix inline +template strong_inline auto operator * (const iScalar& lhs,const iMatrix& rhs) -> iMatrix { typedef decltype(lhs._internal*rhs._internal[0][0]) ret_t; @@ -148,7 +148,7 @@ auto operator * (const iScalar& lhs,const iMatrix& rhs) -> iMatrix inline +template strong_inline auto operator * (const iMatrix& lhs,const iVector& rhs) -> iVector { typedef decltype(lhs._internal[0][0]*rhs._internal[0]) ret_t; @@ -161,7 +161,7 @@ auto operator * (const iMatrix& lhs,const iVector& rhs) -> iVector inline +template strong_inline auto operator * (const iScalar& lhs,const iVector& rhs) -> iVector { typedef decltype(lhs._internal*rhs._internal[0]) ret_t; @@ -171,7 +171,7 @@ auto operator * (const iScalar& lhs,const iVector& rhs) -> iVector inline +template strong_inline auto operator * (const iVector& lhs,const iScalar& rhs) -> iVector { typedef decltype(lhs._internal[0]*rhs._internal) ret_t; From cbfa4097b40d94ec1bf7ff798819dd8fc6a0bb39 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:40:59 +0100 Subject: [PATCH 164/429] strong_inline forces ICPC to do it. --- lib/math/Grid_math_arith_scalar.h | 96 +++++++++++++++---------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/lib/math/Grid_math_arith_scalar.h b/lib/math/Grid_math_arith_scalar.h index 69c9a169..c6418638 100644 --- a/lib/math/Grid_math_arith_scalar.h +++ b/lib/math/Grid_math_arith_scalar.h @@ -9,58 +9,58 @@ namespace Grid { ////////////////////////////////////////////////////////////////////////////////////////// // multiplication by fundamental scalar type -template inline iScalar operator * (const iScalar& lhs,const typename iScalar::scalar_type rhs) +template strong_inline iScalar operator * (const iScalar& lhs,const typename iScalar::scalar_type rhs) { typename iScalar::tensor_reduced srhs; srhs=rhs; return lhs*srhs; } -template inline iScalar operator * (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs*lhs; } +template strong_inline iScalar operator * (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs*lhs; } -template inline iVector operator * (const iVector& lhs,const typename iScalar::scalar_type rhs) +template strong_inline iVector operator * (const iVector& lhs,const typename iScalar::scalar_type rhs) { typename iVector::tensor_reduced srhs; srhs=rhs; return lhs*srhs; } -template inline iVector operator * (const typename iScalar::scalar_type lhs,const iVector& rhs) { return rhs*lhs; } +template strong_inline iVector operator * (const typename iScalar::scalar_type lhs,const iVector& rhs) { return rhs*lhs; } -template inline iMatrix operator * (const iMatrix& lhs,const typename iScalar::scalar_type &rhs) +template strong_inline iMatrix operator * (const iMatrix& lhs,const typename iScalar::scalar_type &rhs) { typename iMatrix::tensor_reduced srhs; srhs=rhs; return lhs*srhs; } -template inline iMatrix operator * (const typename iScalar::scalar_type & lhs,const iMatrix& rhs) { return rhs*lhs; } +template strong_inline iMatrix operator * (const typename iScalar::scalar_type & lhs,const iMatrix& rhs) { return rhs*lhs; } //////////////////////////////////////////////////////////////////// // Double support; cast to "scalar_type" through constructor //////////////////////////////////////////////////////////////////// -template inline iScalar operator * (const iScalar& lhs,double rhs) +template strong_inline iScalar operator * (const iScalar& lhs,double rhs) { typename iScalar::scalar_type t; t=rhs; typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } -template inline iScalar operator * (double lhs,const iScalar& rhs) { return rhs*lhs; } +template strong_inline iScalar operator * (double lhs,const iScalar& rhs) { return rhs*lhs; } -template inline iVector operator * (const iVector& lhs,double rhs) +template strong_inline iVector operator * (const iVector& lhs,double rhs) { typename iScalar::scalar_type t;t=rhs; typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } -template inline iVector operator * (double lhs,const iVector& rhs) { return rhs*lhs; } +template strong_inline iVector operator * (double lhs,const iVector& rhs) { return rhs*lhs; } -template inline iMatrix operator * (const iMatrix& lhs,double rhs) +template strong_inline iMatrix operator * (const iMatrix& lhs,double rhs) { typename iScalar::scalar_type t;t=rhs; typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } -template inline iMatrix operator * (double lhs,const iMatrix& rhs) { return rhs*lhs; } +template strong_inline iMatrix operator * (double lhs,const iMatrix& rhs) { return rhs*lhs; } //////////////////////////////////////////////////////////////////// // Complex support; cast to "scalar_type" through constructor //////////////////////////////////////////////////////////////////// -template inline iScalar operator * (const iScalar& lhs,ComplexD rhs) +template strong_inline iScalar operator * (const iScalar& lhs,ComplexD rhs) { typename iScalar::scalar_type t;t=rhs; typename iScalar::tensor_reduced srhs;srhs=t; @@ -68,131 +68,131 @@ template inline iScalar operator * (const iScalar& lhs,ComplexD r return lhs*srhs; } -template inline iScalar operator * (ComplexD lhs,const iScalar& rhs) { return rhs*lhs; } +template strong_inline iScalar operator * (ComplexD lhs,const iScalar& rhs) { return rhs*lhs; } -template inline iVector operator * (const iVector& lhs,ComplexD rhs) +template strong_inline iVector operator * (const iVector& lhs,ComplexD rhs) { typename iScalar::scalar_type t;t=rhs; typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } -template inline iVector operator * (ComplexD lhs,const iVector& rhs) { return rhs*lhs; } +template strong_inline iVector operator * (ComplexD lhs,const iVector& rhs) { return rhs*lhs; } -template inline iMatrix operator * (const iMatrix& lhs,ComplexD rhs) +template strong_inline iMatrix operator * (const iMatrix& lhs,ComplexD rhs) { typename iScalar::scalar_type t;t=rhs; typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } -template inline iMatrix operator * (ComplexD lhs,const iMatrix& rhs) { return rhs*lhs; } +template strong_inline iMatrix operator * (ComplexD lhs,const iMatrix& rhs) { return rhs*lhs; } //////////////////////////////////////////////////////////////////// // Integer support; cast to "scalar_type" through constructor //////////////////////////////////////////////////////////////////// -template inline iScalar operator * (const iScalar& lhs,Integer rhs) +template strong_inline iScalar operator * (const iScalar& lhs,Integer rhs) { typename iScalar::scalar_type t; t=rhs; typename iScalar::tensor_reduced srhs; srhs=t; return lhs*srhs; } -template inline iScalar operator * (Integer lhs,const iScalar& rhs) { return rhs*lhs; } +template strong_inline iScalar operator * (Integer lhs,const iScalar& rhs) { return rhs*lhs; } -template inline iVector operator * (const iVector& lhs,Integer rhs) +template strong_inline iVector operator * (const iVector& lhs,Integer rhs) { typename iScalar::scalar_type t;t=rhs; typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } -template inline iVector operator * (Integer lhs,const iVector& rhs) { return rhs*lhs; } +template strong_inline iVector operator * (Integer lhs,const iVector& rhs) { return rhs*lhs; } -template inline iMatrix operator * (const iMatrix& lhs,Integer rhs) +template strong_inline iMatrix operator * (const iMatrix& lhs,Integer rhs) { typename iScalar::scalar_type t;t=rhs; typename iScalar::tensor_reduced srhs;srhs=t; return lhs*srhs; } -template inline iMatrix operator * (Integer lhs,const iMatrix& rhs) { return rhs*lhs; } +template strong_inline iMatrix operator * (Integer lhs,const iMatrix& rhs) { return rhs*lhs; } /////////////////////////////////////////////////////////////////////////////////////////////// // addition by fundamental scalar type applies to matrix(down diag) and scalar /////////////////////////////////////////////////////////////////////////////////////////////// -template inline iScalar operator + (const iScalar& lhs,const typename iScalar::scalar_type rhs) +template strong_inline iScalar operator + (const iScalar& lhs,const typename iScalar::scalar_type rhs) { typename iScalar::tensor_reduced srhs; srhs=rhs; return lhs+srhs; } -template inline iScalar operator + (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs+lhs; } +template strong_inline iScalar operator + (const typename iScalar::scalar_type lhs,const iScalar& rhs) { return rhs+lhs; } -template inline iMatrix operator + (const iMatrix& lhs,const typename iScalar::scalar_type rhs) +template strong_inline iMatrix operator + (const iMatrix& lhs,const typename iScalar::scalar_type rhs) { typename iMatrix::tensor_reduced srhs; srhs=rhs; return lhs+srhs; } -template inline iMatrix operator + (const typename iScalar::scalar_type lhs,const iMatrix& rhs) { return rhs+lhs; } +template strong_inline iMatrix operator + (const typename iScalar::scalar_type lhs,const iMatrix& rhs) { return rhs+lhs; } //////////////////////////////////////////////////////////////////// // Double support; cast to "scalar_type" through constructor //////////////////////////////////////////////////////////////////// -template inline iScalar operator + (const iScalar& lhs,double rhs) +template strong_inline iScalar operator + (const iScalar& lhs,double rhs) { typename iScalar::scalar_type t; t=rhs; typename iScalar::tensor_reduced srhs; srhs=t; return lhs+srhs; } -template inline iScalar operator + (double lhs,const iScalar& rhs) { return rhs+lhs; } +template strong_inline iScalar operator + (double lhs,const iScalar& rhs) { return rhs+lhs; } -template inline iMatrix operator + (const iMatrix& lhs,double rhs) +template strong_inline iMatrix operator + (const iMatrix& lhs,double rhs) { typename iScalar::scalar_type t;t=rhs; typename iScalar::tensor_reduced srhs;srhs=t; return lhs+srhs; } -template inline iMatrix operator + (double lhs,const iMatrix& rhs) { return rhs+lhs; } +template strong_inline iMatrix operator + (double lhs,const iMatrix& rhs) { return rhs+lhs; } // Integer support cast to scalar type through constructor -template inline iScalar operator + (const iScalar& lhs,Integer rhs) +template strong_inline iScalar operator + (const iScalar& lhs,Integer rhs) { typename iScalar::scalar_type t; t=rhs; typename iScalar::tensor_reduced srhs; srhs=t; return lhs+srhs; } -template inline iScalar operator + (Integer lhs,const iScalar& rhs) { return rhs+lhs; } +template strong_inline iScalar operator + (Integer lhs,const iScalar& rhs) { return rhs+lhs; } -template inline iMatrix operator + (const iMatrix& lhs,Integer rhs) +template strong_inline iMatrix operator + (const iMatrix& lhs,Integer rhs) { typename iScalar::scalar_type t;t=rhs; typename iScalar::tensor_reduced srhs;srhs=t; return lhs+srhs; } -template inline iMatrix operator + (Integer lhs,const iMatrix& rhs) { return rhs+lhs; } +template strong_inline iMatrix operator + (Integer lhs,const iMatrix& rhs) { return rhs+lhs; } /////////////////////////////////////////////////////////////////////////////////////////////// // subtraction of fundamental scalar type applies to matrix(down diag) and scalar /////////////////////////////////////////////////////////////////////////////////////////////// -template inline iScalar operator - (const iScalar& lhs,const typename iScalar::scalar_type rhs) +template strong_inline iScalar operator - (const iScalar& lhs,const typename iScalar::scalar_type rhs) { typename iScalar::tensor_reduced srhs; srhs=rhs; return lhs-srhs; } -template inline iScalar operator - (const typename iScalar::scalar_type lhs,const iScalar& rhs) +template strong_inline iScalar operator - (const typename iScalar::scalar_type lhs,const iScalar& rhs) { typename iScalar::tensor_reduced slhs;slhs=lhs; return slhs-rhs; } -template inline iMatrix operator - (const iMatrix& lhs,const typename iScalar::scalar_type rhs) +template strong_inline iMatrix operator - (const iMatrix& lhs,const typename iScalar::scalar_type rhs) { typename iScalar::tensor_reduced srhs; srhs=rhs; return lhs-srhs; } -template inline iMatrix operator - (const typename iScalar::scalar_type lhs,const iMatrix& rhs) +template strong_inline iMatrix operator - (const typename iScalar::scalar_type lhs,const iMatrix& rhs) { typename iScalar::tensor_reduced slhs;slhs=lhs; return slhs-rhs; @@ -201,26 +201,26 @@ template inline iMatrix operator - (const typename iScalar inline iScalar operator - (const iScalar& lhs,double rhs) +template strong_inline iScalar operator - (const iScalar& lhs,double rhs) { typename iScalar::scalar_type t; t=rhs; typename iScalar::tensor_reduced srhs; srhs=t; return lhs-srhs; } -template inline iScalar operator - (double lhs,const iScalar& rhs) +template strong_inline iScalar operator - (double lhs,const iScalar& rhs) { typename iScalar::scalar_type t(lhs); typename iScalar::tensor_reduced slhs;slhs=t; return slhs-rhs; } -template inline iMatrix operator - (const iMatrix& lhs,double rhs) +template strong_inline iMatrix operator - (const iMatrix& lhs,double rhs) { typename iScalar::scalar_type t;t=rhs; typename iScalar::tensor_reduced srhs;srhs=t; return lhs-srhs; } -template inline iMatrix operator - (double lhs,const iMatrix& rhs) +template strong_inline iMatrix operator - (double lhs,const iMatrix& rhs) { typename iScalar::scalar_type t(lhs); typename iScalar::tensor_reduced slhs;slhs=t; @@ -230,25 +230,25 @@ template inline iMatrix operator - (double lhs,const iMatrix //////////////////////////////////////////////////////////////////// // Integer support; cast to "scalar_type" through constructor //////////////////////////////////////////////////////////////////// -template inline iScalar operator - (const iScalar& lhs,Integer rhs) +template strong_inline iScalar operator - (const iScalar& lhs,Integer rhs) { typename iScalar::scalar_type t; t=rhs; typename iScalar::tensor_reduced srhs; srhs=t; return lhs-srhs; } -template inline iScalar operator - (Integer lhs,const iScalar& rhs) +template strong_inline iScalar operator - (Integer lhs,const iScalar& rhs) { typename iScalar::scalar_type t;t=lhs; typename iScalar::tensor_reduced slhs;slhs=t; return slhs-rhs; } -template inline iMatrix operator - (const iMatrix& lhs,Integer rhs) +template strong_inline iMatrix operator - (const iMatrix& lhs,Integer rhs) { typename iScalar::scalar_type t;t=rhs; typename iScalar::tensor_reduced srhs;srhs=t; return lhs-srhs; } -template inline iMatrix operator - (Integer lhs,const iMatrix& rhs) +template strong_inline iMatrix operator - (Integer lhs,const iMatrix& rhs) { typename iScalar::scalar_type t;t=lhs; typename iScalar::tensor_reduced slhs;slhs=t; From af6e8f78292459bb1246ec993d0b8f581990d350 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:41:31 +0100 Subject: [PATCH 165/429] Force inlining on ICPC because inline apparently is not enoguh --- lib/math/Grid_math_arith_sub.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/math/Grid_math_arith_sub.h b/lib/math/Grid_math_arith_sub.h index de4ef9e5..c359349f 100644 --- a/lib/math/Grid_math_arith_sub.h +++ b/lib/math/Grid_math_arith_sub.h @@ -14,14 +14,14 @@ namespace Grid { // Vector +/- Vector // Matrix +/- Matrix // Matrix /- scalar -template inline void sub(iScalar * __restrict__ ret, +template strong_inline void sub(iScalar * __restrict__ ret, const iScalar * __restrict__ lhs, const iScalar * __restrict__ rhs) { sub(&ret->_internal,&lhs->_internal,&rhs->_internal); } -template inline void sub(iVector * __restrict__ ret, +template strong_inline void sub(iVector * __restrict__ ret, const iVector * __restrict__ lhs, const iVector * __restrict__ rhs) { @@ -30,7 +30,7 @@ template inline void sub(iVector inline void sub(iMatrix * __restrict__ ret, +template strong_inline void sub(iMatrix * __restrict__ ret, const iMatrix * __restrict__ lhs, const iMatrix * __restrict__ rhs){ for(int c2=0;c2 inline void sub(iMatrix inline void sub(iMatrix * __restrict__ ret, +template strong_inline void sub(iMatrix * __restrict__ ret, const iScalar * __restrict__ lhs, const iMatrix * __restrict__ rhs){ for(int c2=0;c2 inline void sub(iMatrix inline void sub(iMatrix * __restrict__ ret, +template strong_inline void sub(iMatrix * __restrict__ ret, const iMatrix * __restrict__ lhs, const iScalar * __restrict__ rhs){ for(int c2=0;c2 inline void sub(iMatrix inline auto +template strong_inline auto operator - (const iScalar& lhs, const iScalar& rhs) -> iScalar { typedef iScalar ret_t; @@ -78,7 +78,7 @@ operator - (const iScalar& lhs, const iScalar& rhs) -> iScalar -inline auto operator - (const iVector& lhs,const iVector& rhs) ->iVector +strong_inline auto operator - (const iVector& lhs,const iVector& rhs) ->iVector { typedef iVector ret_t; ret_t ret; @@ -86,7 +86,7 @@ inline auto operator - (const iVector& lhs,const iVector& rhs) return ret; } template -inline auto operator - (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix +strong_inline auto operator - (const iMatrix& lhs,const iMatrix& rhs) ->iMatrix { typedef iMatrix ret_t; ret_t ret; @@ -94,7 +94,7 @@ inline auto operator - (const iMatrix& lhs,const iMatrix& rhs) return ret; } template -inline auto operator - (const iScalar& lhs,const iMatrix& rhs)->iMatrix +strong_inline auto operator - (const iScalar& lhs,const iMatrix& rhs)->iMatrix { typedef iMatrix ret_t; ret_t ret; @@ -102,7 +102,7 @@ inline auto operator - (const iScalar& lhs,const iMatrix& rhs)-> return ret; } template -inline auto operator - (const iMatrix& lhs,const iScalar& rhs)->iMatrix +strong_inline auto operator - (const iMatrix& lhs,const iScalar& rhs)->iMatrix { typedef iMatrix ret_t; ret_t ret; From a26fdab7196be3c1a0356bd22c2cbc9b7210bac9 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:42:03 +0100 Subject: [PATCH 166/429] More elegant to do boolean logic inside the enable_if construct Should have done that from the beginning and should move this into a global edit --- lib/math/Grid_math_peek.h | 74 +++++++++++++-------------------------- 1 file changed, 25 insertions(+), 49 deletions(-) diff --git a/lib/math/Grid_math_peek.h b/lib/math/Grid_math_peek.h index b76fa84d..5c8d4a93 100644 --- a/lib/math/Grid_math_peek.h +++ b/lib/math/Grid_math_peek.h @@ -13,28 +13,22 @@ namespace Grid { //template inline RealD peekIndex(const RealD arg) { return arg;} // Scalar peek, no indices -template inline - auto peekIndex(const iScalar &arg) -> - typename std::enable_if,Level>::value, // Index matches - iScalar >::type // return scalar +template::TensorLevel == Level >::type * =nullptr> inline + auto peekIndex(const iScalar &arg) -> iScalar { return arg; } // Vector peek, one index -template inline - auto peekIndex(const iVector &arg,int i) -> - typename std::enable_if,Level>::value, // Index matches - iScalar >::type // return scalar +template::TensorLevel == Level >::type * =nullptr> inline + auto peekIndex(const iVector &arg,int i) -> iScalar // Index matches { iScalar ret; // return scalar ret._internal = arg._internal[i]; return ret; } // Matrix peek, two indices -template inline - auto peekIndex(const iMatrix &arg,int i,int j) -> - typename std::enable_if,Level>::value, // Index matches - iScalar >::type // return scalar +template::TensorLevel == Level >::type * =nullptr> inline + auto peekIndex(const iMatrix &arg,int i,int j) -> iScalar { iScalar ret; // return scalar ret._internal = arg._internal[i][j]; @@ -45,38 +39,30 @@ template inline // No match peek for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue ///////////// // scalar -template inline - auto peekIndex(const iScalar &arg) -> // Scalar 0 index - typename std::enable_if,Level>::notvalue, // Index does NOT match - iScalar(arg._internal))> >::type +template::TensorLevel != Level >::type * =nullptr> inline + auto peekIndex(const iScalar &arg) -> iScalar(arg._internal))> { iScalar(arg._internal))> ret; ret._internal= peekIndex(arg._internal); return ret; } -template inline - auto peekIndex(const iScalar &arg,int i) -> // Scalar 1 index - typename std::enable_if,Level>::notvalue, // Index does NOT match - iScalar(arg._internal,i))> >::type +template::TensorLevel != Level >::type * =nullptr> inline + auto peekIndex(const iScalar &arg,int i) -> iScalar(arg._internal,i))> { iScalar(arg._internal,i))> ret; ret._internal=peekIndex(arg._internal,i); return ret; } -template inline - auto peekIndex(const iScalar &arg,int i,int j) -> // Scalar, 2 index - typename std::enable_if,Level>::notvalue, // Index does NOT match - iScalar(arg._internal,i,j))> >::type +template::TensorLevel != Level >::type * =nullptr> inline + auto peekIndex(const iScalar &arg,int i,int j) -> iScalar(arg._internal,i,j))> { iScalar(arg._internal,i,j))> ret; ret._internal=peekIndex(arg._internal,i,j); return ret; } // vector -template inline -auto peekIndex(const iVector &arg) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iVector(arg._internal[0])),N> >::type +template::TensorLevel != Level >::type * =nullptr> inline +auto peekIndex(const iVector &arg) -> iVector(arg._internal[0])),N> { iVector(arg._internal[0])),N> ret; for(int ii=0;ii &arg) -> } return ret; } -template inline - auto peekIndex(const iVector &arg,int i) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iVector(arg._internal[0],i)),N> >::type +template::TensorLevel != Level >::type * =nullptr> inline + auto peekIndex(const iVector &arg,int i) -> iVector(arg._internal[0],i)),N> { iVector(arg._internal[0],i)),N> ret; for(int ii=0;ii inline } return ret; } -template inline - auto peekIndex(const iVector &arg,int i,int j) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iVector(arg._internal[0],i,j)),N> >::type +template::TensorLevel != Level >::type * =nullptr> inline + auto peekIndex(const iVector &arg,int i,int j) -> iVector(arg._internal[0],i,j)),N> { iVector(arg._internal[0],i,j)),N> ret; for(int ii=0;ii inline return ret; } // matrix -template inline -auto peekIndex(const iMatrix &arg) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iMatrix(arg._internal[0][0])),N> >::type +template::TensorLevel != Level >::type * =nullptr> inline +auto peekIndex(const iMatrix &arg) -> iMatrix(arg._internal[0][0])),N> { iMatrix(arg._internal[0][0])),N> ret; for(int ii=0;ii &arg) -> }} return ret; } -template inline - auto peekIndex(const iMatrix &arg,int i) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iMatrix(arg._internal[0],i)),N> >::type +template::TensorLevel != Level >::type * =nullptr> inline + auto peekIndex(const iMatrix &arg,int i) -> iMatrix(arg._internal[0][0],i)),N> { - iMatrix(arg._internal[0],i)),N> ret; + iMatrix(arg._internal[0][0],i)),N> ret; for(int ii=0;ii(arg._internal[ii][jj],i); }} return ret; } -template inline - auto peekIndex(const iMatrix &arg,int i,int j) -> - typename std::enable_if,Level>::notvalue, // Index does not match - iMatrix(arg._internal[0][0],i,j)),N> >::type +template::TensorLevel != Level >::type * =nullptr> inline + auto peekIndex(const iMatrix &arg,int i,int j) -> iMatrix(arg._internal[0][0],i,j)),N> { iMatrix(arg._internal[0][0],i,j)),N> ret; for(int ii=0;ii Date: Fri, 15 May 2015 11:42:51 +0100 Subject: [PATCH 167/429] More elegant enable_if --- lib/math/Grid_math_poke.h | 73 +++++++++++++-------------------------- 1 file changed, 24 insertions(+), 49 deletions(-) diff --git a/lib/math/Grid_math_poke.h b/lib/math/Grid_math_poke.h index 3f1cb89e..a015478e 100644 --- a/lib/math/Grid_math_poke.h +++ b/lib/math/Grid_math_poke.h @@ -7,23 +7,20 @@ namespace Grid { ////////////////////////////////////////////////////////////////////////////// // Scalar poke -template inline - void pokeIndex(iScalar &ret, - const typename std::enable_if,Level>::value,iScalar >::type &arg) +template::TensorLevel == Level >::type * =nullptr> inline + void pokeIndex(iScalar &ret, const iScalar &arg) { ret._internal = arg._internal; } // Vector poke, one index -template inline - void pokeIndex(iVector &ret, - const typename std::enable_if,Level>::value,iScalar >::type &arg,int i) +template::TensorLevel == Level >::type * =nullptr> inline + void pokeIndex(iVector &ret, const iScalar &arg,int i) { ret._internal[i] = arg._internal; } // Vector poke, two indices -template inline - void pokeIndex(iMatrix &ret, - const typename std::enable_if,Level>::value,iScalar >::type &arg,int i,int j) +template::TensorLevel == Level >::type * =nullptr> inline + void pokeIndex(iMatrix &ret, const iScalar &arg,int i,int j) { ret._internal[i][j] = arg._internal; } @@ -32,55 +29,41 @@ template inline // No match poke for scalar,vector,matrix must forward on either 0,1,2 args. Must have 9 routines with notvalue ///////////// // scalar -template inline - void pokeIndex(iScalar &ret, - const typename std::enable_if,Level>::notvalue,iScalar(ret._internal))> >::type &arg) +template::TensorLevel != Level >::type * =nullptr> inline +void pokeIndex(iScalar &ret, const iScalar(ret._internal))> &arg) { pokeIndex(ret._internal,arg._internal); } -template inline - void pokeIndex(iScalar &ret, - const typename std::enable_if,Level>::notvalue,iScalar(ret._internal,0))> >::type &arg, - int i) +template::TensorLevel != Level >::type * =nullptr> inline + void pokeIndex(iScalar &ret, const iScalar(ret._internal,0))> &arg, int i) { pokeIndex(ret._internal,arg._internal,i); } -template inline - void pokeIndex(iScalar &ret, - const typename std::enable_if,Level>::notvalue,iScalar(ret._internal,0,0))> >::type &arg, - int i,int j) - +template::TensorLevel != Level >::type * =nullptr> inline + void pokeIndex(iScalar &ret, const iScalar(ret._internal,0,0))> &arg,int i,int j) { pokeIndex(ret._internal,arg._internal,i,j); } // Vector -template inline - void pokeIndex(iVector &ret, - const typename std::enable_if,Level>::notvalue,iVector(ret._internal)),N> >::type &arg) - +template::TensorLevel != Level >::type * =nullptr> inline + void pokeIndex(iVector &ret, iVector(ret._internal)),N> &arg) { for(int ii=0;ii(ret._internal[ii],arg._internal[ii]); } } -template inline - void pokeIndex(iVector &ret, - const typename std::enable_if,Level>::notvalue,iVector(ret._internal,0)),N> >::type &arg, - int i) - +template::TensorLevel != Level >::type * =nullptr> inline + void pokeIndex(iVector &ret, const iVector(ret._internal,0)),N> &arg,int i) { for(int ii=0;ii(ret._internal[ii],arg._internal[ii],i); } } -template inline - void pokeIndex(iVector &ret, - const typename std::enable_if,Level>::notvalue,iVector(ret._internal,0,0)),N> >::type &arg, - int i,int j) - +template::TensorLevel != Level >::type * =nullptr> inline + void pokeIndex(iVector &ret, const iVector(ret._internal,0,0)),N> &arg,int i,int j) { for(int ii=0;ii(ret._internal[ii],arg._internal[ii],i,j); @@ -88,32 +71,24 @@ template inline } // Matrix -template inline - void pokeIndex(iMatrix &ret, - const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal)),N> >::type &arg) - +template::TensorLevel != Level >::type * =nullptr> inline + void pokeIndex(iMatrix &ret, const iMatrix(ret._internal)),N> &arg) { for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj]); }} } -template inline - void pokeIndex(iMatrix &ret, - const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal,0)),N> >::type &arg, - int i) - +template::TensorLevel != Level >::type * =nullptr> inline + void pokeIndex(iMatrix &ret, const iMatrix(ret._internal,0)),N> &arg,int i) { for(int ii=0;ii(ret._internal[ii][jj],arg._internal[ii][jj],i); }} } -template inline - void pokeIndex(iMatrix &ret, - const typename std::enable_if,Level>::notvalue,iMatrix(ret._internal,0,0)),N> >::type &arg, - int i,int j) - +template::TensorLevel != Level >::type * =nullptr> inline + void pokeIndex(iMatrix &ret, const iMatrix(ret._internal,0,0)),N> &arg, int i,int j) { for(int ii=0;ii Date: Fri, 15 May 2015 11:43:20 +0100 Subject: [PATCH 168/429] Force inlining upon icpc --- lib/math/Grid_math_tensors.h | 72 ++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/lib/math/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h index 8b3e4b1b..a0424576 100644 --- a/lib/math/Grid_math_tensors.h +++ b/lib/math/Grid_math_tensors.h @@ -42,46 +42,46 @@ public: zeroit(*this); return *this; } - friend void vstream(iScalar &out,const iScalar &in){ + friend strong_inline void vstream(iScalar &out,const iScalar &in){ vstream(out._internal,in._internal); } - friend void zeroit(iScalar &that){ + friend strong_inline void zeroit(iScalar &that){ zeroit(that._internal); } - friend void prefetch(iScalar &that){ + friend strong_inline void prefetch(iScalar &that){ prefetch(that._internal); } - friend void permute(iScalar &out,const iScalar &in,int permutetype){ + friend strong_inline void permute(iScalar &out,const iScalar &in,int permutetype){ permute(out._internal,in._internal,permutetype); } // Unary negation - friend inline iScalar operator -(const iScalar &r) { + friend strong_inline iScalar operator -(const iScalar &r) { iScalar ret; ret._internal= -r._internal; return ret; } // *=,+=,-= operators inherit from corresponding "*,-,+" behaviour - inline iScalar &operator *=(const iScalar &r) { + strong_inline iScalar &operator *=(const iScalar &r) { *this = (*this)*r; return *this; } - inline iScalar &operator -=(const iScalar &r) { + strong_inline iScalar &operator -=(const iScalar &r) { *this = (*this)-r; return *this; } - inline iScalar &operator +=(const iScalar &r) { + strong_inline iScalar &operator +=(const iScalar &r) { *this = (*this)+r; return *this; } - inline vtype & operator ()(void) { + strong_inline vtype & operator ()(void) { return _internal; } - inline const vtype & operator ()(void) const { + strong_inline const vtype & operator ()(void) const { return _internal; } @@ -89,7 +89,7 @@ public: operator RealD () const { return(real(TensorRemove(_internal))); } // convert from a something to a scalar - template::value, T>::type* = nullptr > inline auto operator = (T arg) -> iScalar + template::value, T>::type* = nullptr > strong_inline auto operator = (T arg) -> iScalar { _internal = vtype(arg); return *this; @@ -103,8 +103,8 @@ public: /////////////////////////////////////////////////////////// // Allows to turn scalar>>> back to double. /////////////////////////////////////////////////////////// -template inline typename std::enable_if::value, T>::type TensorRemove(T arg) { return arg;} -template inline auto TensorRemove(iScalar arg) -> decltype(TensorRemove(arg._internal)) +template strong_inline typename std::enable_if::value, T>::type TensorRemove(T arg) { return arg;} +template strong_inline auto TensorRemove(iScalar arg) -> decltype(TensorRemove(arg._internal)) { return TensorRemove(arg._internal); } @@ -130,48 +130,48 @@ public: zeroit(*this); return *this; } - friend void zeroit(iVector &that){ + friend strong_inline void zeroit(iVector &that){ for(int i=0;i &that){ + friend strong_inline void prefetch(iVector &that){ for(int i=0;i &out,const iVector &in){ + friend strong_inline void vstream(iVector &out,const iVector &in){ for(int i=0;i &out,const iVector &in,int permutetype){ + friend strong_inline void permute(iVector &out,const iVector &in,int permutetype){ for(int i=0;i operator -(const iVector &r) { + friend strong_inline iVector operator -(const iVector &r) { iVector ret; for(int i=0;i &operator *=(const iScalar &r) { + strong_inline iVector &operator *=(const iScalar &r) { *this = (*this)*r; return *this; } - inline iVector &operator -=(const iVector &r) { + strong_inline iVector &operator -=(const iVector &r) { *this = (*this)-r; return *this; } - inline iVector &operator +=(const iVector &r) { + strong_inline iVector &operator +=(const iVector &r) { *this = (*this)+r; return *this; } - inline vtype & operator ()(int i) { + strong_inline vtype & operator ()(int i) { return _internal[i]; } - inline const vtype & operator ()(int i) const { + strong_inline const vtype & operator ()(int i) const { return _internal[i]; } friend std::ostream& operator<< (std::ostream& stream, const iVector &o){ @@ -183,7 +183,7 @@ public: stream<<"}"; return stream; }; - // inline vtype && operator ()(int i) { + // strong_inline vtype && operator ()(int i) { // return _internal[i]; // } }; @@ -211,7 +211,7 @@ public: zeroit(*this); return *this; } - template::value, T>::type* = nullptr > inline auto operator = (T arg) -> iMatrix + template::value, T>::type* = nullptr > strong_inline auto operator = (T arg) -> iMatrix { zeroit(*this); for(int i=0;i &that){ + friend strong_inline void zeroit(iMatrix &that){ for(int i=0;i &that){ + friend strong_inline void prefetch(iMatrix &that){ for(int i=0;i &out,const iMatrix &in){ + friend strong_inline void vstream(iMatrix &out,const iMatrix &in){ for(int i=0;i &out,const iMatrix &in,int permutetype){ + friend strong_inline void permute(iMatrix &out,const iMatrix &in,int permutetype){ for(int i=0;i operator -(const iMatrix &r) { + friend strong_inline iMatrix operator -(const iMatrix &r) { iMatrix ret; for(int i=0;i - inline iMatrix &operator *=(const T &r) { + strong_inline iMatrix &operator *=(const T &r) { *this = (*this)*r; return *this; } template - inline iMatrix &operator -=(const T &r) { + strong_inline iMatrix &operator -=(const T &r) { *this = (*this)-r; return *this; } template - inline iMatrix &operator +=(const T &r) { + strong_inline iMatrix &operator +=(const T &r) { *this = (*this)+r; return *this; } // returns an lvalue reference - inline vtype & operator ()(int i,int j) { + strong_inline vtype & operator ()(int i,int j) { return _internal[i][j]; } - inline const vtype & operator ()(int i,int j) const { + strong_inline const vtype & operator ()(int i,int j) const { return _internal[i][j]; } friend std::ostream& operator<< (std::ostream& stream, const iMatrix &o){ @@ -289,7 +289,7 @@ public: return stream; }; - // inline vtype && operator ()(int i,int j) { + // strong_inline vtype && operator ()(int i,int j) { // return _internal[i][j]; // } From 0e7945fe546bb96d5a0f71116ce3abe94ec8909b Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:43:49 +0100 Subject: [PATCH 169/429] Forces inlining upon icpc --- lib/qcd/Grid_qcd_2spinor.h | 273 +++++++++++++++++++------------------ 1 file changed, 137 insertions(+), 136 deletions(-) diff --git a/lib/qcd/Grid_qcd_2spinor.h b/lib/qcd/Grid_qcd_2spinor.h index fe6a1da8..97de13cf 100644 --- a/lib/qcd/Grid_qcd_2spinor.h +++ b/lib/qcd/Grid_qcd_2spinor.h @@ -41,7 +41,8 @@ namespace QCD { * 0 -i 0 0 * -i 0 0 0 */ - template inline void + + template strong_inline void spProjXp (iVector &hspin,const iVector &fspin) { // To fail is not to err (Cryptic clue: suggest to Google SFINAE ;) ) @@ -49,7 +50,7 @@ namespace QCD { hspin(0)=fspin(0)+timesI(fspin(3)); hspin(1)=fspin(1)+timesI(fspin(2)); } - template inline void spProjXm (iVector &hspin,const iVector &fspin) + template strong_inline void spProjXm (iVector &hspin,const iVector &fspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; hspin(0)=fspin(0)-timesI(fspin(3)); @@ -60,13 +61,13 @@ namespace QCD { // 0 0 1 0 [1] +- [2] // 0 1 0 0 // -1 0 0 0 - template inline void spProjYp (iVector &hspin,const iVector &fspin) + template strong_inline void spProjYp (iVector &hspin,const iVector &fspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; hspin(0)=fspin(0)-fspin(3); hspin(1)=fspin(1)+fspin(2); } - template inline void spProjYm (iVector &hspin,const iVector &fspin) + template strong_inline void spProjYm (iVector &hspin,const iVector &fspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; hspin(0)=fspin(0)+fspin(3); @@ -78,13 +79,13 @@ namespace QCD { * -i 0 0 0 * 0 i 0 0 */ - template inline void spProjZp (iVector &hspin,const iVector &fspin) + template strong_inline void spProjZp (iVector &hspin,const iVector &fspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; hspin(0)=fspin(0)+timesI(fspin(2)); hspin(1)=fspin(1)-timesI(fspin(3)); } - template inline void spProjZm (iVector &hspin,const iVector &fspin) + template strong_inline void spProjZm (iVector &hspin,const iVector &fspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; hspin(0)=fspin(0)-timesI(fspin(2)); @@ -96,13 +97,13 @@ namespace QCD { * 1 0 0 0 * 0 1 0 0 */ - template inline void spProjTp (iVector &hspin,const iVector &fspin) + template strong_inline void spProjTp (iVector &hspin,const iVector &fspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; hspin(0)=fspin(0)+fspin(2); hspin(1)=fspin(1)+fspin(3); } - template inline void spProjTm (iVector &hspin,const iVector &fspin) + template strong_inline void spProjTm (iVector &hspin,const iVector &fspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; hspin(0)=fspin(0)-fspin(2); @@ -115,21 +116,21 @@ namespace QCD { * 0 0 0 -1 */ - template inline void spProj5p (iVector &hspin,const iVector &fspin) + template strong_inline void spProj5p (iVector &hspin,const iVector &fspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; hspin(0)=fspin(0); hspin(1)=fspin(1); } - template inline void spProj5m (iVector &hspin,const iVector &fspin) + template strong_inline void spProj5m (iVector &hspin,const iVector &fspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; hspin(0)=fspin(2); hspin(1)=fspin(3); } - // template inline void fspProj5p (iVector &rfspin,const iVector &fspin) - template inline void spProj5p (iVector &rfspin,const iVector &fspin) + // template strong_inline void fspProj5p (iVector &rfspin,const iVector &fspin) + template strong_inline void spProj5p (iVector &rfspin,const iVector &fspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; rfspin(0)=fspin(0); @@ -137,8 +138,8 @@ namespace QCD { rfspin(2)=zero; rfspin(3)=zero; } - // template inline void fspProj5m (iVector &rfspin,const iVector &fspin) - template inline void spProj5m (iVector &rfspin,const iVector &fspin) + // template strong_inline void fspProj5m (iVector &rfspin,const iVector &fspin) + template strong_inline void spProj5m (iVector &rfspin,const iVector &fspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; rfspin(0)=zero; @@ -156,7 +157,7 @@ namespace QCD { * 0 -i 0 0 -i[1]+-[2] == -i ([0]+-i[3]) = -i (1) * -i 0 0 0 -i[0]+-[3] == -i ([1]+-i[2]) = -i (0) */ - template inline void spReconXp (iVector &fspin,const iVector &hspin) + template strong_inline void spReconXp (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)=hspin(0); @@ -164,7 +165,7 @@ namespace QCD { fspin(2)=timesMinusI(hspin(1)); fspin(3)=timesMinusI(hspin(0)); } - template inline void spReconXm (iVector &fspin,const iVector &hspin) + template strong_inline void spReconXm (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)=hspin(0); @@ -172,7 +173,7 @@ namespace QCD { fspin(2)=timesI(hspin(1)); fspin(3)=timesI(hspin(0)); } - template inline void accumReconXp (iVector &fspin,const iVector &hspin) + template strong_inline void accumReconXp (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)+=hspin(0); @@ -180,7 +181,7 @@ namespace QCD { fspin(2)-=timesI(hspin(1)); fspin(3)-=timesI(hspin(0)); } - template inline void accumReconXm (iVector &fspin,const iVector &hspin) + template strong_inline void accumReconXm (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)+=hspin(0); @@ -194,7 +195,7 @@ namespace QCD { // 0 1 0 0 == 1(1) // -1 0 0 0 ==-1(0) - template inline void spReconYp (iVector &fspin,const iVector &hspin) + template strong_inline void spReconYp (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)=hspin(0); @@ -202,7 +203,7 @@ namespace QCD { fspin(2)= hspin(1); fspin(3)=-hspin(0);//Unary minus? } - template inline void spReconYm (iVector &fspin,const iVector &hspin) + template strong_inline void spReconYm (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)=hspin(0); @@ -210,7 +211,7 @@ namespace QCD { fspin(2)=-hspin(1); fspin(3)= hspin(0); } - template inline void accumReconYp (iVector &fspin,const iVector &hspin) + template strong_inline void accumReconYp (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)+=hspin(0); @@ -218,7 +219,7 @@ namespace QCD { fspin(2)+=hspin(1); fspin(3)-=hspin(0); } - template inline void accumReconYm (iVector &fspin,const iVector &hspin) + template strong_inline void accumReconYm (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)+=hspin(0); @@ -233,7 +234,7 @@ namespace QCD { * -i 0 0 0 => -i (0) * 0 i 0 0 => i (1) */ - template inline void spReconZp (iVector &fspin,const iVector &hspin) + template strong_inline void spReconZp (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)=hspin(0); @@ -241,7 +242,7 @@ namespace QCD { fspin(2)=timesMinusI(hspin(0)); fspin(3)=timesI(hspin(1)); } - template inline void spReconZm (iVector &fspin,const iVector &hspin) + template strong_inline void spReconZm (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)=hspin(0); @@ -249,7 +250,7 @@ namespace QCD { fspin(2)= timesI(hspin(0)); fspin(3)=timesMinusI(hspin(1)); } - template inline void accumReconZp (iVector &fspin,const iVector &hspin) + template strong_inline void accumReconZp (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)+=hspin(0); @@ -257,7 +258,7 @@ namespace QCD { fspin(2)-=timesI(hspin(0)); fspin(3)+=timesI(hspin(1)); } - template inline void accumReconZm (iVector &fspin,const iVector &hspin) + template strong_inline void accumReconZm (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)+=hspin(0); @@ -271,7 +272,7 @@ namespace QCD { * 1 0 0 0 => (0) * 0 1 0 0 => (1) */ - template inline void spReconTp (iVector &fspin,const iVector &hspin) + template strong_inline void spReconTp (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)=hspin(0); @@ -279,7 +280,7 @@ namespace QCD { fspin(2)=hspin(0); fspin(3)=hspin(1); } - template inline void spReconTm (iVector &fspin,const iVector &hspin) + template strong_inline void spReconTm (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)=hspin(0); @@ -287,7 +288,7 @@ namespace QCD { fspin(2)=-hspin(0); fspin(3)=-hspin(1); } - template inline void accumReconTp (iVector &fspin,const iVector &hspin) + template strong_inline void accumReconTp (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)+=hspin(0); @@ -295,7 +296,7 @@ namespace QCD { fspin(2)+=hspin(0); fspin(3)+=hspin(1); } - template inline void accumReconTm (iVector &fspin,const iVector &hspin) + template strong_inline void accumReconTm (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)+=hspin(0); @@ -309,7 +310,7 @@ namespace QCD { * 0 0 -1 0 * 0 0 0 -1 */ - template inline void spRecon5p (iVector &fspin,const iVector &hspin) + template strong_inline void spRecon5p (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)=hspin(0)+hspin(0); // add is lower latency than mul @@ -317,7 +318,7 @@ namespace QCD { fspin(2)=zero; fspin(3)=zero; } - template inline void spRecon5m (iVector &fspin,const iVector &hspin) + template strong_inline void spRecon5m (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)=zero; @@ -325,13 +326,13 @@ namespace QCD { fspin(2)=hspin(0)+hspin(0); fspin(3)=hspin(1)+hspin(1); } - template inline void accumRecon5p (iVector &fspin,const iVector &hspin) + template strong_inline void accumRecon5p (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(0)+=hspin(0)+hspin(0); fspin(1)+=hspin(1)+hspin(1); } - template inline void accumRecon5m (iVector &fspin,const iVector &hspin) + template strong_inline void accumRecon5m (iVector &fspin,const iVector &hspin) { typename std::enable_if,SpinIndex>::value,iVector >::type *SFINAE; fspin(2)+=hspin(0)+hspin(0); @@ -345,19 +346,19 @@ namespace QCD { ////////// // Xp ////////// - template inline void spProjXp (iScalar &hspin,const iScalar &fspin) + template strong_inline void spProjXp (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spProjXp(hspin._internal,fspin._internal); } - template inline void spProjXp (iVector &hspin,iVector &fspin) + template strong_inline void spProjXp (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spProjXp (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spProjXp (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spReconXp (iScalar &hspin,const iScalar &fspin) + template strong_inline void spReconXp (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spReconXp(hspin._internal,fspin._internal); } - template inline void spReconXp (iVector &hspin,iVector &fspin) + template strong_inline void spReconXp (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spReconXp (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spReconXp (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void accumReconXp (iScalar &hspin,const iScalar &fspin) + template strong_inline void accumReconXp (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; accumReconXp(hspin._internal,fspin._internal); } - template inline void accumReconXp (iVector &hspin,iVector &fspin) + template strong_inline void accumReconXp (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void accumReconXp (iMatrix &hspin,iMatrix &fspin) + template strong_inline void accumReconXp (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spProjXm (iScalar &hspin,const iScalar &fspin) + template strong_inline void spProjXm (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spProjXm(hspin._internal,fspin._internal); } - template inline void spProjXm (iVector &hspin,iVector &fspin) + template strong_inline void spProjXm (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spProjXm (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spProjXm (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spReconXm (iScalar &hspin,const iScalar &fspin) + template strong_inline void spReconXm (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spReconXm(hspin._internal,fspin._internal); } - template inline void spReconXm (iVector &hspin,iVector &fspin) + template strong_inline void spReconXm (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spReconXm (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spReconXm (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void accumReconXm (iScalar &hspin,const iScalar &fspin) + template strong_inline void accumReconXm (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; accumReconXm(hspin._internal,fspin._internal); } - template inline void accumReconXm (iVector &hspin,iVector &fspin) + template strong_inline void accumReconXm (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void accumReconXm (iMatrix &hspin,iMatrix &fspin) + template strong_inline void accumReconXm (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spProjYp (iScalar &hspin,const iScalar &fspin) + template strong_inline void spProjYp (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spProjYp(hspin._internal,fspin._internal); } - template inline void spProjYp (iVector &hspin,iVector &fspin) + template strong_inline void spProjYp (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spProjYp (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spProjYp (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spReconYp (iScalar &hspin,const iScalar &fspin) + template strong_inline void spReconYp (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spReconYp(hspin._internal,fspin._internal); } - template inline void spReconYp (iVector &hspin,iVector &fspin) + template strong_inline void spReconYp (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spReconYp (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spReconYp (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void accumReconYp (iScalar &hspin,const iScalar &fspin) + template strong_inline void accumReconYp (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; accumReconYp(hspin._internal,fspin._internal); } - template inline void accumReconYp (iVector &hspin,iVector &fspin) + template strong_inline void accumReconYp (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void accumReconYp (iMatrix &hspin,iMatrix &fspin) + template strong_inline void accumReconYp (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spProjYm (iScalar &hspin,const iScalar &fspin) + template strong_inline void spProjYm (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spProjYm(hspin._internal,fspin._internal); } - template inline void spProjYm (iVector &hspin,iVector &fspin) + template strong_inline void spProjYm (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spProjYm (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spProjYm (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spReconYm (iScalar &hspin,const iScalar &fspin) + template strong_inline void spReconYm (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spReconYm(hspin._internal,fspin._internal); } - template inline void spReconYm (iVector &hspin,iVector &fspin) + template strong_inline void spReconYm (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spReconYm (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spReconYm (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void accumReconYm (iScalar &hspin,const iScalar &fspin) + template strong_inline void accumReconYm (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; accumReconYm(hspin._internal,fspin._internal); } - template inline void accumReconYm (iVector &hspin,iVector &fspin) + template strong_inline void accumReconYm (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void accumReconYm (iMatrix &hspin,iMatrix &fspin) + template strong_inline void accumReconYm (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spProjZp (iScalar &hspin,const iScalar &fspin) + template strong_inline void spProjZp (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spProjZp(hspin._internal,fspin._internal); } - template inline void spProjZp (iVector &hspin,iVector &fspin) + template strong_inline void spProjZp (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spProjZp (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spProjZp (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spReconZp (iScalar &hspin,const iScalar &fspin) + template strong_inline void spReconZp (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spReconZp(hspin._internal,fspin._internal); } - template inline void spReconZp (iVector &hspin,iVector &fspin) + template strong_inline void spReconZp (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spReconZp (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spReconZp (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void accumReconZp (iScalar &hspin,const iScalar &fspin) + template strong_inline void accumReconZp (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; accumReconZp(hspin._internal,fspin._internal); } - template inline void accumReconZp (iVector &hspin,iVector &fspin) + template strong_inline void accumReconZp (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void accumReconZp (iMatrix &hspin,iMatrix &fspin) + template strong_inline void accumReconZp (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spProjZm (iScalar &hspin,const iScalar &fspin) + template strong_inline void spProjZm (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spProjZm(hspin._internal,fspin._internal); } - template inline void spProjZm (iVector &hspin,iVector &fspin) + template strong_inline void spProjZm (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spProjZm (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spProjZm (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spReconZm (iScalar &hspin,const iScalar &fspin) + template strong_inline void spReconZm (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spReconZm(hspin._internal,fspin._internal); } - template inline void spReconZm (iVector &hspin,iVector &fspin) + template strong_inline void spReconZm (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spReconZm (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spReconZm (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void accumReconZm (iScalar &hspin,const iScalar &fspin) + template strong_inline void accumReconZm (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; accumReconZm(hspin._internal,fspin._internal); } - template inline void accumReconZm (iVector &hspin,iVector &fspin) + template strong_inline void accumReconZm (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void accumReconZm (iMatrix &hspin,iMatrix &fspin) + template strong_inline void accumReconZm (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spProjTp (iScalar &hspin,const iScalar &fspin) + template strong_inline void spProjTp (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spProjTp(hspin._internal,fspin._internal); } - template inline void spProjTp (iVector &hspin,iVector &fspin) + template strong_inline void spProjTp (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spProjTp (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spProjTp (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spReconTp (iScalar &hspin,const iScalar &fspin) + template strong_inline void spReconTp (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spReconTp(hspin._internal,fspin._internal); } - template inline void spReconTp (iVector &hspin,iVector &fspin) + template strong_inline void spReconTp (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spReconTp (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spReconTp (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void accumReconTp (iScalar &hspin,const iScalar &fspin) + template strong_inline void accumReconTp (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; accumReconTp(hspin._internal,fspin._internal); } - template inline void accumReconTp (iVector &hspin,iVector &fspin) + template strong_inline void accumReconTp (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void accumReconTp (iMatrix &hspin,iMatrix &fspin) + template strong_inline void accumReconTp (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spProjTm (iScalar &hspin,const iScalar &fspin) + template strong_inline void spProjTm (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spProjTm(hspin._internal,fspin._internal); } - template inline void spProjTm (iVector &hspin,iVector &fspin) + template strong_inline void spProjTm (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spProjTm (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spProjTm (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spReconTm (iScalar &hspin,const iScalar &fspin) + template strong_inline void spReconTm (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spReconTm(hspin._internal,fspin._internal); } - template inline void spReconTm (iVector &hspin,iVector &fspin) + template strong_inline void spReconTm (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spReconTm (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spReconTm (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void accumReconTm (iScalar &hspin,const iScalar &fspin) + template strong_inline void accumReconTm (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; accumReconTm(hspin._internal,fspin._internal); } - template inline void accumReconTm (iVector &hspin,iVector &fspin) + template strong_inline void accumReconTm (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void accumReconTm (iMatrix &hspin,iMatrix &fspin) + template strong_inline void accumReconTm (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spProj5p (iScalar &hspin,const iScalar &fspin) + template strong_inline void spProj5p (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spProj5p(hspin._internal,fspin._internal); } - template inline void spProj5p (iVector &hspin,iVector &fspin) + template strong_inline void spProj5p (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spProj5p (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spProj5p (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spRecon5p (iScalar &hspin,const iScalar &fspin) + template strong_inline void spRecon5p (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spRecon5p(hspin._internal,fspin._internal); } - template inline void spRecon5p (iVector &hspin,iVector &fspin) + template strong_inline void spRecon5p (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spRecon5p (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spRecon5p (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void accumRecon5p (iScalar &hspin,const iScalar &fspin) + template strong_inline void accumRecon5p (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; accumRecon5p(hspin._internal,fspin._internal); } - template inline void accumRecon5p (iVector &hspin,iVector &fspin) + template strong_inline void accumRecon5p (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void accumRecon5p (iMatrix &hspin,iMatrix &fspin) + template strong_inline void accumRecon5p (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void fspProj5p (iScalar &hspin,const iScalar &fspin) - template inline void spProj5p (iScalar &hspin,const iScalar &fspin) + // template strong_inline void fspProj5p (iScalar &hspin,const iScalar &fspin) + template strong_inline void spProj5p (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spProj5p(hspin._internal,fspin._internal); } - // template inline void fspProj5p (iVector &hspin,iVector &fspin) - template inline void spProj5p (iVector &hspin,iVector &fspin) + // template strong_inline void fspProj5p (iVector &hspin,iVector &fspin) + template strong_inline void spProj5p (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void fspProj5p (iMatrix &hspin,iMatrix &fspin) - template inline void spProj5p (iMatrix &hspin,iMatrix &fspin) + // template strong_inline void fspProj5p (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spProj5p (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spProj5m (iScalar &hspin,const iScalar &fspin) + template strong_inline void spProj5m (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spProj5m(hspin._internal,fspin._internal); } - template inline void spProj5m (iVector &hspin,iVector &fspin) + template strong_inline void spProj5m (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spProj5m (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spProj5m (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void spRecon5m (iScalar &hspin,const iScalar &fspin) + template strong_inline void spRecon5m (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spRecon5m(hspin._internal,fspin._internal); } - template inline void spRecon5m (iVector &hspin,iVector &fspin) + template strong_inline void spRecon5m (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void spRecon5m (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spRecon5m (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void accumRecon5m (iScalar &hspin,const iScalar &fspin) + template strong_inline void accumRecon5m (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; accumRecon5m(hspin._internal,fspin._internal); } - template inline void accumRecon5m (iVector &hspin,iVector &fspin) + template strong_inline void accumRecon5m (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void accumRecon5m (iMatrix &hspin,iMatrix &fspin) + template strong_inline void accumRecon5m (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i inline void fspProj5m (iScalar &hspin,const iScalar &fspin) - template inline void spProj5m (iScalar &hspin,const iScalar &fspin) + // template strong_inline void fspProj5m (iScalar &hspin,const iScalar &fspin) + template strong_inline void spProj5m (iScalar &hspin,const iScalar &fspin) { typename std::enable_if,SpinIndex>::notvalue,iScalar >::type *temp; spProj5m(hspin._internal,fspin._internal); } - // template inline void fspProj5m (iVector &hspin,iVector &fspin) - template inline void spProj5m (iVector &hspin,iVector &fspin) + // template strong_inline void fspProj5m (iVector &hspin,iVector &fspin) + template strong_inline void spProj5m (iVector &hspin,iVector &fspin) { typename std::enable_if,SpinIndex>::notvalue,iVector >::type *temp; for(int i=0;i inline void fspProj5m (iMatrix &hspin,iMatrix &fspin) - template inline void spProj5m (iMatrix &hspin,iMatrix &fspin) + // template strong_inline void fspProj5m (iMatrix &hspin,iMatrix &fspin) + template strong_inline void spProj5m (iMatrix &hspin,iMatrix &fspin) { typename std::enable_if,SpinIndex>::notvalue,iMatrix >::type *temp; for(int i=0;i Date: Fri, 15 May 2015 11:48:04 +0100 Subject: [PATCH 170/429] Parallel for replace --- lib/lattice/Grid_lattice_base.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/lattice/Grid_lattice_base.h b/lib/lattice/Grid_lattice_base.h index 915879cb..64103c5d 100644 --- a/lib/lattice/Grid_lattice_base.h +++ b/lib/lattice/Grid_lattice_base.h @@ -64,8 +64,7 @@ public: //////////////////////////////////////////////////////////////////////////////// template inline Lattice & operator=(const LatticeUnaryExpression &expr) { - //PARALLEL_FOR_LOOP -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ vobj tmp= eval(ss,expr); vstream(_odata[ss] ,tmp); @@ -74,8 +73,7 @@ public: } template inline Lattice & operator=(const LatticeBinaryExpression &expr) { - // PARALLEL_FOR_LOOP -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ vobj tmp= eval(ss,expr); vstream(_odata[ss] ,tmp); @@ -84,8 +82,7 @@ public: } template inline Lattice & operator=(const LatticeTrinaryExpression &expr) { - //PARALLEL_FOR_LOOP -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ vobj tmp= eval(ss,expr); vstream(_odata[ss] ,tmp); From 9a120cf5eca4b35a9823038608425e734caab636 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:49:39 +0100 Subject: [PATCH 171/429] ngo store --- lib/simd/Grid_vComplexF.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index cd757916..5e3ff4dc 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -203,7 +203,6 @@ namespace Grid { #endif #ifdef AVX512 _mm512_storenrngo_ps((float *)&out.v,in.v); - // _mm512_stream_ps((float *)&out.v,in.v); //Note v has a3 a2 a1 a0 #endif #ifdef QPX From 264850bc160401513714ad2f88ac502f1831e29e Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:50:00 +0100 Subject: [PATCH 172/429] Move platform dependent out to Grid_simd.h --- lib/simd/Grid_vInteger.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/simd/Grid_vInteger.h b/lib/simd/Grid_vInteger.h index 7d558fe7..63e8c720 100644 --- a/lib/simd/Grid_vInteger.h +++ b/lib/simd/Grid_vInteger.h @@ -3,12 +3,6 @@ namespace Grid { -// _mm256_set_m128i(hi,lo); // not defined in all versions of immintrin.h -#ifndef _mm256_set_m128i -#define _mm256_set_m128i(hi,lo) _mm256_insertf128_si256(_mm256_castsi128_si256(lo),(hi),1) -#endif - - typedef uint32_t Integer; class vInteger { protected: From 254dee6ac7d1b0c9f190262519e73e34be638df6 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:50:44 +0100 Subject: [PATCH 173/429] GCC and ICPC complained on more careful typeing --- lib/simd/Grid_vRealD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/simd/Grid_vRealD.h b/lib/simd/Grid_vRealD.h index aef143f8..dbfacb0c 100644 --- a/lib/simd/Grid_vRealD.h +++ b/lib/simd/Grid_vRealD.h @@ -237,7 +237,7 @@ namespace Grid { __m256d tmp = _mm256_permute2f128_pd(in.v,in.v,0x01); // tmp 1032; in= 3210 __m256d hadd = _mm256_hadd_pd(in.v,tmp); // hadd = 1+0,3+2,3+2,1+0 hadd = _mm256_hadd_pd(hadd,hadd); // hadd = 1+0+3+2... - converter.l = _mm256_extract_epi64(hadd,0); + converter.l = _mm256_extract_epi64((ivec)hadd,0); return converter.d; #endif #ifdef AVX512 From 6965a136a0892bc7f216e97c84d0b3bd003e6c77 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 11:51:15 +0100 Subject: [PATCH 174/429] Remove debug masking --- benchmarks/Grid_wilson.cc | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/benchmarks/Grid_wilson.cc b/benchmarks/Grid_wilson.cc index 7718eb19..e49d4515 100644 --- a/benchmarks/Grid_wilson.cc +++ b/benchmarks/Grid_wilson.cc @@ -50,25 +50,20 @@ int main (int argc, char ** argv) U[mu] = peekIndex(Umu,mu); } - std::vector mask({1,1,1,1,1,1,1,1}); { // Naive wilson implementation ref = zero; for(int mu=0;mu Date: Fri, 15 May 2015 11:52:11 +0100 Subject: [PATCH 175/429] clang++ 3.4/5/7 compile happy for AVX and SSE icpc compiles happy on MacOSX both with -xCOMMON-AV512 and native AVX gcc-5 does not compile happy; can work around by renaming lattice peek/poke/transpose/trace templates relative to tensor ones, but gcc goes into a recursive template instantiation due to matching error. I think this is a gcc bug and have filed a report https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66153 --- configure | 12 ++++++++++++ configure-commands | 3 +++ configure.ac | 1 + lib/Grid_config.h | 11 +++++++---- lib/Grid_config.h.in | 3 +++ 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/configure b/configure index d5071cd1..deec23c3 100755 --- a/configure +++ b/configure @@ -4196,6 +4196,18 @@ fi done +for ac_header in mm_malloc.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "mm_malloc.h" "ac_cv_header_mm_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_mm_malloc_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MM_MALLOC_H 1 +_ACEOF + +fi + +done + for ac_header in malloc/malloc.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" diff --git a/configure-commands b/configure-commands index 8ba2dac1..cf8057a9 100644 --- a/configure-commands +++ b/configure-commands @@ -1,5 +1,8 @@ +CXX=icpc ./configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi + CXX=clang-omp++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx" --enable-comms=mpi CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -g -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx" --enable-comms=mpi CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -g -std=c++11" LDFLAGS= LIBS=-lmpi --enable-comms=fake CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -g -std=c++11" LDFLAGS= LIBS=-lmpi --enable-comms=none +CXX=/usr/local/clang-3.7/bin/clang++ ./configure --enable-simd=AVX512 CXXFLAGS="-mavx512f -O3 -std=c++11" LDFLAGS= LIBS= --enable-comms=none diff --git a/configure.ac b/configure.ac index 86f4b70c..97206a01 100644 --- a/configure.ac +++ b/configure.ac @@ -16,6 +16,7 @@ AC_PROG_RANLIB # Checks for header files. AC_CHECK_HEADERS(stdint.h) +AC_CHECK_HEADERS(mm_malloc.h) AC_CHECK_HEADERS(malloc/malloc.h) AC_CHECK_HEADERS(malloc.h) AC_CHECK_HEADERS(endian.h) diff --git a/lib/Grid_config.h b/lib/Grid_config.h index c743bba0..f71e202f 100644 --- a/lib/Grid_config.h +++ b/lib/Grid_config.h @@ -2,19 +2,19 @@ /* lib/Grid_config.h.in. Generated from configure.ac by autoheader. */ /* AVX */ -#define AVX1 1 +/* #undef AVX1 */ /* AVX2 */ /* #undef AVX2 */ /* AVX512 */ -/* #undef AVX512 */ +#define AVX512 1 /* GRID_COMMS_MPI */ -#define GRID_COMMS_MPI 1 +/* #undef GRID_COMMS_MPI */ /* GRID_COMMS_NONE */ -/* #undef GRID_COMMS_NONE */ +#define GRID_COMMS_NONE 1 /* Define to 1 if you have the declaration of `be64toh', and to 0 if you don't. */ @@ -42,6 +42,9 @@ /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 +/* Define to 1 if you have the header file. */ +#define HAVE_MM_MALLOC_H 1 + /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 diff --git a/lib/Grid_config.h.in b/lib/Grid_config.h.in index 437a6095..47643530 100644 --- a/lib/Grid_config.h.in +++ b/lib/Grid_config.h.in @@ -41,6 +41,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H +/* Define to 1 if you have the header file. */ +#undef HAVE_MM_MALLOC_H + /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H From f92fda0cfd9a3ca4fc5537d3d2e0cc0e8a7a11ef Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 12:21:10 +0100 Subject: [PATCH 176/429] Convenience multi-compiler build with out of source compile --- build-all | 11 +++++++++++ configure-all | 11 +++++++++++ configure-commands | 34 ++++++++++++++++++++++++++-------- configure-mic | 10 ++++++++++ 4 files changed, 58 insertions(+), 8 deletions(-) create mode 100755 build-all create mode 100755 configure-all mode change 100644 => 100755 configure-commands create mode 100755 configure-mic diff --git a/build-all b/build-all new file mode 100755 index 00000000..cff673ab --- /dev/null +++ b/build-all @@ -0,0 +1,11 @@ +#!/bin/bash +DIRS="build-clang-avx build-clang-avx-openmp build-clang-avx-openmp-mpi build-clang-avx-mpi build-icpc-avx512 build-icpc-avx " + +for D in $DIRS +do + echo $D + mkdir -p $D + cd $D + make clean all -j 8 + cd .. +done diff --git a/configure-all b/configure-all new file mode 100755 index 00000000..aa67aaf0 --- /dev/null +++ b/configure-all @@ -0,0 +1,11 @@ +#!/bin/bash +DIRS="build-icpc-avx build-icpc-avx512 build-clang-avx build-clang-avx-openmp build-clang-avx-openmp-mpi build-clang-avx-mpi" + +for D in $DIRS +do + echo $D + mkdir -p $D + cd $D + ../configure-commands $D + cd .. +done diff --git a/configure-commands b/configure-commands old mode 100644 new mode 100755 index cf8057a9..66d7b19b --- a/configure-commands +++ b/configure-commands @@ -1,8 +1,26 @@ -CXX=icpc ./configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi - -CXX=clang-omp++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi -CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx" --enable-comms=mpi -CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -g -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx" --enable-comms=mpi -CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -g -std=c++11" LDFLAGS= LIBS=-lmpi --enable-comms=fake -CXX=clang++ ./configure --enable-simd=AVX CXXFLAGS="-mavx -g -std=c++11" LDFLAGS= LIBS=-lmpi --enable-comms=none -CXX=/usr/local/clang-3.7/bin/clang++ ./configure --enable-simd=AVX512 CXXFLAGS="-mavx512f -O3 -std=c++11" LDFLAGS= LIBS= --enable-comms=none +#!/bin/bash +WD=$1 +echo $WD +case $WD in +build-icpc-avx) + CXX=icpc ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I -std=c++11" --enable-comms=none + ;; +build-icpc-avx512) + CXX=icpc ../configure --enable-simd=AVX512 CXXFLAGS="-xCOMMON-AVX512 -O3 -I -std=c++11" --host=none --enable-comms=none + ;; +build-icpc-mic) + CXX=icpc ../configure --host=none --enable-simd=AVX512 CXXFLAGS="-mmic -O3 -I -std=c++11" LDFLAGS=-mmic --enable-comms=none + ;; +build-clang-avx) +CXX=clang++ ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none + ;; +build-clang-avx-openmp) +CXX=clang-omp++ ../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -std=c++11" LDFLAGS="-fopenmp" --enable-comms=none + ;; +build-clang-avx-openmp-mpi) +CXX=clang-omp++ ../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi +;; +build-clang-avx-mpi) +CXX=clang++ ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx " --enable-comms=mpi +;; +esac diff --git a/configure-mic b/configure-mic new file mode 100755 index 00000000..668845fe --- /dev/null +++ b/configure-mic @@ -0,0 +1,10 @@ +#!/bin/bash +DIRS="build-icpc-mic" + +for D in $DIRS +do + mkdir -p $D + cd $D + ../configure-commands + cd .. +done From a98f3e0f5edf7fe671560de5853716435480c5e9 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 12:21:40 +0100 Subject: [PATCH 177/429] Out of source compile now working --- benchmarks/Makefile.am | 2 +- lib/Grid_config.h | 118 ----------------------------------------- tests/Makefile.am | 2 +- 3 files changed, 2 insertions(+), 120 deletions(-) delete mode 100644 lib/Grid_config.h diff --git a/benchmarks/Makefile.am b/benchmarks/Makefile.am index d6fad22d..76c72279 100644 --- a/benchmarks/Makefile.am +++ b/benchmarks/Makefile.am @@ -1,6 +1,6 @@ # additional include paths necessary to compile the C++ library AM_CXXFLAGS = -I$(top_srcdir)/lib -AM_LDFLAGS = -L$(top_srcdir)/lib +AM_LDFLAGS = -L$(top_builddir)/lib # # Test code diff --git a/lib/Grid_config.h b/lib/Grid_config.h deleted file mode 100644 index f71e202f..00000000 --- a/lib/Grid_config.h +++ /dev/null @@ -1,118 +0,0 @@ -/* lib/Grid_config.h. Generated from Grid_config.h.in by configure. */ -/* lib/Grid_config.h.in. Generated from configure.ac by autoheader. */ - -/* AVX */ -/* #undef AVX1 */ - -/* AVX2 */ -/* #undef AVX2 */ - -/* AVX512 */ -#define AVX512 1 - -/* GRID_COMMS_MPI */ -/* #undef GRID_COMMS_MPI */ - -/* GRID_COMMS_NONE */ -#define GRID_COMMS_NONE 1 - -/* Define to 1 if you have the declaration of `be64toh', and to 0 if you - don't. */ -#define HAVE_DECL_BE64TOH 0 - -/* Define to 1 if you have the declaration of `ntohll', and to 0 if you don't. - */ -#define HAVE_DECL_NTOHLL 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_ENDIAN_H */ - -/* Define to 1 if you have the `gettimeofday' function. */ -#define HAVE_GETTIMEOFDAY 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_MALLOC_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_MALLOC_MALLOC_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MM_MALLOC_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* Name of package */ -#define PACKAGE "grid" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "paboyle@ph.ed.ac.uk" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "Grid" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "Grid 1.0" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "grid" - -/* Define to the home page for this package. */ -#define PACKAGE_URL "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "1.0" - -/* SSE4 */ -/* #undef SSE4 */ - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Version number of package */ -#define VERSION "1.0" - -/* Define for Solaris 2.5.1 so the uint32_t typedef from , - , or is not used. If the typedef were allowed, the - #define below would cause a syntax error. */ -/* #undef _UINT32_T */ - -/* Define for Solaris 2.5.1 so the uint64_t typedef from , - , or is not used. If the typedef were allowed, the - #define below would cause a syntax error. */ -/* #undef _UINT64_T */ - -/* Define to `unsigned int' if does not define. */ -/* #undef size_t */ - -/* Define to the type of an unsigned integer type of width exactly 32 bits if - such a type exists and the standard includes do not define it. */ -/* #undef uint32_t */ - -/* Define to the type of an unsigned integer type of width exactly 64 bits if - such a type exists and the standard includes do not define it. */ -/* #undef uint64_t */ diff --git a/tests/Makefile.am b/tests/Makefile.am index 6af1ce3b..655bb9c5 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,6 +1,6 @@ # additional include paths necessary to compile the C++ library AM_CXXFLAGS = -I$(top_srcdir)/lib -AM_LDFLAGS = -L$(top_srcdir)/lib +AM_LDFLAGS = -L$(top_builddir)/lib # # Test code From 675fd1a065dcb7de1ac8dc3912347c1ebcfe627b Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 12:33:18 +0100 Subject: [PATCH 178/429] Compile options tweak --- configure-commands | 6 +++--- lib/simd/Grid_vComplexF.h | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/configure-commands b/configure-commands index 66d7b19b..f4c21f30 100755 --- a/configure-commands +++ b/configure-commands @@ -3,13 +3,13 @@ WD=$1 echo $WD case $WD in build-icpc-avx) - CXX=icpc ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I -std=c++11" --enable-comms=none + CXX=icpc ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none ;; build-icpc-avx512) - CXX=icpc ../configure --enable-simd=AVX512 CXXFLAGS="-xCOMMON-AVX512 -O3 -I -std=c++11" --host=none --enable-comms=none + CXX=icpc ../configure --enable-simd=AVX512 CXXFLAGS="-xCOMMON-AVX512 -O3 -std=c++11" --host=none --enable-comms=none ;; build-icpc-mic) - CXX=icpc ../configure --host=none --enable-simd=AVX512 CXXFLAGS="-mmic -O3 -I -std=c++11" LDFLAGS=-mmic --enable-comms=none + CXX=icpc ../configure --host=none --enable-simd=AVX512 CXXFLAGS="-mmic -O3 -std=c++11" LDFLAGS=-mmic --enable-comms=none ;; build-clang-avx) CXX=clang++ ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index 5e3ff4dc..ac15d19f 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -245,6 +245,7 @@ namespace Grid { float f[8]; } u256; //SWAP lanes + // FIXME .. icc complains with lib/lattice/Grid_lattice_reduction.h (49): (col. 20) warning #13211: Immediate parameter to intrinsic call too large __m256 t0 = _mm256_permute2f128_ps(in.v, in.v, 1); __m256 t1 = _mm256_permute_ps(in.v , 0b11011000);//real (0,2,1,3) __m256 t2 = _mm256_permute_ps(t0 , 0b10001101);//imag (1,3,0,2) From 516aac65183aa6a2860bb8017b40808c59e91079 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 12:39:53 +0100 Subject: [PATCH 179/429] Log the bug report code into the git repo. --- gcc-bug-report/README | 23 ++++++++++++++++ gcc-bug-report/broken.cc | 59 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 gcc-bug-report/README create mode 100644 gcc-bug-report/broken.cc diff --git a/gcc-bug-report/README b/gcc-bug-report/README new file mode 100644 index 00000000..294d0a6c --- /dev/null +++ b/gcc-bug-report/README @@ -0,0 +1,23 @@ +https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66153 + +Grid code breaks on GCC4.8, 4.9, 5.0 due to the +peekIndex operating on lattice. + +It erroneously recurses back into the Lattice variant, even though +the lattice container is dropped. + +Work around is possible; if the Lattice routine is given a disambiguating +name prefix, such as + +latPeekIndex + +GCC5 works. + +However this is ugly and for now I have submitted a bug report to see the reaction and +speed of fixing. + +The simple testcase in this directory is the submitted bug report that encapsulates the +problem. The test case works with icpc and with clang++, but fails consistently on g++ +current variants. + +Peter \ No newline at end of file diff --git a/gcc-bug-report/broken.cc b/gcc-bug-report/broken.cc new file mode 100644 index 00000000..bd403e85 --- /dev/null +++ b/gcc-bug-report/broken.cc @@ -0,0 +1,59 @@ +#include +#include +#include +#include + +typedef std::complex ComplexD; + +template class TypeMapper { +public: + enum { NestLevel = T::NestLevel }; +}; + +template<> class TypeMapper { +public: + enum { NestLevel = 0 }; +}; + +template class Container { + public: + std::vector data; + Container(int size) : data (size){}; +}; + +template class Recursive { +public: + enum { NestLevel = TypeMapper::NestLevel + 1}; + obj internal; +}; + +template::type * = nullptr > auto function(const obj &arg)-> obj +{ + std::cout<<"Leaf "<::type * = nullptr > auto function(const obj &arg)-> obj +{ + std::cout<<"Node "<(arg.internal); + return ret; +} + +template auto function(const Container & arg)-> Container(arg.data[0]))> +{ + Container(arg.data[0]))> ret(arg.data.size()); + for(int ss=0;ss(arg.data[ss]); + } + return ret; +} + + +int main(int argc,char **argv) +{ + Container > > array(10); + Container > > ret(10); + + ret = function<1>(array); +} From 7a63bdbd72d15f89137e2ed4d191c7bcc33a624f Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 15 May 2015 14:41:19 +0100 Subject: [PATCH 180/429] Added su3 matrix benchmark. --- benchmarks/Grid_su3.cc | 139 +++++++++++++++++++++++++++++++++++++++++ benchmarks/Makefile.am | 5 +- 2 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 benchmarks/Grid_su3.cc diff --git a/benchmarks/Grid_su3.cc b/benchmarks/Grid_su3.cc new file mode 100644 index 00000000..7f7bff90 --- /dev/null +++ b/benchmarks/Grid_su3.cc @@ -0,0 +1,139 @@ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + int Nloop=1000; + + std::vector simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + + std::cout << "===================================================================================================="< latt_size ({lat,lat,lat,lat}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + // GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); + + LatticeColourMatrix z(&Grid);// random(pRNG,z); + LatticeColourMatrix x(&Grid);// random(pRNG,x); + LatticeColourMatrix y(&Grid);// random(pRNG,y); + + double start=usecond(); + for(int i=0;i latt_size ({lat,lat,lat,lat}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + // GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); + + LatticeColourMatrix z(&Grid); //random(pRNG,z); + LatticeColourMatrix x(&Grid); //random(pRNG,x); + LatticeColourMatrix y(&Grid); //random(pRNG,y); + + double start=usecond(); + for(int i=0;i latt_size ({lat,lat,lat,lat}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + // GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); + + LatticeColourMatrix z(&Grid); //random(pRNG,z); + LatticeColourMatrix x(&Grid); //random(pRNG,x); + LatticeColourMatrix y(&Grid); //random(pRNG,y); + + double start=usecond(); + for(int i=0;i latt_size ({lat,lat,lat,lat}); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + // GridParallelRNG pRNG(&Grid); pRNG.SeedRandomDevice(); + + LatticeColourMatrix z(&Grid); //random(pRNG,z); + LatticeColourMatrix x(&Grid); //random(pRNG,x); + LatticeColourMatrix y(&Grid); //random(pRNG,y); + + double start=usecond(); + for(int i=0;i Date: Fri, 15 May 2015 14:41:59 +0100 Subject: [PATCH 181/429] Extra compile targs --- configure-commands | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configure-commands b/configure-commands index f4c21f30..19d50a4d 100755 --- a/configure-commands +++ b/configure-commands @@ -2,6 +2,9 @@ WD=$1 echo $WD case $WD in +build-g++-sse4) + CXX=g++-5 ../configure --enable-simd=SSE4 CXXFLAGS="-msse4 -O3 -std=c++11" --enable-comms=none + ;; build-icpc-avx) CXX=icpc ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none ;; From 49f56a25d1ddd7b6191ecc21f039f699ea4c31b3 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 16 May 2015 04:33:10 +0100 Subject: [PATCH 182/429] strong inline --- lib/lattice/Grid_lattice_arith.h | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/lattice/Grid_lattice_arith.h b/lib/lattice/Grid_lattice_arith.h index c9599582..c0bbb2b6 100644 --- a/lib/lattice/Grid_lattice_arith.h +++ b/lib/lattice/Grid_lattice_arith.h @@ -7,7 +7,7 @@ namespace Grid { ////////////////////////////////////////////////////////////////////////////////////////////////////// // avoid copy back routines for mult, mac, sub, add ////////////////////////////////////////////////////////////////////////////////////////////////////// - template + template strong_inline void mult(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); PARALLEL_FOR_LOOP @@ -15,10 +15,11 @@ PARALLEL_FOR_LOOP obj1 tmp; mult(&tmp,&lhs._odata[ss],&rhs._odata[ss]); vstream(ret._odata[ss],tmp); + // mult(&ret._odata[ss],&lhs._odata[ss],&rhs._odata[ss]); } } - template + template strong_inline void mac(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); PARALLEL_FOR_LOOP @@ -29,7 +30,7 @@ PARALLEL_FOR_LOOP } } - template + template strong_inline void sub(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); PARALLEL_FOR_LOOP @@ -39,7 +40,7 @@ PARALLEL_FOR_LOOP vstream(ret._odata[ss],tmp); } } - template + template strong_inline void add(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); PARALLEL_FOR_LOOP @@ -53,7 +54,7 @@ PARALLEL_FOR_LOOP ////////////////////////////////////////////////////////////////////////////////////////////////////// // avoid copy back routines for mult, mac, sub, add ////////////////////////////////////////////////////////////////////////////////////////////////////// - template + template strong_inline void mult(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ conformable(lhs,ret); PARALLEL_FOR_LOOP @@ -64,7 +65,7 @@ PARALLEL_FOR_LOOP } } - template + template strong_inline void mac(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ conformable(lhs,ret); PARALLEL_FOR_LOOP @@ -75,7 +76,7 @@ PARALLEL_FOR_LOOP } } - template + template strong_inline void sub(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ conformable(lhs,ret); PARALLEL_FOR_LOOP @@ -85,7 +86,7 @@ PARALLEL_FOR_LOOP vstream(ret._odata[ss],tmp); } } - template + template strong_inline void add(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ conformable(lhs,ret); PARALLEL_FOR_LOOP @@ -99,7 +100,7 @@ PARALLEL_FOR_LOOP ////////////////////////////////////////////////////////////////////////////////////////////////////// // avoid copy back routines for mult, mac, sub, add ////////////////////////////////////////////////////////////////////////////////////////////////////// - template + template strong_inline void mult(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ conformable(ret,rhs); PARALLEL_FOR_LOOP @@ -110,7 +111,7 @@ PARALLEL_FOR_LOOP } } - template + template strong_inline void mac(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ conformable(ret,rhs); PARALLEL_FOR_LOOP @@ -121,7 +122,7 @@ PARALLEL_FOR_LOOP } } - template + template strong_inline void sub(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ conformable(ret,rhs); PARALLEL_FOR_LOOP @@ -131,7 +132,7 @@ PARALLEL_FOR_LOOP vstream(ret._odata[ss],tmp); } } - template + template strong_inline void add(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ conformable(ret,rhs); PARALLEL_FOR_LOOP @@ -142,8 +143,8 @@ PARALLEL_FOR_LOOP } } - template - inline void axpy(Lattice &ret,sobj a,const Lattice &lhs,const Lattice &rhs){ + template strong_inline + void axpy(Lattice &ret,sobj a,const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); #pragma omp parallel for for(int ss=0;ssoSites();ss++){ From 56667e9d3204cbe436e7b27c4cec2f8a93bacd69 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 16 May 2015 04:33:40 +0100 Subject: [PATCH 183/429] more digits --- benchmarks/Grid_su3.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/benchmarks/Grid_su3.cc b/benchmarks/Grid_su3.cc index 7f7bff90..ce3ccaa9 100644 --- a/benchmarks/Grid_su3.cc +++ b/benchmarks/Grid_su3.cc @@ -40,7 +40,7 @@ int main (int argc, char ** argv) double bytes=3.0*lat*lat*lat*lat*Nc*Nc*sizeof(Complex); double footprint=2.0*lat*lat*lat*lat*Nc*Nc*sizeof(Complex); double flops=Nc*Nc*(6.0+8.0+8.0)*lat*lat*lat*lat; - std::cout< Date: Sat, 16 May 2015 04:36:22 +0100 Subject: [PATCH 184/429] Optimisation and syntax pretty --- lib/lattice/Grid_lattice_base.h | 20 ++++++++++---------- lib/lattice/Grid_lattice_trace.h | 2 +- lib/math/Grid_math_arith_mac.h | 5 +++-- lib/math/Grid_math_arith_mul.h | 17 ++++++++++++----- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/lib/lattice/Grid_lattice_base.h b/lib/lattice/Grid_lattice_base.h index 64103c5d..ae606ae7 100644 --- a/lib/lattice/Grid_lattice_base.h +++ b/lib/lattice/Grid_lattice_base.h @@ -62,7 +62,7 @@ public: //////////////////////////////////////////////////////////////////////////////// // Expression Template closure support //////////////////////////////////////////////////////////////////////////////// - template inline Lattice & operator=(const LatticeUnaryExpression &expr) + template strong_inline Lattice & operator=(const LatticeUnaryExpression &expr) { PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ @@ -71,7 +71,7 @@ PARALLEL_FOR_LOOP } return *this; } - template inline Lattice & operator=(const LatticeBinaryExpression &expr) + template strong_inline Lattice & operator=(const LatticeBinaryExpression &expr) { PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ @@ -80,7 +80,7 @@ PARALLEL_FOR_LOOP } return *this; } - template inline Lattice & operator=(const LatticeTrinaryExpression &expr) + template strong_inline Lattice & operator=(const LatticeTrinaryExpression &expr) { PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ @@ -132,14 +132,14 @@ PARALLEL_FOR_LOOP checkerboard=0; } - template inline Lattice & operator = (const sobj & r){ + template strong_inline Lattice & operator = (const sobj & r){ PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ this->_odata[ss]=r; } return *this; } - template inline Lattice & operator = (const Lattice & r){ + template strong_inline Lattice & operator = (const Lattice & r){ conformable(*this,r); std::cout<<"Lattice operator ="< inline Lattice &operator *=(const T &r) { + template strong_inline Lattice &operator *=(const T &r) { *this = (*this)*r; return *this; } - template inline Lattice &operator -=(const T &r) { + template strong_inline Lattice &operator -=(const T &r) { *this = (*this)-r; return *this; } - template inline Lattice &operator +=(const T &r) { + template strong_inline Lattice &operator +=(const T &r) { *this = (*this)+r; return *this; } - inline friend Lattice operator / (const Lattice &lhs,const Lattice &rhs){ + strong_inline friend Lattice operator / (const Lattice &lhs,const Lattice &rhs){ conformable(lhs,rhs); Lattice ret(lhs._grid); PARALLEL_FOR_LOOP @@ -176,7 +176,7 @@ PARALLEL_FOR_LOOP }; // class Lattice - template inline std::ostream& operator<< (std::ostream& stream, const Lattice &o){ + template std::ostream& operator<< (std::ostream& stream, const Lattice &o){ std::vector gcoor; typedef typename vobj::scalar_object sobj; sobj ss; diff --git a/lib/lattice/Grid_lattice_trace.h b/lib/lattice/Grid_lattice_trace.h index 75cc5b87..4ce26170 100644 --- a/lib/lattice/Grid_lattice_trace.h +++ b/lib/lattice/Grid_lattice_trace.h @@ -26,7 +26,7 @@ PARALLEL_FOR_LOOP // Trace Index level dependent operation //////////////////////////////////////////////////////////////////////////////////////////////////// template - inline auto traceIndex(const Lattice &lhs) -> Lattice(lhs._odata[0]))> + inline auto latTraceIndex(const Lattice &lhs) -> Lattice(lhs._odata[0]))> { Lattice(lhs._odata[0]))> ret(lhs._grid); PARALLEL_FOR_LOOP diff --git a/lib/math/Grid_math_arith_mac.h b/lib/math/Grid_math_arith_mac.h index 68b0acf1..06b1661d 100644 --- a/lib/math/Grid_math_arith_mac.h +++ b/lib/math/Grid_math_arith_mac.h @@ -27,13 +27,14 @@ strong_inline void mac(iScalar * __restrict__ ret,const iScalar * } template strong_inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ - for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); }}} return; } + template strong_inline void mac(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ for(int c1=0;c1 * __restrict__ ret,const iScalar * template strong_inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ + for(int c1=0;c1_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); + } + } + for(int c3=1;c3_internal[c1][c2],&lhs->_internal[c1][0],&rhs->_internal[0][c2]); - for(int c3=1;c3_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); - } - }} + for(int c2=0;c2_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); + } + } + } return; } + template strong_inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iScalar * __restrict__ rhs){ for(int c2=0;c2 Date: Sat, 16 May 2015 04:37:26 +0100 Subject: [PATCH 185/429] Pretty syntax --- lib/math/Grid_math_trace.h | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/lib/math/Grid_math_trace.h b/lib/math/Grid_math_trace.h index db8202e6..f6778496 100644 --- a/lib/math/Grid_math_trace.h +++ b/lib/math/Grid_math_trace.h @@ -35,39 +35,22 @@ inline auto trace(const iScalar &arg) -> iScalar inline -auto traceIndex(const iScalar &arg) -> iScalar(arg._internal)) > -{ - iScalar(arg._internal))> ret; - ret._internal = traceIndex(arg._internal); - return ret; -} -*/ -template inline auto -traceIndex (const iScalar &arg) -> -typename -std::enable_if,Level>::notvalue, - iScalar(arg._internal))> >::type - +template::TensorLevel != Level >::type * =nullptr> inline auto +traceIndex (const iScalar &arg) -> iScalar(arg._internal))> { iScalar(arg._internal))> ret; ret._internal=traceIndex(arg._internal); return ret; } -template inline auto -traceIndex (const iScalar &arg) -> -typename std::enable_if,Level>::value, - iScalar >::type +template::TensorLevel == Level >::type * =nullptr> inline auto +traceIndex (const iScalar &arg) -> iScalar { return arg; } // If we hit the right index, return scalar and trace it with no further recursion -template inline -auto traceIndex(const iMatrix &arg) -> - typename std::enable_if,Level>::value, // Index matches - iScalar >::type // return scalar +template::TensorLevel == Level >::type * =nullptr> inline +auto traceIndex(const iMatrix &arg) -> iScalar { iScalar ret; zeroit(ret._internal); @@ -78,10 +61,8 @@ auto traceIndex(const iMatrix &arg) -> } // not this level, so recurse -template inline -auto traceIndex(const iMatrix &arg) -> - typename std::enable_if,Level>::notvalue,// No index match - iMatrix(arg._internal[0][0])),N> >::type // return matrix +template::TensorLevel != Level >::type * =nullptr> inline +auto traceIndex(const iMatrix &arg) -> iMatrix(arg._internal[0][0])),N> { iMatrix(arg._internal[0][0])),N> ret; for(int i=0;i Date: Sat, 16 May 2015 04:40:28 +0100 Subject: [PATCH 186/429] Update Grid_lattice_trace.h --- lib/lattice/Grid_lattice_trace.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/lattice/Grid_lattice_trace.h b/lib/lattice/Grid_lattice_trace.h index 4ce26170..1b35b412 100644 --- a/lib/lattice/Grid_lattice_trace.h +++ b/lib/lattice/Grid_lattice_trace.h @@ -26,7 +26,7 @@ PARALLEL_FOR_LOOP // Trace Index level dependent operation //////////////////////////////////////////////////////////////////////////////////////////////////// template - inline auto latTraceIndex(const Lattice &lhs) -> Lattice(lhs._odata[0]))> + inline auto TraceIndex(const Lattice &lhs) -> Lattice(lhs._odata[0]))> { Lattice(lhs._odata[0]))> ret(lhs._grid); PARALLEL_FOR_LOOP From 39e7ef1243879503910de6e7c5372e87a0b2563d Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 16 May 2015 05:49:32 +0100 Subject: [PATCH 187/429] Typoo xifed --- lib/lattice/Grid_lattice_trace.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/lattice/Grid_lattice_trace.h b/lib/lattice/Grid_lattice_trace.h index 1b35b412..75cc5b87 100644 --- a/lib/lattice/Grid_lattice_trace.h +++ b/lib/lattice/Grid_lattice_trace.h @@ -26,7 +26,7 @@ PARALLEL_FOR_LOOP // Trace Index level dependent operation //////////////////////////////////////////////////////////////////////////////////////////////////// template - inline auto TraceIndex(const Lattice &lhs) -> Lattice(lhs._odata[0]))> + inline auto traceIndex(const Lattice &lhs) -> Lattice(lhs._odata[0]))> { Lattice(lhs._odata[0]))> ret(lhs._grid); PARALLEL_FOR_LOOP From e2f6745a0ee4088b03b467ce1d25dc6dc3b93d11 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 16 May 2015 06:40:10 +0100 Subject: [PATCH 188/429] Moved things around --- configure-all | 11 ------ build-all => scripts/build-all | 6 ++-- scripts/configure-all | 12 +++++++ .../configure-commands | 34 ++++++++++++++----- configure-mic => scripts/configure-mic | 0 5 files changed, 41 insertions(+), 22 deletions(-) delete mode 100755 configure-all rename build-all => scripts/build-all (86%) create mode 100755 scripts/configure-all rename configure-commands => scripts/configure-commands (51%) rename configure-mic => scripts/configure-mic (100%) diff --git a/configure-all b/configure-all deleted file mode 100755 index aa67aaf0..00000000 --- a/configure-all +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -DIRS="build-icpc-avx build-icpc-avx512 build-clang-avx build-clang-avx-openmp build-clang-avx-openmp-mpi build-clang-avx-mpi" - -for D in $DIRS -do - echo $D - mkdir -p $D - cd $D - ../configure-commands $D - cd .. -done diff --git a/build-all b/scripts/build-all similarity index 86% rename from build-all rename to scripts/build-all index cff673ab..d9aa8635 100755 --- a/build-all +++ b/scripts/build-all @@ -1,11 +1,11 @@ #!/bin/bash + DIRS="build-clang-avx build-clang-avx-openmp build-clang-avx-openmp-mpi build-clang-avx-mpi build-icpc-avx512 build-icpc-avx " for D in $DIRS do echo $D - mkdir -p $D - cd $D + cd builds/$D make clean all -j 8 - cd .. + cd ../../ done diff --git a/scripts/configure-all b/scripts/configure-all new file mode 100755 index 00000000..1f9e758a --- /dev/null +++ b/scripts/configure-all @@ -0,0 +1,12 @@ +#!/bin/bash + +DIRS="clang-avx clang-avx-openmp clang-avx-openmp-mpi clang-avx-mpi clang-avx2 clang-avx2-openmp clang-avx2-openmp-mpi clang-avx2-mpi icpc-avx icpc-avx2 icpc-avx512 g++-sse4 g++-avx" + +for D in $DIRS +do + echo $D + mkdir -p builds/$D + cd builds/$D + ../../configure-commands $D + cd ../.. +done diff --git a/configure-commands b/scripts/configure-commands similarity index 51% rename from configure-commands rename to scripts/configure-commands index 19d50a4d..183f9915 100755 --- a/configure-commands +++ b/scripts/configure-commands @@ -2,28 +2,46 @@ WD=$1 echo $WD case $WD in -build-g++-sse4) +g++-sse4) CXX=g++-5 ../configure --enable-simd=SSE4 CXXFLAGS="-msse4 -O3 -std=c++11" --enable-comms=none ;; -build-icpc-avx) +g++-avx) + CXX=g++-5 ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none + ;; +icpc-avx) CXX=icpc ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none ;; -build-icpc-avx512) +icpc-avx2) + CXX=icpc ../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -std=c++11" --enable-comms=none + ;; +icpc-avx512) CXX=icpc ../configure --enable-simd=AVX512 CXXFLAGS="-xCOMMON-AVX512 -O3 -std=c++11" --host=none --enable-comms=none ;; -build-icpc-mic) +icpc-mic) CXX=icpc ../configure --host=none --enable-simd=AVX512 CXXFLAGS="-mmic -O3 -std=c++11" LDFLAGS=-mmic --enable-comms=none ;; -build-clang-avx) +clang-avx) CXX=clang++ ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none ;; -build-clang-avx-openmp) +clang-avx2) +CXX=clang++ ../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -std=c++11" --enable-comms=none + ;; +clang-avx-openmp) CXX=clang-omp++ ../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -std=c++11" LDFLAGS="-fopenmp" --enable-comms=none ;; -build-clang-avx-openmp-mpi) +clang-avx2-openmp) +CXX=clang-omp++ ../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -fopenmp -O3 -std=c++11" LDFLAGS="-fopenmp" --enable-comms=none + ;; +clang-avx-openmp-mpi) CXX=clang-omp++ ../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi ;; -build-clang-avx-mpi) +clang-avx2-openmp-mpi) +CXX=clang-omp++ ../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi +;; +clang-avx-mpi) CXX=clang++ ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx " --enable-comms=mpi ;; +clang-avx2-mpi) +CXX=clang++ ../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx " --enable-comms=mpi +;; esac diff --git a/configure-mic b/scripts/configure-mic similarity index 100% rename from configure-mic rename to scripts/configure-mic From 9b0aae665f066ab8b47a36fef44347dba704c152 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 16 May 2015 07:16:45 +0100 Subject: [PATCH 189/429] Better build automation --- gcc-bug-report/broken.cc | 1 + scripts/build-all | 39 +++++++++++++++++++++++++++++++-- scripts/configure-all | 3 +-- scripts/configure-commands | 45 +++++++++++++++++++++++++------------- 4 files changed, 69 insertions(+), 19 deletions(-) diff --git a/gcc-bug-report/broken.cc b/gcc-bug-report/broken.cc index bd403e85..d23572d3 100644 --- a/gcc-bug-report/broken.cc +++ b/gcc-bug-report/broken.cc @@ -56,4 +56,5 @@ int main(int argc,char **argv) Container > > ret(10); ret = function<1>(array); + ret = function<2>(array); } diff --git a/scripts/build-all b/scripts/build-all index d9aa8635..d3a978b7 100755 --- a/scripts/build-all +++ b/scripts/build-all @@ -1,11 +1,46 @@ #!/bin/bash -DIRS="build-clang-avx build-clang-avx-openmp build-clang-avx-openmp-mpi build-clang-avx-mpi build-icpc-avx512 build-icpc-avx " +DIRS="clang-avx clang-avx-openmp clang-avx-openmp-mpi clang-avx-mpi clang-avx2 clang-avx2-openmp clang-avx2-openmp-mpi clang-avx2-mpi" +EXTRADIRS="g++-avx g++-sse4 icpc-avx icpc-avx2 icpc-avx512" +BLACK="\033[30m" +RED="\033[31m" +GREEN="\033[32m" +YELLOW="\033[33m" +BLUE="\033[34m" +PINK="\033[35m" +CYAN="\033[36m" +WHITE="\033[37m" +NORMAL="\033[0;39m" for D in $DIRS do - echo $D + +echo +echo -e $RED ============================== +echo -e $GREEN $D +echo -e $RED ============================== +echo -e $BLUE + cd builds/$D make clean all -j 8 cd ../../ +echo -e $NORMAL done + +if [ "X$1" == "Xextra" ] +then +for D in $EXTRADIRS +do + +echo +echo -e $RED ============================== +echo -e $RED $D +echo -e $RED ============================== +echo -e $BLUE + + cd builds/$D + make clean all -j 8 + cd ../../ +echo -e $NORMAL +done +fi \ No newline at end of file diff --git a/scripts/configure-all b/scripts/configure-all index 1f9e758a..2f80b60a 100755 --- a/scripts/configure-all +++ b/scripts/configure-all @@ -4,9 +4,8 @@ DIRS="clang-avx clang-avx-openmp clang-avx-openmp-mpi clang-avx-mpi clang-avx2 c for D in $DIRS do - echo $D mkdir -p builds/$D cd builds/$D - ../../configure-commands $D + ../../scripts/configure-commands $D cd ../.. done diff --git a/scripts/configure-commands b/scripts/configure-commands index 183f9915..5e83fa89 100755 --- a/scripts/configure-commands +++ b/scripts/configure-commands @@ -1,47 +1,62 @@ #!/bin/bash WD=$1 -echo $WD +BLACK="\033[30m" +RED="\033[31m" +GREEN="\033[32m" +YELLOW="\033[33m" +BLUE="\033[34m" +PINK="\033[35m" +CYAN="\033[36m" +WHITE="\033[37m" +NORMAL="\033[0;39m" +echo +echo -e $RED ============================== +echo -e $GREEN $WD +echo -e $RED ============================== +echo -e $YELLOW + case $WD in g++-sse4) - CXX=g++-5 ../configure --enable-simd=SSE4 CXXFLAGS="-msse4 -O3 -std=c++11" --enable-comms=none + CXX=g++-5 ../../configure --enable-simd=SSE4 CXXFLAGS="-msse4 -O3 -std=c++11" --enable-comms=none ;; g++-avx) - CXX=g++-5 ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none + CXX=g++-5 ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none ;; icpc-avx) - CXX=icpc ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none + CXX=icpc ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none ;; icpc-avx2) - CXX=icpc ../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -std=c++11" --enable-comms=none + CXX=icpc ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -std=c++11" --enable-comms=none ;; icpc-avx512) - CXX=icpc ../configure --enable-simd=AVX512 CXXFLAGS="-xCOMMON-AVX512 -O3 -std=c++11" --host=none --enable-comms=none + CXX=icpc ../../configure --enable-simd=AVX512 CXXFLAGS="-xCOMMON-AVX512 -O3 -std=c++11" --host=none --enable-comms=none ;; icpc-mic) - CXX=icpc ../configure --host=none --enable-simd=AVX512 CXXFLAGS="-mmic -O3 -std=c++11" LDFLAGS=-mmic --enable-comms=none + CXX=icpc ../../configure --host=none --enable-simd=AVX512 CXXFLAGS="-mmic -O3 -std=c++11" LDFLAGS=-mmic --enable-comms=none ;; clang-avx) -CXX=clang++ ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none +CXX=clang++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none ;; clang-avx2) -CXX=clang++ ../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -std=c++11" --enable-comms=none +CXX=clang++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -std=c++11" --enable-comms=none ;; clang-avx-openmp) -CXX=clang-omp++ ../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -std=c++11" LDFLAGS="-fopenmp" --enable-comms=none +CXX=clang-omp++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -std=c++11" LDFLAGS="-fopenmp" --enable-comms=none ;; clang-avx2-openmp) -CXX=clang-omp++ ../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -fopenmp -O3 -std=c++11" LDFLAGS="-fopenmp" --enable-comms=none +CXX=clang-omp++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -fopenmp -O3 -std=c++11" LDFLAGS="-fopenmp" --enable-comms=none ;; clang-avx-openmp-mpi) -CXX=clang-omp++ ../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi +CXX=clang-omp++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi ;; clang-avx2-openmp-mpi) -CXX=clang-omp++ ../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi +CXX=clang-omp++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi ;; clang-avx-mpi) -CXX=clang++ ../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx " --enable-comms=mpi +CXX=clang++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx " --enable-comms=mpi ;; clang-avx2-mpi) -CXX=clang++ ../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx " --enable-comms=mpi +CXX=clang++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx " --enable-comms=mpi ;; esac +echo -e $NORMAL From dc6b6bdc96965e4c1cf3c438e0f7b3d0c5b6559b Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 16 May 2015 23:35:08 +0100 Subject: [PATCH 190/429] Updating preparing for solvers etc.. --- benchmarks/Grid_memory_bandwidth.cc | 20 +- benchmarks/Grid_su3.cc | 16 +- lib/algorithms/LinearOperator.h | 207 ++++++- lib/algorithms/approx/PolynomialApprox.h | 145 +++++ lib/algorithms/approx/zolotarev.c | 710 +++++++++++++++++++++++ lib/algorithms/approx/zolotarev.h | 85 +++ lib/qcd/Grid_qcd_wilson_dop.cc | 5 +- lib/qcd/Grid_qcd_wilson_dop.h | 16 +- 8 files changed, 1170 insertions(+), 34 deletions(-) create mode 100644 lib/algorithms/approx/PolynomialApprox.h create mode 100755 lib/algorithms/approx/zolotarev.c create mode 100755 lib/algorithms/approx/zolotarev.h diff --git a/benchmarks/Grid_memory_bandwidth.cc b/benchmarks/Grid_memory_bandwidth.cc index 5a4d1f18..8ece09e8 100644 --- a/benchmarks/Grid_memory_bandwidth.cc +++ b/benchmarks/Grid_memory_bandwidth.cc @@ -19,7 +19,7 @@ int main (int argc, char ** argv) std::cout << "===================================================================================================="< class LinearOperatorBase { + ///////////////////////////////////////////////////////////////////////////////////////////// + // LinearOperators Take a something and return a something. + ///////////////////////////////////////////////////////////////////////////////////////////// + // + // Hopefully linearity is satisfied and the AdjOp is indeed the Hermitian conjugate (transpose if real): + // + // i) F(a x + b y) = aF(x) + b F(y). + // ii) = ^\ast + // + // Would be fun to have a test linearity & Herm Conj function! + ///////////////////////////////////////////////////////////////////////////////////////////// + template class LinearOperatorBase { public: - void M(const Lattice &in, Lattice &out){ assert(0);} - void Mdag(const Lattice &in, Lattice &out){ assert(0);} - void MdagM(const Lattice &in, Lattice &out){ assert(0);} + virtual void Op (const Field &in, Field &out) = 0; // Abstract base + virtual void AdjOp (const Field &in, Field &out) = 0; // Abstract base }; + ///////////////////////////////////////////////////////////////////////////////////////////// + // Hermitian operators are self adjoint and only require Op to be defined, so refine the base + ///////////////////////////////////////////////////////////////////////////////////////////// + template class HermitianOperatorBase : public LinearOperatorBase { + public: + void AdjOp(const Field &in, Field &out) { + return Op(in,out); + }; + }; + + ///////////////////////////////////////////////////////////////////////////////////////////// + // Interface defining what I expect of a general sparse matrix + ///////////////////////////////////////////////////////////////////////////////////////////// + template class SparseMatrixBase { + public: + // Full checkerboar operations + virtual void M (const Field &in, Field &out); + virtual void Mdag (const Field &in, Field &out); + virtual void MdagM(const Field &in, Field &out); + + // half checkerboard operaions + virtual void Mpc (const Field &in, Field &out); + virtual void MpcDag (const Field &in, Field &out); + virtual void MpcDagMpc(const Field &in, Field &out); + }; + + ///////////////////////////////////////////////////////////////////////////////////////////// + // Whereas non hermitian takes a generic sparse matrix (e.g. lattice action) + // conforming to sparse matrix interface and builds the full checkerboard non-herm operator + // Op and AdjOp distinct. + // By sharing the class for Sparse Matrix across multiple operator wrappers, we can share code + // between RB and non-RB variants. Sparse matrix is like the fermion action def, and then + // the wrappers implement the specialisation of "Op" and "AdjOp" to the cases minimising + // replication of code. + ///////////////////////////////////////////////////////////////////////////////////////////// + template + class NonHermitianOperator : public LinearOperatorBase { + SparseMatrix &_Mat; + public: + NonHermitianOperator(SparseMatrix &Mat): _Mat(Mat){}; + void Op (const Field &in, Field &out){ + _Mat.M(in,out); + } + void AdjOp (const Field &in, Field &out){ + _Mat.Mdag(in,out); + } + }; + + //////////////////////////////////////////////////////////////////////////////////// + // Redblack Non hermitian wrapper + //////////////////////////////////////////////////////////////////////////////////// + template + class NonHermitianRedBlackOperator : public LinearOperatorBase { + SparseMatrix &_Mat; + public: + NonHermitianRedBlackOperator(SparseMatrix &Mat): _Mat(Mat){}; + void Op (const Field &in, Field &out){ + this->Mpc(in,out); + } + void AdjOp (const Field &in, Field &out){ // + this->MpcDag(in,out); + } + }; + + //////////////////////////////////////////////////////////////////////////////////// + // Hermitian wrapper + //////////////////////////////////////////////////////////////////////////////////// + template + class HermitianOperator : public HermitianOperatorBase { + SparseMatrix &_Mat; + public: + HermitianOperator(SparseMatrix &Mat): _Mat(Mat) {}; + + void Op (const Field &in, Field &out){ + this->Mpc(in,out); + } + void AdjOp (const Field &in, Field &out){ // + this->MpcDag(in,out); + } + }; + + //////////////////////////////////////////////////////////////////////////////////// + // Hermitian RedBlack wrapper + //////////////////////////////////////////////////////////////////////////////////// + template + class HermitianRedBlackOperator : public HermitianOperatorBase { + SparseMatrix &_Mat; + public: + HermitianRedBlackOperator(SparseMatrix &Mat): _Mat(Mat) {}; + void Op (const Field &in, Field &out){ + this->MpcDagMpc(in,out); + } + }; + + + ///////////////////////////////////////////////////////////// + // Base classes for functions of operators + ///////////////////////////////////////////////////////////// + template class OperatorFunction { + public: + virtual void operator() (LinearOperatorBase *Linop, const Field &in, Field &out) = 0; + }; + + ///////////////////////////////////////////////////////////// + // Base classes for polynomial functions of operators ? needed? + ///////////////////////////////////////////////////////////// + template class OperatorPolynomial : public OperatorFunction { + public: + virtual void operator() (LinearOperatorBase *Linop,const Field &in, Field &out) = 0; + }; + + ///////////////////////////////////////////////////////////// + // Base classes for iterative processes based on operators + // single input vec, single output vec. + ///////////////////////////////////////////////////////////// + template class IterativeProcess : public OperatorFunction { + public: + RealD Tolerance; + Integer MaxIterations; + virtual void operator() (LinearOperatorBase *Linop,const Field &in, Field &out) = 0; + }; + + ///////////////////////////////////////////////////////////// + // Grand daddy iterative method + ///////////////////////////////////////////////////////////// + template class ConjugateGradient : public IterativeProcess { + public: + virtual void operator() (HermitianOperatorBase *Linop,const Field &in, Field &out) = 0; + }; + + ///////////////////////////////////////////////////////////// + // A little more modern + ///////////////////////////////////////////////////////////// + template class PreconditionedConjugateGradient : public IterativeProcess { + public: + void operator() (HermitianOperatorBase *Linop, + OperatorFunction *Preconditioner, + const Field &in, + Field &out) = 0; + }; + + // FIXME : To think about + + // Chroma functionality list defining LinearOperator + /* + virtual void operator() (T& chi, const T& psi, enum PlusMinus isign) const = 0; + virtual void operator() (T& chi, const T& psi, enum PlusMinus isign, Real epsilon) const + virtual const Subset& subset() const = 0; + virtual unsigned long nFlops() const { return 0; } + virtual void deriv(P& ds_u, const T& chi, const T& psi, enum PlusMinus isign) const + class UnprecLinearOperator : public DiffLinearOperator + const Subset& subset() const {return all;} + }; + */ + + // Chroma interface defining GaugeAction + /* + template class GaugeAction + virtual const CreateGaugeState& getCreateState() const = 0; + virtual GaugeState* createState(const Q& q) const + virtual const GaugeBC& getGaugeBC() const + virtual const Set& getSet(void) const = 0; + virtual void deriv(P& result, const Handle< GaugeState >& state) const + virtual Double S(const Handle< GaugeState >& state) const = 0; + + class LinearGaugeAction : public GaugeAction< multi1d, multi1d > + typedef multi1d P; + typedef multi1d Q; + virtual void staple(LatticeColorMatrix& result, + const Handle< GaugeState >& state, + int mu, int cb) const = 0; + */ + + // Chroma interface defining FermionAction + /* + template class FermAct4D : public FermionAction + virtual LinearOperator* linOp(Handle< FermState > state) const = 0; + virtual LinearOperator* lMdagM(Handle< FermState > state) const = 0; + virtual LinOpSystemSolver* invLinOp(Handle< FermState > state, + virtual MdagMSystemSolver* invMdagM(Handle< FermState > state, + virtual LinOpMultiSystemSolver* mInvLinOp(Handle< FermState > state, + virtual MdagMMultiSystemSolver* mInvMdagM(Handle< FermState > state, + virtual MdagMMultiSystemSolverAccumulate* mInvMdagMAcc(Handle< FermState > state, + virtual SystemSolver* qprop(Handle< FermState > state, + class DiffFermAct4D : public FermAct4D + virtual DiffLinearOperator* linOp(Handle< FermState > state) const = 0; + virtual DiffLinearOperator* lMdagM(Handle< FermState > state) const = 0; + */ } #endif diff --git a/lib/algorithms/approx/PolynomialApprox.h b/lib/algorithms/approx/PolynomialApprox.h new file mode 100644 index 00000000..5f59a078 --- /dev/null +++ b/lib/algorithms/approx/PolynomialApprox.h @@ -0,0 +1,145 @@ +#ifndef GRID_POLYNOMIAL_APPROX_H +#define GRID_POLYNOMIAL_APPROX_H + +namespace Grid { + + //////////////////////////////////////////////////////////////////////////////////////////// + // Simple general polynomial with user supplied coefficients + //////////////////////////////////////////////////////////////////////////////////////////// + template + class Polynomial : public OperatorFunction { + private: + std::vector _oeffs; + public: + Polynomial(std::vector &_Coeffs) : Coeffs(_Coeffs) {}; + + // Implement the required interface + void operator() (LinearOperatorBase &Linop, const Field &in, Field &out) { + + Field AtoN = in; + out = AtoN*Coeffs[0]; + + for(int n=1;n + class Chebyshev : public OperatorFunction { + private: + std::vector Coeffs; + int order; + double hi; + double lo; + + public: + Chebyshev(double _lo,double _hi,int _order, double (* func)(double) ){ + lo=_lo; + hi=_hi; + order=_order; + + if(order < 2) exit(-1); + Coeffs.resize(order); + for(int j=0;j &Linop, const Field &in, Field &out) { + + Field T0 = in; + Field T1 = T0; // Field T1(T0._grid); more efficient but hardwires Lattice class + Field T2 = T1; + + // use a pointer trick to eliminate copies + Field *Tnm = &T0; + Field *Tn = &T1; + Field *Tnp = &T2; + Field y = in; + + double xscale = 2.0/(hi-lo); + double mscale = -(hi+lo)/(hi-lo); + + Field *T0=Tnm; + Field *T1=Tn; + + + // Tn=T1 = (xscale M + mscale)in + Linop.Op(T0,y); + + T1=y*xscale+in*mscale; + + // sum = .5 c[0] T0 + c[1] T1 + out = (0.5*coeffs[0])*T0 + coeffs[1]*T1; + + for(int n=2;n + +/* These C routines evalute the optimal rational approximation to the signum + * function for epsilon < |x| < 1 using Zolotarev's theorem. + * + * To obtain reliable results for high degree approximations (large n) it is + * necessary to compute using sufficiently high precision arithmetic. To this + * end the code has been parameterised to work with the preprocessor names + * INTERNAL_PRECISION and PRECISION set to float, double, or long double as + * appropriate. INTERNAL_PRECISION is used in computing the Zolotarev + * coefficients, which are converted to PRECISION before being returned to the + * caller. Presumably even higher precision could be obtained using GMP or + * similar package, but bear in mind that rounding errors might also be + * significant in evaluating the resulting polynomial. The convergence criteria + * have been written in a precision-independent form. */ + +#include +#include +#include + +#define MAX(a,b) ((a) > (b) ? (a) : (b)) +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +#ifndef INTERNAL_PRECISION +#define INTERNAL_PRECISION double +#endif + +#include "zolotarev.h" +#define ZOLOTAREV_INTERNAL +#undef ZOLOTAREV_DATA +#define ZOLOTAREV_DATA izd +#undef ZPRECISION +#define ZPRECISION INTERNAL_PRECISION +#include "zolotarev.h" +#undef ZOLOTAREV_INTERNAL + +/* The ANSI standard appears not to know what pi is */ + +#ifndef M_PI +#define M_PI ((INTERNAL_PRECISION) 3.141592653589793238462643383279502884197\ +169399375105820974944592307816406286208998628034825342117068) +#endif + +#define ZERO ((INTERNAL_PRECISION) 0) +#define ONE ((INTERNAL_PRECISION) 1) +#define TWO ((INTERNAL_PRECISION) 2) +#define THREE ((INTERNAL_PRECISION) 3) +#define FOUR ((INTERNAL_PRECISION) 4) +#define HALF (ONE/TWO) + +/* The following obscenity seems to be the simplest (?) way to coerce the C + * preprocessor to convert the value of a preprocessor token into a string. */ + +#define PP2(x) #x +#define PP1(a,b,c) a ## b(c) +#define STRINGIFY(name) PP1(PP,2,name) + +/* Compute the partial fraction expansion coefficients (alpha) from the + * factored form */ + +static void construct_partfrac(izd *z) { + int dn = z -> dn, dd = z -> dd, type = z -> type; + int j, k, da = dd + 1 + type; + INTERNAL_PRECISION A = z -> A, *a = z -> a, *ap = z -> ap, *alpha; + alpha = (INTERNAL_PRECISION*) malloc(da * sizeof(INTERNAL_PRECISION)); + for (j = 0; j < dd; j++) + for (k = 0, alpha[j] = A; k < dd; k++) + alpha[j] *= + (k < dn ? ap[j] - a[k] : ONE) / (k == j ? ONE : ap[j] - ap[k]); + if(type == 1) /* implicit pole at zero? */ + for (k = 0, alpha[dd] = A * (dn > dd ? - a[dd] : ONE); k < dd; k++) { + alpha[dd] *= a[k] / ap[k]; + alpha[k] *= (dn > dd ? ap[k] - a[dd] : ONE) / ap[k]; + } + alpha[da-1] = dn == da - 1 ? A : ZERO; + z -> alpha = alpha; + z -> da = da; + return; +} + +/* Convert factored polynomial into dense polynomial. The input is the overall + * factor A and the roots a[i], such that p = A product(x - a[i], i = 1..d) */ + +static INTERNAL_PRECISION *poly_factored_to_dense(INTERNAL_PRECISION A, + INTERNAL_PRECISION *a, + int d) { + INTERNAL_PRECISION *p; + int i, j; + p = (INTERNAL_PRECISION *) malloc((d + 2) * sizeof(INTERNAL_PRECISION)); + p[0] = A; + for (i = 0; i < d; i++) { + p[i+1] = p[i]; + for (j = i; j > 0; j--) p[j] = p[j-1] - a[i]*p[j]; + p[0] *= - a[i]; + } + return p; +} + +/* Convert a rational function of the form R0(x) = x p(x^2)/q(x^2) (type 0) or + * R1(x) = p(x^2)/[x q(x^2)] (type 1) into its continued fraction + * representation. We assume that 0 <= deg(q) - deg(p) <= 1 for type 0 and 0 <= + * deg(p) - deg(q) <= 1 for type 1. On input p and q are in factored form, and + * deg(q) = dq, deg(p) = dp. The output is the continued fraction coefficients + * beta, where R(x) = beta[0] x + 1/(beta[1] x + 1/(...)). + * + * The method used is as follows. There are four cases to consider: + * + * 0.i. Type 0, deg p = deg q + * + * 0.ii. Type 0, deg p = deg q - 1 + * + * 1.i. Type 1, deg p = deg q + * + * 1.ii. Type 1, deg p = deg q + 1 + * + * and these are connected by two transformations: + * + * A. To obtain a continued fraction expansion of type 1 we use a single-step + * polynomial division we find beta and r(x) such that p(x) = beta x q(x) + + * r(x), with deg(r) = deg(q). This implies that p(x^2) = beta x^2 q(x^2) + + * r(x^2), and thus R1(x) = x beta + r(x^2)/(x q(x^2)) = x beta + 1/R0(x) + * with R0(x) = x q(x^2)/r(x^2). + * + * B. A continued fraction expansion of type 0 is obtained in a similar, but + * not identical, manner. We use the polynomial division algorithm to compute + * the quotient beta and the remainder r that satisfy p(x) = beta q(x) + r(x) + * with deg(r) = deg(q) - 1. We thus have x p(x^2) = x beta q(x^2) + x r(x^2), + * so R0(x) = x beta + x r(x^2)/q(x^2) = x beta + 1/R1(x) with R1(x) = q(x^2) / + * (x r(x^2)). + * + * Note that the deg(r) must be exactly deg(q) for (A) and deg(q) - 1 for (B) + * because p and q have disjoint roots all of multiplicity 1. This means that + * the division algorithm requires only a single polynomial subtraction step. + * + * The transformations between the cases form the following finite state + * automaton: + * + * +------+ +------+ +------+ +------+ + * | | | | ---(A)---> | | | | + * | 0.ii | ---(B)---> | 1.ii | | 0.i | <---(A)--- | 1.i | + * | | | | <---(B)--- | | | | + * +------+ +------+ +------+ +------+ + */ + +static INTERNAL_PRECISION *contfrac_A(INTERNAL_PRECISION *, + INTERNAL_PRECISION *, + INTERNAL_PRECISION *, + INTERNAL_PRECISION *, int, int); + +static INTERNAL_PRECISION *contfrac_B(INTERNAL_PRECISION *, + INTERNAL_PRECISION *, + INTERNAL_PRECISION *, + INTERNAL_PRECISION *, int, int); + +static void construct_contfrac(izd *z){ + INTERNAL_PRECISION *r, A = z -> A, *p = z -> a, *q = z -> ap; + int dp = z -> dn, dq = z -> dd, type = z -> type; + + z -> db = 2 * dq + 1 + type; + z -> beta = (INTERNAL_PRECISION *) + malloc(z -> db * sizeof(INTERNAL_PRECISION)); + p = poly_factored_to_dense(A, p, dp); + q = poly_factored_to_dense(ONE, q, dq); + r = (INTERNAL_PRECISION *) malloc((MAX(dp,dq) + 1) * + sizeof(INTERNAL_PRECISION)); + if (type == 0) (void) contfrac_B(z -> beta, p, q, r, dp, dq); + else (void) contfrac_A(z -> beta, p, q, r, dp, dq); + free(p); free(q); free(r); + return; +} + +static INTERNAL_PRECISION *contfrac_A(INTERNAL_PRECISION *beta, + INTERNAL_PRECISION *p, + INTERNAL_PRECISION *q, + INTERNAL_PRECISION *r, int dp, int dq) { + INTERNAL_PRECISION quot, *rb; + int j; + + /* p(x) = x beta q(x) + r(x); dp = dq or dp = dq + 1 */ + + quot = dp == dq ? ZERO : p[dp] / q[dq]; + r[0] = p[0]; + for (j = 1; j <= dp; j++) r[j] = p[j] - quot * q[j-1]; +#ifdef DEBUG + printf("%s: Continued Fraction form: deg p = %2d, deg q = %2d, beta = %g\n", + __FUNCTION__, dp, dq, (float) quot); + for (j = 0; j <= dq + 1; j++) + printf("\tp[%2d] = %14.6g\tq[%2d] = %14.6g\tr[%2d] = %14.6g\n", + j, (float) (j > dp ? ZERO : p[j]), + j, (float) (j == 0 ? ZERO : q[j-1]), + j, (float) (j == dp ? ZERO : r[j])); +#endif /* DEBUG */ + *(rb = contfrac_B(beta, q, r, p, dq, dq)) = quot; + return rb + 1; +} + +static INTERNAL_PRECISION *contfrac_B(INTERNAL_PRECISION *beta, + INTERNAL_PRECISION *p, + INTERNAL_PRECISION *q, + INTERNAL_PRECISION *r, int dp, int dq) { + INTERNAL_PRECISION quot, *rb; + int j; + + /* p(x) = beta q(x) + r(x); dp = dq or dp = dq - 1 */ + + quot = dp == dq ? p[dp] / q[dq] : ZERO; + for (j = 0; j < dq; j++) r[j] = p[j] - quot * q[j]; +#ifdef DEBUG + printf("%s: Continued Fraction form: deg p = %2d, deg q = %2d, beta = %g\n", + __FUNCTION__, dp, dq, (float) quot); + for (j = 0; j <= dq; j++) + printf("\tp[%2d] = %14.6g\tq[%2d] = %14.6g\tr[%2d] = %14.6g\n", + j, (float) (j > dp ? ZERO : p[j]), + j, (float) q[j], + j, (float) (j == dq ? ZERO : r[j])); +#endif /* DEBUG */ + *(rb = dq > 0 ? contfrac_A(beta, q, r, p, dq, dq-1) : beta) = quot; + return rb + 1; +} + +/* The global variable U is used to hold the argument u throughout the AGM + * recursion. The global variables F and K are set in the innermost + * instantiation of the recursive function AGM to the values of the elliptic + * integrals F(u,k) and K(k) respectively. They must be made thread local to + * make this code thread-safe in a multithreaded environment. */ + +static INTERNAL_PRECISION U, F, K; /* THREAD LOCAL */ + +/* Recursive implementation of Gauss' arithmetico-geometric mean, which is the + * kernel of the method used to compute the Jacobian elliptic functions + * sn(u,k), cn(u,k), and dn(u,k) with parameter k (where 0 < k < 1), as well + * as the elliptic integral F(s,k) satisfying F(sn(u,k)) = u and the complete + * elliptic integral K(k). + * + * The algorithm used is a recursive implementation of the Gauss (Landen) + * transformation. + * + * The function returns the value of sn(u,k'), where k' is the dual parameter, + * and also sets the values of the global variables F and K. The latter is + * used to determine the sign of cn(u,k'). + * + * The algorithm is deemed to have converged when b ceases to increase. This + * works whatever INTERNAL_PRECISION is specified. */ + +static INTERNAL_PRECISION AGM(INTERNAL_PRECISION a, + INTERNAL_PRECISION b, + INTERNAL_PRECISION s) { + static INTERNAL_PRECISION pb = -ONE; + INTERNAL_PRECISION c, d, xi; + + if (b <= pb) { + pb = -ONE; + F = asin(s) / a; /* Here, a is the AGM */ + K = M_PI / (TWO * a); + return sin(U * a); + } + pb = b; + c = a - b; + d = a + b; + xi = AGM(HALF*d, sqrt(a*b), ONE + c*c == ONE ? + HALF*s*d/a : (a - sqrt(a*a - s*s*c*d))/(c*s)); + return 2*a*xi / (d + c*xi*xi); +} + +/* Computes sn(u,k), cn(u,k), dn(u,k), F(u,k), and K(k). It is essentially a + * wrapper for the routine AGM. The sign of cn(u,k) is defined to be -1 if + * K(k) < u < 3*K(k) and +1 otherwise, and thus sign is computed by some quite + * unnecessarily obfuscated bit manipulations. */ + +static void sncndnFK(INTERNAL_PRECISION u, INTERNAL_PRECISION k, + INTERNAL_PRECISION* sn, INTERNAL_PRECISION* cn, + INTERNAL_PRECISION* dn, INTERNAL_PRECISION* elF, + INTERNAL_PRECISION* elK) { + int sgn; + U = u; + *sn = AGM(ONE, sqrt(ONE - k*k), u); + sgn = ((int) (fabs(u) / K)) % 4; /* sgn = 0, 1, 2, 3 */ + sgn ^= sgn >> 1; /* (sgn & 1) = 0, 1, 1, 0 */ + sgn = 1 - ((sgn & 1) << 1); /* sgn = 1, -1, -1, 1 */ + *cn = ((INTERNAL_PRECISION) sgn) * sqrt(ONE - *sn * *sn); + *dn = sqrt(ONE - k*k* *sn * *sn); + *elF = F; + *elK = K; +} + +/* Compute the coefficients for the optimal rational approximation R(x) to + * sgn(x) of degree n over the interval epsilon < |x| < 1 using Zolotarev's + * formula. + * + * Set type = 0 for the Zolotarev approximation, which is zero at x = 0, and + * type = 1 for the approximation which is infinite at x = 0. */ + +zolotarev_data* bfm_zolotarev(PRECISION epsilon, int n, int type) { + INTERNAL_PRECISION A, c, cp, kp, ksq, sn, cn, dn, Kp, Kj, z, z0, t, M, F, + l, invlambda, xi, xisq, *tv, s, opl; + int m, czero, ts; + zolotarev_data *zd; + izd *d = (izd*) malloc(sizeof(izd)); + + d -> type = type; + d -> epsilon = (INTERNAL_PRECISION) epsilon; + d -> n = n; + d -> dd = n / 2; + d -> dn = d -> dd - 1 + n % 2; /* n even: dn = dd - 1, n odd: dn = dd */ + d -> deg_denom = 2 * d -> dd; + d -> deg_num = 2 * d -> dn + 1; + + d -> a = (INTERNAL_PRECISION*) malloc((1 + d -> dn) * + sizeof(INTERNAL_PRECISION)); + d -> ap = (INTERNAL_PRECISION*) malloc(d -> dd * + sizeof(INTERNAL_PRECISION)); + ksq = d -> epsilon * d -> epsilon; + kp = sqrt(ONE - ksq); + sncndnFK(ZERO, kp, &sn, &cn, &dn, &F, &Kp); /* compute Kp = K(kp) */ + z0 = TWO * Kp / (INTERNAL_PRECISION) n; + M = ONE; + A = ONE / d -> epsilon; + + sncndnFK(HALF * z0, kp, &sn, &cn, &dn, &F, &Kj); /* compute xi */ + xi = ONE / dn; + xisq = xi * xi; + invlambda = xi; + + for (m = 0; m < d -> dd; m++) { + czero = 2 * (m + 1) == n; /* n even and m = dd -1 */ + + z = z0 * ((INTERNAL_PRECISION) m + ONE); + sncndnFK(z, kp, &sn, &cn, &dn, &F, &Kj); + t = cn / sn; + c = - t*t; + if (!czero) (d -> a)[d -> dn - 1 - m] = ksq / c; + + z = z0 * ((INTERNAL_PRECISION) m + HALF); + sncndnFK(z, kp, &sn, &cn, &dn, &F, &Kj); + t = cn / sn; + cp = - t*t; + (d -> ap)[d -> dd - 1 - m] = ksq / cp; + + M *= (ONE - c) / (ONE - cp); + A *= (czero ? -ksq : c) * (ONE - cp) / (cp * (ONE - c)); + invlambda *= (ONE - c*xisq) / (ONE - cp*xisq); + } + invlambda /= M; + d -> A = TWO / (ONE + invlambda) * A; + d -> Delta = (invlambda - ONE) / (invlambda + ONE); + + d -> gamma = (INTERNAL_PRECISION*) malloc((1 + d -> n) * + sizeof(INTERNAL_PRECISION)); + l = ONE / invlambda; + opl = ONE + l; + sncndnFK(sqrt( d -> type == 1 + ? (THREE + l) / (FOUR * opl) + : (ONE + THREE*l) / (opl*opl*opl) + ), sqrt(ONE - l*l), &sn, &cn, &dn, &F, &Kj); + s = M * F; + for (m = 0; m < d -> n; m++) { + sncndnFK(s + TWO*Kp*m/n, kp, &sn, &cn, &dn, &F, &Kj); + d -> gamma[m] = d -> epsilon / dn; + } + + /* If R(x) is a Zolotarev rational approximation of degree (n,m) with maximum + * error Delta, then (1 - Delta^2) / R(x) is also an optimal Chebyshev + * approximation of degree (m,n) */ + + if (d -> type == 1) { + d -> A = (ONE - d -> Delta * d -> Delta) / d -> A; + tv = d -> a; d -> a = d -> ap; d -> ap = tv; + ts = d -> dn; d -> dn = d -> dd; d -> dd = ts; + ts = d -> deg_num; d -> deg_num = d -> deg_denom; d -> deg_denom = ts; + } + + construct_partfrac(d); + construct_contfrac(d); + + /* Converting everything to PRECISION for external use only */ + + zd = (zolotarev_data*) malloc(sizeof(zolotarev_data)); + zd -> A = (PRECISION) d -> A; + zd -> Delta = (PRECISION) d -> Delta; + zd -> epsilon = (PRECISION) d -> epsilon; + zd -> n = d -> n; + zd -> type = d -> type; + zd -> dn = d -> dn; + zd -> dd = d -> dd; + zd -> da = d -> da; + zd -> db = d -> db; + zd -> deg_num = d -> deg_num; + zd -> deg_denom = d -> deg_denom; + + zd -> a = (PRECISION*) malloc(zd -> dn * sizeof(PRECISION)); + for (m = 0; m < zd -> dn; m++) zd -> a[m] = (PRECISION) d -> a[m]; + free(d -> a); + + zd -> ap = (PRECISION*) malloc(zd -> dd * sizeof(PRECISION)); + for (m = 0; m < zd -> dd; m++) zd -> ap[m] = (PRECISION) d -> ap[m]; + free(d -> ap); + + zd -> alpha = (PRECISION*) malloc(zd -> da * sizeof(PRECISION)); + for (m = 0; m < zd -> da; m++) zd -> alpha[m] = (PRECISION) d -> alpha[m]; + free(d -> alpha); + + zd -> beta = (PRECISION*) malloc(zd -> db * sizeof(PRECISION)); + for (m = 0; m < zd -> db; m++) zd -> beta[m] = (PRECISION) d -> beta[m]; + free(d -> beta); + + zd -> gamma = (PRECISION*) malloc(zd -> n * sizeof(PRECISION)); + for (m = 0; m < zd -> n; m++) zd -> gamma[m] = (PRECISION) d -> gamma[m]; + free(d -> gamma); + + free(d); + return zd; +} + +zolotarev_data* bfm_higham(PRECISION epsilon, int n) { + INTERNAL_PRECISION A, M, c, cp, z, z0, t, epssq; + int m, czero; + zolotarev_data *zd; + izd *d = (izd*) malloc(sizeof(izd)); + + d -> type = 0; + d -> epsilon = (INTERNAL_PRECISION) epsilon; + d -> n = n; + d -> dd = n / 2; + d -> dn = d -> dd - 1 + n % 2; /* n even: dn = dd - 1, n odd: dn = dd */ + d -> deg_denom = 2 * d -> dd; + d -> deg_num = 2 * d -> dn + 1; + + d -> a = (INTERNAL_PRECISION*) malloc((1 + d -> dn) * + sizeof(INTERNAL_PRECISION)); + d -> ap = (INTERNAL_PRECISION*) malloc(d -> dd * + sizeof(INTERNAL_PRECISION)); + A = (INTERNAL_PRECISION) n; + z0 = M_PI / A; + A = n % 2 == 0 ? A : ONE / A; + M = d -> epsilon * A; + epssq = d -> epsilon * d -> epsilon; + + for (m = 0; m < d -> dd; m++) { + czero = 2 * (m + 1) == n; /* n even and m = dd - 1*/ + + if (!czero) { + z = z0 * ((INTERNAL_PRECISION) m + ONE); + t = tan(z); + c = - t*t; + (d -> a)[d -> dn - 1 - m] = c; + M *= epssq - c; + } + + z = z0 * ((INTERNAL_PRECISION) m + HALF); + t = tan(z); + cp = - t*t; + (d -> ap)[d -> dd - 1 - m] = cp; + M /= epssq - cp; + } + + d -> gamma = (INTERNAL_PRECISION*) malloc((1 + d -> n) * + sizeof(INTERNAL_PRECISION)); + for (m = 0; m < d -> n; m++) d -> gamma[m] = ONE; + + d -> A = A; + d -> Delta = ONE - M; + + construct_partfrac(d); + construct_contfrac(d); + + /* Converting everything to PRECISION for external use only */ + + zd = (zolotarev_data*) malloc(sizeof(zolotarev_data)); + zd -> A = (PRECISION) d -> A; + zd -> Delta = (PRECISION) d -> Delta; + zd -> epsilon = (PRECISION) d -> epsilon; + zd -> n = d -> n; + zd -> type = d -> type; + zd -> dn = d -> dn; + zd -> dd = d -> dd; + zd -> da = d -> da; + zd -> db = d -> db; + zd -> deg_num = d -> deg_num; + zd -> deg_denom = d -> deg_denom; + + zd -> a = (PRECISION*) malloc(zd -> dn * sizeof(PRECISION)); + for (m = 0; m < zd -> dn; m++) zd -> a[m] = (PRECISION) d -> a[m]; + free(d -> a); + + zd -> ap = (PRECISION*) malloc(zd -> dd * sizeof(PRECISION)); + for (m = 0; m < zd -> dd; m++) zd -> ap[m] = (PRECISION) d -> ap[m]; + free(d -> ap); + + zd -> alpha = (PRECISION*) malloc(zd -> da * sizeof(PRECISION)); + for (m = 0; m < zd -> da; m++) zd -> alpha[m] = (PRECISION) d -> alpha[m]; + free(d -> alpha); + + zd -> beta = (PRECISION*) malloc(zd -> db * sizeof(PRECISION)); + for (m = 0; m < zd -> db; m++) zd -> beta[m] = (PRECISION) d -> beta[m]; + free(d -> beta); + + zd -> gamma = (PRECISION*) malloc(zd -> n * sizeof(PRECISION)); + for (m = 0; m < zd -> n; m++) zd -> gamma[m] = (PRECISION) d -> gamma[m]; + free(d -> gamma); + + free(d); + return zd; +} + +#ifdef TEST + +#undef ZERO +#define ZERO ((PRECISION) 0) +#undef ONE +#define ONE ((PRECISION) 1) +#undef TWO +#define TWO ((PRECISION) 2) + +/* Evaluate the rational approximation R(x) using the factored form */ + +static PRECISION zolotarev_eval(PRECISION x, zolotarev_data* rdata) { + int m; + PRECISION R; + + if (rdata -> type == 0) { + R = rdata -> A * x; + for (m = 0; m < rdata -> deg_denom/2; m++) + R *= (2*(m+1) > rdata -> deg_num ? ONE : x*x - rdata -> a[m]) / + (x*x - rdata -> ap[m]); + } else { + R = rdata -> A / x; + for (m = 0; m < rdata -> deg_num/2; m++) + R *= (x*x - rdata -> a[m]) / + (2*(m+1) > rdata -> deg_denom ? ONE : x*x - rdata -> ap[m]); + } + return R; +} + +/* Evaluate the rational approximation R(x) using the partial fraction form */ + +static PRECISION zolotarev_partfrac_eval(PRECISION x, zolotarev_data* rdata) { + int m; + PRECISION R = rdata -> alpha[rdata -> da - 1]; + for (m = 0; m < rdata -> dd; m++) + R += rdata -> alpha[m] / (x * x - rdata -> ap[m]); + if (rdata -> type == 1) R += rdata -> alpha[rdata -> dd] / (x * x); + return R * x; +} + +/* Evaluate the rational approximation R(x) using continued fraction form. + * + * If x = 0 and type = 1 then the result should be INF, whereas if x = 0 and + * type = 0 then the result should be 0, but division by zero will occur at + * intermediate stages of the evaluation. For IEEE implementations with + * non-signalling overflow this will work correctly since 1/(1/0) = 1/INF = 0, + * but with signalling overflow you will get an error message. */ + +static PRECISION zolotarev_contfrac_eval(PRECISION x, zolotarev_data* rdata) { + int m; + PRECISION R = rdata -> beta[0] * x; + for (m = 1; m < rdata -> db; m++) R = rdata -> beta[m] * x + ONE / R; + return R; +} + +/* Evaluate the rational approximation R(x) using Cayley form */ + +static PRECISION zolotarev_cayley_eval(PRECISION x, zolotarev_data* rdata) { + int m; + PRECISION T; + + T = rdata -> type == 0 ? ONE : -ONE; + for (m = 0; m < rdata -> n; m++) + T *= (rdata -> gamma[m] - x) / (rdata -> gamma[m] + x); + return (ONE - T) / (ONE + T); +} + +/* Test program. Apart from printing out the parameters for R(x) it produces + * the following data files for plotting (unless NPLOT is defined): + * + * zolotarev-fn is a plot of R(x) for |x| < 1.2. This should look like sgn(x). + * + * zolotarev-err is a plot of the error |R(x) - sgn(x)| scaled by 1/Delta. This + * should oscillate deg_num + deg_denom + 2 times between +1 and -1 over the + * domain epsilon <= |x| <= 1. + * + * If ALLPLOTS is defined then zolotarev-partfrac (zolotarev-contfrac) is a + * plot of the difference between the values of R(x) computed using the + * factored form and the partial fraction (continued fraction) form, scaled by + * 1/Delta. It should be zero everywhere. */ + +int main(int argc, char** argv) { + + int m, n, plotpts = 5000, type = 0; + float eps, x, ypferr, ycferr, ycaylerr, maxypferr, maxycferr, maxycaylerr; + zolotarev_data *rdata; + PRECISION y; + FILE *plot_function, *plot_error, + *plot_partfrac, *plot_contfrac, *plot_cayley; + + if (argc < 3 || argc > 4) { + fprintf(stderr, "Usage: %s epsilon n [type]\n", *argv); + exit(EXIT_FAILURE); + } + sscanf(argv[1], "%g", &eps); /* First argument is epsilon */ + sscanf(argv[2], "%d", &n); /* Second argument is n */ + if (argc == 4) sscanf(argv[3], "%d", &type); /* Third argument is type */ + + if (type < 0 || type > 2) { + fprintf(stderr, "%s: type must be 0 (Zolotarev R(0) = 0),\n" + "\t\t1 (Zolotarev R(0) = Inf, or 2 (Higham)\n", *argv); + exit(EXIT_FAILURE); + } + + rdata = type == 2 + ? higham((PRECISION) eps, n) + : zolotarev((PRECISION) eps, n, type); + + printf("Zolotarev Test: R(epsilon = %g, n = %d, type = %d)\n\t" + STRINGIFY(VERSION) "\n\t" STRINGIFY(HVERSION) + "\n\tINTERNAL_PRECISION = " STRINGIFY(INTERNAL_PRECISION) + "\tPRECISION = " STRINGIFY(PRECISION) + "\n\n\tRational approximation of degree (%d,%d), %s at x = 0\n" + "\tDelta = %g (maximum error)\n\n" + "\tA = %g (overall factor)\n", + (float) rdata -> epsilon, rdata -> n, type, + rdata -> deg_num, rdata -> deg_denom, + rdata -> type == 1 ? "infinite" : "zero", + (float) rdata -> Delta, (float) rdata -> A); + for (m = 0; m < MIN(rdata -> dd, rdata -> dn); m++) + printf("\ta[%2d] = %14.8g\t\ta'[%2d] = %14.8g\n", + m + 1, (float) rdata -> a[m], m + 1, (float) rdata -> ap[m]); + if (rdata -> dd > rdata -> dn) + printf("\t\t\t\t\ta'[%2d] = %14.8g\n", + rdata -> dn + 1, (float) rdata -> ap[rdata -> dn]); + if (rdata -> dd < rdata -> dn) + printf("\ta[%2d] = %14.8g\n", + rdata -> dd + 1, (float) rdata -> a[rdata -> dd]); + + printf("\n\tPartial fraction coefficients\n"); + printf("\talpha[ 0] = %14.8g\n", + (float) rdata -> alpha[rdata -> da - 1]); + for (m = 0; m < rdata -> dd; m++) + printf("\talpha[%2d] = %14.8g\ta'[%2d] = %14.8g\n", + m + 1, (float) rdata -> alpha[m], m + 1, (float) rdata -> ap[m]); + if (rdata -> type == 1) + printf("\talpha[%2d] = %14.8g\ta'[%2d] = %14.8g\n", + rdata -> dd + 1, (float) rdata -> alpha[rdata -> dd], + rdata -> dd + 1, (float) ZERO); + + printf("\n\tContinued fraction coefficients\n"); + for (m = 0; m < rdata -> db; m++) + printf("\tbeta[%2d] = %14.8g\n", m, (float) rdata -> beta[m]); + + printf("\n\tCayley transform coefficients\n"); + for (m = 0; m < rdata -> n; m++) + printf("\tgamma[%2d] = %14.8g\n", m, (float) rdata -> gamma[m]); + +#ifndef NPLOT + plot_function = fopen("zolotarev-fn.dat", "w"); + plot_error = fopen("zolotarev-err.dat", "w"); +#ifdef ALLPLOTS + plot_partfrac = fopen("zolotarev-partfrac.dat", "w"); + plot_contfrac = fopen("zolotarev-contfrac.dat", "w"); + plot_cayley = fopen("zolotarev-cayley.dat", "w"); +#endif /* ALLPLOTS */ + for (m = 0, maxypferr = maxycferr = maxycaylerr = 0.0; m <= plotpts; m++) { + x = 2.4 * (float) m / plotpts - 1.2; + if (rdata -> type == 0 || fabs(x) * (float) plotpts > 1.0) { + /* skip x = 0 for type 1, as R(0) is singular */ + y = zolotarev_eval((PRECISION) x, rdata); + fprintf(plot_function, "%g %g\n", x, (float) y); + fprintf(plot_error, "%g %g\n", + x, (float)((y - ((x > 0.0 ? ONE : -ONE))) / rdata -> Delta)); + ypferr = (float)((zolotarev_partfrac_eval((PRECISION) x, rdata) - y) + / rdata -> Delta); + ycferr = (float)((zolotarev_contfrac_eval((PRECISION) x, rdata) - y) + / rdata -> Delta); + ycaylerr = (float)((zolotarev_cayley_eval((PRECISION) x, rdata) - y) + / rdata -> Delta); + if (fabs(x) < 1.0 && fabs(x) > rdata -> epsilon) { + maxypferr = MAX(maxypferr, fabs(ypferr)); + maxycferr = MAX(maxycferr, fabs(ycferr)); + maxycaylerr = MAX(maxycaylerr, fabs(ycaylerr)); + } +#ifdef ALLPLOTS + fprintf(plot_partfrac, "%g %g\n", x, ypferr); + fprintf(plot_contfrac, "%g %g\n", x, ycferr); + fprintf(plot_cayley, "%g %g\n", x, ycaylerr); +#endif /* ALLPLOTS */ + } + } +#ifdef ALLPLOTS + fclose(plot_cayley); + fclose(plot_contfrac); + fclose(plot_partfrac); +#endif /* ALLPLOTS */ + fclose(plot_error); + fclose(plot_function); + + printf("\n\tMaximum PF error = %g (relative to Delta)\n", maxypferr); + printf("\tMaximum CF error = %g (relative to Delta)\n", maxycferr); + printf("\tMaximum Cayley error = %g (relative to Delta)\n", maxycaylerr); +#endif /* NPLOT */ + + free(rdata -> a); + free(rdata -> ap); + free(rdata -> alpha); + free(rdata -> beta); + free(rdata -> gamma); + free(rdata); + + return EXIT_SUCCESS; +} +#endif /* TEST */ diff --git a/lib/algorithms/approx/zolotarev.h b/lib/algorithms/approx/zolotarev.h new file mode 100755 index 00000000..3f0dc58e --- /dev/null +++ b/lib/algorithms/approx/zolotarev.h @@ -0,0 +1,85 @@ +/* -*- Mode: C; comment-column: 22; fill-column: 79; -*- */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define HVERSION Header Time-stamp: <14-OCT-2004 09:26:51.00 adk@MISSCONTRARY> + + +#ifndef ZOLOTAREV_INTERNAL +#ifndef PRECISION +#define PRECISION double +#endif +#define ZPRECISION PRECISION +#define ZOLOTAREV_DATA zolotarev_data +#endif + +/* This struct contains the coefficients which parameterise an optimal rational + * approximation to the signum function. + * + * The parameterisations used are: + * + * Factored form for type 0 (R0(0) = 0) + * + * R0(x) = A * x * prod(x^2 - a[j], j = 0 .. dn-1) / prod(x^2 - ap[j], j = 0 + * .. dd-1), + * + * where deg_num = 2*dn + 1 and deg_denom = 2*dd. + * + * Factored form for type 1 (R1(0) = infinity) + * + * R1(x) = (A / x) * prod(x^2 - a[j], j = 0 .. dn-1) / prod(x^2 - ap[j], j = 0 + * .. dd-1), + * + * where deg_num = 2*dn and deg_denom = 2*dd + 1. + * + * Partial fraction form + * + * R(x) = alpha[da] * x + sum(alpha[j] * x / (x^2 - ap[j]), j = 0 .. da-1) + * + * where da = dd for type 0 and da = dd + 1 with ap[dd] = 0 for type 1. + * + * Continued fraction form + * + * R(x) = beta[db-1] * x + 1 / (beta[db-2] * x + 1 / (beta[db-3] * x + ...)) + * + * with the final coefficient being beta[0], with d' = 2 * dd + 1 for type 0 + * and db = 2 * dd + 2 for type 1. + * + * Cayley form (Chiu's domain wall formulation) + * + * R(x) = (1 - T(x)) / (1 + T(x)) + * + * where T(x) = prod((x - gamma[j]) / (x + gamma[j]), j = 0 .. n-1) + */ + +typedef struct { + ZPRECISION *a, /* zeros of numerator, a[0 .. dn-1] */ + *ap, /* poles (zeros of denominator), ap[0 .. dd-1] */ + A, /* overall factor */ + *alpha, /* coefficients of partial fraction, alpha[0 .. da-1] */ + *beta, /* coefficients of continued fraction, beta[0 .. db-1] */ + *gamma, /* zeros of numerator of T in Cayley form */ + Delta, /* maximum error, |R(x) - sgn(x)| <= Delta */ + epsilon; /* minimum x value, epsilon < |x| < 1 */ + int n, /* approximation degree */ + type, /* 0: R(0) = 0, 1: R(0) = infinity */ + dn, dd, da, db, /* number of elements of a, ap, alpha, and beta */ + deg_num, /* degree of numerator = deg_denom +/- 1 */ + deg_denom; /* degree of denominator */ +} ZOLOTAREV_DATA; + +#ifndef ZOLOTAREV_INTERNAL + +/* zolotarev(epsilon, n, type) returns a pointer to an initialised + * zolotarev_data structure. The arguments must satisfy the constraints that + * epsilon > 0, n > 0, and type = 0 or 1. */ + +ZOLOTAREV_DATA* bfm_higham(PRECISION epsilon, int n) ; +ZOLOTAREV_DATA* bfm_zolotarev(PRECISION epsilon, int n, int type); +#endif + +#ifdef __cplusplus +} +#endif diff --git a/lib/qcd/Grid_qcd_wilson_dop.cc b/lib/qcd/Grid_qcd_wilson_dop.cc index 14c48cf2..c4d37a87 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.cc +++ b/lib/qcd/Grid_qcd_wilson_dop.cc @@ -290,10 +290,7 @@ void WilsonMatrix::MpcDagMpc(const LatticeFermion &in, LatticeFermion &out) { return; } -void WilsonMatrix::MDagM (const LatticeFermion &in, LatticeFermion &out) -{ - return; -} + }} diff --git a/lib/qcd/Grid_qcd_wilson_dop.h b/lib/qcd/Grid_qcd_wilson_dop.h index e19cbabe..2f5105c8 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.h +++ b/lib/qcd/Grid_qcd_wilson_dop.h @@ -9,7 +9,7 @@ namespace Grid { namespace QCD { - class WilsonMatrix : public LinearOperatorBase + class WilsonMatrix : public SparseMatrixBase { //NB r=1; public: @@ -40,6 +40,11 @@ namespace Grid { virtual void Mdag (const LatticeFermion &in, LatticeFermion &out); virtual void MdagM(const LatticeFermion &in, LatticeFermion &out); + // half checkerboard operaions + void Mpc (const LatticeFermion &in, LatticeFermion &out); + void MpcDag (const LatticeFermion &in, LatticeFermion &out); + void MpcDagMpc(const LatticeFermion &in, LatticeFermion &out); + // non-hermitian hopping term; half cb or both void Dhop(const LatticeFermion &in, LatticeFermion &out); @@ -48,17 +53,10 @@ namespace Grid { typedef iScalar > matrix; - // half checkerboard operaions - void MpcDag (const LatticeFermion &in, LatticeFermion &out); - void Mpc (const LatticeFermion &in, LatticeFermion &out); - void MpcDagMpc(const LatticeFermion &in, LatticeFermion &out); - - // full checkerboard hermitian - void MDagM (const LatticeFermion &in, LatticeFermion &out); - }; + } } #endif From 8e99e4671ff538b74a38e1fbc4d07a1dbcf6058a Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sun, 17 May 2015 00:19:03 +0100 Subject: [PATCH 191/429] Working towards solvers --- lib/algorithms/LinearOperator.h | 55 ++++++------ lib/algorithms/approx/PolynomialApprox.h | 3 + lib/algorithms/iterative/ConjugateGradient.h | 88 ++++++++++++++++++++ 3 files changed, 119 insertions(+), 27 deletions(-) create mode 100644 lib/algorithms/iterative/ConjugateGradient.h diff --git a/lib/algorithms/LinearOperator.h b/lib/algorithms/LinearOperator.h index c449ee8e..12259236 100644 --- a/lib/algorithms/LinearOperator.h +++ b/lib/algorithms/LinearOperator.h @@ -5,6 +5,22 @@ namespace Grid { + ///////////////////////////////////////////////////////////////////////////////////////////// + // Interface defining what I expect of a general sparse matrix, such as a Fermion action + ///////////////////////////////////////////////////////////////////////////////////////////// + template class SparseMatrixBase { + public: + // Full checkerboar operations + virtual void M (const Field &in, Field &out); + virtual void Mdag (const Field &in, Field &out); + virtual RealD MdagM(const Field &in, Field &out); + + // half checkerboard operaions + virtual void Mpc (const Field &in, Field &out); + virtual void MpcDag (const Field &in, Field &out); + virtual RealD MpcDagMpc(const Field &in, Field &out); + }; + ///////////////////////////////////////////////////////////////////////////////////////////// // LinearOperators Take a something and return a something. ///////////////////////////////////////////////////////////////////////////////////////////// @@ -27,25 +43,13 @@ namespace Grid { ///////////////////////////////////////////////////////////////////////////////////////////// template class HermitianOperatorBase : public LinearOperatorBase { public: + virtual RealD OpAndNorm(const Field &in, Field &out); void AdjOp(const Field &in, Field &out) { - return Op(in,out); + Op(in,out); + }; + void Op(const Field &in, Field &out) { + OpAndNorm(in,out); }; - }; - - ///////////////////////////////////////////////////////////////////////////////////////////// - // Interface defining what I expect of a general sparse matrix - ///////////////////////////////////////////////////////////////////////////////////////////// - template class SparseMatrixBase { - public: - // Full checkerboar operations - virtual void M (const Field &in, Field &out); - virtual void Mdag (const Field &in, Field &out); - virtual void MdagM(const Field &in, Field &out); - - // half checkerboard operaions - virtual void Mpc (const Field &in, Field &out); - virtual void MpcDag (const Field &in, Field &out); - virtual void MpcDagMpc(const Field &in, Field &out); }; ///////////////////////////////////////////////////////////////////////////////////////////// @@ -79,10 +83,10 @@ namespace Grid { public: NonHermitianRedBlackOperator(SparseMatrix &Mat): _Mat(Mat){}; void Op (const Field &in, Field &out){ - this->Mpc(in,out); + _Mat.Mpc(in,out); } void AdjOp (const Field &in, Field &out){ // - this->MpcDag(in,out); + _Mat.MpcDag(in,out); } }; @@ -94,12 +98,8 @@ namespace Grid { SparseMatrix &_Mat; public: HermitianOperator(SparseMatrix &Mat): _Mat(Mat) {}; - - void Op (const Field &in, Field &out){ - this->Mpc(in,out); - } - void AdjOp (const Field &in, Field &out){ // - this->MpcDag(in,out); + RealD OpAndNorm(const Field &in, Field &out){ + return _Mat.MdagM(in,out); } }; @@ -111,8 +111,8 @@ namespace Grid { SparseMatrix &_Mat; public: HermitianRedBlackOperator(SparseMatrix &Mat): _Mat(Mat) {}; - void Op (const Field &in, Field &out){ - this->MpcDagMpc(in,out); + RealD OpAndNorm(const Field &in, Field &out){ + return _Mat.MpcDagMpc(in,out); } }; @@ -141,6 +141,7 @@ namespace Grid { public: RealD Tolerance; Integer MaxIterations; + IterativeProcess(RealD tol,Integer maxit) : Tolerance(tol),MaxIterations(maxit) {}; virtual void operator() (LinearOperatorBase *Linop,const Field &in, Field &out) = 0; }; diff --git a/lib/algorithms/approx/PolynomialApprox.h b/lib/algorithms/approx/PolynomialApprox.h index 5f59a078..5515b325 100644 --- a/lib/algorithms/approx/PolynomialApprox.h +++ b/lib/algorithms/approx/PolynomialApprox.h @@ -1,6 +1,9 @@ #ifndef GRID_POLYNOMIAL_APPROX_H #define GRID_POLYNOMIAL_APPROX_H +#include +#include + namespace Grid { //////////////////////////////////////////////////////////////////////////////////////////// diff --git a/lib/algorithms/iterative/ConjugateGradient.h b/lib/algorithms/iterative/ConjugateGradient.h new file mode 100644 index 00000000..ad305d2f --- /dev/null +++ b/lib/algorithms/iterative/ConjugateGradient.h @@ -0,0 +1,88 @@ +#ifndef GRID_CONJUGATE_GRADIENT_H +#define GRID_CONJUGATE_GRADIENT_H + +#include +#include + +namespace Grid { + + template class ConjugateGradient : public IterativeProcess { + public: + + ConjugateGradient(RealD tol,Integer maxit): IterativeProces(tol,maxit) {}; + + void operator() (HermitianOperatorBase *Linop,const Field &src, Field &psi){ + + RealD residual = Tolerance; + RealD cp,c,a,d,b,ssq,qq,b_pred; + + Field p(src); + Field mmp(src); + Field r(src); + + //Initial residual computation & set up + RealD guess = norm2(psi); + + Linop.OpAndNorm(psi,mmp,d,b); + + r= src-mmp; + p= r; + + a =norm2(p); + cp =a; + ssq=norm2(src); + + std::cout < Date: Mon, 18 May 2015 07:47:05 +0100 Subject: [PATCH 192/429] Getting closer to having a wilson solver... introducing a first and untested cut at Conjugate gradient. Also copied in Remez, Zolotarev, Chebyshev from Mike Clark, Tony Kennedy and my BFM package respectively since we know we will need these. I wanted the structure of algorithms/approx algorithms/iterative etc.. to start taking shape. --- configure | 13 +- configure.ac | 2 +- lib/Grid.h | 23 +- lib/Grid_algorithms.h | 34 + lib/Grid_config.h.in | 3 + lib/Makefile.am | 40 +- lib/algorithms/LinearOperator.h | 94 +-- lib/algorithms/SparseMatrix.h | 72 ++ .../{PolynomialApprox.h => Chebyshev.h} | 14 +- lib/algorithms/approx/LICENSE | 21 + lib/algorithms/approx/README | 80 ++ lib/algorithms/approx/Remez.cc | 755 ++++++++++++++++++ lib/algorithms/approx/Remez.h | 167 ++++ .../approx/{zolotarev.c => Zolotarev.cc} | 0 lib/algorithms/approx/bigfloat.h | 368 +++++++++ lib/algorithms/iterative/ConjugateGradient.h | 49 +- lib/algorithms/iterative/NormalEquations.h | 34 + lib/algorithms/iterative/SchurRedBlack.h | 106 +++ lib/algorithms/iterative/TODO | 15 + lib/qcd/Grid_qcd_wilson_dop.cc | 44 +- lib/qcd/Grid_qcd_wilson_dop.h | 19 +- tests/Grid_main.cc | 2 +- 22 files changed, 1798 insertions(+), 157 deletions(-) create mode 100644 lib/Grid_algorithms.h create mode 100644 lib/algorithms/SparseMatrix.h rename lib/algorithms/approx/{PolynomialApprox.h => Chebyshev.h} (93%) create mode 100644 lib/algorithms/approx/LICENSE create mode 100644 lib/algorithms/approx/README create mode 100755 lib/algorithms/approx/Remez.cc create mode 100755 lib/algorithms/approx/Remez.h rename lib/algorithms/approx/{zolotarev.c => Zolotarev.cc} (100%) create mode 100755 lib/algorithms/approx/bigfloat.h create mode 100644 lib/algorithms/iterative/NormalEquations.h create mode 100644 lib/algorithms/iterative/SchurRedBlack.h create mode 100644 lib/algorithms/iterative/TODO diff --git a/configure b/configure index deec23c3..ee90f6bc 100755 --- a/configure +++ b/configure @@ -4244,7 +4244,18 @@ fi done -#AC_CHECK_HEADERS(machine/endian.h) +for ac_header in gmp.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default" +if test "x$ac_cv_header_gmp_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GMP_H 1 +_ACEOF + +fi + +done + ac_fn_cxx_check_decl "$LINENO" "ntohll" "ac_cv_have_decl_ntohll" "#include " if test "x$ac_cv_have_decl_ntohll" = xyes; then : diff --git a/configure.ac b/configure.ac index 97206a01..14fd45bb 100644 --- a/configure.ac +++ b/configure.ac @@ -20,7 +20,7 @@ AC_CHECK_HEADERS(mm_malloc.h) AC_CHECK_HEADERS(malloc/malloc.h) AC_CHECK_HEADERS(malloc.h) AC_CHECK_HEADERS(endian.h) -#AC_CHECK_HEADERS(machine/endian.h) +AC_CHECK_HEADERS(gmp.h) AC_CHECK_DECLS([ntohll],[], [], [[#include ]]) AC_CHECK_DECLS([be64toh],[], [], [[#include ]]) diff --git a/lib/Grid.h b/lib/Grid.h index 2936dd27..edd94769 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -10,15 +10,17 @@ #ifndef GRID_H #define GRID_H -#include +#include #include #include -#include + #include -#include +#include #include #include + +#include #include #include #include @@ -45,16 +47,19 @@ #endif #include + #include #include -#include - -#include -#include +#include // subdir aggregate +#include // subdir aggregate +#include // subdir aggregate #include -#include -#include +#include // subdir aggregate +#include // subdir aggregate + +#include // subdir aggregate + #include #include diff --git a/lib/Grid_algorithms.h b/lib/Grid_algorithms.h new file mode 100644 index 00000000..b5a2814a --- /dev/null +++ b/lib/Grid_algorithms.h @@ -0,0 +1,34 @@ +#ifndef GRID_ALGORITHMS_H +#define GRID_ALGORITHMS_H + +#include +#include + +#include +#include +#include + +#include +#include +#include + +// Eigen/lanczos +// EigCg +// MCR +// Pcg +// Multishift CG +// Hdcg +// GCR +// etc.. + +// integrator/Leapfrog +// integrator/Omelyan +// integrator/ForceGradient + +// montecarlo/hmc +// montecarlo/rhmc +// montecarlo/metropolis +// etc... + + +#endif diff --git a/lib/Grid_config.h.in b/lib/Grid_config.h.in index 47643530..0ce09cf5 100644 --- a/lib/Grid_config.h.in +++ b/lib/Grid_config.h.in @@ -29,6 +29,9 @@ /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY +/* Define to 1 if you have the header file. */ +#undef HAVE_GMP_H + /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H diff --git a/lib/Makefile.am b/lib/Makefile.am index f76b0b64..938f7ca1 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -19,35 +19,50 @@ libGrid_a_SOURCES =\ stencil/Grid_stencil_common.cc\ qcd/Grid_qcd_dirac.cc\ qcd/Grid_qcd_wilson_dop.cc\ + algorithms/approx/Zolotarev.cc\ + algorithms/approx/Remez.cc\ $(extra_sources) # # Include files # -include_HEADERS =\ +nobase_include_HEADERS = algorithms/approx/bigfloat.h\ + algorithms/approx/Chebyshev.h\ + algorithms/approx/Remez.h\ + algorithms/approx/Zolotarev.h\ + algorithms/iterative/ConjugateGradient.h\ + algorithms/iterative/NormalEquations.h\ + algorithms/iterative/SchurRedBlack.h\ + algorithms/LinearOperator.h\ + algorithms/SparseMatrix.h\ + cartesian/Grid_cartesian_base.h\ + cartesian/Grid_cartesian_full.h\ + cartesian/Grid_cartesian_red_black.h\ + communicator/Grid_communicator_base.h\ + cshift/Grid_cshift_common.h\ + cshift/Grid_cshift_mpi.h\ + cshift/Grid_cshift_none.h\ Grid.h\ + Grid_algorithms.h\ Grid_aligned_allocator.h\ Grid_cartesian.h\ Grid_communicator.h\ Grid_comparison.h\ - Grid_config.h\ Grid_cshift.h\ + Grid_extract.h\ Grid_lattice.h\ Grid_math.h\ Grid_simd.h\ - Grid_stencil.h - -nobase_include_HEADERS=\ - cartesian/Grid_cartesian_base.h\ - cartesian/Grid_cartesian_full.h\ - cartesian/Grid_cartesian_red_black.h\ - cshift/Grid_cshift_common.h\ - cshift/Grid_cshift_mpi.h\ - cshift/Grid_cshift_none.h\ + Grid_stencil.h\ + Grid_threads.h\ lattice/Grid_lattice_arith.h\ + lattice/Grid_lattice_base.h\ + lattice/Grid_lattice_comparison.h\ lattice/Grid_lattice_conformable.h\ lattice/Grid_lattice_coordinate.h\ + lattice/Grid_lattice_ET.h\ lattice/Grid_lattice_local.h\ + lattice/Grid_lattice_overload.h\ lattice/Grid_lattice_peekpoke.h\ lattice/Grid_lattice_reality.h\ lattice/Grid_lattice_reduction.h\ @@ -71,8 +86,11 @@ nobase_include_HEADERS=\ math/Grid_math_trace.h\ math/Grid_math_traits.h\ math/Grid_math_transpose.h\ + parallelIO/GridNerscIO.h\ qcd/Grid_qcd.h\ + qcd/Grid_qcd_2spinor.h\ qcd/Grid_qcd_dirac.h\ + qcd/Grid_qcd_wilson_dop.h\ simd/Grid_vComplexD.h\ simd/Grid_vComplexF.h\ simd/Grid_vInteger.h\ diff --git a/lib/algorithms/LinearOperator.h b/lib/algorithms/LinearOperator.h index 12259236..bb948b95 100644 --- a/lib/algorithms/LinearOperator.h +++ b/lib/algorithms/LinearOperator.h @@ -1,26 +1,8 @@ #ifndef GRID_ALGORITHM_LINEAR_OP_H #define GRID_ALGORITHM_LINEAR_OP_H -#include - namespace Grid { - ///////////////////////////////////////////////////////////////////////////////////////////// - // Interface defining what I expect of a general sparse matrix, such as a Fermion action - ///////////////////////////////////////////////////////////////////////////////////////////// - template class SparseMatrixBase { - public: - // Full checkerboar operations - virtual void M (const Field &in, Field &out); - virtual void Mdag (const Field &in, Field &out); - virtual RealD MdagM(const Field &in, Field &out); - - // half checkerboard operaions - virtual void Mpc (const Field &in, Field &out); - virtual void MpcDag (const Field &in, Field &out); - virtual RealD MpcDagMpc(const Field &in, Field &out); - }; - ///////////////////////////////////////////////////////////////////////////////////////////// // LinearOperators Take a something and return a something. ///////////////////////////////////////////////////////////////////////////////////////////// @@ -61,11 +43,11 @@ namespace Grid { // the wrappers implement the specialisation of "Op" and "AdjOp" to the cases minimising // replication of code. ///////////////////////////////////////////////////////////////////////////////////////////// - template + template class NonHermitianOperator : public LinearOperatorBase { - SparseMatrix &_Mat; + Matrix &_Mat; public: - NonHermitianOperator(SparseMatrix &Mat): _Mat(Mat){}; + NonHermitianOperator(Matrix &Mat): _Mat(Mat){}; void Op (const Field &in, Field &out){ _Mat.M(in,out); } @@ -77,11 +59,11 @@ namespace Grid { //////////////////////////////////////////////////////////////////////////////////// // Redblack Non hermitian wrapper //////////////////////////////////////////////////////////////////////////////////// - template - class NonHermitianRedBlackOperator : public LinearOperatorBase { - SparseMatrix &_Mat; + template + class NonHermitianCheckerBoardedOperator : public LinearOperatorBase { + Matrix &_Mat; public: - NonHermitianRedBlackOperator(SparseMatrix &Mat): _Mat(Mat){}; + NonHermitianCheckerBoardedOperator(Matrix &Mat): _Mat(Mat){}; void Op (const Field &in, Field &out){ _Mat.Mpc(in,out); } @@ -93,75 +75,35 @@ namespace Grid { //////////////////////////////////////////////////////////////////////////////////// // Hermitian wrapper //////////////////////////////////////////////////////////////////////////////////// - template + template class HermitianOperator : public HermitianOperatorBase { - SparseMatrix &_Mat; + Matrix &_Mat; public: - HermitianOperator(SparseMatrix &Mat): _Mat(Mat) {}; + HermitianOperator(Matrix &Mat): _Mat(Mat) {}; RealD OpAndNorm(const Field &in, Field &out){ return _Mat.MdagM(in,out); } }; //////////////////////////////////////////////////////////////////////////////////// - // Hermitian RedBlack wrapper + // Hermitian CheckerBoarded wrapper //////////////////////////////////////////////////////////////////////////////////// - template - class HermitianRedBlackOperator : public HermitianOperatorBase { - SparseMatrix &_Mat; + template + class HermitianCheckerBoardedOperator : public HermitianOperatorBase { + Matrix &_Mat; public: - HermitianRedBlackOperator(SparseMatrix &Mat): _Mat(Mat) {}; - RealD OpAndNorm(const Field &in, Field &out){ - return _Mat.MpcDagMpc(in,out); + HermitianCheckerBoardedOperator(Matrix &Mat): _Mat(Mat) {}; + void OpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){ + _Mat.MpcDagMpc(in,out,n1,n2); } }; - ///////////////////////////////////////////////////////////// // Base classes for functions of operators ///////////////////////////////////////////////////////////// template class OperatorFunction { public: - virtual void operator() (LinearOperatorBase *Linop, const Field &in, Field &out) = 0; - }; - - ///////////////////////////////////////////////////////////// - // Base classes for polynomial functions of operators ? needed? - ///////////////////////////////////////////////////////////// - template class OperatorPolynomial : public OperatorFunction { - public: - virtual void operator() (LinearOperatorBase *Linop,const Field &in, Field &out) = 0; - }; - - ///////////////////////////////////////////////////////////// - // Base classes for iterative processes based on operators - // single input vec, single output vec. - ///////////////////////////////////////////////////////////// - template class IterativeProcess : public OperatorFunction { - public: - RealD Tolerance; - Integer MaxIterations; - IterativeProcess(RealD tol,Integer maxit) : Tolerance(tol),MaxIterations(maxit) {}; - virtual void operator() (LinearOperatorBase *Linop,const Field &in, Field &out) = 0; - }; - - ///////////////////////////////////////////////////////////// - // Grand daddy iterative method - ///////////////////////////////////////////////////////////// - template class ConjugateGradient : public IterativeProcess { - public: - virtual void operator() (HermitianOperatorBase *Linop,const Field &in, Field &out) = 0; - }; - - ///////////////////////////////////////////////////////////// - // A little more modern - ///////////////////////////////////////////////////////////// - template class PreconditionedConjugateGradient : public IterativeProcess { - public: - void operator() (HermitianOperatorBase *Linop, - OperatorFunction *Preconditioner, - const Field &in, - Field &out) = 0; + virtual void operator() (LinearOperatorBase &Linop, const Field &in, Field &out) = 0; }; // FIXME : To think about diff --git a/lib/algorithms/SparseMatrix.h b/lib/algorithms/SparseMatrix.h new file mode 100644 index 00000000..6c54fc92 --- /dev/null +++ b/lib/algorithms/SparseMatrix.h @@ -0,0 +1,72 @@ +#ifndef GRID_ALGORITHM_SPARSE_MATRIX_H +#define GRID_ALGORITHM_SPARSE_MATRIX_H + +#include + +namespace Grid { + + ///////////////////////////////////////////////////////////////////////////////////////////// + // Interface defining what I expect of a general sparse matrix, such as a Fermion action + ///////////////////////////////////////////////////////////////////////////////////////////// + template class SparseMatrixBase { + public: + // Full checkerboar operations + virtual RealD M (const Field &in, Field &out)=0; + virtual RealD Mdag (const Field &in, Field &out)=0; + virtual void MdagM(const Field &in, Field &out,RealD &ni,RealD &no) { + Field tmp (in._grid); + ni=M(in,tmp); + no=Mdag(tmp,out); + } + }; + + ///////////////////////////////////////////////////////////////////////////////////////////// + // Interface augmented by a red black sparse matrix, such as a Fermion action + ///////////////////////////////////////////////////////////////////////////////////////////// + template class CheckerBoardedSparseMatrixBase : public SparseMatrixBase { + public: + + // half checkerboard operaions + virtual void Meooe (const Field &in, Field &out)=0; + virtual void Mooee (const Field &in, Field &out)=0; + virtual void MooeeInv (const Field &in, Field &out)=0; + + virtual void MeooeDag (const Field &in, Field &out)=0; + virtual void MooeeDag (const Field &in, Field &out)=0; + virtual void MooeeInvDag (const Field &in, Field &out)=0; + + // Schur decomp operators + virtual RealD Mpc (const Field &in, Field &out) { + Field tmp(in._grid); + + Meooe(in,tmp); + MooeeInv(tmp,out); + Meooe(out,tmp); + + Mooee(in,out); + out=out-tmp; // axpy_norm + RealD n=norm2(out); + return n; + } + virtual RealD MpcDag (const Field &in, Field &out){ + Field tmp(in._grid); + + MeooeDag(in,tmp); + MooeeInvDag(tmp,out); + MeooeDag(out,tmp); + + MooeeDag(in,out); + out=out-tmp; // axpy_norm + RealD n=norm2(out); + return n; + } + virtual void MpcDagMpc(const Field &in, Field &out,RealD ni,RealD no) { + Field tmp(in._grid); + ni=Mpc(in,tmp); + no=Mpc(tmp,out); + } + }; + +} + +#endif diff --git a/lib/algorithms/approx/PolynomialApprox.h b/lib/algorithms/approx/Chebyshev.h similarity index 93% rename from lib/algorithms/approx/PolynomialApprox.h rename to lib/algorithms/approx/Chebyshev.h index 5515b325..5c7741e4 100644 --- a/lib/algorithms/approx/PolynomialApprox.h +++ b/lib/algorithms/approx/Chebyshev.h @@ -1,5 +1,5 @@ -#ifndef GRID_POLYNOMIAL_APPROX_H -#define GRID_POLYNOMIAL_APPROX_H +#ifndef GRID_CHEBYSHEV_H +#define GRID_CHEBYSHEV_H #include #include @@ -12,7 +12,7 @@ namespace Grid { template class Polynomial : public OperatorFunction { private: - std::vector _oeffs; + std::vector Coeffs; public: Polynomial(std::vector &_Coeffs) : Coeffs(_Coeffs) {}; @@ -111,17 +111,13 @@ namespace Grid { double xscale = 2.0/(hi-lo); double mscale = -(hi+lo)/(hi-lo); - Field *T0=Tnm; - Field *T1=Tn; - - // Tn=T1 = (xscale M + mscale)in Linop.Op(T0,y); T1=y*xscale+in*mscale; // sum = .5 c[0] T0 + c[1] T1 - out = (0.5*coeffs[0])*T0 + coeffs[1]*T1; + out = (0.5*Coeffs[0])*T0 + Coeffs[1]*T1; for(int n=2;n +#include +#include +#include +#include +#include +#include + +#include + +// Constructor +AlgRemez::AlgRemez(double lower, double upper, long precision) +{ + prec = precision; + bigfloat::setDefaultPrecision(prec); + + apstrt = lower; + apend = upper; + apwidt = apend - apstrt; + + std::cout<<"Approximation bounds are ["< tolerance) { //iterate until convergance + + if (iter++%100==0) + std::cout<<"Iteration " <= tolerance); + + search(step); + } + + int sign; + double error = (double)getErr(mm[0],&sign); + std::cout<<"Converged at "<= xx1) { // Cannot skip over adjacent boundaries + q = -q; + xn = xm; + yn = ym; + ensign = emsign; + } else { + yn = getErr(xn,&ensign); + if (yn < ym) { + q = -q; + xn = xm; + yn = ym; + ensign = emsign; + } + } + + while(yn >= ym) { // March until error becomes smaller. + if (++steps > 10) break; + ym = yn; + xm = xn; + emsign = ensign; + a = xm + q; + if (a == xm || a <= xx0 || a >= xx1) break;// Must not skip over the zeros either side. + xn = a; + yn = getErr(xn,&ensign); + } + + mm[i] = xm; // Position of maximum + yy[i] = ym; // Value of maximum + + if (eclose > ym) eclose = ym; + if (farther < ym) farther = ym; + + xx0 = xx1; // Walk to next zero. + } // end of search loop + + q = (farther - eclose); // Decrease step size if error spread increased + if (eclose != 0.0) q /= eclose; // Relative error spread + if (q >= spread) delta *= 0.5; // Spread is increasing; decrease step size + spread = q; + + for (i = 0; i < neq; i++) { + q = yy[i+1]; + if (q != 0.0) q = yy[i] / q - (bigfloat)1l; + else q = 0.0625; + if (q > (bigfloat)0.25) q = 0.25; + q *= mm[i+1] - mm[i]; + step[i] = q * delta; + } + step[neq] = step[neq-1]; + + for (i = 0; i < neq; i++) { // Insert new locations for the zeros. + xm = xx[i] - step[i]; + if (xm <= apstrt) continue; + if (xm >= apend) continue; + if (xm <= mm[i]) xm = (bigfloat)0.5 * (mm[i] + xx[i]); + if (xm >= mm[i+1]) xm = (bigfloat)0.5 * (mm[i+1] + xx[i]); + xx[i] = xm; + } + + delete [] yy; +} + +// Solve the equations +void AlgRemez::equations(void) { + bigfloat x, y, z; + int i, j, ip; + bigfloat *aa; + + bigfloat *AA = new bigfloat[(neq)*(neq)]; + bigfloat *BB = new bigfloat[neq]; + + for (i = 0; i < neq; i++) { // set up the equations for solution by simq() + ip = neq * i; // offset to 1st element of this row of matrix + x = xx[i]; // the guess for this row + y = func(x); // right-hand-side vector + + z = (bigfloat)1l; + aa = AA+ip; + for (j = 0; j <= n; j++) { + *aa++ = z; + z *= x; + } + + z = (bigfloat)1l; + for (j = 0; j < d; j++) { + *aa++ = -y * z; + z *= x; + } + BB[i] = y * z; // Right hand side vector + } + + // Solve the simultaneous linear equations. + if (simq(AA, BB, param, neq)) { + std::cout<<"simq failed\n"; + exit(0); + } + + delete [] AA; + delete [] BB; + +} + +// Evaluate the rational form P(x)/Q(x) using coefficients +// from the solution vector param +bigfloat AlgRemez::approx(const bigfloat x) { + bigfloat yn, yd; + int i; + + // Work backwards toward the constant term. + yn = param[n]; // Highest order numerator coefficient + for (i = n-1; i >= 0; i--) yn = x * yn + param[i]; + yd = x + param[n+d]; // Highest degree coefficient = 1.0 + for (i = n+d-1; i > n; i--) yd = x * yd + param[i]; + + return(yn/yd); +} + +// Compute size and sign of the approximation error at x +bigfloat AlgRemez::getErr(bigfloat x, int *sign) { + bigfloat e, f; + + f = func(x); + e = approx(x) - f; + if (f != 0) e /= f; + if (e < (bigfloat)0.0) { + *sign = -1; + e = -e; + } + else *sign = 1; + + return(e); +} + +// Calculate function required for the approximation. +bigfloat AlgRemez::func(const bigfloat x) { + + bigfloat z = (bigfloat)power_num / (bigfloat)power_den; + bigfloat y; + + if (x == (bigfloat)1.0) y = (bigfloat)1.0; + else y = pow_bf(x,z); + + if (a_length > 0) { + bigfloat sum = 0l; + for (int j=0; j big) { + big = size; + idxpiv = i; + } + } + + if (big == (bigfloat)0l) { + std::cout<<"simq big=0\n"; + delete [] IPS; + return(2); + } + if (idxpiv != k) { + j = IPS[k]; + IPS[k] = IPS[idxpiv]; + IPS[idxpiv] = j; + } + kp = IPS[k]; + kpk = n*kp + k; + pivot = A[kpk]; + kp1 = k+1; + for (i = kp1; i < n; i++) { + ip = IPS[i]; + ipk = n*ip + k; + em = -A[ipk] / pivot; + A[ipk] = -em; + nip = n*ip; + nkp = n*kp; + aa = A+nkp+kp1; + for (j = kp1; j < n; j++) { + ipj = nip + j; + A[ipj] = A[ipj] + em * *aa++; + } + } + } + kpn = n * IPS[n-1] + n - 1; // last element of IPS[n] th row + if (A[kpn] == (bigfloat)0l) { + std::cout<<"simq A[kpn]=0\n"; + delete [] IPS; + return(3); + } + + + ip = IPS[0]; + X[0] = B[ip]; + for (i = 1; i < n; i++) { + ip = IPS[i]; + ipj = n * ip; + sum = 0.0; + for (j = 0; j < i; j++) { + sum += A[ipj] * X[j]; + ++ipj; + } + X[i] = B[ip] - sum; + } + + ipn = n * IPS[n-1] + n - 1; + X[n-1] = X[n-1] / A[ipn]; + + for (iback = 1; iback < n; iback++) { + //i goes (n-1),...,1 + i = nm1 - iback; + ip = IPS[i]; + nip = n*ip; + sum = 0.0; + aa = A+nip+i+1; + for (j= i + 1; j < n; j++) + sum += *aa++ * X[j]; + X[i] = (X[i] - sum) / A[nip+i]; + } + + delete [] IPS; + return(0); +} + +// Calculate the roots of the approximation +int AlgRemez::root() { + + long i,j; + bigfloat x,dx=0.05; + bigfloat upper=1, lower=-100000; + bigfloat tol = 1e-20; + + bigfloat *poly = new bigfloat[neq+1]; + + // First find the numerator roots + for (i=0; i<=n; i++) poly[i] = param[i]; + + for (i=n-1; i>=0; i--) { + roots[i] = rtnewt(poly,i+1,lower,upper,tol); + if (roots[i] == 0.0) { + std::cout<<"Failure to converge on root "<=0; i--) { + poles[i]=rtnewt(poly,i+1,lower,upper,tol); + if (poles[i] == 0.0) { + std::cout<<"Failure to converge on pole "<=0; i--) f = f*x + poly[i]; + return f; +} + +// Evaluate the differential of the polynomial +bigfloat AlgRemez::polyDiff(bigfloat x, bigfloat *poly, long size) { + bigfloat df = (bigfloat)size*poly[size]; + for (int i=size-1; i>0; i--) df = df*x + (bigfloat)i*poly[i]; + return df; +} + + +// Newton's method to calculate roots +bigfloat AlgRemez::rtnewt(bigfloat *poly, long i, bigfloat x1, + bigfloat x2, bigfloat xacc) { + int j; + bigfloat df, dx, f, rtn; + + rtn=(bigfloat)0.5*(x1+x2); + for (j=1; j<=JMAX;j++) { + f = polyEval(rtn, poly, i); + df = polyDiff(rtn, poly, i); + dx = f/df; + rtn -= dx; + if (abs_bf(dx) < xacc) return rtn; + } + std::cout<<"Maximum number of iterations exceeded in rtnewt\n"; + return 0.0; +} + +// Evaluate the partial fraction expansion of the rational function +// with res roots and poles poles. Result is overwritten on input +// arrays. +void AlgRemez::pfe(bigfloat *res, bigfloat *poles, bigfloat norm) { + int i,j,small; + bigfloat temp; + bigfloat *numerator = new bigfloat[n]; + bigfloat *denominator = new bigfloat[d]; + + // Construct the polynomials explicitly + for (i=1; i=0; i--) { + numerator[i] *= -res[j]; + denominator[i] *= -poles[j]; + if (i>0) { + numerator[i] += numerator[i-1]; + denominator[i] += denominator[i-1]; + } + } + } + + // Convert to proper fraction form. + // Fraction is now in the form 1 + n/d, where O(n)+1=O(d) + for (i=0; i=0; j--) { + res[i] = poles[i]*res[i]+numerator[j]; + } + for (j=n-1; j>=0; j--) { + if (i!=j) res[i] /= poles[i]-poles[j]; + } + res[i] *= norm; + } + + // res now holds the residues + j = 0; + for (i=0; i + +#define JMAX 10000 //Maximum number of iterations of Newton's approximation +#define SUM_MAX 10 // Maximum number of terms in exponential + +/* + *Usage examples + AlgRemez remez(lambda_low,lambda_high,precision); + error = remez.generateApprox(n,d,y,z); + remez.getPFE(res,pole,&norm); + remez.getIPFE(res,pole,&norm); + remez.csv(ostream &os); + */ +class AlgRemez +{ + private: + char *cname; + + // The approximation parameters + bigfloat *param, *roots, *poles; + bigfloat norm; + + // The numerator and denominator degree (n=d) + int n, d; + + // The bounds of the approximation + bigfloat apstrt, apwidt, apend; + + // the numerator and denominator of the power we are approximating + unsigned long power_num; + unsigned long power_den; + + // Flag to determine whether the arrays have been allocated + int alloc; + + // Flag to determine whether the roots have been found + int foundRoots; + + // Variables used to calculate the approximation + int nd1, iter; + bigfloat *xx, *mm, *step; + bigfloat delta, spread, tolerance; + + // The exponential summation coefficients + bigfloat *a; + int *a_power; + int a_length; + + // The number of equations we must solve at each iteration (n+d+1) + int neq; + + // The precision of the GNU MP library + long prec; + + // Initial values of maximal and minmal errors + void initialGuess(); + + // Solve the equations + void equations(); + + // Search for error maxima and minima + void search(bigfloat *step); + + // Initialise step sizes + void stpini(bigfloat *step); + + // Calculate the roots of the approximation + int root(); + + // Evaluate the polynomial + bigfloat polyEval(bigfloat x, bigfloat *poly, long size); + //complex_bf polyEval(complex_bf x, complex_bf *poly, long size); + + // Evaluate the differential of the polynomial + bigfloat polyDiff(bigfloat x, bigfloat *poly, long size); + //complex_bf polyDiff(complex_bf x, complex_bf *poly, long size); + + // Newton's method to calculate roots + bigfloat rtnewt(bigfloat *poly, long i, bigfloat x1, bigfloat x2, bigfloat xacc); + //complex_bf rtnewt(complex_bf *poly, long i, bigfloat x1, bigfloat x2, bigfloat xacc); + + // Evaluate the partial fraction expansion of the rational function + // with res roots and poles poles. Result is overwritten on input + // arrays. + void pfe(bigfloat *res, bigfloat* poles, bigfloat norm); + + // Calculate function required for the approximation + bigfloat func(bigfloat x); + + // Compute size and sign of the approximation error at x + bigfloat getErr(bigfloat x, int *sign); + + // Solve the system AX=B + int simq(bigfloat *A, bigfloat *B, bigfloat *X, int n); + + // Free memory and reallocate as necessary + void allocate(int num_degree, int den_degree); + + // Evaluate the rational form P(x)/Q(x) using coefficients from the + // solution vector param + bigfloat approx(bigfloat x); + + public: + + // Constructor + AlgRemez(double lower, double upper, long prec); + + // Destructor + virtual ~AlgRemez(); + + // Reset the bounds of the approximation + void setBounds(double lower, double upper); + + // Generate the rational approximation x^(pnum/pden) + double generateApprox(int num_degree, int den_degree, + unsigned long power_num, unsigned long power_den, + int a_len, double* a_param, int* a_pow); + double generateApprox(int num_degree, int den_degree, + unsigned long power_num, unsigned long power_den); + double generateApprox(int degree, unsigned long power_num, + unsigned long power_den); + + // Return the partial fraction expansion of the approximation x^(pnum/pden) + int getPFE(double *res, double *pole, double *norm); + + // Return the partial fraction expansion of the approximation x^(-pnum/pden) + int getIPFE(double *res, double *pole, double *norm); + + // Evaluate the rational form P(x)/Q(x) using coefficients from the + // solution vector param + double evaluateApprox(double x); + + // Evaluate the rational form Q(x)/P(x) using coefficients from the + // solution vector param + double evaluateInverseApprox(double x); + + // Calculate function required for the approximation + double evaluateFunc(double x); + + // Calculate inverse function required for the approximation + double evaluateInverseFunc(double x); + + // Dump csv of function, approx and error + void csv(std::ostream &os); +}; + +#endif // Include guard + + + diff --git a/lib/algorithms/approx/zolotarev.c b/lib/algorithms/approx/Zolotarev.cc similarity index 100% rename from lib/algorithms/approx/zolotarev.c rename to lib/algorithms/approx/Zolotarev.cc diff --git a/lib/algorithms/approx/bigfloat.h b/lib/algorithms/approx/bigfloat.h new file mode 100755 index 00000000..7f59ea33 --- /dev/null +++ b/lib/algorithms/approx/bigfloat.h @@ -0,0 +1,368 @@ +/* + Mike Clark - 25th May 2005 + + bigfloat.h + + Simple C++ wrapper for multiprecision datatype used by AlgRemez + algorithm +*/ + +#ifndef INCLUDED_BIGFLOAT_H +#define INCLUDED_BIGFLOAT_H + +#ifdef HAVE_GMP +#include +#include +#include +class bigfloat { + +private: + + mpf_t x; + +public: + + bigfloat() { mpf_init(x); } + bigfloat(const bigfloat& y) { mpf_init_set(x, y.x); } + bigfloat(const unsigned long u) { mpf_init_set_ui(x, u); } + bigfloat(const long i) { mpf_init_set_si(x, i); } + bigfloat(const int i) {mpf_init_set_si(x,(long)i);} + bigfloat(const float d) { mpf_init_set_d(x, (double)d); } + bigfloat(const double d) { mpf_init_set_d(x, d); } + bigfloat(const char *str) { mpf_init_set_str(x, (char*)str, 10); } + ~bigfloat(void) { mpf_clear(x); } + operator const double (void) const { return (double)mpf_get_d(x); } + static void setDefaultPrecision(unsigned long dprec) { + unsigned long bprec = (unsigned long)(3.321928094 * (double)dprec); + mpf_set_default_prec(bprec); + } + + void setPrecision(unsigned long dprec) { + unsigned long bprec = (unsigned long)(3.321928094 * (double)dprec); + mpf_set_prec(x,bprec); + } + + unsigned long getPrecision(void) const { return mpf_get_prec(x); } + + unsigned long getDefaultPrecision(void) const { return mpf_get_default_prec(); } + + bigfloat& operator=(const bigfloat& y) { + mpf_set(x, y.x); + return *this; + } + + bigfloat& operator=(const unsigned long y) { + mpf_set_ui(x, y); + return *this; + } + + bigfloat& operator=(const signed long y) { + mpf_set_si(x, y); + return *this; + } + + bigfloat& operator=(const float y) { + mpf_set_d(x, (double)y); + return *this; + } + + bigfloat& operator=(const double y) { + mpf_set_d(x, y); + return *this; + } + + size_t write(void); + size_t read(void); + + /* Arithmetic Functions */ + + bigfloat& operator+=(const bigfloat& y) { return *this = *this + y; } + bigfloat& operator-=(const bigfloat& y) { return *this = *this - y; } + bigfloat& operator*=(const bigfloat& y) { return *this = *this * y; } + bigfloat& operator/=(const bigfloat& y) { return *this = *this / y; } + + friend bigfloat operator+(const bigfloat& x, const bigfloat& y) { + bigfloat a; + mpf_add(a.x,x.x,y.x); + return a; + } + + friend bigfloat operator+(const bigfloat& x, const unsigned long y) { + bigfloat a; + mpf_add_ui(a.x,x.x,y); + return a; + } + + friend bigfloat operator-(const bigfloat& x, const bigfloat& y) { + bigfloat a; + mpf_sub(a.x,x.x,y.x); + return a; + } + + friend bigfloat operator-(const unsigned long x, const bigfloat& y) { + bigfloat a; + mpf_ui_sub(a.x,x,y.x); + return a; + } + + friend bigfloat operator-(const bigfloat& x, const unsigned long y) { + bigfloat a; + mpf_sub_ui(a.x,x.x,y); + return a; + } + + friend bigfloat operator-(const bigfloat& x) { + bigfloat a; + mpf_neg(a.x,x.x); + return a; + } + + friend bigfloat operator*(const bigfloat& x, const bigfloat& y) { + bigfloat a; + mpf_mul(a.x,x.x,y.x); + return a; + } + + friend bigfloat operator*(const bigfloat& x, const unsigned long y) { + bigfloat a; + mpf_mul_ui(a.x,x.x,y); + return a; + } + + friend bigfloat operator/(const bigfloat& x, const bigfloat& y){ + bigfloat a; + mpf_div(a.x,x.x,y.x); + return a; + } + + friend bigfloat operator/(const unsigned long x, const bigfloat& y){ + bigfloat a; + mpf_ui_div(a.x,x,y.x); + return a; + } + + friend bigfloat operator/(const bigfloat& x, const unsigned long y){ + bigfloat a; + mpf_div_ui(a.x,x.x,y); + return a; + } + + friend bigfloat sqrt_bf(const bigfloat& x){ + bigfloat a; + mpf_sqrt(a.x,x.x); + return a; + } + + friend bigfloat sqrt_bf(const unsigned long x){ + bigfloat a; + mpf_sqrt_ui(a.x,x); + return a; + } + + friend bigfloat abs_bf(const bigfloat& x){ + bigfloat a; + mpf_abs(a.x,x.x); + return a; + } + + friend bigfloat pow_bf(const bigfloat& a, long power) { + bigfloat b; + mpf_pow_ui(b.x,a.x,power); + return b; + } + + friend bigfloat pow_bf(const bigfloat& a, bigfloat &power) { + bigfloat b; + mpfr_pow(b.x,a.x,power.x,GMP_RNDN); + return b; + } + + friend bigfloat exp_bf(const bigfloat& a) { + bigfloat b; + mpfr_exp(b.x,a.x,GMP_RNDN); + return b; + } + + /* Comparison Functions */ + + friend int operator>(const bigfloat& x, const bigfloat& y) { + int test; + test = mpf_cmp(x.x,y.x); + if (test > 0) return 1; + else return 0; + } + + friend int operator<(const bigfloat& x, const bigfloat& y) { + int test; + test = mpf_cmp(x.x,y.x); + if (test < 0) return 1; + else return 0; + } + + friend int sgn(const bigfloat&); + +}; +#else + +typedef double mfloat; +class bigfloat { +private: + + mfloat x; + +public: + + bigfloat() { } + bigfloat(const bigfloat& y) { x=y.x; } + bigfloat(const unsigned long u) { x=u; } + bigfloat(const long i) { x=i; } + bigfloat(const int i) { x=i;} + bigfloat(const float d) { x=d;} + bigfloat(const double d) { x=d;} + bigfloat(const char *str) { x=std::stod(std::string(str));} + ~bigfloat(void) { } + operator double (void) const { return (double)x; } + static void setDefaultPrecision(unsigned long dprec) { + } + + void setPrecision(unsigned long dprec) { + } + + unsigned long getPrecision(void) const { return 64; } + unsigned long getDefaultPrecision(void) const { return 64; } + + bigfloat& operator=(const bigfloat& y) { x=y.x; return *this; } + bigfloat& operator=(const unsigned long y) { x=y; return *this; } + bigfloat& operator=(const signed long y) { x=y; return *this; } + bigfloat& operator=(const float y) { x=y; return *this; } + bigfloat& operator=(const double y) { x=y; return *this; } + + size_t write(void); + size_t read(void); + + /* Arithmetic Functions */ + + bigfloat& operator+=(const bigfloat& y) { return *this = *this + y; } + bigfloat& operator-=(const bigfloat& y) { return *this = *this - y; } + bigfloat& operator*=(const bigfloat& y) { return *this = *this * y; } + bigfloat& operator/=(const bigfloat& y) { return *this = *this / y; } + + friend bigfloat operator+(const bigfloat& x, const bigfloat& y) { + bigfloat a; + a.x=x.x+y.x; + return a; + } + + friend bigfloat operator+(const bigfloat& x, const unsigned long y) { + bigfloat a; + a.x=x.x+y; + return a; + } + + friend bigfloat operator-(const bigfloat& x, const bigfloat& y) { + bigfloat a; + a.x=x.x-y.x; + return a; + } + + friend bigfloat operator-(const unsigned long x, const bigfloat& y) { + bigfloat bx(x); + return bx-y; + } + + friend bigfloat operator-(const bigfloat& x, const unsigned long y) { + bigfloat by(y); + return x-by; + } + + friend bigfloat operator-(const bigfloat& x) { + bigfloat a; + a.x=-x.x; + return a; + } + + friend bigfloat operator*(const bigfloat& x, const bigfloat& y) { + bigfloat a; + a.x=x.x*y.x; + return a; + } + + friend bigfloat operator*(const bigfloat& x, const unsigned long y) { + bigfloat a; + a.x=x.x*y; + return a; + } + + friend bigfloat operator/(const bigfloat& x, const bigfloat& y){ + bigfloat a; + a.x=x.x/y.x; + return a; + } + + friend bigfloat operator/(const unsigned long x, const bigfloat& y){ + bigfloat bx(x); + return bx/y; + } + + friend bigfloat operator/(const bigfloat& x, const unsigned long y){ + bigfloat by(y); + return x/by; + } + + friend bigfloat sqrt_bf(const bigfloat& x){ + bigfloat a; + a.x= sqrt(x.x); + return a; + } + + friend bigfloat sqrt_bf(const unsigned long x){ + bigfloat a(x); + return sqrt_bf(a); + } + + friend bigfloat abs_bf(const bigfloat& x){ + bigfloat a; + a.x=abs(x.x); + return a; + } + + friend bigfloat pow_bf(const bigfloat& a, long power) { + bigfloat b; + b.x=pow(a.x,power); + return b; + } + + friend bigfloat pow_bf(const bigfloat& a, bigfloat &power) { + bigfloat b; + b.x=pow(a.x,power.x); + return b; + } + + friend bigfloat exp_bf(const bigfloat& a) { + bigfloat b; + b.x=exp(a.x); + return b; + } + + /* Comparison Functions */ + friend int operator>(const bigfloat& x, const bigfloat& y) { + return x.x>y.x; + } + + friend int operator<(const bigfloat& x, const bigfloat& y) { + return x.x=0 ) return 1; + else return 0; + } + + /* Miscellaneous Functions */ + + // friend bigfloat& random(void); +}; + +#endif + +#endif diff --git a/lib/algorithms/iterative/ConjugateGradient.h b/lib/algorithms/iterative/ConjugateGradient.h index ad305d2f..bcb6ab60 100644 --- a/lib/algorithms/iterative/ConjugateGradient.h +++ b/lib/algorithms/iterative/ConjugateGradient.h @@ -1,19 +1,25 @@ #ifndef GRID_CONJUGATE_GRADIENT_H #define GRID_CONJUGATE_GRADIENT_H -#include -#include - namespace Grid { - template class ConjugateGradient : public IterativeProcess { - public: + ///////////////////////////////////////////////////////////// + // Base classes for iterative processes based on operators + // single input vec, single output vec. + ///////////////////////////////////////////////////////////// - ConjugateGradient(RealD tol,Integer maxit): IterativeProces(tol,maxit) {}; + template + class ConjugateGradient : public OperatorFunction { +public: + RealD Tolerance; + Integer MaxIterations; - void operator() (HermitianOperatorBase *Linop,const Field &src, Field &psi){ + ConjugateGradient(RealD tol,Integer maxit) : Tolerance(tol), MaxIterations(maxit) { + std::cout << Tolerance< &Linop,const Field &src, Field &psi){ - RealD residual = Tolerance; RealD cp,c,a,d,b,ssq,qq,b_pred; Field p(src); @@ -32,24 +38,24 @@ namespace Grid { cp =a; ssq=norm2(src); - std::cout < class NormalEquations : public OperatorFunction{ + private: + SparseMatrixBase & _Matrix; + OperatorFunction & _HermitianSolver; + + public: + + ///////////////////////////////////////////////////// + // Wrap the usual normal equations Schur trick + ///////////////////////////////////////////////////// + NormalEquations(SparseMatrixBase &Matrix, OperatorFunction &HermitianSolver) + : _Matrix(Matrix), _HermitianSolver(HermitianSolver) {}; + + void operator() (const Field &in, Field &out){ + + Field src(in._grid); + + _Matrix.Mdag(in,src); + _HermitianSolver(src,out); // Mdag M out = Mdag in + + } + }; + +} +#endif diff --git a/lib/algorithms/iterative/SchurRedBlack.h b/lib/algorithms/iterative/SchurRedBlack.h new file mode 100644 index 00000000..e6a7b59e --- /dev/null +++ b/lib/algorithms/iterative/SchurRedBlack.h @@ -0,0 +1,106 @@ +#ifndef GRID_SCHUR_RED_BLACK_H +#define GRID_SCHUR_RED_BLACK_H + + /* + * Red black Schur decomposition + * + * M = (Mee Meo) = (1 0 ) (Mee 0 ) (1 Mee^{-1} Meo) + * (Moe Moo) (Moe Mee^-1 1 ) (0 Moo-Moe Mee^-1 Meo) (0 1 ) + * = L D U + * + * L^-1 = (1 0 ) + * (-MoeMee^{-1} 1 ) + * L^{dag} = ( 1 Mee^{-dag} Moe^{dag} ) + * ( 0 1 ) + * L^{-d} = ( 1 -Mee^{-dag} Moe^{dag} ) + * ( 0 1 ) + * + * U^-1 = (1 -Mee^{-1} Meo) + * (0 1 ) + * U^{dag} = ( 1 0) + * (Meo^dag Mee^{-dag} 1) + * U^{-dag} = ( 1 0) + * (-Meo^dag Mee^{-dag} 1) + *********************** + * M psi = eta + *********************** + *Odd + * i) (D_oo)^{\dag} D_oo psi_o = (D_oo)^\dag L^{-1} eta_o + * eta_o' = D_oo (eta_o - Moe Mee^{-1} eta_e) + *Even + * ii) Mee psi_e + Meo psi_o = src_e + * + * => sol_e = M_ee^-1 * ( src_e - Meo sol_o )... + * + */ + +namespace Grid { + + /////////////////////////////////////////////////////////////////////////////////////////////////////// + // Take a matrix and form a Red Black solver calling a Herm solver + // Use of RB info prevents making SchurRedBlackSolve conform to standard interface + /////////////////////////////////////////////////////////////////////////////////////////////////////// + template class SchurRedBlackSolve : public OperatorFunction{ + private: + SparseMatrixBase & _Matrix; + OperatorFunction & _HermitianRBSolver; + int CBfactorise; + public: + + ///////////////////////////////////////////////////// + // Wrap the usual normal equations Schur trick + ///////////////////////////////////////////////////// + SchurRedBlackSolve(SparseMatrixBase &Matrix, OperatorFunction &HermitianRBSolver) + : _Matrix(Matrix), _HermitianRBSolver(HermitianRBSolver) { + CBfactorise=0; + }; + + void operator() (const Field &in, Field &out){ + + // FIXME CGdiagonalMee not implemented virtual function + // FIXME need to make eo grid from full grid. + // FIXME use CBfactorise to control schur decomp + const int Even=0; + const int Odd =1; + + // Make a cartesianRedBlack from full Grid + GridRedBlackCartesian grid(in._grid); + + Field src_e(&grid); + Field src_o(&grid); + Field sol_e(&grid); + Field sol_o(&grid); + Field tmp(&grid); + Field Mtmp(&grid); + + pickCheckerboard(Even,src_e,in); + pickCheckerboard(Odd ,src_o,in); + + ///////////////////////////////////////////////////// + // src_o = Mdag * (source_o - Moe MeeInv source_e) + ///////////////////////////////////////////////////// + _Matrix.MooeeInv(src_e,tmp); // MooeeInv(source[Even],tmp,DaggerNo,Even); + _Matrix.Meooe (tmp,Mtmp); // Meo (tmp,src,Odd,DaggerNo); + tmp=src_o-Mtmp; // axpy (tmp,src,source[Odd],-1.0); + _Matrix.MpcDag(tmp,src_o); // Mprec(tmp,src,Mtmp,DaggerYes); + + ////////////////////////////////////////////////////////////// + // Call the red-black solver + ////////////////////////////////////////////////////////////// + _HermitianRBSolver(src_o,sol_o); // CGNE_prec_MdagM(solution[Odd],src); + + /////////////////////////////////////////////////// + // sol_e = M_ee^-1 * ( src_e - Meo sol_o )... + /////////////////////////////////////////////////// + _Matrix.Meooe(sol_o,tmp); // Meo(solution[Odd],tmp,Even,DaggerNo); + src_e = src_e-tmp; // axpy(src,tmp,source[Even],-1.0); + _Matrix.MooeeInv(src_e,sol_e); // MooeeInv(src,solution[Even],DaggerNo,Even); + + setCheckerboard(out,sol_e); + setCheckerboard(out,sol_o); + + } + }; + +} +#endif diff --git a/lib/algorithms/iterative/TODO b/lib/algorithms/iterative/TODO new file mode 100644 index 00000000..ca3bca3b --- /dev/null +++ b/lib/algorithms/iterative/TODO @@ -0,0 +1,15 @@ +- ConjugateGradientMultiShift +- MCR + +- Potentially Useful Boost libraries + +- MultiArray +- Aligned allocator; memory pool +- Remez -- Mike or Boost? +- Multiprecision +- quaternians +- Tokenize +- Serialization +- Regex +- Proto (ET) +- uBlas diff --git a/lib/qcd/Grid_qcd_wilson_dop.cc b/lib/qcd/Grid_qcd_wilson_dop.cc index c4d37a87..6a67efe3 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.cc +++ b/lib/qcd/Grid_qcd_wilson_dop.cc @@ -85,20 +85,40 @@ void WilsonMatrix::DoubleStore(LatticeDoubledGaugeField &Uds,const LatticeGaugeF } } -void WilsonMatrix::M(const LatticeFermion &in, LatticeFermion &out) +RealD WilsonMatrix::M(const LatticeFermion &in, LatticeFermion &out) { Dhop(in,out); - return; + return 0.0; } -void WilsonMatrix::Mdag(const LatticeFermion &in, LatticeFermion &out) +RealD WilsonMatrix::Mdag(const LatticeFermion &in, LatticeFermion &out) { Dhop(in,out); - return; + return 0.0; } -void WilsonMatrix::MdagM(const LatticeFermion &in, LatticeFermion &out) + +void WilsonMatrix::Meooe(const LatticeFermion &in, LatticeFermion &out) { Dhop(in,out); - return; +} +void WilsonMatrix::MeooeDag(const LatticeFermion &in, LatticeFermion &out) +{ + Dhop(in,out); +} +void WilsonMatrix::Mooee(const LatticeFermion &in, LatticeFermion &out) +{ + return ; +} +void WilsonMatrix::MooeeInv(const LatticeFermion &in, LatticeFermion &out) +{ + return ; +} +void WilsonMatrix::MooeeDag(const LatticeFermion &in, LatticeFermion &out) +{ + return ; +} +void WilsonMatrix::MooeeInvDag(const LatticeFermion &in, LatticeFermion &out) +{ + return ; } void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out) @@ -278,18 +298,6 @@ void WilsonMatrix::Dw(const LatticeFermion &in, LatticeFermion &out) { return; } -void WilsonMatrix::MpcDag (const LatticeFermion &in, LatticeFermion &out) -{ - return; -} -void WilsonMatrix::Mpc (const LatticeFermion &in, LatticeFermion &out) -{ - return; -} -void WilsonMatrix::MpcDagMpc(const LatticeFermion &in, LatticeFermion &out) -{ - return; -} diff --git a/lib/qcd/Grid_qcd_wilson_dop.h b/lib/qcd/Grid_qcd_wilson_dop.h index 2f5105c8..1098d330 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.h +++ b/lib/qcd/Grid_qcd_wilson_dop.h @@ -1,15 +1,12 @@ #ifndef GRID_QCD_WILSON_DOP_H #define GRID_QCD_WILSON_DOP_H -#include - -#include namespace Grid { namespace QCD { - class WilsonMatrix : public SparseMatrixBase + class WilsonMatrix : public CheckerBoardedSparseMatrixBase { //NB r=1; public: @@ -36,14 +33,16 @@ namespace Grid { void DoubleStore(LatticeDoubledGaugeField &Uds,const LatticeGaugeField &Umu); // override multiply - virtual void M (const LatticeFermion &in, LatticeFermion &out); - virtual void Mdag (const LatticeFermion &in, LatticeFermion &out); - virtual void MdagM(const LatticeFermion &in, LatticeFermion &out); + virtual RealD M (const LatticeFermion &in, LatticeFermion &out); + virtual RealD Mdag (const LatticeFermion &in, LatticeFermion &out); // half checkerboard operaions - void Mpc (const LatticeFermion &in, LatticeFermion &out); - void MpcDag (const LatticeFermion &in, LatticeFermion &out); - void MpcDagMpc(const LatticeFermion &in, LatticeFermion &out); + virtual void Meooe (const LatticeFermion &in, LatticeFermion &out); + virtual void MeooeDag (const LatticeFermion &in, LatticeFermion &out); + virtual void Mooee (const LatticeFermion &in, LatticeFermion &out); + virtual void MooeeDag (const LatticeFermion &in, LatticeFermion &out); + virtual void MooeeInv (const LatticeFermion &in, LatticeFermion &out); + virtual void MooeeInvDag (const LatticeFermion &in, LatticeFermion &out); // non-hermitian hopping term; half cb or both void Dhop(const LatticeFermion &in, LatticeFermion &out); diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index 7515ebd1..45778922 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -48,7 +48,7 @@ int main (int argc, char ** argv) latt_size[3] = lat; double volume = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; - GridCartesian Fine(latt_size,simd_layout,mpi_layout); + GridCartesian Fine(latt_size,simd_layout,mpi_layout); GridRedBlackCartesian rbFine(latt_size,simd_layout,mpi_layout); GridParallelRNG FineRNG(&Fine); FineRNG.SeedRandomDevice(); From cee363e28ca55e12621d8e513085b4d2a6273abf Mon Sep 17 00:00:00 2001 From: neo Date: Mon, 18 May 2015 16:48:14 +0900 Subject: [PATCH 193/429] Corrected some compilation errors (zolotarev.h) and SSE4 vsplat and conj to make cshift test pass. --- Makefile.in | 43 +-- aclocal.m4 | 61 ++-- benchmarks/Grid_comms | Bin 0 -> 45225 bytes benchmarks/Grid_memory_bandwidth | Bin 0 -> 45026 bytes benchmarks/Grid_su3 | Bin 0 -> 44845 bytes benchmarks/Grid_wilson | Bin 0 -> 121651 bytes configure | 13 +- lib/Grid_config.h | 121 +++++++ lib/algorithms/approx/.dirstamp | 0 lib/algorithms/approx/Zolotarev.cc | 6 +- .../approx/{zolotarev.h => Zolotarev.h} | 0 lib/communicator/.dirstamp | 0 lib/qcd/.dirstamp | 0 lib/simd/Grid_vComplexD.h | 3 + lib/simd/Grid_vComplexF.h | 6 +- lib/simd/Grid_vector_types.h | 299 ++++++++++++++++++ lib/stamp-h1 | 1 + lib/stencil/.dirstamp | 0 tests/Grid_cshift | Bin 0 -> 60539 bytes tests/Grid_cshift.cc | 2 + tests/Grid_gamma | Bin 0 -> 72670 bytes tests/Grid_main | Bin 0 -> 143261 bytes tests/Grid_nersc_io | Bin 0 -> 97496 bytes tests/Grid_rng | Bin 0 -> 60784 bytes tests/Grid_simd | Bin 0 -> 98268 bytes tests/Grid_stencil | Bin 0 -> 97307 bytes 26 files changed, 482 insertions(+), 73 deletions(-) create mode 100755 benchmarks/Grid_comms create mode 100755 benchmarks/Grid_memory_bandwidth create mode 100755 benchmarks/Grid_su3 create mode 100755 benchmarks/Grid_wilson create mode 100644 lib/Grid_config.h create mode 100644 lib/algorithms/approx/.dirstamp rename lib/algorithms/approx/{zolotarev.h => Zolotarev.h} (100%) create mode 100644 lib/communicator/.dirstamp create mode 100644 lib/qcd/.dirstamp create mode 100644 lib/simd/Grid_vector_types.h create mode 100644 lib/stamp-h1 create mode 100644 lib/stencil/.dirstamp create mode 100755 tests/Grid_cshift create mode 100755 tests/Grid_gamma create mode 100755 tests/Grid_main create mode 100755 tests/Grid_nersc_io create mode 100755 tests/Grid_rng create mode 100755 tests/Grid_simd create mode 100755 tests/Grid_stencil diff --git a/Makefile.in b/Makefile.in index c9b848f3..c905f84b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -14,17 +14,7 @@ @SET_MAKE@ VPATH = @srcdir@ -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ @@ -86,12 +76,14 @@ NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . +DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) COPYING TODO \ + compile depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ - $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d @@ -154,8 +146,6 @@ ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) -am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING ChangeLog \ - INSTALL NEWS README TODO compile depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -309,6 +299,7 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -515,15 +506,15 @@ dist-xz: distdir $(am__post_remove_distdir) dist-tarZ: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) @@ -559,17 +550,17 @@ distcheck: dist esac chmod -R a-w $(distdir) chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build/sub \ - && ../../configure \ + && $(am__cd) $(distdir)/_build \ + && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=../.. --prefix="$$dc_install_base" \ + --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -743,8 +734,6 @@ uninstall-am: maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am -.PRECIOUS: Makefile - # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/aclocal.m4 b/aclocal.m4 index bf79d078..389763bf 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.15 -*- Autoconf -*- +# generated automatically by aclocal 1.14.1 -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -20,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002-2014 Free Software Foundation, Inc. +# Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.15' +[am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.15], [], +m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.15])dnl +[AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -103,14 +103,15 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -# Expand $ac_aux_dir to an absolute path. -am_aux_dir=`cd "$ac_aux_dir" && pwd` +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -141,7 +142,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -332,7 +333,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -408,7 +409,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -498,8 +499,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target (and possibly the TAP driver). The -# system "awk" is bad on some platforms. +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -572,11 +573,7 @@ to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi -fi -dnl The trailing newline in this macro's definition is deliberate, for -dnl backward compatibility and to allow trailing 'dnl'-style comments -dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. -]) +fi]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further @@ -605,7 +602,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -616,7 +613,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh+set}" != xset; then +if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -626,7 +623,7 @@ if test x"${install_sh+set}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -647,7 +644,7 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -697,7 +694,7 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -736,7 +733,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -767,7 +764,7 @@ AC_DEFUN([_AM_IF_OPTION], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -848,7 +845,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -908,7 +905,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -936,7 +933,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -955,7 +952,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/benchmarks/Grid_comms b/benchmarks/Grid_comms new file mode 100755 index 0000000000000000000000000000000000000000..9013b3da11e6d41d2bd1fdf5976cc5dc80387c21 GIT binary patch literal 45225 zcmeHwdwf*Y_3z0GqGBdc#Hg)|HrfOwB;jF#sFTOY8J$2%qNP5VOp*yq$;-?H!3PE> zX_*ew(*CHmz5Lqr<{zbe>jsalCv>lx!Cz93p*?)SUTK9e((8LGeg zx%d9l4Rh96Yp=cb+H0@x!>M`AzOgARe8Bme>8_*~p%f?^5jIU3( z0V8fBP^!gs9Fmuz_BDSq@3*%I6woGa47f!a!hlA)FC!iG{InrgGA@((rLxO-{pbl~ z_R5@AZ{vb_b6T5cw|d*V*UnyBwqW*xc}2dCqEbOQRnIS(d3M; zdbi~3vz~szf7ymxep3A1(eoO6UcP{F#rPTZ7Ifz}xCg7#NGru}K7RW*oczpxHvM7m zx7won-_E`4N8zv9-hJuX?^+A&&pM~yIi*Tjm37yTKHs@xon!TbU{4ydpv<%+F<(zX ze-8>J<3A4yC!^n$Le7&Z=vgV`)1KBOdd^Hi_oa}3aSHnPQqb3?pl?UM$;$gc3jWn8 z%Jsz*{O_cohf~n!rm(}`Qt&TL!M{F5xele!e{Tx<{VC{!DfC&Fg8vIC=+CB*b1;Se zM^n((rtn*D3j4gCLZ38r%E|n}l|ugaQ_x>Zq2~`%l(!ijOR{|Dq>z723OPSXQLa!5 zIloGg@2^tGzZCrEC}%1?w>O}Kin3f>73D?9Ctc}n5EO&{h~)3zpwoLqEc!jk-;lt+ z2K-YY$JVFwTP6R0Nq(!$w^q`Fvb;T~*(5~=Z%aADl0O%G4F8Fru=5NX(O4LhdJaf^ zdSuL6TB!{={qy5Iti6$=!XYh_zUyUXWyclli|#dXCR*D}vaug~x4s%mxn zd>)_Ta@5zjnmt{TTwhbw+R^T*cQ>|r^tj|Pu1^1|E|0s}wc4}J)r31g*sobq=bMKd zI!lUO6zcPLb*!^5yRy#hXtG0@rnPQYXLpy!wZ_}!?{>E`#g%pb`Azm$%*Px33W*z4JOfp49@W^Os!Yav|rA8(oda+}+yR(WG;A%x`J!_N_A57MR(Z z+&(|KkR0?5sO53DAq$_U%kO9cwWMj4yUXS8a(n$g=wV+5+T2FB&)Z~hJL+Ba#V&i@ z0$1&ob#q-%U6iKFBa{)c%VE_vZ#yiZYveEUcKD#C&oj?~(o~no^7t1(X?Lq9M(|aY z*lVwBirI-q@m!vgQh_6`uFRl0okWnK~EFDcV?MZvu7EA`?fE0?GT zJ90x-J{HmCfQCyuJ?(8B&8)xrtCyhaP_nh|M(>&u8oP;p;$j8CU@aX+H8#Ru+Fea< zf72?VgI@2Y#jZM+r>)b!&ei4Vgx_^^xmS9aX64$ou1-&vucO`F>P7ULVwuc$qq`IK zh9e?(=rrG4l*aCs)a5{mI{&<;j&A?Nw5Z<{X`u|E$r}5fvY!iv&id|aba;<6e zCMh~omcvJ->on6-I_lA|5HVie)upnII_7qE`|YSc;VYi@=9t0i>rvFtRBK7pL{0gU zYFXz;MaX8->S-8%>?@HkpK965%^R!9O z)VWSs>GAu$ZJv&nX7@U>xtsjnj&`Nd-Lx7FvdKgCwvIKPaf-{guB{O@h#aVg?B3ek z-gd?7>+EiC@+*t0s$6r6ij~DqM`e|(w5ViW?6$OMzJ9-aIauZumB(T8m8#{-D=HnX zlA^hB5hW#N6n$?xX4vWCO2|N%fq$9!WyyPe9-fX>j?SB|Ocs2^bQzN+FH>X-u5_&b zvILbh{U7hLFkeqooEQU*`D*R?>rPRS>Lj^nO9Piz#ur2WmhaqwWy?v*RKzn)_nF?4 zsL|(R{FJH30Vu)S3Zd3yr9krc34D^WK;nPewiC^ONS zw-Ib6x_LdSn&{NY2(>1<+5XE-^pg!{zy=c?jui{5O!O%+s-kq7=%d1iaHkH_uP|P4v&1`0qB+7ntbVP4v@D^c^Pp=_dMsiO#jQ z5%!ztXBb4l1136Vp|NntL_aG=Rg_^9-PoI9v}U50nfOOd^e>p`V~bQT1%5kmb~TY6f!{=&?i1-0co%VYEs+L+e~mcC z7$s6G@J8Y%6SoQc8sh9)BEyxlkArYt zDRFigkzs+)BF?TNazNnc5@#0?84&oH#Mw1OwhMe3ac-AI`UQS6adrif%>qv+K7)9V zz(4*PaCQliPJzEioLxbrLEvu?XBQBu75FQ}+4Lhefj>{2O+HdA@Mnm#sYk2=e}Xuh zawJ#aj}m7Sjwk}(Nt{hLGJ1^Vzn{33_^`n5Ay7ttY|k{)lgRE8Y{#q%5Lj*5VSGIxIf1Dw$AuIz&K;S!MHr~BXG79 zS!VW%XtuxF-8-1SCzd}^sUPiA@|GibaD^ItMGd?=-_{emA3{!8T_C15dYH**P{uP0y$UI{^>C=`_hsD$ zQri1_SUxpyNr49p{uDGhAzE0in z=8jBEC?Cn^o~0UmApdT{u*AbUuC2aICvHaMF8q|8?7OsTc!0JIJ)|SJ&kx9Y5b z+;3IGnfIzeJ((l4z!ADSTP=J~4L(cZ{%kdPSo3^>l#-1}0vD%MSbn@OaC0W%V}YBq z35NnVPf4>`e!O=#r=h!QQL{Unp@%ku$wOI((Js}HO;ba69tbp`3SO}E{sv9G!t&rg z{Qf&_5Z9r!{Wi;kZ>8-Gw&oZ2++3#kv%XnXHF5^kcBlQ*<$!4-C3!sCQr9D9L?qS$fZc zem%DeE$mezXR5(>wB&@a0K?mwUq1Q*CG}8<9_SP_t|ssIY9?8?4T6ZK<%d z?`^Sk4k&1f)%l%hhFieI#%n3uq-PCU12sh0%@JCA3QD6vJJA_XH%IvLTsA~9wOBeJ z<^2lFZIeh^E>wP94Zf`gpI5`1L<82|hP6V-+_Fv2O>NR*oxw1wot?obs~>^Rd>rcZ z4M1Ek2$qdEpf*GgF`T7_7umGS=y7`gAX1}$&?qHb-KMC6U`jhgT_`cMN!Y-$ZIdXb z+Vrj(JgNp>&rti0PzAq5?Sri6)nLTZOGBuEXqt}uUARw|_p{Im_`mSJ<+iF?UTnM+ z^J3*C7nck*T!X%+u7N!^IV;IoNzO`gR+6)loat)xaW(MhXJ8B*&$Qfr5{!buh9-fU zpDL5!b828;gMSt>y?r}U5%x>CS;8J2R(4Xo2B8{~P~+RV$xTS_AY^AlI4t1-2?qe< z5_ZZ24HDK$Xp^v5LMtFOWa8j^mcH{b7>(p}{E~GqhKocGDS4q}fc48d-_5+WqNDWB z$9A!GJA<#Q;Vt=0q^-exixnrvhBH2lMr+Wzm?E@QxK`f_F*h6lKi%*EAcOx_^!gh! z&`&voKhN(6#q5E9I3hA+6cZBervSqPooU0=kisT-;6XKbPz}5c4}3;=V71!!c=u(_ z;LDL`k&7JPjZB3B5_Pkeyjn64`41Rx+#doTrFCaP$jH~!z(?u&?Sh)VSN(--o7MTX zISJED{4{M6*gYz4i#2ja&bumry3ai42*$~;lQtm z;u-$?Y4Qj@!FD42cZ2lb4Xg_2utECoh8`WS=%jY=Bxr^tRCt5*-wo1#H%R~8Ff2t# z|J^VEJT9U1-wo1#H%R~8ApLiP^xqA-|Dq)$*Wf|je_8MJ1>G~Ze88@1ukcKa$@EOt zruHI+Yj*7o&hYO<_QCt|?}i$zv23`ow)(wjRQm_E4BoR$t6T3_xR|dwgHiO<=%%+qhBMro&*xLx zWs4vf3HrgNhNkDig&9v0b##U@^Qu83Z*?#~A3{`23#pE_?|h2yl1XR z{D{yNT|ZXrY45TvA679yEsqWa#!j|u+Ja?^=DkQ7f4S@}#PlWP&#%|oNA+5bO&>Vj z`YYrBh8_?jjdn#cp5N&_)xm#gvy#PskMS@w3uM`L$h)U!GL@J$058y~?^$x4`ODw4 zT<6R$08!kp7-asB3)y>j#VJ({B9a(smqXABl#~2FKomMnM+hw+lie#q_gUFM#BB0I z^etjGY568*llfX0ypi|C6y_aGq2{3^^Gf>dpM(}e+CK%;R^c#e=wjW}cf7-tH|GI! zhMMzH!jb*0&M}h& zV;GnwVh!gm(>ad4t=qkyX+mqMAOyW0Po;XG9*n0-4IhrDN=<(ePn8;fJC3?zT=O;Y z5#uGeUPQoaV`aLM6igpE1=N0xeT`VpQGyt_keJnR4#k_m*i_6h)$mrq?+Ct_IL)+d zI*#FSWV*KJE!1=x{r?9rRHP3BT}5DTW<_*gMc~*}%cfSa>GSyUWz%8ih*c2g%0Iu> z3IoP3ojP;jOjsaUdhKv4ERrHu13H33&d|?AiJVychRjW}9ZINZbu@s!zK*$29i!0B z9px`|zrj@FMk+&;6YaBMpBjbhi5;L=EhPf^T(4VwJL$RHM40*ruxKJHn3ssCGMJP!9H( zx`TB}3a9@%Wd$hcNVThBXtCYKo@||9OSQ;3%;cN zWCRK%E;DuePqm3^!^J27dzRVbHe3>~4P4u#i^Sv0O zrPIjSa9nMFj5f~qK#X<@`NT4_A2c)_@A8Rus5^Cn9d3Vv+^OtP4}EFxTOdMW#I(UOZt1*^80{N3npkY}*Gxtu2=JeaV-Pv3W@k z=L(pYYzAb|*N~$Af*7gv6&aym3|EM?B$?$}k`qkyTN^0`O@@;#4&yra7O^Uhtt_`- z2im-{L^?4UFfA~1nI7tJvc|v#W;SF89ucfqU;a5^eR-HB*4LLJG1ixPLW%hGB?V&M zLJK8bU&gI1`@v;eTdp*%EsHodokR0s()#Jvmj?HzT4R2C=GZ!u%gaxfOfE5tr23z6 znK{o$MmwYQpJ}NXOWY|FH%M43p-sYK30Yz0<>m}7H@^_`Tk2qT6l0yqy4Pp(`!qU+ zJ`2{T^u_>$c|DVBnRtQ`n`->mKiE{|q&eI_02eTvE|#g7a=|+lq-OAU8Z4HL=VJ9~ zUUe=O*^7Nqkqmx0h9s)7>XiE)6g9ywO{-4-9IiNLslmTSb|ZO8RapMWcOVQaN-QqH zKjP6Bm%N?*DZLg;qwtjtTvHkj^{LjCpPpH)E#IIWK6M^)U1>P&XIxtve)m6GU&a!5 z!mwPVHb_`2p-sYK39W!)w@9ur>9q7g*1YbO#dI@J`ay|#B@wPR=_pz|hEqBsiO%r$ z0f3m3roW20-mQ4hBNm#fK3*)ZUVWeF9UJT=QLZbQnlqHZqC2sEtcOl9w>dy*@Ze!U z2C=YY$6W@l;7jbP-vpVfOASza8IK5zR&hmWdKp}m@rHg&LYZY;`H{CecwxRFi9-Oh z(n^?KijNT&389Y&4t>rv>+gEw(^sN*#?;-;yrAv?AVc&CLs$}B=f~+Oi9G@^y!!B5PQrk!Nb}@+9P<_Sf1XSjAw?GdqrG z6z24Jsw_-eJXIEEBVi{A7iYxR60+(U}|1R5aok+WD{LsgR-J`7p00%AUUI#+*pfjDyN2ouKQLdHTl z$P{9s{APC~nKP^+gW(KMPBJ-zrS}Q3y`=kwb{QBWJ3ygzzI7aV9?|~!B4}U77KZjN z?^KrVb>97gcYovE&#=YH6zh?4!osVfxCtJPTnotb%O$J@ zG@j3xo~H-i%yZxwb?`$KJCfm>vHkFr_Ex?=fMNm=7)CaP^dQ0k3F$<{`z72gVUG^0 zxZz#Zz)P(<6c`1Sfhjof5*A3v2`uq!K(ML+4C+uuXOj({)}5_h(5=9^2an@@02UTnLTPSz=ROPF$7}z2@=wVA7-TXI39U3Pg7dK9e$XWfe0OhsAs$g zEGTcu&($^>0?zP3AyA|SOfZ7!EGTLS#tU7!JU)F6H-oM)QlIS0))Q7OcZPqqU(Z_y zp#u~07HM;gwByAlr!)N9VLiDHLK?BS(j)m%?P;7DNGLfuu{{35&(9ZC`M<`1+e;p= z=^L>0o`U*xqBPmgPz~(jTcw8X?LmA^=qiZ07KOaI))~5&Muo*`HB9QnPu@^FBq#oWW^8Czkup(3L9f zS&yDyI@m@yCsR1X_lh}pD4>H-K{7G#XoV&*r^bt63RE`RA+*s!$TmUDS*+|=vUP2o z7^8Bj(jfYVk!b=IjfQ$LZB5_f=-qMS2<77F0FD3zhR2ZLPnO;v!Ya<-Q)=KJV`_N) zm^%1Q2Bz%MA^%J@_z|8prghK2{1=ZKJF=Seo(B&;JNA#vc;C`-CVtCu{{SuMV0-Yx zL$_$U4-I7BNVOVv-czg=z73`?AHe0S!??IdaVc!El-VBTq6SACmc@U?8dEKN zS3D>!eBVDAy%Uyq1zd{y&oEY@AC6>Nwk^6JzkB%jC-^ooHM%c2reY4=b$)Qn=#Sxh zV5`0#{MGko^D+f`W;)BC>UtH1^;bAT#WkVHHKFPGj?ncman5d7S}A!;K9Bvu(M7+m z2rjxiH2v2&NiqGN;PiWgnZHDKzedK+@;`RHghQWsrfC5l`f&uD4k6rc-g?M<0jXVbQ+C43sYqf9w1>@@P zAXv25@$s+L5q!>pGZ(>s*7QX!y?k-d@rQfw(F2}D=<3f{oZj4993isk* zSC+%F?Jc!%2qyw7EK@V{9Ybg)&|49M6o#iAQdYWJzSkngHf<(UQGar8AD!keT5Q=uQ{KB4-aW~106Y8 zK93R8))!$K{n_3-+Ri^AR?{;64B*(T21nI2&A-r+TRjIQsV+iMs^_3A)kP>w<{Ui5 zoP*-j&p~;vn}fn!SAYdOW(ELr2Er&msYV_e)$rNNu37PD}2V zIX#TY-8yHp;MiKE!!1RE4#AzwAEtt2Bm^B>j3Wol>fRklG+|0fAeI=Wd!)EZ~+oHUYQJsTF)% zi*&f9NYIgs;6pA}5 zC^=FS#16*aF)Z<@=R0Wcp97yGd_%4yyaKAg(eTs~93UGOd$LDIrdNbAAN)bZ(M7-E$aH^2 z+Mkdd<6nB$Lfpvl3p~5X^HA_PaLwD9_EbfvdRHb$w>*>?JP4X|XJ#6P+o5!4`B2w^ z;Qnj%<*iI#GO%ZSvWRoT{|XQ8kLNdy2Ws$rNAS2fp!dXOF9e&#C1vS#IA+uJY%xxN=%5M;vL-TE6?Jv-};) zcL%c%IxY5ha7?NO&wH(o@?(~7d>_nLgctn^K+%pL;L7bW2xjiiLRgq%O}Zb`@7JBk zA^50vCV9e(?o-3l|C5PIj%eR_3N0h;Z;tTi@55Ne$G6yj1Fa@_z9YCI`^s?UeU9Me zxg)2kgMUviIf6bDrw6q!gTs-wB0Hg}?XGCFDcT2r#Hcw3S(&Yi`L4-c!DofR^Z{^^ zW9af+s)Hr=4VH~x;^5UZViZgbF3Q)=5rrG730}H1oWHFm*dk_&7~ZGnYkQF$DA|ta zAA_3td=N&o^$Vj8n4_Qjqn_GZdu?9r(5n#PwBut2=Nkz3aLw z!WaGu`#9JwnDRU7q!#|snRX1KAJTPsI_*hpt*Ypl(0U+h1w@GjQ0#n^WvU%Lx_uPC zVf--k?;SwH9qs-{O>i%#*5&V6dcOhD)xpTogMp8Z%TgY!3_E9~2cHPMl7WFg6O)At z0w1UO&kB5;?mvarWYJ;7(RiYpY%O*+i-Ai;8+ zK(^sq@~0%oLp0jC)(x%H5SEM%?MQXDHOtah0@-RB=7n6tIYKCc<6;!ge>NwAldwjc z5=_VAm`q0yQ4ulVbA4J9!jp>N0cRoJV;Dmxwf7+;S5!-NL`~ak`R)K6c`$OR<$HtK zgX#`?CBkK@#jfE<%EPP?|Ai(xrn27<({-cAa#GRY9%dtystF!<7QW#K{>3rKGs>K* zeuBq;(9j7Dv)MhJBFgx-_T?v|(Iw$q9?oQEh(7Bb%>tu1f}hW?;iiF#*Cq5xF={ys z^C6iw8);BOEdbnMcnUKMlJ7vm$RH5y7Q{qWpbU{=mNS$!vcL+PV{Wa6PMvuX?s;+~ z=*$G3bvkjxSyfEl3$|})Kr9Z8tKqfULwr$JEq}VZUc?>f1%~Qs&~8QsJWpg2+t2%$ zScqah3--0zR%nL3S$c+fIujTe6YB)d%Fhs;!Kh_08%Ga%!H8!$1S69}+2JoogSl8= ze|rszBn}%OLi_&XC|@%vI1CWV$~Nh;C{CA9);t+^f+G4aL!fCl}OqD56CBZ^p zWsyT!x6g-Fq~X`|K81yDq6F08G$d=$=X3hoKAcXf!6)HM!4J{c_0t+Jf*T#>e5_wB zQz7$W@kUmL8pJVo8(gFcE3_)H2+Yz3hHxH+gOYZap6bUlL@Gzl|8PfwcbL+75UB?(?(a#th+Io|ZyUc+eS7eu!jQeD>RK@eL4Uqf$}Z zuB9yg8B%Xm>g~nevn)Q?%$f8-FH!s>C_Wv#Q1(s5z=is`l$))~9o(zigF_s>Z7TP) zli4GW_85Z%?ORBq+v6sj-=(4=ZWM94J=%oKaeL%x_fmV<1B_->--fCrLm@Lc%VZBV z?9aDqFJPXfhHgP03+@6HQ`*2-rlqeTOHqchemGAyGO_!U`xsgE<`yrO`-td8*(0zQ z70y=LGKl6L5znaP#$tRGO@x!2R_TaNjV2 zn_nGECA)b7ck2nbzcPW_bpq}yCU7r10rw>nxa}w4W~G`2x`^mN9?0i3NBi}o80h{2 ziizPxzPN`jOE84V@B}C(hMn9#Fc@0Na5pF>hWn417_KBkKPV=Kspc$Zks%td!^vib zlgKa@&v4Mppbdgycf68AW`-d${4Sp1$L3PpMTT&EDZXcB=p#b_l*m;yKF9k11!C4;;EeNuZWAh!B)u`NMb+Ud+P*YkDfpnTVsT4*`&Q< zZ}9|SeAtjmvkizF!K{5xV<-bD9`_C>e4AwMk^y7|+1IiV_AW;WgwMS!rg_ z=a9pU+)tH~%`ST9Q-;YY2AD09{*d^K}^3wJTy^_=sNSX&};=6fgR zQLJ|t1$^dg^=Z=s;ykbR0k#}Q)+OZ0S&jBQVkV57Cz^vNFQ#6K?UcAtNaPSJhSA3# z(aqVZlT;>vh%3VLgfdt&9M+y;+lCt8 z8K2Q~FLs13tq5JTliLyxaW6u<=6xu#;V~9AwxYupj%fuoZ@jtVWhg9s3r09c9baN4 zV~Dwm<=d0wT5mtH(C&R0{`*5E(bsr$d>9PADX-Sc{o|gfc6OXRB-emclVn* zejo6VFMGG*5z+q%bazi*gR+Zj674CV!M%cjw$YFLP$hkDtv@5SKZX^rc8D?qd$OZ{ z>>e$NY7wBO_{&5u5ZMDNo`1&LC%0tSHb1EeepplZngdTTvG20J+Y!bje!M*k7x0a8 z2l>m$o|`Oe|0u#3X_rWv7_CEdNtz`|tQ)Y2&F2}Cb~|WztYcNfRaR^^-u4ryjn(#x z*l=?e4r50ugO4oz^KebamR(>hqkFj{G>>m?YR{km_&~{(NRNGZowiG-U1X-+qtm`v z6Z~N0Y;KK0{>W+M7_s1*J8}}Pc_SH!cLs;Yn=DL*{V`#m`npw+H0sS2RjSL1$avlJ8RfJusK3Y3ml=Z;8?;F`V#@1 zIeKmlKDlyO``+v9h8EjKaA*gc!5bXGrNtFPlOaW^7+P$lSbmMA5YP8Zo-y~Yfkod* z>poiz%^k|TLvY~%aQUNMnz6fzrO=+;)8I_I@^RUT4Fct%D{-g&{Xy=f;dq;T#qqbq z@xVe15qANhjei8&#qVeStM>3&<7;<+H>RAG%59-?mm`1O{^s~X#=pw=^OMHUX8iIN z#7~OFe^z~lXmZ$`SL`cq=JO)6y-i!qiRT5x^PywT@)3Lo0*Re)|Ip3ZHE21FXdB(Hn9v)Sg=t_GFK&b%eXoBJ3Eo9>o)JzO|1NZfbeNcMdn7%g6jB z5T?ENJJhkRqf{$<%XunJrtpZ|aU9k8#F=))QFzpk-LxTR@MGeB)n>zSfx+9|vV6@_DbTt)M;Q?4hy)%4X?iZ~1q)>Qv z0brf8@HJRu@EBVDo7vh`zl9N?(Ama*yEFI(bgPDp==2xSn$y(s5xh@{)_m>t#@SZX zSgb#Pe-By?zjX!<+@cr7Fn)r->No!``F{|UORSZi_NG;B?ylANny$5}qrIuStIN~w zx2|%xc33@Y@v-3cl^(0N-Ktod@#)fbA3j*>Q><2})vBCyl45oGaMQTXkIyUDRL=2P zyW73`O{2Hjn<(GsxuF}vz3$c|^4EBp@D1IC3&rP@Tio5PewVuw-|KCTH=4D{rW0nI z80J>Vc%55WGH-F0x4Dd$N_?l-F3B;V$Cs8=;rr1ZpV!@9)zQ|5(%`$l9bMqwe0zi7 z9cZ)(sPmT;Q((RLKC~{<;2V{Ef*F_2-Ue~o-)Iw%7kb2SqYYQwW3*<-mgP(3Edw$> z*KQO1RtbwGv`Lt}{3Ua#Z>)?aE9CYz2zmWde$38-s(;gzDjGkMdwPp1+S@O=1mBB= zRPiC}qNXMVZshY@@p0~j3-wA}gpcH2Y9-IYg}hdKME%xz+nNgybs_xAU#QHU-PY;F zbtO0e@J(n1KmFU=_%yHgCQm^j^IFs4Z8iz3b$9tZPWL)|9JzqswzkfiB?MkLQG@f7 z(U@_wr?GqGYb=GBVw)RHJ=Rk$A@~Y?&jt$kI!d4ueEh8 zX)-k7`_h8T)!Eh21cr_--?h!xQ*(UhI_6SygvrblS3AB&PW$PGidB-?5f?5@N-mgS z?DGrp^;naok|tZYunz63zGIoEY0c$b9c=|7fnmNlMAXn{l~>6xXUFNrviO#<8}RvE z@CnpNTsCpY|0qx7(Anzodrq8fp^|o1#>M>GC;Vn^|F5FaVcc)t9*quU;BTe?=1#)* zcYg!=WJRe3+>UtL{n2Ov8s_GM(P#tUb{w1Iw?sA{ibnSXHoO>(DoEe(68Hc+0d0Ui zfXe|l19k%T18xL7a5x$r1uT9A{8&EN0BwM^fc!4h0ALT`FyNhld~fXl@pq%q>@47T zgl_}f49I=!e!#VW+W|KN4glT_I0`rb*!f{JdI$mLH{b!l z0l;CvLx7`zqkzg7@`XLDfL1^oU>RToU@c%LAitQ|1K0z&8SqZPe!%U3+X43j4gfBv z+>fHsG2jg!qa3pT!}Bu{(r#L&q^-?OJ8R11?9FMDb4mX^es^w*MrY|P;+mXaQSv4K zj(edy>PE@Qy*wxH3d<=sX7?zUoq6%Bx%uZ(0A(^{+*IonIZn>tpBl)}^VPqFOj)_` z2^C*Q%AC?+Qz~+DD|7NHbF7s)1(i9)6**;#b4E`JOx`ppob|2DZ)bcxU3^3NI;1Oj zIvSmhvSwD_kStwwPHkK=#VAikT>16Cb3 z4-@M!Wj^dD6tr130V6P<`#>N2TRfe1t%v+k&{yF;^S@Cal{vW;IeFDN#es}(F>eH> ze-r7;AXj|v*;Jofz+(e_3F~uumo15|i*p7t;wqHo`){OM{&F<>bL={0u1ZK(kyE@l zXE;4DY14S+A`R1JBA)|qV#ba1nFoAA--1UrHT^{^4(O%P$e{K@`g`j6Ap;v>h zB%xmi`WVWQDBlnIDClP*nNe=qW0T}hr2kyXPozHrdNO_fEcp}jeN)O$q-S!>fkuzi)w@Jk&GXEiObe?(gkUGPbeUiqnYV zjf!9H*|==MuMs~H_*DHy2pMBc9#Y`|f%3C2;Nk=_1MqGl_W|K3d7Q`&4zE^go(+E@KLSaOXqBWFsN0t=uEhNFX} z5Ek1?{weG+4y zV$8D=u~D~UKt2H!HkgEHvI##p0OX5COf;h~<4Zu4r+8uDO#|FL4Hc{uq5l727%!Uf zTn~I~$t{RrvH3JE?J-=021FjmWe#FQ7?Ux-XWQ9{3)zM!c{eVirz0P@5TY4-Ai9FL zESw0up+WF9IQ;WQL5Jmq52=h5cu?FkpqvDh`9pu z4imWtKO%hOtPJ8u@AxATI_=H8VTfjIRWi<;i#zU7|Ba;8_40drA48CvV5GLGZ^z~ z&chiFS!@CtbVcHZ-iJgi|DvHDjQo#B_43r_*hB=*SBdf&dSDww;Lo3`$Lp#8?_Xno z$37ve7Fn-rB>cLBcSv}bgbzx%Pr~OU{D*``B%E}bUalDuo-g472``uMY6)8;TqEJv zCA>qzyCi&2!hI4xC*eONJR;$w88Uwf&zEq4gqKTrwS+Aau95KT65b)JYT{E5+<0Re;#z9wcx78?sk8-bzV_fQR(cG@@|2a6zT*;#^Uea z;t;?Z{OMXejr&843;rA5b50TD>Xo;?9#bxkN|6_TomeTt z-)Y4adV3Mq(d_oSl_Jk7S4)?>&Es0tjI;&@q4>kFI0xbB#Pdq=m!gFXm%FPAf5TPC zFz&zBgoMb?-R5mVx(;N4OOeP|&!f@jQ;PV=7l$Ac>*;@rvp-}XYxFy1={8_kZA*gD z9||HaMt^MJU&IajAR~Q!x(%4zpa8TIF$LMJ#VCA!YEJJ@w~08v6qqlt@k?U*YDD2N zWQUReo#{5g%)gbuP^*Jjzisr7lB{rhiG8$@-ss2ql@f-HvL9zZ&$1iojsEm%(Aakx z>5XxrQ!*Ok09ZswwBHI)*#{fxjehreIgqW9>7*L5d<=eWhOkdJaHC(Z&CwHXm+7fL z^)&RCWaTE@(56OuV;oT|I>#Z&Xyk9CH_G3eklq-V4$1V!IL7oGs}s|I3pCoq7)On9 zykI(r2;4_Ahs631BGR0`R`&C?GQD_qYZAa6E(QZ`!M!=XF>kS*F4&Z396B_vMmhuk zA#Tj+jd{m(x6WaVzXpGz{{1q&VSlUJCRnX9J)gsyLt_4SBa-9@Do1pD?D0mSB~ zey3j(^M4Rzb9!}^O)#pfbpFSTiqX+n{Yg|Az>PUQA8#{E5wi$v04M05nEx~2rK{36 z8H{<_{#$k2s)N|o@E?Ql5^m^fMtWl&r^)n*{E7G*NK5^V^!$r`45Obi{X5{LiH!8d zJZ4O$H!8+3qmjQ+k7Gz{&foYu&||kD0>R+dv2om>A47yWz0%X5v-aqKFRz$`kcqIQO_sAu)eb)P&m%l(H<{mV};;2LQ?F8HztCJu|j`F$?40Ue}WHPl~N? z;`t{l#`qLZ&sL0aC!P-L$aP6P{p8sCC7ynYV)Xy<^eKwbugB9*RgC^Ro}Lq1|HacS ziqXHu({mN0-;Af@O?=rO#?z;vf3ulM;ywcpG>rbs9GQVfAV$9wPd^R)OoN#u?lbVj z$>>MSkr{XjWAqR4bazT2?D<4lcR>$L1`fDZ*1B_GjJAHVc zXoqt|^fZOXmCS)paQH}x$BWFt4kR7VevEpw%E(5*H0asf*B~fHySV{aGJOpBJT7An z>jg4R;V~F<*evNh=3)*%m2@6sF^30$P|pUrPU@182LP!jU!h_!`h~Y}PdeYPVle1N zxq2ksDAy^tNmeey&OA0^4t(H9eTJnzRvBr?=bzVQFyvpGLVgSAY05-D&*GYO}KhPrNOl;SjxLcF7)0;r&1K7mCH+83>Uiw$q zL=?;-!t*Kk-j_;TY)WpnVzhjUJh15hj?)^mGgQsmiFd+nJJ| zhhl{OjW$8y5dwy%LAQ##_{&Qv=6&udc9TT{@# zk%GQM(9y5Tde4#hzMXPi?XM(>~3A({G4zEu^zdZ&0C!o{* z4UIM-q)du>Q1GL_P4L?^Y!=Y}I~_W|oSrGOBz^O8ozAm}4Ap|J-X)GZB6%<@CsXJV{ob0^MpLCin*EEZ1H zuz@}m{KotQ?j!<_jj+76*V_cnGlUGig0A12uRjBw`Sv&31lh394$!TF5`TFH^xP!< z&tW0|ROLWIdzphNT{6GDR?tsXHYfPWM$koh6YRM|@)sx6?^`M4pK`KphwTaaRD;g; z)g#;2a#_4JlD{WGpPvbS_*;`ra2o!`KO0UvTNCw>^kJvY&$F=%=K!)?#(Og23^eF9 zpws@NjW%HV;TJ*==*jHX2l~|XGn6|wG>|P8zLSFgH{?fohh=&BnF5CWDfkbkpnpO+ z$aix>z9(V5CdQWrn~>`fS4BBP(mSu!>2oCgLW5t@Zn&S<_uRv$HMpc`@WwTTE3%Vf1 zUCu*?nXJARf=)dfF4g5cB~x*~jdbgEIvuD8UfeL>;cImIGD#1EPWu?|Ng00lQz@rY z`r#aDpxvOe-aGpmgao61cuB~YLQP;y(2;LKd8cDSnF~3I{$>R|S$Qu8o$X8M)$=vl zS7!?T&7ji`wXz=1k^1ih-D=X$xP3Z>oYw^%auWO`8yzX_Su5>h)cZ2fsb@oio*O0q zW`|8=$usc`{C*nkFc5AKxN&(*${CPydSt|LDW~Uho1lny0C0B}I@n}(D^5XQ4m#~q zEd9jTpSU9h|NWq|-uW)Q2PaM}GDfrVqmt6muf{uI>`gvyxeoqSeh7|NIQobVnXO%4U zE=eEF)9t`_dl>czdXjyN*!y}u@s3_qRor8tVm@e#qu`~;1j;;E|cn8z2 zj7MG+7uo9e`|Y3hHO5qhHD0QXz3s|E~ zl}SM^tyRMa@C6h1I?NgDj3wAkgso3I@>x>`N$EB&inp02Kr zuG%Y`Y_`QtM`hLW<*vC!@Gn`ZDPChPnZH2YVo$Uy%sNNcXr`HY>O1+DlIB4 zn*Xl^T~vwZpI%RweGNJ5{3T_0`0H(g!jQERSC6~R(FA%4-^g|OyWC#C&(UPBbK_#K zDzPuSvd)L-xh_YC&$Se9dAH%M*$HK->uB}az42tcdF%7|6Sb{($oH`m-*0wZ6N`#_ zRomri^)@!Snta{D2b4y4(`u;MWGG?S!Ki}ztD)|Eb156UTT&M>UT3!Kk_AQ$HoBW# zO>UomO(N3?UqLS|jel3yc+b_otj@ncf6dzAg?+ttHsAWX6AA;1Yh_zUyY6B1-YeF) zmdVCe)#~>7(9$}){k{oyu185eQ)MR>vbnW3q2Qji-o*NJQG+hOtHteYO;lmYm3994 zP5yPA9{3VGsK#}px7pJ!8kap@bWuskzw+dg(z;dN7Qd%?nY(>8oXxw;TUX*zR(kw? zeD0v5rP;kMK>=}W;IlWh7B6hxwAStF@`#3Pv!T)A(1WX_Xs+If%DiX`JVY_ifqnvw zB)%|6E?ic4q^r&CZBJ0_n)<8tN;iGv;9uxjT2gDgqh8g~(ZzSbX$QMEsZ+@&R?Z=z zs;zlxryu7;>}%0O`|P!~O|ToAbaof{5G5^ z@q1#T5}_{-udIbnxUQXb#?h&TI_6t;Gaw{E^m)`D*y`jpO+V(~=}3<@3V z*za=)ka~Z*QL8*QXxW#2EoQg`)0bRib_vm@;S9PW;>#Z?3|%s>va7@0%>MW*9bK)> zb}xz`e8{^1AAIQO@+36Fe?2&s%!{{`okl6qje;f$d!Qd!>u&U}DJi)K_v~(6?9b3v zS~_5x_>SR3+M7*7pE7!Y1mlc5Yzixs$BYmwzsMF72DEk47dF_=lXMQK^H{~id~ZRA zqrKU)Hi?%|Q|YPkA5cNtMGtZjr*3Xoe&YPb1rIhRTxjP$^papo;Z=41c}@6$N4&G) zGal|H_7#b3r_Ns<>v$&gyv@E27e0m4+=@PFeCELUT&&y|pxOQx$JgY+)VbN?Gv$;};U)9Tt-%AY zmVIw$cbCVt#@prZc4J^o;%JG2O3i}o$)+0UZA(jCF3jp-4Sd=M-)U*aoC^JTyTjR7 zY`2%pH)0KP?YJDhbQgK+(DS>y982ovx-RnSlT#q`U5+}xaEDgUT1T_p>78r0<64TV zowLch3YXp9RtKN3ufasS7$ZFJK>-2b5CvobcwZe=#fenh%qm4E z7(W`6mbhGN+Wxg&Onpmi8s=#C%O%~iI$yHc8$YDQ0RlcfzKp>#EyXe>#SpCz2+|Aq z{U*-1yuQxv_9mmBHC9gOo;%7>AF_cp+hK!_dRJU6qRFs5Vrhg~b+dz$NFNr=b*21| zrd;eo=dz#+9dAdQ%iYAUDY?AprTI-R9LHTLdo`2|Ge>{Zs-#_7X^H5CV=Futirj*= ztH_!ou)eV7vJA7&j;17zrq5*HwskHKK1sC>6RJ-5eMgsjr6<8s=+_0y#6_x@{WtQH zNXeA-h$F&SmaSdu>ckQ34jiiXBBwRQNeiX-(=?mtaYcvHeq&plbz^Neg|BiQKB31@ zTvxTQB<#u{r2weEGTnA4fpBwQ{jqW4t(H>p34HUIzs literal 0 HcmV?d00001 diff --git a/benchmarks/Grid_memory_bandwidth b/benchmarks/Grid_memory_bandwidth new file mode 100755 index 0000000000000000000000000000000000000000..632fb5eb4123b0f247951342fbac8c2b5e1a68c9 GIT binary patch literal 45026 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 b8_pHjl#7n&O2?W;te=caf7+D@nt%I0!DXRr literal 0 HcmV?d00001 diff --git a/benchmarks/Grid_su3 b/benchmarks/Grid_su3 new file mode 100755 index 0000000000000000000000000000000000000000..72d8a8d0170e828d287c6b87996116ca96fb2d3a GIT binary patch literal 44845 zcmeIb3wTu3)i-`}gQ$=R7A;;Xqeh#E#smkI(s=+H>NxhyiB2f_{73TZ>_St80W-=4szW?X{ zJ&gKNQyRKy5vg%OvN=TStra&wuy)V&(_H(K@Wz8ge-43*kn|P znQL^^fQn)j1m>fzdv6mcV3mj%u$u}Y3|Vw&r2Ymp>c_hAs*vdw z$u?lbZ3IfOxDP|}GL*gRuMzQj9arjYdPKtY(hvqT@_h^WsOSGQWJ<<`vb;og8Ezjv zgDhUTw9d0)#`H_;YA&hsG&Hwf(mHF#B{Qby`nX znSTB|xBPSR1-EZq`dZqQ-B0wrSv>jeFPN5#%V@WNE3?YgQ=CLv9>T>5=$cFBv5i5tfiDXY?c`}4CKx2&lJ;|8uB`VqIDLLsli%r7oY%BC7rIw^e13ORQJu@@ zbNdvhy`t1v<8G4ViqfJwZ-cwSwW7|gr^QckHu_gJxm`8R)$TRUYQ+3tzixiHZ#qh7 z%+GUDsL$WzT~o5~+H#k@x&+Epx4N8-%}s7+i>Jxo?5bmqYs>wYRr}X8y1|k^4cTt; z)VLd*o(7M@%l)%FULO?kxu@HqZ*jiV*gpemx$4{zg0CpQr0m-2h$UEU-^^-neWR<% z%@n<&GdwFBydcPWH~C5ydPIspf0nKdRQEKj)GH8Ab7AQcl!l^wtc24J4Hq=J8|u9^ zY@v$9^U*kHiB{JNPfI?{Sgsyyd?hqh!%g)fb5td#<~yA&^`7_@^%kJd$*xetmiJa*puhsdjaxibwupCHW3#`6 zja5;Bs{Kc85=SkxgDXaeV9Ka< zdFqr#bUA;m9KIOmtscMP^Q;uz!sqrY$SXm0;~Hh9+wb?(yS=qFt~F$HRr@{O24#h- zdNsyZwVUkq-WK;T#pzp9zXA=25~!A(t?FH#2Bo&i?N&U##^#1E47}sTt6}gj@bdjEn=d&^Rmn<%F>9H|N68??Dnr8ToWf!hF zMM17NKx0S(XO2wI1Ag!Keu&44lazNQt@%vPNz`UA!k>mbx;*9&+@1rK#wuS({^uWB zjmNby%E`F1%ubP>rko~m*U*o^pQ@ZMaevPD@d%ZyOa;y`bbFP6e6~TskzlN&WTT!& zFxExV=@S~kSf@$nGlUV0b&>ST3?iXi|46^oL^sxH((_GpW4$DOripH>-=t49(I>T4 z32ZFxa!D4r)kJ688X?<6XHPIfo{27-L?q2J(OI?;Y$m$-c~Lddsgn`POmySfmT8qH zy18AdOmuXtNLXc}kBd;@f0*dwP4re1J;OwAGtn(3`dubE`BH%_7-Ry^M zGSR^ACOV&mjj-25Kf@pb_L=DLDkEXPiGEguswn*? zy0Le{WX(jMVd5V&(Z6A$51HuanCQy7DuJ<&@EOwx=_b0>AOdEZ=;xZ~lT7sUO?0b? zo@JtEo9Gvq=y@jkg(mte6aAYey3ItNWumJldbWvPW}@eq=#?h=MJ9Tci9W?dUuB|S zY@#=s=$Dx2YWs)jYA|h4omEjgyZvd}uaT&>?@HfkVnQ^0*&MKhFDS;{GTDY0@l|9B z^@kBIxSTkrm{6aevyoH{~n0za8J zyF;i^;K{@}RfMVperz>xP7$Fpfqz2$Wa2h~e?Xj5MJP|;ZxQDd5wZ&WRpR4`XA1l| z;+zsfiol;F&Z!_YcmjkAb`a+j5b78Bqr^G%Lwy2&m^g=gs9WF<5a&=2Z5H^ih;w@? zv`OGUA6T6Zll( z=MnD~_(jAy1VftzejafSz0f9spGllUF0?`5rxNE-3$+RSWa1oRp+0%(?RcUvZ;J=B6x)0_4P0K@jaDhRqO!l75!-&9zMK z5OO%a%C>J|`JG76^&=|vqkZxZ+5`KpR|9XU?e7ehRoHvGyWKV@(^DouuWgb|(Y_7F z!?l*l#fq}!9#n0SddXb?YWq-z8hH1nDok9oeegDD7kD?^w>)$UvREc7A)gKx6@I&Lap9uEigI<`hm$Z3 z1Rl>C2cQNX$$}fGs9h58(sAu6RGLH$QwTTtlt+_s(|!ZzNVC8Lvj_IrgKN|6Q?ANC zs0RM6_WV1!)^e!3)^dACRv+@Hy&YNofDHcA)WCkVN4v_>IrvTFcfzh}V7D50P-g|) z&n#WVKZ8PgK6`M6J-9es&G|$PJWuKVbTx2D>-Yj$4L)YtPS0?gt=6VIT7#mraxw(d z9`slhHE7e+;Ksi8Dp>h7OUG>&DoWcevlM^YcZ-S!&QJpfw32_5I|ZD1+fGJy(87I| zZG%Fp_C93=dbLXd^>Y53<#14I10rWyah!4{k1XenW22RGyDX;{GGpu0u9x#Vri$45 z^kB5d)TepWa=tFhaYoA7#rkm3(9Vj`_K_wUdu)XEWQ6Zil%VU_M;aF-?LdU~0%;kf zJtZ_r%Zj7-*GB67kIzT55A|g`{4P??+brjDmQ$^l^Z3e<_W5hp2>UD=wVb1rg>tS2 zEaZ-y;^_KKRu$}H{|6B903gR_q_1yAA7o$e24vXIB~80cND@6^y+ri)Eg(Ar@2ePlI`_R|*r{FX#rV*kMMc!=j;uC_v2=ch1;!EhP1Y>bNv*z5N_c~<-Vy&PRDr6JRxu~^2PmJDpW&QRj%Tj|6ilX(I$Wo$lU{jphmHL`cG6^K8PZD4m zpzX+Rs8b7dU^^QK4Ad->OwpQIL5kI^@Ns4sMYU6eYK|Zz!YYOt`dI|!8LByw`l(VL zNr2gag-3QlwWq8?wMif_Xg{5!D4$p+6lYBe>SnVCG<&<&W^ezntt9`6&et3P2;Z@d z%v*W0+`SHi!&sAQE#5h8wZ#_iiVcXa*o+P^vmEJwk#P!q;c@i$n|QWWyzbL6kGcK&9p-$mL(x{rp8y8_K9W5r%d|DvgC7!{rJz8 zB`zvClASDM2u#PBT-L|*=OAPW4DbQU z`%GqE(an@EHlcEs>|Koi6M7#)rC7s4OXWa`NZJYA1r=hoVoN1z4q?YEOP&PZ=inP+ zj%#+OJ#9Zo+SrFaIQcLE_nh;hA}E(4BaG1*oTBZR^U05 zRFP#94Q+$$7id^0m~HE4wVnj;UY6F+rhNsuUKh4SwVwf@YLHCNk>Rjl0Q(DI5`E)& zFue?>Nle~}Zty%(_CnEpmdckvzorjGeawyqD`vkAkv zyUH@9W_F`x%6+rjFv{d$4EH#aK2q21*Z`86#(Tjlmi6DkdRG|kDO~rt#-Z5xZQ$B- zSIL1~1vjD7W!0C}-Zl+>1XnY$xD^MEXn{|-8tmQ{Sr6%d9R4&MMg=Z<26F-Xc{ch} zWj8t>pmAl6&n;#d2EHWiLg37O;bC3mIV-VzVKNuQUs9wc6GQ$J%d(2BNr4rcr|>Y3qk2N-5W) zM>BsDSnYvb_F!rj9gu5+4_XJQdFMe($8Qm7yA2*y=66eq1}>-__Q9D``xqq$vBV8~ zSBHdmg|$u#3blH*=V@guR$@}_4C4vDzV4Gf0E;>k92G9Kb$y{vDDGSga|R=qozyv8+n z#*6W?ETUqGyv9FM7QBeh!KIgT0h?QRjeiw6(=y_ebJoameg~Zsd#83;&i5ka412+) zdO5$neq??Af$GQ9=ju_*`4?rOJ~@$chP}pjkyEc@WRz(8BD7(z@gEV|u-Ewe2yNJF z`~hefmLDx2skddM-rqSintiA*^}aDu&fB$y*LaCu&Yf|}`SY10>@#`Pa(XBW<(ve# zg-)XyfS2HaGq)*)4nP}7O2l8}hCKa6MLHI`zgQ|{2!By9NPm$`YS582sn*iagIU(( zGY&zH1M??}(R0N3j6X#+=re9)d0*x;zIkvIpRwobEa{P~R@8=`nJ!WIjCXnQbHqp4kRK-80LFJ}_V#2nGoBhzqn z7wzpIwdFri%MjVK=sf5Mpq#fJV>aR6Tkh_Jl&}29ul&ca{Ktg;4x(r09@qr?uAf*g!ezLD ztC5t*4ZI&2gd2Dg-N19i{v`ds_gT+G{+}ox{vRy__f5>Ny8kCBVlklqr!S=R|By25 z|3NwyK@F>W7%Be+I)1mAiOj^KPWYG?sY8)6;7iK6hd z`bDx;O^)ENa2OHeIE@h{C2|Dsrz|)IgW%H3DW)TMKCGoZC~~Hy#VMzFWH~>F&WRmC zn=I$9NIAofV6k4#&niaN=RH(Eram)9EoVPvp+43~Im3?N>&O}F2=0y0h8@92BD7&g za8raf>U z-%sa`@%?@Q&FTB?hd27AzTaDKkK+67#(|z$(&Om633nbhN=Y$}o$j^W5-mw=ktN!~ zTp$Fg!S%y#m})86s|Mf+AL)Ucl?!3oNqFBwOv9PMM?_Ui1IJ1OecY5Q4ZK|%c*Wix zYEy%^avnI;mVYqX-#VfOh8%$>9f2OIFy7UGmOn{ivxZJBaopJhs6zh#PR&@$x=IUK_~)pb4Gii`HCKDDg>1%0aB z>yB#}a+b~;ft3bcFAcn`&A|C`#Ip*OTH|_F+?zZ2Ca2mMzpAo794-!gn#iZxny33z zJp!72s(X-egim!ch_OD^d}M`7l*p%=C*?%>R67nN^r^lMetTfIUH6f=wU#|ddvR;+ zhlmKDDvdtXne@&!veNPWsYBWoqU>I+9mVOBp74cUKpq|~b>h@iUyB@p<8Y-Or>xF{ z`l0GW!kP!P?_{EIxKd(K5!pX`0~$uQ(q`iH3|ncNKol>HgqEg{^q`&-TBc2L$ksD? zP~Sgk#EQBLvJ!hXwX6(Q)IUL{?p>^+2X!87qurpFv-8@K*XwsQ_f4MevF53`1R51^FvwAo6ttD&#(velL#%+eY86xv|$gbDMB0epstV5 zhCQfjK!XSM>uW~ZCwrvcSB|PT^<_I;7%AuNhzIqS$eDIUoN}JT$y_ZTAnQ#afx`cHj;47&d`US!;<2JXue3|&Q;+?XK~{ij}I?+ou@ zbY$(Nh`=GbPdamq`&0$B>GbezEV@slIz7LBRd=7_Iz4xC^UWklKTl0?aJxiGG99Mk z;8rUXC#6?XQeat@)g*3IALu! zCB!k}UYvH_&<{7ONt|Z!MDax)S-rs%Egr6klfFKjM)5Rj7n43>63zhkAoVy-w0bQ$ zI7Gr39gfqzXOiPnoOivARGiNA{R=8QYpHw-X>0SC7~TZRJ}C7x4!+)o9^ub$ruZxh zexCf$`sveS!oW%vR!@)jPima`tV)jR#;K zfaMh)Zw>Gu5$9cC#pxLcIF>~HElXYnL7a%asULu~@5xl#cjT$zy_U`=PGD$srQ#^8 zpIaFdQ@L4@%B_r=RBmNBQn{5;oNB}U)>Lj~)TMGO!=Ea)GE&=Mdo|o^G~~M78%S8U zlc3+NyNLkIDH_3qd` z4112g-hNBK;q~@_Hu)7@+GI}VY19(0;`{{COzW*U275Dml=b$2_A;`J&}t!wp56N) zHD(Xvfc85iiT9Sq=qFkC<>|{U-VLIW#8fqg?*^T@ff{AA(s5o6;;zF#MbW+5L_$1c z@v*On#$PQj9tZ8A(l#QI%Butd04xMvDX;0GFI>oVy83qK4aq; zE5Y`JmdscM&RDde=Mj6Dv5y$b{0Omk7~96!tBjqElP#@}v6>@@?O|*OV~;atJ&M@F zj6K8H{fu2aB*sv5KYRu$(fyG5IZirYOzmpiLSyv7H}JApA58BfwtqOu9(Yj=e8$%Z zyKcd7ct#t4F6R#MGE#d#%!ikf+WREzmXJM!^i2|S2orD9VNoNHqAK3X)ZX?%P#MTE z3oS^PE#V{y(*eP%0x+n(Dcv3$x>0kwI;B~`u%Dr}ItccSC|l&sHS!Kuo1BiWzx3I8f~ByFZh^$$ zmS8ctgl}BT307?V0tppczL*o3xWyhE1Il(2W#Ak7`^kd2H+2h&RLEsS!@Z>iy_P#> zV-YD0^f<6m;d6y{(IbOFeqelvgR+a%wl@ zD5G(25@UO7Eo+~(7ku2D8W;)k;FkrXLdqoYrqUL-I{;_0{Iwg(xfo#n zU1dWLc}(;W;b7G~&6Vac(enhMTqlSgEeLaTLO%ryLcUHAGm;=!b%K~41;L^d!~`G+ zC;ll)X^Y4>C=ID$W-a*p7P{3E4-o%Z&((QSELa42l)_!>KO*NvI>uIq8#oLL&^wYR@N%pkvc zzyppKPq|+9!IkWOlX2a`$P`@j8JSUQx%~7Y^sCEHe1bl4BJ0?&~ z2>95LcMPZ;CjYLroY;Zq_7mu)d#q~vPF%fKxW_}5&aYu6a|GT52dlf+a_SR^Vw}uM zegZkxK4mW$Y)&r@yb`*Zjn}mnBW4JF2_t4dUt`W0|Lrm-ZFoF_s-$N1?*>h86Mah%|Glf;S~5&d*FodOGBumJvcYr z9-N;kCvp`pKDKkmLfsBaF*63SNct<*>{d zuqVA}`Th<^!6D1{d(!t|=iyLEK8F55ztvuF-140tf%%%QEB^?fXg`07PT(#GX6cR` zSa`SEb3ED4)!l&-0z0%HpU~cBXX==~g$@w^;>BY8!HUS*=r0df$fux%zknP{W+@L+O7yjh|6lJz9 z_8(043cM%`hNrJlGa`xeyXT9^&yB<0=s(-PEOjr?>HDcUkhlr z9|-Z6pv($D5w0otLI(+f14j?Ehfn;2?e!>cmIW^-y{d+H*tf#p4ub=;B z=MWX`A6X`pD7Xf3_2cS;9^DwYgU#=i26l7lE%?OJ@g0aR4up>GYybR&tmVErU5<;A z15dWUm4a0!6(2)QX+M_aKdb#%vi}rXlU0Wi<44;+Pi?yF+OBaA6?QF3Qn!(p7sgkw z_^q_w!Y_2w-FVpEzWWQTzJu*MzUX}J_Wr=`_Tx#-r{bln*lwlXfCuIIxIK#VMP=(! z#I%fF^s+T*dpKJipz`}Jd{1T?qFeYinh7slT#ipeC*j*Aj#a#;7kE<*JgJ?A4;a;g z{r>auYC<|AXR5(GwW}g4ldjH66vM6lUab^mk(|Em`C1!Xm!sOXNYk~&DtbM3I(xNj zFd6z_z5G=BJKh|CP|FXxvE)Rz&+vG__g{CxDE7c%oPgSc1x-q ztjtFzp@Muu3GC7QyHRY{ty$w@iN&%hi+rw!;K3hW6LYm9zas44<(7`!P4NxS!$rqk%Kq$hA>I(-YOc-QXEo~ zc3ZyR&5qm?y2|o{p7b7d3wtHP)i@Q_upb~!aQzpX=moni-x15XF=KtW2Z{!EvKXOM zY2bt-=L37-WqVH;#i76Uf1xJrhlUPln9k|x6j8^Iv2`V9?T&9$25% z0Y;q96AX+ErgwcS9LR+KeNPLj#EtbfBxoyPr%(+kft}E$(xl7!C|!bS9Wrf{D*CVf zPu017d_Cfq3Q|6(nYTzmKrNCzx z?D~Pkt>D5$*$n^IG66EL5FfJQ_#s8@vZ0F`auAb{^Gz@at zgIDW|)>wOBEVJ1I^U`t2Y)g=>H*LW*d=tuM#F@w@z)JQ9?1JgN|K6+(pl$m;C$W=g zg6iF+U0Hk7u6qRoCKgBFJ?-`k)?l|9#OuNoW$IU!&MUEl<|ugA(!p&kN^TRdBCAyw z`!Lj?Jd&lnOCiru(C?qZS&otO#4PuC)?Fg&y;*&L+8SgWI1gPT^t*IjvXQ(O$ztNu z775{xi<+@5$)Q!TBG6T5A07jiP8GT`r44M+wOGa!D8Gp*fj6}ek5OxE@^O}3wQb`K zFp$Z{b-w(S?JK7VI`s4DgL;NyN-eXyCObwV#u{UfM8J9bVnw!1O9@_-BV zGbt!tm-{^_mrERb+XTpsYmZ5^#}FiF*CUH=kDIYmM0<#|L8R&Sm@Q-u+hdY;EiHtK zgVC(&M^KeyC}bw5ne3r<`LnFrYw)ww;H{_!xU*HbwCzKwmQHSS_ojVtsT^cty!LM+ zt3KSK#d4nkvnXc-&Z1)H-8^YoI`}(;=6UpD;Fw1VLjR3hH1{7z;odlcd($Y~!4cg5 zH469I5!`o@zcLA;b1)CHYBuq!vFS!(XEr_%2U`p@j@xpqP~Wftg_u z8Td+dXc3JMw*V_@6{;qqi&)FcWm3H5sN+da1B{JL< zErD|tC3I85U&*l2%%J;_{Y>0QmEw699hXstsp+GAWlrvLj*s${!w|}nH449iB_BjA zqPt%5BxKgk5hcg2>K*)?=|3;_E?KOVl6T=*YG6%Fne=M32aqyiioYg<9?QLm_jk9jDyAS$QpTn#r*Rp^giu@BlbYp9z3VC z`kT_fz*FkBQ&!s)tsgSxcU}B8eHc8!<3aZ$js7Ecyl9Z@zF4Q`zeU!KSu{Nh(fl*xsd3sK!>%#L*>M*ZD&!LawJ^SHC-r! zXNCjXa~#`H13bevYo2EhUR4;J`6#y~wsJ2*yY5pcvTheE8+oF`7LMtGZaQof4vPmm zM^-i-e6t7WqYgju#bbzc70W$i{MSe2oi;M>HzS(eJ~cAncl}lGFRw$p;q+5=pYV4waXS)e z`o9Cp{apTx&L-5Gjh?ABkO7UJE*pIVQjA7VH#PbXA<)$5-=X|I6aFpekEl1uSI_B z!|OEK2R{lm(@eWrr=4FKI6QC;w?-j<;52d!Sa8oAI0^Sj11U(yPl*f=b&*gmk? zgA20l!EfiOIZx^*0(d9kr5608)dB4X?{gZOXB)twJ~o5b*#ism3VX*wic;7+&q}d) zBhsIP^S}J(%=2semETKhK1U5s>rLgG%XkrOhgz_sNi%j=@hG%&`wDcXZGPOuPXulK zDPr1R{w#Le(O>jcp`ADmEW{Gg0)#fc3bu>h&-}9S@SmoaZGT{;p_~=^Z+(l(osRN# z`At${ToIWVW|yt6A)y4)5=BT-yW3 z9R&lH4!)A*K=%*cl3t1tm4lx3F3)M~!Q0R+@S8+<%;k1#!S0rY`LFSPaIAOOf#olC zy}-P9&*Nd(0Hdw6;HaNn#1X*J`diwEqM2@!N3730#710>*^qmoC7GpN?(~6Hdsj0? zLh+DPU83-c7cr)MLHA7$Y>&1?8J?+MmJ4`6du9 zT#Tuva1jo`3M(947gSBM;wRg>E@=fUcjUYai}W1F$p0{1JMB*}0u;ixjr#t-Bk%!q zD~62l#Md#JlhlHN<_|<~Uv9j0hZc*>=b!GxnBZ?kV!R`YSrp5-5p4I^^k}+-Rvq&6 zI}-AW@C&*n5mZD-V~C|we)Ki_|3Xk^Tj#hNs#n#!npWet$gSmzrnTa-T3csZTQ6Fp zSgj7LRavpdj~|ym>7Cd^)>8)}3T}$(p=UkZAIyc8Udv>0Zo6Ent za%r6lzjs~jzI0xbr^YD}@ssems}#~Mzucj7T&ZK8@@iL|t0_KK>ca24x5~7ZBK$sl zox64J#nx$8S;fDIuxwoz?{o0;^VW-UtV>(GD{ipPw*G%EX1UVhuEsCDUw*mx5&v2j z4Ciz;;y2`LL^q6cYs3q5494FtNCdm*>3o72xB1hl?JT1jG5y|1pPFBUzhB_?d0Y)J zNquvJr`iSmz`fy)Dj_OUmaogp&!fN!@%IUIkp`bl@)_kf;vj`#&@==&V)GT0Fh+u-wC@y8)9zg%zLE77~JlD&nT#ct8k<(~SQY$RQ5#VrTJ zwZ74V`$}*CphqgW^uPUppO*LB?9R?%SuI{qjY(LUtI6kfxYppu{ImJD6|5IsBm`bO zQiBWQ(O7VedqwlgOYjr&_!9%1Hze+_;a>jgC@V|KtV%UfMFHBD}x z&w4>!T`OraRO7E72rg%1leZcS-X`DDn&s3Se}y5^rSws3rZ^k$*Dz>5n&|S&BaLM4 zhzZEqBaD4vj@eELWR+u_Rd^S=t6SzadF!)YvNnz zzOfm9uEU8Qf%b?hCJOmqm5CBCkNMrB7fXLD>8zA1xEGd(c=vC^;r)nj_HYZ;v7A=7ma9Yi80}_T;>oZj!og8xJl8=Rg~#SqpV5j z3&CtWeV^TIQwlRO=VVNplVP2ckv%6PuP|fQyo|n#_Oa{7bfw*$dQZxo$s*q}+Me@aySb-Pek+sonbGl0~g9rdDa)Nu&(&(SxBbt}xsZa1{i z^HZNb^i_0$NSKJ2AJ^VE^!1>3$D#iQ^er)T>hL(O&7hwfrANd@g&DT!x`JKQ_b^~O z#-5b~)Qf<6jf0##^z{r9WMDa2ptoYIeVgq%vMmypvkdt*VGN=%6=&qNr`*l55tyGJt?dUNem^48F4S`wcsTaw!{DhOBL7HT z=Vf%KL>Yzo?nS<#1L5#*PC-7~P0{%ZGxFwT^e4BESwGyk$isa9M83uWJkbEA-rp+p zjr3EIuTA9ZO1(Sf9`G=*Px%qQ>tHy%kOb&BFJp5O`xe7QT-0YT(oxMwApJqmyW`Mz zfxaaU{dLecgUe3+69IjMtY`(UiVKJ97iBbK2(*MndA82Yl@k!_c- zpY1}vEhs0}Uay0`IS&0W==aB=k4r^=jYH1@ePbLtzvbKj`k7GIs5k9VA^BtJby9vT zy#w@k`rIe^W9#*Zlpjm~C+O72JbtOqJD}eMI?ZbY()l-I+Tzq}BG#z8eic1G6q6tH z4VWL?6oP(nPjX4dq`Ol}GOS&xB^lZ4)6|T-JIAOQv)ad&X4vX7W}%JI(qi7m?2Ueu zF8X&dCWI}JgYFg;!YMD_(blG4=>on6s7%6bSO9*|jsli5&pselz!gNE!_MAW5b#$Dxb_@fz#>59I@}@xUa{%| zZegCxb9Di2L{2|XQRbpfCn(^N3v>b70F|A%bs9EMVTkDi>~lq63GbRl$~gWLPj}^MPP(=yMkB&u9F#ID8hyJ6_qMn$|78NHBt}Z zls+Y8KI3JQA|ihWvX)KE?Z_GTC__~D%;gq-TfN}?tIf$r3 z$ynSdpGX-I?iDk2DUofsPRCV6Z7I8ea2Wl82>n<}+f3vX)Q%}XVV=oAnCDkSY(QwN3f74 z0NMTmBvQ^!Ae1&l(JupGImd~dh2~?*C(OgY{K!0qiIf3hIW>Sv9d0bAndP+0lrPA( zQzFGoc@fC76w4s{0GA7vz}HSh&tlnKL>|CJgh$g#4=(nOr-`tK-NFb%IORSi<;-b_ zaWDG~l2+sT5hGuPuPpGD1-`Pt|BDvLoMaPfZ#Z3tn|C&{icNmN5~mvVL4- z7>xCY>lH(*#U`LZ-;|-_hTi){>hRwxG|I;d45B`R<8^+#uOM(k54fKKUn|q4nE&5F zNy7Ie zJR;$k(`5M)UMS%V3Fk_gPF?G7YWDfpOtohFT`PT;E-Z1B6qc7br(KqJX{`sl+Bw#2 z{_)@%D{?v_nQ zZx7PMd6<&xUgfN9a@D(?t7?$fz#tTVc-Gxo?QX=5viM8VLWa}T)Pz3@D`Xh)8>*2J z<+ym=7gc;bRx)WFx;ZZ*!lVfq%n?f%7`+Zsa%S&&8l|t~Bx+>wrx% z8uLC_M2NND^`LUjHS!zt>{_{SiM=B5NHrqm82o%l;2dt?#ymbK^KTZV>iSbpLw`wD zZbpPQHS!zl#-G_3wzuZ>&SD7Cob}ZZSXC=GgpqgGQSe>!z`8Z{#x* zg0UX!n69f4Ck)^+=kJ#5LAT5=_Sj7s_~gf6zW$FSQ8h0a~f&T;% zbAH3m*yYwa_`qlmvHf=w5}Dtyf1le14Ey0SKYuyI9AeAAABpDtO1({Iuh#+3kjx>r z{J$a5oPR@uO|Wlh&~vRf8b(JW?I%&C8xeDU9z!sk-7J8@Jw$VeE&n+rva1J>r@g1-H%KMOj z@FI7YOd+;>Q__fN3Tink*%pVMjE%8)^c0+##G|K1o>vr8NWrS2#pNFpd7d$`qn=|G zV||LIrz^&~6HPx!G1il4`pJ>!m1z1Yk>|E(`Z&dy*Q4p<6=S}Rre{Q+_oC?*%&Rst zNyJmQ8W{7YDK$lzpcwO^i3~fOiuuiECW&|oHu{YD%bb{ktwCd6il(22d8W!t67dx5 z#2WL6IWYyhlg9iIO-FAu#=R*aML9z;#7Y{5Tr99<8d)u3DBjK>zxW0nYEieC!)c%`h` zCUBTVgqITVe<1n0WB7SS9Z!CJ0(wURI^WMZ7oL{!exK3L|03zedx3_(@RX1^ zQk3^Ww@Mx}IFf*VG9GZ^>2o&d=VE@a-ccpQlu2RNC*W^NK<`LE|3v~i-w!(#<9blm zH$#>?299VvJ*|R1a^1X8(8nuQDJMzFS(-pjTLStoK&PEIud)dVv!t9yr2Nbpoo>kI z%P`d6I$x(tH%#GsT%_BU>vXUnJoFGw4>c02zM@^vpQ(&we2X^MAEXa2n$x8;)(feo`Umu)pM&>MQF& zr=5-Wdks7PS@QSC@V}Qpe(K4(eX3&gnGHI}QQI9=LeENZR}`=0&x?_NpWsJ-ljGXx zZ-1BkeKGv+N&1Fw*@R@iWP9|QLYC)p54}hJ|X!G z<*s#Al2ZrYO~C&E`BC3~Szmt6%g~d6f4`L979;;%!H;#sZ4>$3;*N6+Nw-$%^h+f@ zeVlH8e%Qxwlel9)5OmQGJvKr4x}=v&{z0csmuf0apbNX%b-K|X?i2jO@5f6q%43q> zcwgM$|5VD~RI1C7!%NA)5Q=B#)d}crpo{)FSC{jQEcl0#-Y4s8%##lZIq+9yy%tLT z=Rv0(jQ7utex*q{RymJ}ce9Wu4FcJYjh$6Of-w(dfgVr)s{|e8#?<#Z&@&+?w*S;7 zkh2bSju)jvFV`3^e@nps66my#a*a*sd9KlrmiY6@X`si`{}Mrm9BEHO%zT3`?PIj> zM$oBeRg9j`NPgRVT_3)y$dHDKmv-pxsuH+yI~jD!>6UWZWI{3MoNx24wF!!NHxn_J zpi3qbXh}f-Iq0-czpR(BukbqPY+rsWDgx$HhT{q3oR0~d{5HvN72Jxl5cGKVTn#$s z?bvp2lKj@wZBl{`{!7ruE15C&|6>CA-I8Bfq02GWqt6oXkB5@+^qeB-D7RXdW3+o^ z0{$Bl(7O`QH%a-MOLh6H6g@mC>9$Eao$o?3JS*sN_7lXXAim~l;!B32qNu}}JRWyN zQSue%Jja4Lg$}3F*Sx}Mcbc<1uPgUEW;vZ6uQ(SHNsPr4J$;1e86zmOMo@T-ewbDAKmF7rUgdcJWqf!P`6i^g$?x+w72W;u(ZTk zGQSwg>YB^AZ1x3n=a!dLI4cV0I7-Mt+ebvyL=${|e4M2?ig zZ_`T3YCK9~6AnXbr6A|j+^M;jeVL${b8rUfaW|E;kh9#MKMM!2o@yuzSu1gOyXx)L zpy%_eC8xj1N*H!9nxJAa)V<7H z%N5PFiK`f`Gsk-V45I~CxN4l$E}y?8nyJz2^RzlqJy#vR#)_?=UcChEI(2IF*G|Tl zLM02!{WJ8>)a)ME-c!P%T~R)&Ft9jR)_WWD-p8JOO^b7(9Ee4AE}svhu(8?ii&e3r z0=4{)IzqGooY&RVmBkpv-Rg;LYbP~m@;hr?p1N2S=3iUxzpUE7rqPXlhTc``yvbAJ zZV&^nBwBQCKBi|m2PQCU{?zhSo?5@VW}&NLH9Deap{G3GsjPJ4Q`LI6x38y8oM)Z=3#d_14J_Y>}ZKmdz z8DH`hdA&{iR*tnT@x<*qa*!2pQ7EdfS8E>UTtdXFIxRQqF zBPZTDS%G;lrl&S{_nsDc=Zo*9^fy-n_z5%}dRWB&ALTb0l#`MOasI$;ltfL7NE zPfLFOOvE{#IyqrsnACb<8!Y8`9m$!WJ1tV%1lpTT!(L_#{utv7ci}{GB1VYRUl;o7^kBo= zg4f~01PP`Dy{g=84XoHahLbCs*1rp|3lvh)n-uSKdh6N4FF zf7j?fkKV1O3h&qlPfdJ4Ek!iJjs>8wMVdH+~jt)c$)mpE-a35`ckZ*sb)bX@!SQepQy0>xV;q52&|Rv z)p&J(57y$k9M30WFUX&!J5Q3^4!1bZSyDd3S$1vtG^eqW>wau*fdW6M-rEv8oyj#K z(#wjc>NXmow~?SXlQ25g0DK5RA zkGK}JO!S~Yg+|mCa}yU$^N&`P)I&@8lLgMz?lsP8)Yy;lg6y6qU&+E4N8PZ~RN;3! zn;R1K?F7@()O$H&h#wmhlV%1A7b59&&)yl)whw3TIR+ zV#shj;voY*XpNoDm=BMhK=5+u%1G~= znlI+G$n%gB)vCplo)FI^OMeXILyW7g&RZR)GwDk|x@Ni4jUTyK0}rGTecRjQTIr6l z24+dYGV+nmEnZv2qeyG3vk|Wad-0;L2eMl7Mw!=Gd9dA#bsPFN+*BWBBU2sY{>THL zOGk_Z#kr{ACYTi7jIX(#6B2fLrsd{Q7?@!JSDibK*E#y5g?a6+6{5V;@Jv-Q@_D}8 vH{ExWs}Y(RE}(qY#|&BBXnFw2H$DD~As6YveLgd1H)kQCz2DpZ z{<;e}GxN+d&ph+Y%ri63%$c(wKX`3Fr_&Mt^>bY9V5saop8(0H!%-dX!SOkA9H%*a zjuDPwj{d+(!(SZFXZhl8mz6B;rURG16#S*)FQ*?vbbWLZ?l2K@AP4!2=T4XT_56I6 zSGqY5NX)qFaJWT0q2zVdLo$BVLsJDj?q-k~{OVlNji)1fOxI$1|tU5CYg+>Muy z-;q&zyGY%*xrdb1$8nbLFL1j=rp>>axp4xk;b6 z*G;-vuoRbL214X{2>w_U#xGy6@2P_+u30y|d+^-%4S!YDz0;2{?h5>o2Fs;Sb(KwR z4mb%LgTJfr*ShfZ9Z!|Nw&~GX-K}4_uK9Unif`YCw?F32%zr01Wa*$h$BeY!{(M;V zs{6Hj{s{D5e|LbHGkb~I-v^xa*&F_uXq3Id$MgYDL&18(Z|fsp%G2EopCkH!@9u-n z<9)!Leen5dANVVgZ*Tm&`=Ar)qr4CHLI3tX=p60?e^eiG(E6Y=s}J}MebAZTM|rR6 zqdlbe0YA`(94_sHpP%)C|9l_t;eEjUebC?DN4XC50dGUc?5*CP?xS8R`;e#BhkWMr z!RMd)$aila@DKao|GYl(?cYbfoBP0jq>p_6)Q22C?W0~k>4VNaec&s7;Gf$E|4rck z0>^h9(TAr(A`VBfcsd-T!6)Iq`egX|pig-FLJ6<4@FNzy=>+_ppg$P+bqx~VZQ*xY z_+?hUg%pS2dw&+dbSsp9U+noz}@yqQyLYAR|R zrCL!z>9mSD7PzP&Z)Vl(ilV7^&8(1dy~mVRhi1&Fm^!WWo{IZR%i#+F{kBPyYepl7 z>g=pi60Hf%sk%S^riqiMYUTN0rhM+y((2kd6{Yu9&I#2{oyimvCx@;m58Yo~0hH`f zNOoW4w2IlKm9r~D`S%Kvm7}XGD((@1$)W5qrKQNZ>b}yukonY^GpouaR@D{LXV%ut zh@)L;M=PIN6CxIp16~ETDyGgt7Bv-fLRvYX+2u2)&M6JenOYgD0U!A{0XFKcsWp}5 zacr%qv?!}IfAW>3g%c-_Diy2~Y0lKy)2e2ntoK%ySBwGsf^ifXk`?8hQz6(Dx#vRe zvnpppR+8rv)8``n-4&sGr_QvB9?Ge#szFI>Dn@G%NFX~7zY^u1Ikr2)}Z&c0g; zus6wxn$8C^lmO*Zs-XZkR9DQNRW*$*r0AAOXdIBt+^Kg}-kZ(pEN4qBWfOq#rdP!q z%3WxYvrEgThRSCM9%Re9JganaX~nGS(EX)zDyq@4tL99-yMk%%o;$a+x?)aE)$FM= zD-nHfmX)mLzNyuyQB(+W2Txbni*i@(^uEi16q7@v%d2WbC#OXV>LV?fxo!4+vqX}l z!d{+TT6*uS%3cbLj#I_Tx0>WMw!o?)bXY|6w1L3oR?Sq6s;&*?qfSK&tC&44A*P}t z6!3pkSG}-_`l;!a%gG^#-|BudD`wvvno(LYXHM0eMEgo^u4o2qNz-N)-s^y3nk9A8 z%&NO*GI)1+d1(zn*^bhiXWv(eQruKgQ#-4Ik>wJ%x~isfZt1LwS*X&xXFE`8b}K3_ z=(FilD`z^Y(H=w7ElHqb&8-YMYAWv*Eu^L*DX+fYfzB1GoK;aZecIIfi8i%7 zR9Q9Kao5!Hd(ipID~LX;>fVYTNNLUev+k;z$!y7%rAlW_t(@(cKBuC>QCU-6JG(sO zxGpcRbkt>8j_ZQjguK$rFT4D*D-!v*D zyTyO;c?scM+r@wJc>v+#;y}3Z`3m7z+Tihd3E??5czk|9_|-Oee7-_>t__}1C(AVe zFl!1TV%;`41ey3{+Td(W@n4n=j%rN&a%^zs9sl`kaQix5wZX|#{8wm$+vQ(ugP$Hp zhFfNXqah}KGi>ld2`KD6HuxDf_*@(OJ2rTo4X)VWi)?VV+xV~11|J*;!d+^E+t(RQ zHuzaK{AX0vL;KObBoi_OSHh7l}KHdg*So3wZ5!wXezjPbi9S6d7+29x0;2Adfg*Ld`2LCr3 zJktjE*x*?<`1fq^92@-KZE&9ro@s-tHn`UYFSNlgw!w>S@R2rnnGJr44L-vLztje= zw!yEl!ROlGm)YQTHu(2#@I^K_^?3Z(XoF|RfpC}F;FsIrO*S}f9r52YHu&f`5Uv{j zGF>&&&i=s#4z(c~N;4l9z>Vn}Y)J5SU(pXJ-4~_esf_T!$M6gy#oD{^yXZ(I!c>K^ zHWA*>FjZhID#BkdOw|`#DZ(E!OqCaF65;n5rmBlIitrAGsp4XFBD|GhHrrUW2(M?D zDlJwf!fP1jU>qwH;g=YuYK!?q_&J8D(qdU6{40j3%3^L2{wc#$VKJ8oKgKXsSIi;8 z|G_X-R;=?l02e*XFjZBoU4$QCm?|pPCc<+VrfP~sMfe8{QzgY#itt?w)4UmL65-nz zrV5HRittSgQ}x8^MEH7!&tbS)geNde6%;EI;j0*?>WLMK@Z}6s<-~j~=?qh4#5%ua`TH^KX1HC1kIX=rDk9b^NH|t4701pvPAe-46}>J+#>u_hS{}aE)jl=VRqe^Lxlf>VRqSA z=P^&pBI7b-+%OsE28IJf3=ok8?27Yk{se-Ql6Z)@wWK`^ zhre}#lT69URK`h8ro*dbrd3_+bSQ(7z?Z?U3|DmV7N47mk=d2NlbN~V#lAh}MQ*CT zK{du7nsb4p<8mR`EJ(|A#PF4R{4S(8MSfsT?I|F`j+*~J|mcn5^hxrH)znQL#2w;EeT{NAW)l1vp zsNt^fsQPF3^}A!kDp4RP@^9`~$EfahWkeles~C#oH+Q7~U)9&E&0k!jI@{FkUA0KO zMkd~Y#HzkorvKPVUpM|q^mj+?;G2=soDV79u{rHW06D+j!1kkt$G1)eLg@Si3qx*R z*NI&);CHv(5ql6xlo5_tjdXAJ-|D}`f3v@6vbylgRZ#QVT14=7jsB|VON;}m{<5c? zZo~>lWZ3khK<46VVxV$HsmA1VRex9Y9?H-DRMo##o4@VHM&hmaM47y$-qQw`zfeXn z_ki-qPB#b~g)B9FqeUR7KP|B7wgOv=q%K!=nNs!cSM|5m=A->W=|TN(=0``6GLpKC z@x&#A&%j-qiY(T!F`JLh!sBoi=;$q)u^?R=c}?~nRX<817H^GA3ErCE@)sH$%>7z< z#P3GRQt+ngn^b+dN1(x7O7uwJDHK|!(Tp*gacjDrIaS|l2EbebPbOOK@qsfH;uG?S zED_wQk;NAAz2*pHx{jUF{ETJOThvufgjf_!AE2&c&t%~={kn9~|LQ#}0aFHp6}YOX za)+by8Zs9p1O;nlD*OoJZouYxPdh2dQT1nqO7R*jDrj896-_RU91d2wY<~JybH>v-m{ds3L>uxzgc*Z!x6M720^i! zT$C>pB(t}u4ZEx|))5W@jTV8>#j3tjZEo+cMuzy9Q77_VTL;o+!69_vEe%ms2`m<1 zRbT88=_9GPizLog7K)_kE`ocoSy38}V?;(4bFD0bs3nS;)X6t%jqC;W{pPdR(OvFQ z3Gap7V!}ad23-D5!S2rw_QI}6pUf^vk=-)5g54V=yMV)I3R=oZ){1xKQhrcZRx$);xyw2|R>cZwI@WwWh>b#d(Xg4{D z7y4jN9c2-YLi;R^PEqJ*51`NoMIF6t)zQlykv>uAP8OD==;pxn9o&pcnu2MRss}ti zWRz)TWGoTwrD4bX^6V%It?K)xPq&S!|L^6uD0fFKG32(*dr{Rx9+h(FLZ?*A-?v(5 zI#~r%85UD$g1b&3f&c!dmueR@5)u%tl;kJ@7hF;8#h6zj8;6w*8EF%YoZM;J2?uT` zT>ehMPDXF+i1f+qkQCW5;R<%PWC(V+r^H`RRTPV=_+Pfa-sH~`KSMSWqF==j%Gqi$ zaiZv>$qM3hnCA>zd#*-$F%ku+>XEg%-tN zWOOvB?^Bx(r)ukRAN?eU|AWek!)l~HT8&{`UHxMT{6szUk*dF=Ht!jrc5h_6>1 zSq^2$enxWk)hA_NmYjXH$bJU0pW70yV}AGv0fbpQYD;*j0Ll8e^&~NrkdGZgnJ%%E z>Ej|{Buq`O>W|Zz7#ReaK;q8rs&0^?8VOP?0@N`=mDtK)k*U`Fw^WfrqM~|?Wuo1y z2F6-JHC;}<*CO}*%Ec-8o0z&^nbHbRUOGI@gbb39!9h<}_AYDw%8^QRVDv3^CAIvS zE>djR<6j5Y5z10^Gu~Cim>w^(`NO^4-3`$odBAwTir7IVzl*aoGNtJs_z$*VlsE&6 z`JnN#$i^RDOY)BS{)v&9EbwQkYRYmCJ3MBoLH+0&DW%=2{*~E?()hbKstY&y5U(!W zz_|Reza@ovef(C=iEg6nWJ7)2zX5 zI|jFZ()gAb*v86P+`Qkbk%w1;Jr1!soB>hJLCk>W3UTeBJ`d`jtmd4QwNghZSremx z{)M>`Rt!psLy|QUQ63$Ov1(!@_&X2^yzXKPYGg7UfU!x! zq7oL$E(C0|gt7FG_wpf=Py5h*rAZ3N02a1&WXC44L3?*MM6O$h?D0a1T}Yp2RZWI&nnw5JI; z@a)~6ue5yz&k_%%nXgRgB;+soO7WioUFNBi(8Gl82K4=a;$1d~jZzIaXQ|=MS?a>W z?Lbl*-l55%{B<%d;v<7JD7XH~$kfw?u&}UIMg~rIG2pTSZU)>|Ad7)4E8t_mX9Wrw zD6|4)43t@cY6hxBp#F3+%W$0)W|0_fw8BkRxXB7rQ0VSZHc|M-E~S!D7Jmy{N5@&V z{t)jlR5ildF|h+BHG&?WIx@(q=>7uzn5uuM)c=aw6pC7OtLDS~)m6_wCx5E4qE$6! zdUCR(jhxd^O&O_wh{6(qnG8EORytg~&4X9d-@+vq&oxXJ^!Lry;iN3n1sU-L z25^>*qGpqGuuPdtq+~OfNug#wE#;YsC8LOcSxPbURUtsMW+^;)utWm}JZK5hv&EYF+ z>3}rP*gX{XwnzVpkQNEhfle6 z2LeS`v?H*6y0Ui{LM2x;BJ>_YpCUBviYP)KA+!gfnOAfo6hr7BLZK^~5Zb5Qib+D- zyerxeILyqL7qrB!%@9^#3?v#H1CbVuflN!rK&aEkL>2GMF>Q)BG^Sng&KuLIcvHuy zMkbe}n_1OkpOF1!JZdyZ^V12Vj##D|i$!P1-eK=gk1+TsRGu3O8Bt)Q4*KdTGj079YSkQ=oq%hm@{QySrDTBSAU6>M7*x43j!e;y9_>g{?CT zKImY@fMAf=NdyE1BEm$ZYLe4A%q|cX3m7p8FGDCu3$m4J23@2wi3Q6e<4LXBf_Kuz zsKhXTlEYiTAxAJ(&0Q|+K`O_fztMQ80x_t6MT;P&t;I_H(_$Pf!DzPyc5dq0Vk5P| z8tjN|4R%3zHT_$Rpql;-Mm_T*Z1Q1X!?+jJ_iBmJGhfN$TE)k=Bc}UZnLRtruy%Nb5yfFVcF?Q@fivp{Jov z)!S4r7I0ntHDv_`K{5Ji3pYo>rkV>h*3rY$*?;sRk5AK&W2_8!rHVCFe66ABo0P?m z!BWEpnZf!*gM0?{wO?_i-G-yaX2VQa%H83qjEQh<#i!)L0- zQWp+C3q!}BAe_1fa~z?x|H#YhIG4Lc;g5)&0?e$nOb%Fgo3gf3P&J?UgbcQrPl2YH z^8@CL#>$CP_8zW`$P~G)W|1Sygz;7E2VuAlqD+`Iz4Sxu)^A$)tqGKQrulWHMWhp% zN!EWt*11z|_Lr<*(+lhU!8(c^@MK{%omQbZ5sJHm0X?Bu%iB*?thLMs#oCO*OCEkn z9=Q8%K1_k2NUEsC-yoK7oN}cT)s?Fz~7%)naZ0 zmr??+Bp9dz45F4xsQsdAqnhKwzq463jrUo;-lZ}3WM+n)ika_Q%!~oaAZ9CFXySfr z{-!)So(&&Rn#N%zf<=QS;&m$_driy%5%1vQ8Nb9HGHSDv6G|X+ zNv_lenI*Y()M4W#LdoLs5}{o$f9#WTV)zX-jI7_*MEy2>C|fwitfGOnVdgCB zv_EU9_d0z6$R{)~^@CG1u-gTx7PB0gnO{{PCyZuP7mbtrsLoeCScM1Q4wnC7w)dZkGTDRwR#0CMmFjIWl;)6)cm%?~CB89$^3!Squk+256X9 z|7Mo`m3+S{tY0$0aSI|wXOZAb3nF$S1mt}SB6es5q}773ok==>v>9xl@UR8~gDe84NkkP^y-sB22%W+5(QDohlpv}&GrqeT z#=`A6Z)p-=smE2B@qY~KyA z8;FSp`0ywxbE^TO?X@F1i80l9&}xU9n9_LAYKDK3p)y%9&x+71J&kZF0r7g?^&V5& z8{z!|-l?gujIO7zP^H43Daj2hoeRnZNrG3p!^tG5pUsAcm^^Sr@|j*;@)4qDuWh)F*cz(}P9<=A$EDsu`)C2}aTC zV~8kPb!>t@WR+(02V|WM(lK0~-xA0zsjJv@i52&Dw-n^IC=ZWE_bbqwsRh%~GDM3s z48H7`5briN%%RjCb+D5LjfpDdS)bx`SPg6u8Yfc(BhR~;&X~-AT7Bp;8>i-KK&2VMI zy4$LT+q;n9ZKeLFkV;VBriMT7QX})RZMruF=cl?`LL*dc;f6nQ)((ZX*#YFV$3Y$b zUGTSd4E_J9_63HX7R()kz!K2w9a+va=r zkyT&}C@_Y2G~*74_&e($X{;ix{m>^5jeEhbk9)=#@`7JkG2}UY$n$#Yv&ilRWE{+W zbIylqcw>fbG9%8T?KVe?IqY8ZjXx)k4?M=V@+>qDjtQJLMv6S?Ya@jorGdVatLSxOi^@&}`a)&5d8E`i72qc$}1XXnGRu zoW5v(kBM0ha{)@!feqsp^8kAU+&yr6vOZhb4Vd*s$eM+EiZX!v1YEIRm*Xi;KZd__ z`SrK_G{JuZ;ZZNBdWy9@&C_Umgi)*Kd;|^xiJfZe6dDwSu&$e1+Y%=Of>0Xbctl_p zww`fbO&m#Zx~w%1&PqMkSv6?55zV61U68wSQ_GzisrMQ9K)h~ZNJ_P!;EiUC3ZK9qpE1dTTZ;K3P^ z;yM{Bl%W@8C`*QZEkk1d+5h&~5(IDGFuk$R{3*(9K7p)l^(oG?hQG|jHWo~LEdfsk za&*9jP6YeqXIET(0S^GE4LBzU?Kh3Ri3eBEtlY91Q;-3MGafjY=5ZG&fn!G6_mK(% z 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 literal 0 HcmV?d00001 diff --git a/configure b/configure index ee90f6bc..f6bc2da7 100755 --- a/configure +++ b/configure @@ -2309,7 +2309,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -am__api_version='1.15' +am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -2510,8 +2510,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# Expand $ac_aux_dir to an absolute path. -am_aux_dir=`cd "$ac_aux_dir" && pwd` +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2530,7 +2530,7 @@ else $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh+set}" != xset; then +if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2858,8 +2858,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # mkdir_p='$(MKDIR_P)' -# We need awk for the "check" target (and possibly the TAP driver). The -# system "awk" is bad on some platforms. +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' @@ -2918,7 +2918,6 @@ END fi - ac_config_headers="$ac_config_headers lib/Grid_config.h" diff --git a/lib/Grid_config.h b/lib/Grid_config.h new file mode 100644 index 00000000..e1674850 --- /dev/null +++ b/lib/Grid_config.h @@ -0,0 +1,121 @@ +/* lib/Grid_config.h. Generated from Grid_config.h.in by configure. */ +/* lib/Grid_config.h.in. Generated from configure.ac by autoheader. */ + +/* AVX */ +/* #undef AVX1 */ + +/* AVX2 */ +/* #undef AVX2 */ + +/* AVX512 */ +/* #undef AVX512 */ + +/* GRID_COMMS_MPI */ +/* #undef GRID_COMMS_MPI */ + +/* GRID_COMMS_NONE */ +#define GRID_COMMS_NONE 1 + +/* Define to 1 if you have the declaration of `be64toh', and to 0 if you + don't. */ +#define HAVE_DECL_BE64TOH 1 + +/* Define to 1 if you have the declaration of `ntohll', and to 0 if you don't. + */ +#define HAVE_DECL_NTOHLL 0 + +/* Define to 1 if you have the header file. */ +#define HAVE_ENDIAN_H 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_GMP_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MALLOC_MALLOC_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MM_MALLOC_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Name of package */ +#define PACKAGE "grid" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "paboyle@ph.ed.ac.uk" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "Grid" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "Grid 1.0" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "grid" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.0" + +/* SSE4 */ +#define SSE4 1 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "1.0" + +/* Define for Solaris 2.5.1 so the uint32_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +/* #undef _UINT32_T */ + +/* Define for Solaris 2.5.1 so the uint64_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +/* #undef _UINT64_T */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +/* #undef uint32_t */ + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +/* #undef uint64_t */ diff --git a/lib/algorithms/approx/.dirstamp b/lib/algorithms/approx/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/lib/algorithms/approx/Zolotarev.cc b/lib/algorithms/approx/Zolotarev.cc index dea7a439..7629bbde 100755 --- a/lib/algorithms/approx/Zolotarev.cc +++ b/lib/algorithms/approx/Zolotarev.cc @@ -1,5 +1,5 @@ /* -*- Mode: C; comment-column: 22; fill-column: 79; compile-command: "gcc -o zolotarev zolotarev.c -ansi -pedantic -lm -DTEST"; -*- */ -#define VERSION Source Time-stamp: <19-OCT-2004 09:33:22.00 adk@MISSCONTRARY> +#define VERSION Source Time-stamp: <2015-05-18 16:32:08 neo> /* These C routines evalute the optimal rational approximation to the signum * function for epsilon < |x| < 1 using Zolotarev's theorem. @@ -26,13 +26,13 @@ #define INTERNAL_PRECISION double #endif -#include "zolotarev.h" +#include "Zolotarev.h" #define ZOLOTAREV_INTERNAL #undef ZOLOTAREV_DATA #define ZOLOTAREV_DATA izd #undef ZPRECISION #define ZPRECISION INTERNAL_PRECISION -#include "zolotarev.h" +#include "Zolotarev.h" #undef ZOLOTAREV_INTERNAL /* The ANSI standard appears not to know what pi is */ diff --git a/lib/algorithms/approx/zolotarev.h b/lib/algorithms/approx/Zolotarev.h similarity index 100% rename from lib/algorithms/approx/zolotarev.h rename to lib/algorithms/approx/Zolotarev.h diff --git a/lib/communicator/.dirstamp b/lib/communicator/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/lib/qcd/.dirstamp b/lib/qcd/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/lib/simd/Grid_vComplexD.h b/lib/simd/Grid_vComplexD.h index f0bc2da4..41c8509f 100644 --- a/lib/simd/Grid_vComplexD.h +++ b/lib/simd/Grid_vComplexD.h @@ -345,6 +345,9 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ // REDUCE FIXME must be a cleaner implementation friend inline ComplexD Reduce(const vComplexD & in) { +#if defined SSE4 + return ComplexD(in.v[0], in.v[1]); // inefficient +#endif #if defined (AVX1) || defined(AVX2) // return std::complex(_mm256_mask_reduce_add_pd(0x55, in.v),_mm256_mask_reduce_add_pd(0xAA, in.v)); __attribute__ ((aligned(32))) double c_[4]; diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index ac15d19f..8a892d24 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -219,7 +219,7 @@ namespace Grid { ret.v = _mm256_set_ps(b,a,b,a,b,a,b,a); #endif #ifdef SSE4 - ret.v = _mm_set_ps(a,b,a,b); + ret.v = _mm_set_ps(b,a,b,a); #endif #ifdef AVX512 ret.v = _mm512_set_ps(b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a); @@ -354,9 +354,7 @@ namespace Grid { #endif #ifdef SSE4 - cvec tmp; - tmp = _mm_addsub_ps(ret.v,_mm_shuffle_ps(in.v,in.v,_MM_SHUFFLE(2,3,0,1))); // ymm1 <- br,bi - ret.v=_mm_shuffle_ps(tmp,tmp,_MM_SHUFFLE(2,3,0,1)); + ret.v = _mm_xor_ps(_mm_addsub_ps(ret.v,in.v), _mm_set1_ps(-0.f)); #endif #ifdef AVX512 ret.v = _mm512_mask_sub_ps(in.v,0xaaaa,ret.v,in.v); // Zero out 0+real 0-imag diff --git a/lib/simd/Grid_vector_types.h b/lib/simd/Grid_vector_types.h new file mode 100644 index 00000000..14b2ddf0 --- /dev/null +++ b/lib/simd/Grid_vector_types.h @@ -0,0 +1,299 @@ +#ifndef GRID_VECTOR_TYPES +#define GRID_VECTOR_TYPES + + +namespace Grid { + + // To take the floating point type of real/complex type + template + struct RealPart { + typedef T type; + }; + template + struct RealPart< std::complex >{ + typedef T type; + }; + //////////////////////////////////////////////////////// + + // Check for complexity with type traits + template + struct is_complex : std::false_type {}; + template < typename T > + struct is_complex< std::complex >: std::true_type {}; + //////////////////////////////////////////////////////// + + + // Define the operation templates functors + template < class SIMD, class Operation > + SIMD binary(SIMD src_1, SIMD src_2, Operation op){ + return op(src_1, src_2); + } + + template < class SIMD, class Operation > + SIMD unary(SIMD src, Operation op){ + return op(src); + } + /////////////////////////////////////////////// + + /* + @brief Grid_simd class for the SIMD vector type operations + + */ + template < class Scalar_type, class Vector_type > + class Grid_simd { + + public: + typedef typename RealPart < Scalar_type >::type Real; + Vector_type v; + + + static inline int Nsimd(void) { return sizeof(Vector_type)/sizeof(Scalar_type);} + + // Constructors + Grid_simd & operator = ( Zero & z){ + vzero(*this); + return (*this); + } + Grid_simd(){}; + + + //Enable if complex type + template < class S = Scalar_type > + Grid_simd(typename std::enable_if< is_complex < S >::value, S>::type a){ + vsplat(*this,a); + }; + + + Grid_simd(Real a){ + vsplat(*this,Scalar_type(a)); + }; + + + + + /////////////////////////////////////////////// + // mac, mult, sub, add, adj + // Should do an AVX2 version with mac. + /////////////////////////////////////////////// + friend inline void mac (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ a,const Grid_simd *__restrict__ x){ *y = (*a)*(*x)+(*y); }; + friend inline void mult(Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) * (*r); } + friend inline void sub (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) - (*r); } + friend inline void add (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) + (*r); } + friend inline Grid_simd adj(const Grid_simd &in){ return conj(in); } + + ////////////////////////////////// + // Initialise to 1,0,i + ////////////////////////////////// + // if not complex overload here + friend inline void vone(Grid_simd &ret) { vsplat(ret,1.0); } + friend inline void vzero(Grid_simd &ret) { vsplat(ret,0.0); } + + // overload for complex type + template < class S = Scalar_type,typename std::enable_if < is_complex < S >::value, int >::type = 0 > + friend inline void vone(Grid_simd &ret) { vsplat(ret,1.0,0.0); } + template < class S = Scalar_type,typename std::enable_if < is_complex < S >::value, int >::type = 0 > + friend inline void vzero(Grid_simd &ret) { vsplat(ret,0.0,0.0); } + + // For integral type + template < class S = Scalar_type,typename std::enable_if < std::is_integral < S >::value, int >::type = 0 > + friend inline void vone(Grid_simd &ret) { vsplat(ret,1); } + template < class S = Scalar_type,typename std::enable_if < std::is_integral < S >::value, int >::type = 0 > + friend inline void vzero(Grid_simd &ret) { vsplat(ret,0); } + + + + // do not compile if real or integer, send an error message from the compiler + template < class S = Scalar_type,typename std::enable_if < is_complex < S >::value, int >::type = 0 > + friend inline void vcomplex_i(Grid_simd &ret){ vsplat(ret,0.0,1.0);} + + + + + //////////////////////////////////// + // Arithmetic operator overloads +,-,* + //////////////////////////////////// + friend inline Grid_simd operator + (Grid_simd a, Grid_simd b) + { + vComplexF ret; + // FIXME call the binary op + return ret; + }; + + friend inline Grid_simd operator - (Grid_simd a, Grid_simd b) + { + vComplexF ret; + // FIXME call the binary op + return ret; + }; + + friend inline Grid_simd operator * (Grid_simd a, Grid_simd b) + { + vComplexF ret; + // FIXME call the binary op + return ret; + }; + + + //////////////////////////////////////////////////////////////////////// + // FIXME: gonna remove these load/store, get, set, prefetch + //////////////////////////////////////////////////////////////////////// + friend inline void vset(Grid_simd &ret, Scalar_type *a){ + // FIXME set + } + + /////////////////////// + // Splat + /////////////////////// + // overload if complex + template < class S = Scalar_type > + friend inline void vsplat(Grid_simd &ret, typename std::enable_if< is_complex < S >::value, S>::type c){ + Real a= real(c); + Real b= imag(c); + vsplat(ret,a,b); + } + + // this only for the complex version + template < class S = Scalar_type, typename std::enable_if < is_complex < S >::value, int >::type = 0 > + friend inline void vsplat(Grid_simd &ret,Real a, Real b){ + // FIXME add operator + } + + //if real fill with a, if complex fill with a in the real part + friend inline void vsplat(Grid_simd &ret,Real a){ + // FIXME add operator + } + + + + friend inline void vstore(const Grid_simd &ret, Scalar_type *a){ + //FIXME + } + friend inline void vprefetch(const Grid_simd &v) + { + _mm_prefetch((const char*)&v.v,_MM_HINT_T0); + } + + + + friend inline Scalar_type Reduce(const Grid_simd & in) + { + // FIXME add operator + } + + friend inline Grid_simd operator * (const Scalar_type &a, Grid_simd b){ + Grid_simd va; + vsplat(va,a); + return va*b; + } + friend inline Grid_simd operator * (Grid_simd b,const Scalar_type &a){ + return a*b; + } + + /////////////////////// + // Conjugate + /////////////////////// + + friend inline Grid_simd conj(const Grid_simd &in){ + Grid_simd ret ; vzero(ret); + // FIXME add operator + return ret; + } + friend inline Grid_simd timesMinusI(const Grid_simd &in){ + Grid_simd ret; + vzero(ret); + // FIXME add operator + return ret; + } + friend inline Grid_simd timesI(const Grid_simd &in){ + Grid_simd ret; vzero(ret); + // FIXME add operator + return ret; + } + + // Unary negation + friend inline Grid_simd operator -(const Grid_simd &r) { + vComplexF ret; + vzero(ret); + ret = ret - r; + return ret; + } + // *=,+=,-= operators + inline Grid_simd &operator *=(const Grid_simd &r) { + *this = (*this)*r; + return *this; + } + inline Grid_simd &operator +=(const Grid_simd &r) { + *this = *this+r; + return *this; + } + inline Grid_simd &operator -=(const Grid_simd &r) { + *this = *this-r; + return *this; + } + + + + friend inline void permute(Grid_simd &y,Grid_simd b,int perm) + { + Gpermute(y,b,perm); + } + friend inline void merge(Grid_simd &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(const Grid_simd &y,std::vector &extracted) + { + Gextract(y,extracted); + } + friend inline void merge(Grid_simd &y,std::vector &extracted) + { + Gmerge(y,extracted); + } + friend inline void extract(const Grid_simd &y,std::vector &extracted) + { + Gextract(y,extracted); + } + + + };// end of Grid_simd class definition + + + + + + + template + inline Grid_simd< scalar_type, vector_type> innerProduct(const Grid_simd< scalar_type, vector_type> & l, const Grid_simd< scalar_type, vector_type> & r) + { + return conj(l)*r; + } + + template + inline void zeroit(Grid_simd< scalar_type, vector_type> &z){ vzero(z);} + + + template + inline Grid_simd< scalar_type, vector_type> outerProduct(const Grid_simd< scalar_type, vector_type> &l, const Grid_simd< scalar_type, vector_type>& r) + { + return l*r; + } + + + template + inline Grid_simd< scalar_type, vector_type> trace(const Grid_simd< scalar_type, vector_type> &arg){ + return arg; + } + + + // Define available types (now change names to avoid clashing) + typedef __m128 SIMD_type;// decided at compilation time + typedef Grid_simd< float , SIMD_type > MyRealF; + typedef Grid_simd< double , SIMD_type > MyRealD; + typedef Grid_simd< std::complex< float > , SIMD_type > MyComplexF; + typedef Grid_simd< std::complex< double >, SIMD_type > MyComplexD; + + + +} + +#endif diff --git a/lib/stamp-h1 b/lib/stamp-h1 new file mode 100644 index 00000000..753f890f --- /dev/null +++ b/lib/stamp-h1 @@ -0,0 +1 @@ +timestamp for lib/Grid_config.h diff --git a/lib/stencil/.dirstamp b/lib/stencil/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/tests/Grid_cshift b/tests/Grid_cshift new file mode 100755 index 0000000000000000000000000000000000000000..54d76474cbf499d5a7c8eede1e31c62f6efade12 GIT binary patch literal 60539 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%0DcgI}@@nR8-=QqOpw4UT*2w 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 K^X>v{@%=w@XkmT; literal 0 HcmV?d00001 diff --git a/tests/Grid_nersc_io b/tests/Grid_nersc_io new file mode 100755 index 0000000000000000000000000000000000000000..2ab855983b08f387e5ff7915f0292c972ce6a088 GIT binary patch literal 97496 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 bzV*028A}I=cV$9aEml3r*NBRkttkH&hjv>s literal 0 HcmV?d00001 diff --git a/tests/Grid_rng b/tests/Grid_rng new file mode 100755 index 0000000000000000000000000000000000000000..039db0665ed14e8079e9c886f88661c6e82127bb GIT binary patch literal 60784 zcmeFa4R{pQ^*=s&gQ&nPh!_=h)zv0~m-gqnW_*gKG`iu=3P-Lo)oC0Wh%!gZsl}k ztTF_YB>dbWgwTAlV6PNy!DPvo0GNnhX1qzrjCYF%3yw9(NWr`;4GEcE-{qE%CQSLG ziCR!moPxl3)V1SLfdUqb2MY>iK*@BN;Z{7V$9TOmUayR2K}G6sK`VdE8-E2dydd5U zjJTUX$r1NHNM2s~ANtGqyyj;D1$2uC3+7097PR910P(2jzk6BPoGsHE%r1T9V@kHl z;ryz~c^6GOzpCuKs>U*52xv%<0uNs!ER3!c3H)CtpFZN#dSFjIw-3Vny4G@xo zN;VLE1u`-aeG3#Gh@Lr!oNET5Cn3WF$vHTPp0u-b0R2xNgq}1=y6Xm!|Gh!@j~#@* z4(Sf0|BONSR}GTx?St^2J_vpMAmuV~5IfWiBIjp=&@UfE&aH#wchMmFd_73{emn?$ z&LH{(2jTzqAoNoQp)VLj{;omtb!ZU!w}aIG9fOo_0OVT^d=FiD6dHRni&4kppOK9(_c(}r{o_io0GAYOTWU(MPz{l&?_|ea#r?_$NyY7|xC^Fq98FUfo!Y`fV?qlW?`muU{ zS?RcO?7J>fii#F2tf?-l_m|Z9i;9$@?=LEvUA~~Q-d|pqT~$(FUtX^ic?-g_YH?j;UpAj4Z@hQ0`w;QYAC% z&#bJeN8akoCwXCloD7S85pr5mRURSKXJ_Q*Usf71E-hJqacRxM+LF3*h6vlmrbi9u zLq%z(s(SDIe>eZ>MFknc07%j=5~?b1gjrCqDEG>XDi>7OAZ1x*b@jQkE2RpVrX^wa z%IXEC@dvWHs3p0`7Oh9y7I|Tc%WKQ47uJ-qb`@MX3l$5ssIg>T<)RE$g;LhyB32(5 zetwNr$>yOpR~MC*_)9B<4rZ;qAiZc#QTf7J|Kg&$@>;Ztn!1t&<&3kSv9YMOyso~c zx}>TS!Hd#mwE7!LYEc_lm<3ltrwi>_nb$CX@O&V~9RH-!ng)OWxTt-D#5IjsQ&pc! z<5l0VP(+T(_5~S5MT-_z4v=*eLtpjDxj+_0&BWRUe=e&-K>>2`9~H&`siOeu2TXj9 zANG}Pv#Pv$fxn`tysoaME>abvYc|T6Ri&&de-XXbLepVY)htlzudnkfc&H+ML1}4G zJ;O4TqARLzsH`r7f2nU+SkAywGg56$ePv_O!t#YEyam+?vWxO6qI-kan_p5{rPQM4 z`R7XygvQud=~wD27l^u0U+z~BSAx>o#R?jvzj9%D&HS>G#bhff^;gzZEAvW9uY-#y zEhqcJnnmS(l%o2@3+JKKkOI|`4tHTmWwkQDuDo2StgmgTF7+!jv$KmPPDoc~`n=P# zi!PXO!GsGV&l!`<$HGFeOq!4tg=J(a*@cCk>E5D@2@|72qyQN!Bf}nu4j~@%l6Y|^ zM7M#biD!n!V?Ju~$16jXWWhoF7!gMPp`Z-`JXTPN$1BGne2Abj#Qfuv zHHVAC%;zQamDcz^|D46gDUh%R{X8#*|IHTOaB?LQJVtpa5+1L7D#O#kzw)Q|LiBOU zQwXO_lRv@6KLirZFaSlrEe%;rRyIriir!xUAF8}4@mC(Z4o^drwGRE^B;&Xkwmc(XH_U>74snmoSSH{HoCQD!LULb-Ci!mHaaR||jB(Z^Usz*ZamL>s-sMnB0$@3hfRw$XRn=%?7|T{gP4CdOdHMnBcY-(#bnW~2Ao z=v*U+Tyk8`Ix;mvga@$Eoi@6|MnA(wPqER@w9%b5`dK!5s*Ucl(bH}8vu*TD8~uAW zy4yxiwb3;jJJ<0`#OV@4tpfigak|3L zI)UFqoGvi5M&LgoPS+P&A@Dnh)8&Pl1b!oNR^w2u!0U+9#f6Fm{$t{FZJ~UD&m(>; zaks#KM4T=zlrHeu#Oc~XPJw@)I9*!EA@J$M>B>Tiz$X)@3k&re0paWmh|_h2x&(eM zak{Kfr@+r7K8kp&z)vQAJn?k`A4QxlD6~f4#}Yq*_zHo?6Q?T*H3|IdRlw4HLTf&Y^@T~8=o;4c%W%LzFJzJoYjO~@he=ZMqAgcN~q zBu>{7>iL%We}cG^c$dH*CQg?T>J<0`#OW$Rtpfigak_}mI)UFqoUS3XM&LgoPL~i` zA@DnhpF_M!;5QPdYY5c}ypA|sLa12aKPFCB5Xu+$JmPc#A-BMPM4U}OlrHeu#M$IS zPJw@)IGc3HA@J$M*_1@FXH$RA#4CD6@y_stxn}}{~Me8gS_Q~Je`YghiM8b)RaO0<-saLhCBa`<04z0C4 z=>q^>o0TOH)DdBaQ2R-=(-uBiW-3?{hngnRiKgF#WuOp*h%vVp(QIz#BA!}D?=XC&R&AlTu z{lgpLui3Jm3DV(wam{81g}c<#n@C$v%;InBO#r{9Kc}^QGEIx?)OPhYAo4~sYD->5 zWKG|0#(z)7Z@TopUpg@y9(e^~8n>druGyY+CrELhZ(;tl=1V*70fYavhzg^x*xd6d zw9`KfcU}{^2~pJ3l~BD2ukc*uxzclmr(lkD`==V*ly?&XcumuvaV>)%)AXlYO@u*- z2Tj~~w_H(-@mG>#ix!xu1?D7c`s-TSq1=oQH2qtx?b~=3XIhJ^n9Rn&L zgBrg@3Yxx6)7QEL8(=2cgE_xOrp-9sz{TFcRmpbcG<~1(;5UeB@tKjHadkl{4dxT} z2(A>`YQbefxbYlP+)Te~q%vbjc0GF?=EJM!D%yJXF;o&*GV{6$L8861xE|u;$QD8J zZUzsoo@qXm;Cd#B?6p!3F48*iyuHP>nJv zHwrxG6iV>T3-vm+ThlfgfTuj1zC`$UWZVc zdJQ1W+6qW5I~WTWX`Oh6sk=xbFZZnp4M2t`!^(`~kk%$G1<#0+N)k&~R7;pG9fSbt z1uB~QSc~f|KveQfP~pfNG#aI9r9H;MT#Z_1%URSmnUphqmNRwWS@y z(59O*6@SuCva`ESVk>>&OL8ZGGkp^WnV^L`)lEI7^qrKYw;LZJ=NcSXvDBPxStw!n zFp@A;e2{88sp3*_$ExiY5|CF@@T(ZGM5{fA41uKa1E_s+f3;6Is@f+?wa_efh5*e5aioVCEf8^7@Hr|8DwcyRJLW#djT;C_LtunO2tA8s=kAnnn z!z^q1JI1_n%M#ln1$ZmejJ3p%sX9tM-?YR{7}`Z!!YlHYbmj_YzXCitsb2ve_XX`X zSOE^FRZ)Ovi$u-*YQeQ;L9z`TFg`g`<{J){_&+6HEb$${efmC$Jp;^^>4jxhrbCh9 z*P&5trW>ebU#9QG_%=Gz1tJ?s=PmD_>GRP5V`}Y~&ySYr6lNBgP8W%;bk)W)htG%} zNGM^PbGD`Sv1~fXlVZFKnXzhbVmf_lzmyuQ_OFE^NsI38ul5}Y{nRcxa5S|`s4moA zEE0u}q1t+mD^)99Eu3_2#z8h?4w-XYnOb{}OM~Kyf1IZ8*4nxfwcuzs^Vtf6ZE9kk z?%p2`Bi52upPKWOp!;+`q6QPMW&~ec4-?RMb9)YMSJfpCKx+twGosB_x)fevUz$j%Rg_W*Cp@-$Fsm~{v`_B*lpE zjFpr%5z4WWqS5j~PVc^OI1f)qCTw&A(E>N4>k?sa5k;A^vKad?&1aV-2CqxNHrM4u zs_R7*bFgg2`U5FT-sB)^k8vN6j8^UTt(*>A?V0Pj#&fNw=$b8}gA~2Hu$?(*2^~ac zEMn+K&^m&o*%1{;H^R`zMi^cfQEe3J%4~+7j139h2TJG$8ikXMzFv5W@yTc5aQB7A z?*KyQe}z)Gk56y$X}Ng%8c$33)Q+*FaTA~XVqh->^%c+k2%+e{;$eJJ`ikckN$D$| z>jWjog;l0Z)0jV$Jfcq#g))Zuoq^dFEQm^~wj9Co z2P-P|4ebYF6rtpeAK?~?Loh|2Mjz9sZmAeaodAYnzZ%_o~bP4Vil zYWkO)a0PEd-P&m^oU17F)qSm>tG6|Gft|2Z!d3~_Nw`MB6%sa?FuN9!vWt1k*V>!u zNqA8b$B=}n5~fI)%zD$_tO4-S+7pUbxMA{!WNlo7g1X*zBwo|&wG9mQh>5fR6sTNb zEX2Z;FOaQif#xR03#+YTr>&=qBZYpGA@+yx`)>v z_x)gElcqN_BE+mR#jGKSi5q;HfyP&3%rtFr1$XdiS_UFa5TKsXA{?52GlsA0EdeLh zLm^P428__1Bq&+{#tU3l7#)8Er`0!Fv5&1!HX~*i`hvgfFw-_cptE1vBJNZxZeO;^ z=?gyDWkxqaz#tZtdqh8Egiq*~b8^mCYfc?~tti@G^#ae$cs_4QtJ-oL%F~DZCHn$- zuuFY~7I>ry;dy~8P-s^>w7^aIzQ7|iDhiHP%gqSS7guCWC_9k2VY;5UX}X^CtO8^s zkj>KriJR2Nnia^`#eI4Jp`auR3h#n)U-qFXPiHgcebWz3*^Hf#`ARb zvBb@~c+7=6IL{kMbWINwY&eX7g7t@|>!a6u14BUBY@>9aYOXH{=Jv$(NKzq}^%!o? z%W7BexD-t@PjB;~1Aqf+7Bw;uaDY2v-kq$NW7t)!!K$n;aG6GXZbd_s6>KRgCu8`6 zk2o1I&}@Q0>Of-l89%g%xg}Z*W1z6v4k5+_0e3$!r?9X`Nin`aj>|!nGAL`5Kt-dW zUW}W!P3WC)RteuDn5Ou*8EYg7QD4rYulHA^__6L|8!0N zN^5>Mu3-$k&C6g;dgW^2dEUfxNB5Y|)tZy>o9%cu86rU2g5M6UIUHY)2C}_7M+^EM zPS?^t1Je&Waryg>LYm&~RcF4T>2GLh`=NY-miD=SD7@2> z=l!W#^H*{HlW>o3fP!CkC#sK4c>=$OwJ_GFJ|m`ux9h!H^EZig=jgqbKStdHTh0^U z&v_!5w_(sT(U-Ne?gJRs@9_rG^8!Qj0;64CtfY7YBR0d*O2%Hf-gw`kDS!6pQyvP8 z{FUTiPIcsE4s~RL)}CEU(Vq4pG^MHQXy)zqt<3nq^x z(GV?WJoPa~L3JF7Zp2;?$lc`(i#4DB@~D*07%XL#l4>C-qQPw^Fm)%iGcu7nM;Y!Dvu6g~jVI?qO`UeS7gXI2njx#U7&$D+z+#*v*Ky zZ>89)k7BvC2#4heY?iz2&(xd6XEc2X8~v8HxmnsKDsBJ#DBEP(ZDW^x4kI%k#xy9_ zolaBbVy%SmQotCKJ;bDwkTf%OjWpdAfMWk3YP_Ur`XrZEx7H}qIi+*6Dsi#GLCi_a z7ntB_ewMwEqTbz!@p8tSnAE{hVA_@()4zEGk1hqDcif{*09xDLc&&7sH|-s-81iiQ zr5#)}jG0L{?!aWB`?&gJFd1y7q|7CIZ@tYM__c_K{v{oYtjFs{b64CZNP>SyVtSh& zOJ+Vibli9768%IIw23v}=5OQcrloxe;eW$SbncUhBERIg>9Bs)VfoP37Y}|ZUTbbo z)|$5@H*Y(lw>7*>&Crcca%sT=sJIV#-E=2sb<8`vwDUf|&@@oyO7{gYkImD+%uD<5 zS*qvLKle|;K8GhTX)PHG-s2dyn+yM1FgvVeZS#-XwA3!@z4uW>aHd&r*X{7>?{E4E z1CgLeXBz@HMHbyC@X3CZ`$_qkJ=StkFu@ffUVazIy;iVjUkHXMvpGBo1)~-EL0@o+ zv9e$A1%1Izqk+MZWk2e7JkyS%#Py@>Lo9D#C@1B!0&6pSplKdT`NtkH10L=938v(! z(c>ko{1^`*Ctmvm9YirfXS$Cd6=rS=WQ(d1Zqszs5DlXqUm(?UNstv+T~>;jNcSen1P9*pnN zpJ;)n#Rx=9!M2hy@U$4&2*Q&lL5!FL;Q^D-1tXaAxSyJYjtHU2Byb>Ua@3dvF~Afu zt~Ciw5so}TxT(VApJrnDCYE7h=_YoTi8+W3xjHl&=+#^1uZZ#wSZu_63VoxdPk}L~ z=9T`91I)mTWVF}OW=SF}$Ccs@G@$>x0th$cGT!v+hrMlw%{?!!d%~3zBc|d%)u(r9 zZN^k}i5C^scof!$efy$|CBnI`Ld*nyN6E!vqw7^}?wP9vPgCz;;v)bIv6iVdzn37^XRx{I z)A##JwC1nl_%Ia@n8WSItPdLoBgB##h6!#5)A9yqVfNmN1(tq6TKM^+hj^QhB-T|@ zo}3?3$Z_h(h;T~KpVOM3OYsj=N4isxC`Kr-1tm)&`T@5)mZ*VPD2QMaQaT$Rpi_3T z)unfjVxQ4xu#DCWB;@1bA?*uqiCNPk^nc@LYi%DU<^`urFlP)2+Qvs7HZM(mY!@wb z!)O*EW)!c{A3F`6cIj3Tl2CUHvX2fBwl=pe7ou>*GLxpGo4*Vlxt8n=U^H=@7T^;$ zO7)Ri08a%IFkAfr+yco36TnGCJfrY_0IzQbqzVL9L(F#L+qWRUG{=SUIciS8w*`Eo zU7G%Vhw4b&qK=IBHg8Qv=6oAcpfRVjf6s&F*3#A{MsMC)Ve>4g?W~;6Zpar;vYP&k ztne(4yo2SH`{1@WZKvyO2xK1)OuX;VEr<0sy$29;<;xGN zj}6Ur@yJC zedABY8aIX<{u4czo8RX-G-bWMU46{|tP-~q^E@5%q;KNueBQKg@`AqgP;l->3^uBs zg$Q&0OwEo%yv2w0cJ;Aa4#yqBz{7JWi&7etxFg=?HZkBZb=z{JVW&r@>r8Z^S9H>v zuSGwi7;5t)C`)aK$t#Ps<8<^%s2V^bfspFR1sl`Lepyd!9?);Zt+Fux`RG z*X7OHs@|o884mnIRuwHc#ceb~S#iK(Ds|Gb4x#^6TP}jn@C9cW-n3qy-s(N{Ar84D zYT@TJy%Qyx!1FB`@P-ZJefn2&W!EqR_WFl201eUzEnySi41M4m}9~t9ZRA^xF z4JR_-JU*&R-T^lQ4=@%M;!RIJL~EZRJh>LkMLBJUC+{B=?)VoW&EF>0)u2&EkB2A< z{=6><$YHH)6aIV#{P_&&&mmtD;m>Edp&^`n9})h1hV@WjddEg` zW&IO_XLz@6Z``Z!Yrd>~@Nvnz;NAA&yc(xHPH)z?>RrD8^Y?>O9tBX0-=H*bI1PfC zx-YGlt6LoUa<$us6!hnejVJ|gaLQV&WBr^ZVv z*RoK%Pte-lk4FcmxAWvv8)A9mux2$-S(hQu*o>rN`irRfL8d5jEUs`8B)1wa8KN!; z!4+$z4{@#lPmXpKXzIl?hHb9(R9Ot*)RwXEFX&yCzC!k3;$9I%2mcFZkxG8T5wvWV z7(ssp*Xyq^2hrkrx;c&(&trwFLOY_1^0v>6c;JYuVjF{tYWK*7DV(A3R0D^wVJ<`v zJaAYYX5!Po5hI>k;a}u@ zz#CY?_F@(YR#>--(R*B*R@&ypA&cvbMoi=KwYX2vQgP12@F6{mf;}~ovPeo;n6CwI zasWpu`Sfp%vp~g4N{T1EJtynShF>sY_+w~_+14MCBj*g^rlp*W8mpUC-?EYoXJ?7){!;`Pd+a*k|IlaW%BwkclT_ z4EeYW!1WXVMB}4Qb3k?EWsJ$6XM}$+0#>w?4M!N^LogUk2o0UpHyrN-Za@Co1a`0f z53ha*e&>y(ce54c%_%P9B(S}SvECa=uSm*JQmS0;clN)Lv<0*`+IGMDw$Ii0MjP(6 z<~AZ^HE9z`e11>p?cJI>ok2m*q>PufLl_|R#(ADa5h*@(rg1=ZBsD`0ypWn|s8_x0 zUqn(ZNG6VzE9oB(s3WUfnQB^r%gx!%EfArm0-3L=)!1a1m-Nka?q|$RNdmbX znP=DBVKrQS!b;*O!PEp_#(H>u+bNKQ@djMQgv6u44xpUWBd$HrTbK;5t*GVjzPQ@2wW2zWCE zVCD$jc0)HrK(riJA+#&pJ-ie=&@LZ51+IK=_{D|?snt;4E>Bid-xJvux+8ZEp_~JX zc8^q3x2vfynfjeQ9%2rt*S>l{oqGfceT{^Uz`zI8AH5FpTOfCU{CAK$;8{R!!`2M4 zb1OQTcb(cX9bSD1)}EV?jYvJ+(&v6wXu^T=-8o<2@>*~6SI5=e=)L``B`6oHCkL*o z@ZR2b6DoXe29^Lgo(R@qGyMBQIj&K?JAHxCFKK}rinWAEuX}^T;=Nf1@=kgacdweg z!`u9R9JYdddQq{a4||=`IDT&a`Z(+pb!s|OTNIc*Dnu_PS)Z&d|A7+lMeE(X18I$73WLq@TIkCI@HkYkYx|*k1i0)~fRY3(&@eZ%Rj|VZqkVS&W!9lE{uNB|=A4OoVN@{bjRnp9pe) zf~*WA<>d%{Kq(l5L^Pq8-$mG?l?g=X1B-Fw;heb89liTMjkyu_h!{afQA#Zb7Ly_m z#rbs1U(K-_MmeFpOVJ!6ofpR2w*LF}PnSZd=)y743wxSw!+8;hXZy?)MO1o6=$v@? znj|kyr_wLo{-WiVE|HWPQlwuR2b%Cp%Un$mD_m2f-8D&ipLfDOq}@9`gHoe+>cY%V zZTSZ<(Lfx--x$wtr_kIljW1pq*901lc3JUv-C-b zBzzLKIE0W|wENoK!>Kt4Z3;XZR#E^LhBq#YXMT@Cfil)TtB6AhO6(F?1^4J^Xb< zfKG*ir;wg<6?7saq7|OdiC{Gqt8Iwgs;2%E0IsbNPR)_DR)ith32(rBFq?YU^Kb{i z$DZBz6So4M;Y-1TkcMP6@F>E%A#98A@M;>IqH*5~;V?udT@N-S3oVU{KvGkEE;pSZ zlkG$e8F`hcEO9_Pfc|h+GVX;V)YLXOFjlRI1G@%0(Q^FJeZ*cJ-3s<+F?Ya_^qan| z45NJq_7V~y0qw##_IV&t`xp-~II=lHo_j$NZRnu!CfOtV5F8CGCVOP-h3pIZ3Ah3j zZxD+K2)(bLgp2!0IJ=*O<4p+|3hyzl>L=k#QlfNtpOmOf>;lD$>6^^RsD47$#ZdMb zzX64ZFGY*L7IPYf{&J2q=q1bLj*_v6F)f2`Xa^EyQ0j|;I^XBnw4AGsY>LdtRK|-^ za=b_pp7x+|eFp-gEUhBY(;QAvgIuhM&hO{sjuQ1QD3;C7?k8&tDNz=Cyq|>Mni7P~ z-)F9(w7I>XgqnU5t}!Lh=EnW~ButBy5aQUG3o;Rx8l9yPrZ`cJX7>}7&h{8L%zR#D$d{%|{LmDAfCPE?niiuP`|(jMb#u%HUz zkN_sdI4@z=pVu%b6_dI-JoL%Z&i<0BqN@s!bkLY+;#dzi@v}@k#lnv_aqJG5;Rz<5 zYT=*bv@ztRTlo7Xo@wE)m^c>Q&G=hP9P0`u{-lZLTlnuxywJjbX5tu^nEcHqUSZ+& zCSGgdr6%5J;d6kaPi;bhW8y8$6AE95(vK8<-+uZW41hFwNbF6t9baJiI>rn9qCPK0NI7VtRG z>G<8mhjIAL;=@Jr)yZRean5J*nCIi}JM@)~{^eE(y7k5T4t+act;X4*$!E5S@ZNaA z6%Q^FpA%?rf*>YXM1dNDe}6=t0eN4V^1f!&uSB>Z1njrueJxN!2-t7Q`x>Y`w)D+> z^~iJcJ?arG(QkKRwuoOlYG!+{y5xAQsQC1Ez`^WxsH2|8Bl@w-_~#Mh*1vnRdK!{* z^fy8`!lXESg%eD@sG%5{?xqLCqBKq~4acSvR_}Ra=}`A*EaCr^OZboTB+(O|xK|Ke ztlv+@gPh-hXA^lg=&ylm(#E)*ocwbg~U8mk5s=_t> z*N<=zrIBT-A4JEirnN*~B&wx1rP6`B=svL3k`q|ZO=SjSB#rxz z!93mevf1^|iI>ghBBmC^iED}sKII~A{2VQw$Bgo=wD8;s241A^2IQJm4ptM!;#8n| z_n8S;I%@SnKr!NEJdbsRJpJSD)9Kx8{!POk4jD9@bg2OJ27b#-;N&BFcx~JxO$6eY z$E(P)-D1n>kd-u?Phj4w{I$*afdkHi(4-Xf&o$j8lE;8#LMz-tG-vnTSJV2o@F0Ld@dVtt2UMOk#r*onPI)72E2IejTHtnwQsY!*ghDURWwik z%%5aj2JIrpHKqdLLX^{Et_F=&myP3kjI3*(_MwPJ8UE8SW@Yp38?%Pu5ZTk7=n^ck zp3`Pwo2As>Z@UC-}M ze^kcrRDb7ptbgivtUubxcWVF4?^u8LcdWnm9qXU}|4V<#=?7X;{Xb$Hk)Rz0vZJ`QwOdp?QS$U3}I;911)|rW@3BG-4jFm^`flpGyRx-BPKZTo-3Ay^k znA{}#^xKj{90o$Z=*oD2CLY5?^H{N(^PV?ut9nl>`dyq^nX3N$x#Z`p{ysd7=V36Q z@jMFwihlyXbRx$B;c4Q043Df}2l@95H|8RY-}1nDOf8Uy{d9Bd`Q6mv-6>+UuR7zv>m>z z_tZP4L!K||T^xtaQ>TCGjeAj?M>MSShz8g8_WH+qv$m;sIhpo#-!>ZiVMI-DgIw|E zR~BaRFRCp|;YfVJ%a(f6_IuasOU(-}5qb}G!MP8KK9K0)xx*=N&7leKX+HhK6+Ak8 zf;k_8iTE;y^?DbaZKH-Xrj6vpe98fuDOg^8Wbj}zUAjbi<6USiLVT=RI4r82Hb{GS- z=Q?mJa6oyV1KKCzI9z+9|3-XBVvHfuSnD9fqQ;orgd z#w-<)SB_aF;Oa3C38vK!6Rva!`p9Jt!3Qm2y7or3r3q}*L9EB=YaN8tfs20BK|tVc zi3t#+7jr9;r6hTwyI#=|SCOD#>F8M7NPH2oO| zAvNg`5?UMr0$(q20f9dxaRGr>h6p+e{(h9 zzY8GZ*vx+yKx}JbgDgO$e#aB=|1N;YHOWEjuYJe%|G%;TlF@2g4Z-~OU*UR3G{0?p zr@tx=V4Hg<{BWTI-dVwT=z4YO_t4GzO1rIt(wdI*NZ0>~bBlJIUcWr(dMr<$FTU0Q zS3TNgeE0{9cJ=wmIM1US_Wdjjmu{UL{(E+N;$sl0=-b-%o*uVt*SBC?@}_RwwkNa< zoeDN@A__o}WGWJ>M}WTP(4OY-k!LZ-4R7R4z5MmKe_~MQ-OvjR9Ow^s`ObJg&~5m9#NGs)#tv`uAA=VT`1uHbikg~q-${y+ zjls!dUx@n$o0z=D*PG{lKREtT%p&lv!LYx8h>_2WzPN88TD&{1Uj9iUO&wmQuWAq%YJYTZi!mNl){0hnKv3TbI7A`P;aLQ9ivVX02wkflume`V6;? z=R?AVZ}4PP{~mqsF@NNFC%GQAzT??q`-0v2u4tU!hY$-rI9`Z@cG!5uFn)(|0$!rm zvUdB=!k`sz8143-tOe5f_8Znd4jHc_8Gbtq?+2ouk(|6~I?i1%>}iCV+Ttq}`0xUl zc7w^%2k#4iZv1VOkgoo`6|dYzmrq}Nz`(IItxCLhH`nFZ zn1YOBCWTLc82|VklEoI>uo!s=#_ z-b;`@Y=og~hv2OCFg>0NmpEDNvR1EhP?-bcF{JABr5Rkq!oKweQE+Nb2ty{UVX-2& zg|LRzmfY62PKCW411nBXLtn)|-bUwyilbe;*Ttry7^|r$Hr9}gP%2M9;!FDkFDZK4 z!blGFwd*i8qM)G<8sa^WFy7f=9A-hwzNq3rVp#nBFw?Bi=eoQjlUxSL`}4bRieZ~6w6t# zHyWQpGaj#l)%&(8kMfa<7BFJ#p1}5z3U&D+;YFSjpENaIe*pO_BZbrPq>4+CEt$pD ze70qAr3^bt7X8!EXa@P($iV8{Hk=#BP0-QsL6sN_{fSu)B)vDKPpfzM9MLM;LOUn{ zWjGJftoPZ)*QPoB(e%HgE{PW#%?fcafqFgaS&-B)?+7g;)T{T&Fr*>dhymKqTyY+WWFzFM%#dB?MX$`oSa8tx`7Yu z0 z_nD{~p+BN0qGZlX8QcLV9G|fbJPcVQLY@*FMmkFZx|-~ET{W&;Af!pK+e79u#1f>x zV|0M{)*hC+7o29jm=>9_ZOWoBQa-tJA)nEfA$G;l~l>RmZ3l6|n*rSYu* zk^O_nJ}Y*b{S|$h6$e7tc?r33QZBnV*0zz5JD@#MXpdfqGRvd4|su%bW_)`Kw9 z9*=^-$`4;|PBBiQ)sb;9+Ex7ws*((a>|}9{#HtQ_Iofy=<18(}H>1Iwir2TX=7oce z#n>ckPx|^2*~rAZjqYEQ)ogCjVt>i%aQjwz1bR{Nxkq|k_5HXPABDTDA9vMJxUcHRU33)g@Au=L zeH89X`*G(Ug`0&M`6QCMJR}^*Q{uDV#%I4mNB24?Hioyb5!U@7_0FToIu&c)B|+1y5kW>7*`(D)b@phtDAMjGa05*|a7Wzay~ zQOgdoINdi6P+Qo<2WwJqAS}c;aR&6`E#^wMUD$I+5ysXS`gNbMXs_6k-cK`r>~Ap5 zZbw)*M(tZdf5MYcZ-5@Hg|o)!RzB}2Li0>fq2JTpLv)8FI<}u^`Ex(H96}AIYz@M? z^C|I@K8ewuwxzS5#6KKG;!jOEp-%xf=c4;Dr(9LA?uH++H~QumqEdu-wt)$MD`6!f z*y`ugl!NNG8^OkcRj55Qr;Xv4lEDFJ%pe2DxHbm*DoSXjgtN)8z|LTfA-foujKBd$ z7cCc3#-M{!I(O;gqsGc%2xZC!g+GG)hW6qqqMDg<3L+bK(-{4F^_EQ(@E<2@4x645 z|GdDM1j*ftW76cP#yDA~8P#(hZ45qeHqBhDqr{GTnTyEBN51;GY0fpwg{^n~pQiB; z(l60(V>$Z7`2?J(@nWmB^m}rAfm!ONM_BdpA!Al>{QDfk;B=ap z1aka{4d($y7=MDaysS_C9*Rjf5@ut9esLtK z^Qf>h>>$IHpmbj%yj|>2O?(73D*4O%>z9qF-F_KA$^!mtqvB5NANP9^)o;5X(%>gS zD_V6K%-k0~N_;TKI8g@HAdpN80OfulzYno^901z!Io?t^2=uDLg% zq0k$cI`djm2ZJpXfTcoc6p^aJJqSrJ3ReShP!}B*^d$*+=v$^38Dz^yf zoA$Sdr!o9xhF>{g_<0PU@iT;96bb)N^=U`Jq14-X$2#*0?tj?r9kttm`q8((%XZCw z=E6gSM-bVE>L0iXpZYkQmxh{!&sTkmGb^{CTIAx43pNX|+?us*(d>*jd3F!|9adoZ z9mRhzE)JE>Ljj?+ zw1`~vS~w8%HTEy~g?W6QtNsiwK4!b> zPI52@GQy+ZLTirGvbr1aSs9%ByvF)h6DYBWKmU9SS`Pn*Cphp3FN$v5cConaKSfE; z#xK{#f=AML#nMS@!l$AYH-1I<$*X6Y`Ovdj5?UoxW|vf#)hu+*sjaMb=9S?8-8VW@ z>jbT+tb9>rX?fbQ1MshUt) zQC@modELC4lDe`>FLhQ;C|XcgS$5vkY?D5n^wj!Fe|efRVZ!8gtgR|g35%SgI+^rttq>-MvQ1o1)xu>@mkEvL0C;&4dnY*YZkFIXZOC zHp9uwYt|%cn`x;W<9Ds_3o^1x>ip$&S7=iU8>%ZyOW^gu-T6eZkh5;NTR>A@Mmhx+ zRMeH1l$jzezAnipm~mV8RIzwmVWYE$=#+STvItgsE!;%=-Pg(dJ8Rq`EL}pkg!vK< zod1l8)Hjkxn-%gc{iJ-$&XxjH&;BF5sbzwvy86;fGelJ@s;sW`Pbe)_%v#>h!7=5@ zlX=fE9mE{?kyKRj@lM>*l=IG8SX+tv0&oDp6)E`ng>CC2z9Yl#Y$+_iq^`c)SF*UK z!Jk@MQBvnT7Y#~C?WaME7XcHU1=1=jpVzS9y!y%o)g@K+eYn32LY3^2h6NRVcsqtV z&n`PwaXJ^4FLaiamDQEk*E`Rys%j)nUZpi<<$|lIwyvfW3^jH2SC?HwE5W@+s+8H6 z*eONTHPz*`pJ}K_A=xY9L|^alls}^*Ef{c`-^D%@o?b(t7#$ybcF1EZQX0XWI4W%J0;qm|R@Nr!mP{C$Z zEnqq}!d3t_VgIrVFduuwy`42?( zjkM1@;qW@ZbifWkH((dwI>6*(kUpRj(D`0CTu6K`>_WT;{D4h>2H*-ng?0u^0bB=| z4%h{#0T%Cvo{(D$$p0k2;sDYGT!WRb6s)wZ155{O1=IjL0gC~<02={&09ODyzJUDz z`F|B#0rLTO0~Q1J0M-H~qnw)noq#Ie*$e+@LG*M@i5sn!nQogSqcSCZM zGVSC`&YkEw6I8)Nm~dmhPoy|BK{?5-B$(+c$|QtQRwvS(iEaACmNjn0Gr}=_M9TCL z&gmmkr;kYYjL4ihqUpHiq05E@lkQGjo^WTph&LDU46JsHMqNo9z@)(2gBjB(bfkj3(p95RF=SGmLcu2`=M}HeDNGM zHErP;k?I+d-kh{7@$Q7>@zg63dey?WoB{an%4a+u@=@_HdDLy?Hkv=A*NS+rvcAcS^2UR{bW1q=VwAoS9R{q2jOT|OC;F0F#7i9e z;6VEK(}nTYB3|Kk_-f|6aKLz|F8%ZU59sMepY=5LkJ$C-dNSX`z~8Ym9Da@QYTs(3=LJSApI*0KEnDb+@4JpmgX4dd?=`|H2&kZX%Bb)?GzeUQwfdr&)`5APpSbtI!+C%v`96p%} z#Q00QuSBTO_a99Erf|591jr+xoWmHK?S`Cqw!>b#eWHCP`B~4#g1;jKeVK0mvKz3y z(=G*w*Mxc-Yp*KM8wa4bfL=QQeKqJ61JIuWy?6ln3!oQ*j?;+-3LKWzcJcB%obcy6nv{e`1pV(8l@BN4mpcr%_wbvJ-zm(a3k9AFC@!AEI2%v1 z$#yr8;ebU%6v#u0N)?e4fH0(*NQp!^NLJWe9}oCTB0mRG2sn<&g^7v+m!qUI(Oe)D zu$CeFWXNQOgn_VVzh=luh;Rbn<3yGMIUS)QWD;~a75aTnDIAuc2Pi_m1o8^qAIGpF+z z;KYyVTt{REerMx%IgtbS(QXd`iQ~C7BG(e(R|swfA}&1RvSh=BiZXtH#MAMk>^~Cm z;K!6dATkR-iu(q?xQ`|BIg$OiO~y}Lmh4Vw-2w`?4fq8Er3@jcrONk+aGW~|a3YcW zfaKsO*jUAAsv!(X#BC;^xWWma&=wU${%n%W2Vo1cKZ{?L6_N&t)OR~WI7RpyUFB;s}o659dz6=fa+F$@{bkQN}90Di-e%`)U% zhP(iT{}o(Z;e@|7LAgn^K9%DcNTnUW2K>Y|1r+9c217i!oo~{aFH0ZB97Ear@Y{~x zPNvEOan$EMA_Yiw8ek_8{_`=02)DHcNF#;wlD6XGc;0yNf!xfFLNl|p#FdRZYezA$ zEAV607ni9UAM;Iu`M{#R73nE_`M=BxVf$cx79q=lFu$y9%1YdLj80;1xKTcld?Gvpz|gCSY{G90e#Jx%;ddf_xwO>?h@`4BiCh4L?!?Pqs{vRR28b@jCh#ZI9G31wwb2<>ld4Px;2#v*(5c3JDvykc3 z%aDi3_N0s>(%Axp(t0WSbs$XVTOy~R92s(ean1+AbiN?MB?G2Y2B=iw#&jB(PO}U- zOtvi&$zjN=KwhF)Ua}5wIKvcpoLGz@n0AoJ!}t;5kwc{oKh_R0lc0mViBw)@yPSw8 zo>6$4r0eke1t0!<{nrBjwZMNZ@Lvo3*8=~qSipITTd2AQi|o8wC3K%`;))Cxfw)=y zU@ZI_M{2h4mtt_P?eM~sMO^7)+yb(f<@JT`7Vso-M>qUvv3NQ~;!X)Uj^Sm%NloZoWd)Aq+39X-smuKOYhwx6yt3Pt@MwCWqwqXALoxn{$z3rwvq(y zkl`}=cMf``{bLiFFUxh2gm+4KuY`Y)@UIeXm+&)nrG)b(TqNP065cCeYUPsc;lhgs{5usuD(!PqkHkWde_QC=>iRuBA+X-jxUwXOol(u@BisGv`m5sIf_arBaHhk!U9z`|EaKfg-G?~?JUKW%5}FUiV{l5WMf`kh8jt#R!(K_q=EzLozL zgj22+-|ENm#b%14Sp6RD&%Ql2{@tL_CeqA`)$gZs5d+uBCWzdbmi^L!*yHERej#7R z7iS4<5oER^3u!B3;#=dKHFBUayVe#Nk5+t(`pcO3);Q%0Du&DIuT9LfmGw-x20!X= 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 Zl1{2&Do4HfGUleig(9w2Gm literal 0 HcmV?d00001 diff --git a/tests/Grid_stencil b/tests/Grid_stencil new file mode 100755 index 0000000000000000000000000000000000000000..92d844eedd06f93a24b40886982bad57a5f3fb02 GIT binary patch literal 97307 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 Y`DmY;|7D-9nn(F`#ZR7^7)xvaAM|vw`Tzg` literal 0 HcmV?d00001 From 17e4e478cd539d9efef7a2e3544da601dc71e8ac Mon Sep 17 00:00:00 2001 From: neo Date: Mon, 18 May 2015 17:15:14 +0900 Subject: [PATCH 194/429] Minor modification to the configure.ac Enables silent rules (use make V=1 to override) Prints a summary after configure is completed --- Makefile.in | 17 ++- benchmarks/Grid_comms | Bin 45225 -> 0 bytes benchmarks/Grid_memory_bandwidth | Bin 45026 -> 0 bytes benchmarks/Grid_su3 | Bin 44845 -> 0 bytes benchmarks/Grid_wilson | Bin 121651 -> 0 bytes config.guess | 1 + config.sub | 1 + configure | 208 ++++++++++++++++++++++++++++++- configure.ac | 40 ++++++ lib/algorithms/approx/bigfloat.h | 2 +- tests/Grid_cshift | Bin 60539 -> 0 bytes tests/Grid_gamma | Bin 72670 -> 0 bytes tests/Grid_main | Bin 143261 -> 0 bytes tests/Grid_nersc_io | Bin 97496 -> 0 bytes tests/Grid_rng | Bin 60784 -> 0 bytes tests/Grid_simd | Bin 98268 -> 0 bytes tests/Grid_stencil | Bin 97307 -> 0 bytes 17 files changed, 265 insertions(+), 4 deletions(-) delete mode 100755 benchmarks/Grid_comms delete mode 100755 benchmarks/Grid_memory_bandwidth delete mode 100755 benchmarks/Grid_su3 delete mode 100755 benchmarks/Grid_wilson create mode 120000 config.guess create mode 120000 config.sub delete mode 100755 tests/Grid_cshift delete mode 100755 tests/Grid_gamma delete mode 100755 tests/Grid_main delete mode 100755 tests/Grid_nersc_io delete mode 100755 tests/Grid_rng delete mode 100755 tests/Grid_simd delete mode 100755 tests/Grid_stencil diff --git a/Makefile.in b/Makefile.in index c905f84b..b6894ef6 100644 --- a/Makefile.in +++ b/Makefile.in @@ -75,11 +75,14 @@ POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ subdir = . DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) COPYING TODO \ - compile depcomp install-sh missing + compile config.guess config.sub depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ @@ -246,14 +249,22 @@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ +build = @build@ build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ +host = @host@ host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ @@ -273,7 +284,11 @@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ +target = @target@ target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ diff --git a/benchmarks/Grid_comms b/benchmarks/Grid_comms deleted file mode 100755 index 9013b3da11e6d41d2bd1fdf5976cc5dc80387c21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45225 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 diff --git a/benchmarks/Grid_memory_bandwidth b/benchmarks/Grid_memory_bandwidth deleted file mode 100755 index 632fb5eb4123b0f247951342fbac8c2b5e1a68c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45026 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 b8_pHjl#7n&O2?W;te=caf7+D@nt%I0!DXRr diff --git a/benchmarks/Grid_su3 b/benchmarks/Grid_su3 deleted file mode 100755 index 72d8a8d0170e828d287c6b87996116ca96fb2d3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44845 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 z 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 diff --git a/config.guess b/config.guess new file mode 120000 index 00000000..5f6aa02d --- /dev/null +++ b/config.guess @@ -0,0 +1 @@ +/usr/share/automake-1.14/config.guess \ No newline at end of file diff --git a/config.sub b/config.sub new file mode 120000 index 00000000..0abfe18c --- /dev/null +++ b/config.sub @@ -0,0 +1 @@ +/usr/share/automake-1.14/config.sub \ No newline at end of file diff --git a/configure b/configure index f6bc2da7..e7d9f32f 100755 --- a/configure +++ b/configure @@ -679,6 +679,18 @@ am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM +target_os +target_vendor +target_cpu +target +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build target_alias host_alias build_alias @@ -1337,6 +1349,11 @@ Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi @@ -2309,8 +2326,6 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -am__api_version='1.14' - ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then @@ -2340,6 +2355,119 @@ ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if ${ac_cv_target+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; +esac +target=$ac_cv_target +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + +am__api_version='1.14' + # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: @@ -2920,6 +3048,58 @@ fi ac_config_headers="$ac_config_headers lib/Grid_config.h" +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +Configuring $PACKAGE v$VERSION for $host +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +" >&5 +$as_echo "$as_me: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +Configuring $PACKAGE v$VERSION for $host +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +" >&6;} # Checks for programs. ac_ext=cpp @@ -4334,6 +4514,11 @@ fi done + + + + + # Check whether --enable-simd was given. if test "${enable_simd+set}" = set; then : enableval=$enable_simd; \ @@ -5891,3 +6076,22 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi + + +echo " +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Summary of configuration for $PACKAGE v$VERSION +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The following features are enabled: + +- architecture (build) : $build_cpu +- os (build) : $build_os +- architecture (target) : $target_cpu +- os (target) : $target_os +---------------------------------------------------------- +- enabled simd support : ${ac_SIMD} +- communications type : ${ac_COMMS} + + +" diff --git a/configure.ac b/configure.ac index 14fd45bb..14170f4e 100644 --- a/configure.ac +++ b/configure.ac @@ -1,9 +1,25 @@ +# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. +# +# Project Grid package +# +# Time-stamp: <2015-05-18 17:14:20 neo> + +AC_PREREQ([2.69]) AC_INIT([Grid], [1.0], [paboyle@ph.ed.ac.uk]) +AC_CANONICAL_SYSTEM AM_INIT_AUTOMAKE(subdir-objects) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([lib/Grid.h]) AC_CONFIG_HEADERS([lib/Grid_config.h]) +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +AC_MSG_NOTICE([ + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +Configuring $PACKAGE v$VERSION for $host +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +]) # Checks for programs. AC_LANG(C++) @@ -32,6 +48,11 @@ AC_TYPE_UINT64_T # Checks for library functions. AC_CHECK_FUNCS([gettimeofday]) + + + + + AC_ARG_ENABLE([simd],[AC_HELP_STRING([--enable-simd=SSE|AVX|AVX2|AVX512|MIC],\ [Select instructions to be SSE4.0, AVX 1.0, AVX 2.0+FMA, AVX 512, MIC])],\ [ac_SIMD=${enable_simd}],[ac_SIMD=AVX2]) @@ -84,3 +105,22 @@ AC_CONFIG_FILES(lib/Makefile) AC_CONFIG_FILES(tests/Makefile) AC_CONFIG_FILES(benchmarks/Makefile) AC_OUTPUT + + +echo " +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Summary of configuration for $PACKAGE v$VERSION +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The following features are enabled: + +- architecture (build) : $build_cpu +- os (build) : $build_os +- architecture (target) : $target_cpu +- os (target) : $target_os +---------------------------------------------------------- +- enabled simd support : ${ac_SIMD} +- communications type : ${ac_COMMS} + + +" diff --git a/lib/algorithms/approx/bigfloat.h b/lib/algorithms/approx/bigfloat.h index 7f59ea33..32561a73 100755 --- a/lib/algorithms/approx/bigfloat.h +++ b/lib/algorithms/approx/bigfloat.h @@ -322,7 +322,7 @@ public: friend bigfloat abs_bf(const bigfloat& x){ bigfloat a; - a.x=abs(x.x); + a.x=fabs(x.x); return a; } diff --git a/tests/Grid_cshift b/tests/Grid_cshift deleted file mode 100755 index 54d76474cbf499d5a7c8eede1e31c62f6efade12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60539 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%0DcgI}@@nR8-=QqOpw4UT*2w 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 K^X>v{@%=w@XkmT; diff --git a/tests/Grid_nersc_io b/tests/Grid_nersc_io deleted file mode 100755 index 2ab855983b08f387e5ff7915f0292c972ce6a088..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97496 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 bzV*028A}I=cV$9aEml3r*NBRkttkH&hjv>s diff --git a/tests/Grid_rng b/tests/Grid_rng deleted file mode 100755 index 039db0665ed14e8079e9c886f88661c6e82127bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60784 zcmeFa4R{pQ^*=s&gQ&nPh!_=h)zv0~m-gqnW_*gKG`iu=3P-Lo)oC0Wh%!gZsl}k ztTF_YB>dbWgwTAlV6PNy!DPvo0GNnhX1qzrjCYF%3yw9(NWr`;4GEcE-{qE%CQSLG ziCR!moPxl3)V1SLfdUqb2MY>iK*@BN;Z{7V$9TOmUayR2K}G6sK`VdE8-E2dydd5U zjJTUX$r1NHNM2s~ANtGqyyj;D1$2uC3+7097PR910P(2jzk6BPoGsHE%r1T9V@kHl z;ryz~c^6GOzpCuKs>U*52xv%<0uNs!ER3!c3H)CtpFZN#dSFjIw-3Vny4G@xo zN;VLE1u`-aeG3#Gh@Lr!oNET5Cn3WF$vHTPp0u-b0R2xNgq}1=y6Xm!|Gh!@j~#@* z4(Sf0|BONSR}GTx?St^2J_vpMAmuV~5IfWiBIjp=&@UfE&aH#wchMmFd_73{emn?$ z&LH{(2jTzqAoNoQp)VLj{;omtb!ZU!w}aIG9fOo_0OVT^d=FiD6dHRni&4kppOK9(_c(}r{o_io0GAYOTWU(MPz{l&?_|ea#r?_$NyY7|xC^Fq98FUfo!Y`fV?qlW?`muU{ zS?RcO?7J>fii#F2tf?-l_m|Z9i;9$@?=LEvUA~~Q-d|pqT~$(FUtX^ic?-g_YH?j;UpAj4Z@hQ0`w;QYAC% z&#bJeN8akoCwXCloD7S85pr5mRURSKXJ_Q*Usf71E-hJqacRxM+LF3*h6vlmrbi9u zLq%z(s(SDIe>eZ>MFknc07%j=5~?b1gjrCqDEG>XDi>7OAZ1x*b@jQkE2RpVrX^wa z%IXEC@dvWHs3p0`7Oh9y7I|Tc%WKQ47uJ-qb`@MX3l$5ssIg>T<)RE$g;LhyB32(5 zetwNr$>yOpR~MC*_)9B<4rZ;qAiZc#QTf7J|Kg&$@>;Ztn!1t&<&3kSv9YMOyso~c zx}>TS!Hd#mwE7!LYEc_lm<3ltrwi>_nb$CX@O&V~9RH-!ng)OWxTt-D#5IjsQ&pc! z<5l0VP(+T(_5~S5MT-_z4v=*eLtpjDxj+_0&BWRUe=e&-K>>2`9~H&`siOeu2TXj9 zANG}Pv#Pv$fxn`tysoaME>abvYc|T6Ri&&de-XXbLepVY)htlzudnkfc&H+ML1}4G zJ;O4TqARLzsH`r7f2nU+SkAywGg56$ePv_O!t#YEyam+?vWxO6qI-kan_p5{rPQM4 z`R7XygvQud=~wD27l^u0U+z~BSAx>o#R?jvzj9%D&HS>G#bhff^;gzZEAvW9uY-#y zEhqcJnnmS(l%o2@3+JKKkOI|`4tHTmWwkQDuDo2StgmgTF7+!jv$KmPPDoc~`n=P# zi!PXO!GsGV&l!`<$HGFeOq!4tg=J(a*@cCk>E5D@2@|72qyQN!Bf}nu4j~@%l6Y|^ zM7M#biD!n!V?Ju~$16jXWWhoF7!gMPp`Z-`JXTPN$1BGne2Abj#Qfuv zHHVAC%;zQamDcz^|D46gDUh%R{X8#*|IHTOaB?LQJVtpa5+1L7D#O#kzw)Q|LiBOU zQwXO_lRv@6KLirZFaSlrEe%;rRyIriir!xUAF8}4@mC(Z4o^drwGRE^B;&Xkwmc(XH_U>74snmoSSH{HoCQD!LULb-Ci!mHaaR||jB(Z^Usz*ZamL>s-sMnB0$@3hfRw$XRn=%?7|T{gP4CdOdHMnBcY-(#bnW~2Ao z=v*U+Tyk8`Ix;mvga@$Eoi@6|MnA(wPqER@w9%b5`dK!5s*Ucl(bH}8vu*TD8~uAW zy4yxiwb3;jJJ<0`#OV@4tpfigak|3L zI)UFqoGvi5M&LgoPS+P&A@Dnh)8&Pl1b!oNR^w2u!0U+9#f6Fm{$t{FZJ~UD&m(>; zaks#KM4T=zlrHeu#Oc~XPJw@)I9*!EA@J$M>B>Tiz$X)@3k&re0paWmh|_h2x&(eM zak{Kfr@+r7K8kp&z)vQAJn?k`A4QxlD6~f4#}Yq*_zHo?6Q?T*H3|IdRlw4HLTf&Y^@T~8=o;4c%W%LzFJzJoYjO~@he=ZMqAgcN~q zBu>{7>iL%We}cG^c$dH*CQg?T>J<0`#OW$Rtpfigak_}mI)UFqoUS3XM&LgoPL~i` zA@DnhpF_M!;5QPdYY5c}ypA|sLa12aKPFCB5Xu+$JmPc#A-BMPM4U}OlrHeu#M$IS zPJw@)IGc3HA@J$M*_1@FXH$RA#4CD6@y_stxn}}{~Me8gS_Q~Je`YghiM8b)RaO0<-saLhCBa`<04z0C4 z=>q^>o0TOH)DdBaQ2R-=(-uBiW-3?{hngnRiKgF#WuOp*h%vVp(QIz#BA!}D?=XC&R&AlTu z{lgpLui3Jm3DV(wam{81g}c<#n@C$v%;InBO#r{9Kc}^QGEIx?)OPhYAo4~sYD->5 zWKG|0#(z)7Z@TopUpg@y9(e^~8n>druGyY+CrELhZ(;tl=1V*70fYavhzg^x*xd6d zw9`KfcU}{^2~pJ3l~BD2ukc*uxzclmr(lkD`==V*ly?&XcumuvaV>)%)AXlYO@u*- z2Tj~~w_H(-@mG>#ix!xu1?D7c`s-TSq1=oQH2qtx?b~=3XIhJ^n9Rn&L zgBrg@3Yxx6)7QEL8(=2cgE_xOrp-9sz{TFcRmpbcG<~1(;5UeB@tKjHadkl{4dxT} z2(A>`YQbefxbYlP+)Te~q%vbjc0GF?=EJM!D%yJXF;o&*GV{6$L8861xE|u;$QD8J zZUzsoo@qXm;Cd#B?6p!3F48*iyuHP>nJv zHwrxG6iV>T3-vm+ThlfgfTuj1zC`$UWZVc zdJQ1W+6qW5I~WTWX`Oh6sk=xbFZZnp4M2t`!^(`~kk%$G1<#0+N)k&~R7;pG9fSbt z1uB~QSc~f|KveQfP~pfNG#aI9r9H;MT#Z_1%URSmnUphqmNRwWS@y z(59O*6@SuCva`ESVk>>&OL8ZGGkp^WnV^L`)lEI7^qrKYw;LZJ=NcSXvDBPxStw!n zFp@A;e2{88sp3*_$ExiY5|CF@@T(ZGM5{fA41uKa1E_s+f3;6Is@f+?wa_efh5*e5aioVCEf8^7@Hr|8DwcyRJLW#djT;C_LtunO2tA8s=kAnnn z!z^q1JI1_n%M#ln1$ZmejJ3p%sX9tM-?YR{7}`Z!!YlHYbmj_YzXCitsb2ve_XX`X zSOE^FRZ)Ovi$u-*YQeQ;L9z`TFg`g`<{J){_&+6HEb$${efmC$Jp;^^>4jxhrbCh9 z*P&5trW>ebU#9QG_%=Gz1tJ?s=PmD_>GRP5V`}Y~&ySYr6lNBgP8W%;bk)W)htG%} zNGM^PbGD`Sv1~fXlVZFKnXzhbVmf_lzmyuQ_OFE^NsI38ul5}Y{nRcxa5S|`s4moA zEE0u}q1t+mD^)99Eu3_2#z8h?4w-XYnOb{}OM~Kyf1IZ8*4nxfwcuzs^Vtf6ZE9kk z?%p2`Bi52upPKWOp!;+`q6QPMW&~ec4-?RMb9)YMSJfpCKx+twGosB_x)fevUz$j%Rg_W*Cp@-$Fsm~{v`_B*lpE zjFpr%5z4WWqS5j~PVc^OI1f)qCTw&A(E>N4>k?sa5k;A^vKad?&1aV-2CqxNHrM4u zs_R7*bFgg2`U5FT-sB)^k8vN6j8^UTt(*>A?V0Pj#&fNw=$b8}gA~2Hu$?(*2^~ac zEMn+K&^m&o*%1{;H^R`zMi^cfQEe3J%4~+7j139h2TJG$8ikXMzFv5W@yTc5aQB7A z?*KyQe}z)Gk56y$X}Ng%8c$33)Q+*FaTA~XVqh->^%c+k2%+e{;$eJJ`ikckN$D$| z>jWjog;l0Z)0jV$Jfcq#g))Zuoq^dFEQm^~wj9Co z2P-P|4ebYF6rtpeAK?~?Loh|2Mjz9sZmAeaodAYnzZ%_o~bP4Vil zYWkO)a0PEd-P&m^oU17F)qSm>tG6|Gft|2Z!d3~_Nw`MB6%sa?FuN9!vWt1k*V>!u zNqA8b$B=}n5~fI)%zD$_tO4-S+7pUbxMA{!WNlo7g1X*zBwo|&wG9mQh>5fR6sTNb zEX2Z;FOaQif#xR03#+YTr>&=qBZYpGA@+yx`)>v z_x)gElcqN_BE+mR#jGKSi5q;HfyP&3%rtFr1$XdiS_UFa5TKsXA{?52GlsA0EdeLh zLm^P428__1Bq&+{#tU3l7#)8Er`0!Fv5&1!HX~*i`hvgfFw-_cptE1vBJNZxZeO;^ z=?gyDWkxqaz#tZtdqh8Egiq*~b8^mCYfc?~tti@G^#ae$cs_4QtJ-oL%F~DZCHn$- zuuFY~7I>ry;dy~8P-s^>w7^aIzQ7|iDhiHP%gqSS7guCWC_9k2VY;5UX}X^CtO8^s zkj>KriJR2Nnia^`#eI4Jp`auR3h#n)U-qFXPiHgcebWz3*^Hf#`ARb zvBb@~c+7=6IL{kMbWINwY&eX7g7t@|>!a6u14BUBY@>9aYOXH{=Jv$(NKzq}^%!o? z%W7BexD-t@PjB;~1Aqf+7Bw;uaDY2v-kq$NW7t)!!K$n;aG6GXZbd_s6>KRgCu8`6 zk2o1I&}@Q0>Of-l89%g%xg}Z*W1z6v4k5+_0e3$!r?9X`Nin`aj>|!nGAL`5Kt-dW zUW}W!P3WC)RteuDn5Ou*8EYg7QD4rYulHA^__6L|8!0N zN^5>Mu3-$k&C6g;dgW^2dEUfxNB5Y|)tZy>o9%cu86rU2g5M6UIUHY)2C}_7M+^EM zPS?^t1Je&Waryg>LYm&~RcF4T>2GLh`=NY-miD=SD7@2> z=l!W#^H*{HlW>o3fP!CkC#sK4c>=$OwJ_GFJ|m`ux9h!H^EZig=jgqbKStdHTh0^U z&v_!5w_(sT(U-Ne?gJRs@9_rG^8!Qj0;64CtfY7YBR0d*O2%Hf-gw`kDS!6pQyvP8 z{FUTiPIcsE4s~RL)}CEU(Vq4pG^MHQXy)zqt<3nq^x z(GV?WJoPa~L3JF7Zp2;?$lc`(i#4DB@~D*07%XL#l4>C-qQPw^Fm)%iGcu7nM;Y!Dvu6g~jVI?qO`UeS7gXI2njx#U7&$D+z+#*v*Ky zZ>89)k7BvC2#4heY?iz2&(xd6XEc2X8~v8HxmnsKDsBJ#DBEP(ZDW^x4kI%k#xy9_ zolaBbVy%SmQotCKJ;bDwkTf%OjWpdAfMWk3YP_Ur`XrZEx7H}qIi+*6Dsi#GLCi_a z7ntB_ewMwEqTbz!@p8tSnAE{hVA_@()4zEGk1hqDcif{*09xDLc&&7sH|-s-81iiQ zr5#)}jG0L{?!aWB`?&gJFd1y7q|7CIZ@tYM__c_K{v{oYtjFs{b64CZNP>SyVtSh& zOJ+Vibli9768%IIw23v}=5OQcrloxe;eW$SbncUhBERIg>9Bs)VfoP37Y}|ZUTbbo z)|$5@H*Y(lw>7*>&Crcca%sT=sJIV#-E=2sb<8`vwDUf|&@@oyO7{gYkImD+%uD<5 zS*qvLKle|;K8GhTX)PHG-s2dyn+yM1FgvVeZS#-XwA3!@z4uW>aHd&r*X{7>?{E4E z1CgLeXBz@HMHbyC@X3CZ`$_qkJ=StkFu@ffUVazIy;iVjUkHXMvpGBo1)~-EL0@o+ zv9e$A1%1Izqk+MZWk2e7JkyS%#Py@>Lo9D#C@1B!0&6pSplKdT`NtkH10L=938v(! z(c>ko{1^`*Ctmvm9YirfXS$Cd6=rS=WQ(d1Zqszs5DlXqUm(?UNstv+T~>;jNcSen1P9*pnN zpJ;)n#Rx=9!M2hy@U$4&2*Q&lL5!FL;Q^D-1tXaAxSyJYjtHU2Byb>Ua@3dvF~Afu zt~Ciw5so}TxT(VApJrnDCYE7h=_YoTi8+W3xjHl&=+#^1uZZ#wSZu_63VoxdPk}L~ z=9T`91I)mTWVF}OW=SF}$Ccs@G@$>x0th$cGT!v+hrMlw%{?!!d%~3zBc|d%)u(r9 zZN^k}i5C^scof!$efy$|CBnI`Ld*nyN6E!vqw7^}?wP9vPgCz;;v)bIv6iVdzn37^XRx{I z)A##JwC1nl_%Ia@n8WSItPdLoBgB##h6!#5)A9yqVfNmN1(tq6TKM^+hj^QhB-T|@ zo}3?3$Z_h(h;T~KpVOM3OYsj=N4isxC`Kr-1tm)&`T@5)mZ*VPD2QMaQaT$Rpi_3T z)unfjVxQ4xu#DCWB;@1bA?*uqiCNPk^nc@LYi%DU<^`urFlP)2+Qvs7HZM(mY!@wb z!)O*EW)!c{A3F`6cIj3Tl2CUHvX2fBwl=pe7ou>*GLxpGo4*Vlxt8n=U^H=@7T^;$ zO7)Ri08a%IFkAfr+yco36TnGCJfrY_0IzQbqzVL9L(F#L+qWRUG{=SUIciS8w*`Eo zU7G%Vhw4b&qK=IBHg8Qv=6oAcpfRVjf6s&F*3#A{MsMC)Ve>4g?W~;6Zpar;vYP&k ztne(4yo2SH`{1@WZKvyO2xK1)OuX;VEr<0sy$29;<;xGN zj}6Ur@yJC zedABY8aIX<{u4czo8RX-G-bWMU46{|tP-~q^E@5%q;KNueBQKg@`AqgP;l->3^uBs zg$Q&0OwEo%yv2w0cJ;Aa4#yqBz{7JWi&7etxFg=?HZkBZb=z{JVW&r@>r8Z^S9H>v zuSGwi7;5t)C`)aK$t#Ps<8<^%s2V^bfspFR1sl`Lepyd!9?);Zt+Fux`RG z*X7OHs@|o884mnIRuwHc#ceb~S#iK(Ds|Gb4x#^6TP}jn@C9cW-n3qy-s(N{Ar84D zYT@TJy%Qyx!1FB`@P-ZJefn2&W!EqR_WFl201eUzEnySi41M4m}9~t9ZRA^xF z4JR_-JU*&R-T^lQ4=@%M;!RIJL~EZRJh>LkMLBJUC+{B=?)VoW&EF>0)u2&EkB2A< z{=6><$YHH)6aIV#{P_&&&mmtD;m>Edp&^`n9})h1hV@WjddEg` zW&IO_XLz@6Z``Z!Yrd>~@Nvnz;NAA&yc(xHPH)z?>RrD8^Y?>O9tBX0-=H*bI1PfC zx-YGlt6LoUa<$us6!hnejVJ|gaLQV&WBr^ZVv z*RoK%Pte-lk4FcmxAWvv8)A9mux2$-S(hQu*o>rN`irRfL8d5jEUs`8B)1wa8KN!; z!4+$z4{@#lPmXpKXzIl?hHb9(R9Ot*)RwXEFX&yCzC!k3;$9I%2mcFZkxG8T5wvWV z7(ssp*Xyq^2hrkrx;c&(&trwFLOY_1^0v>6c;JYuVjF{tYWK*7DV(A3R0D^wVJ<`v zJaAYYX5!Po5hI>k;a}u@ zz#CY?_F@(YR#>--(R*B*R@&ypA&cvbMoi=KwYX2vQgP12@F6{mf;}~ovPeo;n6CwI zasWpu`Sfp%vp~g4N{T1EJtynShF>sY_+w~_+14MCBj*g^rlp*W8mpUC-?EYoXJ?7){!;`Pd+a*k|IlaW%BwkclT_ z4EeYW!1WXVMB}4Qb3k?EWsJ$6XM}$+0#>w?4M!N^LogUk2o0UpHyrN-Za@Co1a`0f z53ha*e&>y(ce54c%_%P9B(S}SvECa=uSm*JQmS0;clN)Lv<0*`+IGMDw$Ii0MjP(6 z<~AZ^HE9z`e11>p?cJI>ok2m*q>PufLl_|R#(ADa5h*@(rg1=ZBsD`0ypWn|s8_x0 zUqn(ZNG6VzE9oB(s3WUfnQB^r%gx!%EfArm0-3L=)!1a1m-Nka?q|$RNdmbX znP=DBVKrQS!b;*O!PEp_#(H>u+bNKQ@djMQgv6u44xpUWBd$HrTbK;5t*GVjzPQ@2wW2zWCE zVCD$jc0)HrK(riJA+#&pJ-ie=&@LZ51+IK=_{D|?snt;4E>Bid-xJvux+8ZEp_~JX zc8^q3x2vfynfjeQ9%2rt*S>l{oqGfceT{^Uz`zI8AH5FpTOfCU{CAK$;8{R!!`2M4 zb1OQTcb(cX9bSD1)}EV?jYvJ+(&v6wXu^T=-8o<2@>*~6SI5=e=)L``B`6oHCkL*o z@ZR2b6DoXe29^Lgo(R@qGyMBQIj&K?JAHxCFKK}rinWAEuX}^T;=Nf1@=kgacdweg z!`u9R9JYdddQq{a4||=`IDT&a`Z(+pb!s|OTNIc*Dnu_PS)Z&d|A7+lMeE(X18I$73WLq@TIkCI@HkYkYx|*k1i0)~fRY3(&@eZ%Rj|VZqkVS&W!9lE{uNB|=A4OoVN@{bjRnp9pe) zf~*WA<>d%{Kq(l5L^Pq8-$mG?l?g=X1B-Fw;heb89liTMjkyu_h!{afQA#Zb7Ly_m z#rbs1U(K-_MmeFpOVJ!6ofpR2w*LF}PnSZd=)y743wxSw!+8;hXZy?)MO1o6=$v@? znj|kyr_wLo{-WiVE|HWPQlwuR2b%Cp%Un$mD_m2f-8D&ipLfDOq}@9`gHoe+>cY%V zZTSZ<(Lfx--x$wtr_kIljW1pq*901lc3JUv-C-b zBzzLKIE0W|wENoK!>Kt4Z3;XZR#E^LhBq#YXMT@Cfil)TtB6AhO6(F?1^4J^Xb< zfKG*ir;wg<6?7saq7|OdiC{Gqt8Iwgs;2%E0IsbNPR)_DR)ith32(rBFq?YU^Kb{i z$DZBz6So4M;Y-1TkcMP6@F>E%A#98A@M;>IqH*5~;V?udT@N-S3oVU{KvGkEE;pSZ zlkG$e8F`hcEO9_Pfc|h+GVX;V)YLXOFjlRI1G@%0(Q^FJeZ*cJ-3s<+F?Ya_^qan| z45NJq_7V~y0qw##_IV&t`xp-~II=lHo_j$NZRnu!CfOtV5F8CGCVOP-h3pIZ3Ah3j zZxD+K2)(bLgp2!0IJ=*O<4p+|3hyzl>L=k#QlfNtpOmOf>;lD$>6^^RsD47$#ZdMb zzX64ZFGY*L7IPYf{&J2q=q1bLj*_v6F)f2`Xa^EyQ0j|;I^XBnw4AGsY>LdtRK|-^ za=b_pp7x+|eFp-gEUhBY(;QAvgIuhM&hO{sjuQ1QD3;C7?k8&tDNz=Cyq|>Mni7P~ z-)F9(w7I>XgqnU5t}!Lh=EnW~ButBy5aQUG3o;Rx8l9yPrZ`cJX7>}7&h{8L%zR#D$d{%|{LmDAfCPE?niiuP`|(jMb#u%HUz zkN_sdI4@z=pVu%b6_dI-JoL%Z&i<0BqN@s!bkLY+;#dzi@v}@k#lnv_aqJG5;Rz<5 zYT=*bv@ztRTlo7Xo@wE)m^c>Q&G=hP9P0`u{-lZLTlnuxywJjbX5tu^nEcHqUSZ+& zCSGgdr6%5J;d6kaPi;bhW8y8$6AE95(vK8<-+uZW41hFwNbF6t9baJiI>rn9qCPK0NI7VtRG z>G<8mhjIAL;=@Jr)yZRean5J*nCIi}JM@)~{^eE(y7k5T4t+act;X4*$!E5S@ZNaA z6%Q^FpA%?rf*>YXM1dNDe}6=t0eN4V^1f!&uSB>Z1njrueJxN!2-t7Q`x>Y`w)D+> z^~iJcJ?arG(QkKRwuoOlYG!+{y5xAQsQC1Ez`^WxsH2|8Bl@w-_~#Mh*1vnRdK!{* z^fy8`!lXESg%eD@sG%5{?xqLCqBKq~4acSvR_}Ra=}`A*EaCr^OZboTB+(O|xK|Ke ztlv+@gPh-hXA^lg=&ylm(#E)*ocwbg~U8mk5s=_t> z*N<=zrIBT-A4JEirnN*~B&wx1rP6`B=svL3k`q|ZO=SjSB#rxz z!93mevf1^|iI>ghBBmC^iED}sKII~A{2VQw$Bgo=wD8;s241A^2IQJm4ptM!;#8n| z_n8S;I%@SnKr!NEJdbsRJpJSD)9Kx8{!POk4jD9@bg2OJ27b#-;N&BFcx~JxO$6eY z$E(P)-D1n>kd-u?Phj4w{I$*afdkHi(4-Xf&o$j8lE;8#LMz-tG-vnTSJV2o@F0Ld@dVtt2UMOk#r*onPI)72E2IejTHtnwQsY!*ghDURWwik z%%5aj2JIrpHKqdLLX^{Et_F=&myP3kjI3*(_MwPJ8UE8SW@Yp38?%Pu5ZTk7=n^ck zp3`Pwo2As>Z@UC-}M ze^kcrRDb7ptbgivtUubxcWVF4?^u8LcdWnm9qXU}|4V<#=?7X;{Xb$Hk)Rz0vZJ`QwOdp?QS$U3}I;911)|rW@3BG-4jFm^`flpGyRx-BPKZTo-3Ay^k znA{}#^xKj{90o$Z=*oD2CLY5?^H{N(^PV?ut9nl>`dyq^nX3N$x#Z`p{ysd7=V36Q z@jMFwihlyXbRx$B;c4Q043Df}2l@95H|8RY-}1nDOf8Uy{d9Bd`Q6mv-6>+UuR7zv>m>z z_tZP4L!K||T^xtaQ>TCGjeAj?M>MSShz8g8_WH+qv$m;sIhpo#-!>ZiVMI-DgIw|E zR~BaRFRCp|;YfVJ%a(f6_IuasOU(-}5qb}G!MP8KK9K0)xx*=N&7leKX+HhK6+Ak8 zf;k_8iTE;y^?DbaZKH-Xrj6vpe98fuDOg^8Wbj}zUAjbi<6USiLVT=RI4r82Hb{GS- z=Q?mJa6oyV1KKCzI9z+9|3-XBVvHfuSnD9fqQ;orgd z#w-<)SB_aF;Oa3C38vK!6Rva!`p9Jt!3Qm2y7or3r3q}*L9EB=YaN8tfs20BK|tVc zi3t#+7jr9;r6hTwyI#=|SCOD#>F8M7NPH2oO| zAvNg`5?UMr0$(q20f9dxaRGr>h6p+e{(h9 zzY8GZ*vx+yKx}JbgDgO$e#aB=|1N;YHOWEjuYJe%|G%;TlF@2g4Z-~OU*UR3G{0?p zr@tx=V4Hg<{BWTI-dVwT=z4YO_t4GzO1rIt(wdI*NZ0>~bBlJIUcWr(dMr<$FTU0Q zS3TNgeE0{9cJ=wmIM1US_Wdjjmu{UL{(E+N;$sl0=-b-%o*uVt*SBC?@}_RwwkNa< zoeDN@A__o}WGWJ>M}WTP(4OY-k!LZ-4R7R4z5MmKe_~MQ-OvjR9Ow^s`ObJg&~5m9#NGs)#tv`uAA=VT`1uHbikg~q-${y+ zjls!dUx@n$o0z=D*PG{lKREtT%p&lv!LYx8h>_2WzPN88TD&{1Uj9iUO&wmQuWAq%YJYTZi!mNl){0hnKv3TbI7A`P;aLQ9ivVX02wkflume`V6;? z=R?AVZ}4PP{~mqsF@NNFC%GQAzT??q`-0v2u4tU!hY$-rI9`Z@cG!5uFn)(|0$!rm zvUdB=!k`sz8143-tOe5f_8Znd4jHc_8Gbtq?+2ouk(|6~I?i1%>}iCV+Ttq}`0xUl zc7w^%2k#4iZv1VOkgoo`6|dYzmrq}Nz`(IItxCLhH`nFZ zn1YOBCWTLc82|VklEoI>uo!s=#_ z-b;`@Y=og~hv2OCFg>0NmpEDNvR1EhP?-bcF{JABr5Rkq!oKweQE+Nb2ty{UVX-2& zg|LRzmfY62PKCW411nBXLtn)|-bUwyilbe;*Ttry7^|r$Hr9}gP%2M9;!FDkFDZK4 z!blGFwd*i8qM)G<8sa^WFy7f=9A-hwzNq3rVp#nBFw?Bi=eoQjlUxSL`}4bRieZ~6w6t# zHyWQpGaj#l)%&(8kMfa<7BFJ#p1}5z3U&D+;YFSjpENaIe*pO_BZbrPq>4+CEt$pD ze70qAr3^bt7X8!EXa@P($iV8{Hk=#BP0-QsL6sN_{fSu)B)vDKPpfzM9MLM;LOUn{ zWjGJftoPZ)*QPoB(e%HgE{PW#%?fcafqFgaS&-B)?+7g;)T{T&Fr*>dhymKqTyY+WWFzFM%#dB?MX$`oSa8tx`7Yu z0 z_nD{~p+BN0qGZlX8QcLV9G|fbJPcVQLY@*FMmkFZx|-~ET{W&;Af!pK+e79u#1f>x zV|0M{)*hC+7o29jm=>9_ZOWoBQa-tJA)nEfA$G;l~l>RmZ3l6|n*rSYu* zk^O_nJ}Y*b{S|$h6$e7tc?r33QZBnV*0zz5JD@#MXpdfqGRvd4|su%bW_)`Kw9 z9*=^-$`4;|PBBiQ)sb;9+Ex7ws*((a>|}9{#HtQ_Iofy=<18(}H>1Iwir2TX=7oce z#n>ckPx|^2*~rAZjqYEQ)ogCjVt>i%aQjwz1bR{Nxkq|k_5HXPABDTDA9vMJxUcHRU33)g@Au=L zeH89X`*G(Ug`0&M`6QCMJR}^*Q{uDV#%I4mNB24?Hioyb5!U@7_0FToIu&c)B|+1y5kW>7*`(D)b@phtDAMjGa05*|a7Wzay~ zQOgdoINdi6P+Qo<2WwJqAS}c;aR&6`E#^wMUD$I+5ysXS`gNbMXs_6k-cK`r>~Ap5 zZbw)*M(tZdf5MYcZ-5@Hg|o)!RzB}2Li0>fq2JTpLv)8FI<}u^`Ex(H96}AIYz@M? z^C|I@K8ewuwxzS5#6KKG;!jOEp-%xf=c4;Dr(9LA?uH++H~QumqEdu-wt)$MD`6!f z*y`ugl!NNG8^OkcRj55Qr;Xv4lEDFJ%pe2DxHbm*DoSXjgtN)8z|LTfA-foujKBd$ z7cCc3#-M{!I(O;gqsGc%2xZC!g+GG)hW6qqqMDg<3L+bK(-{4F^_EQ(@E<2@4x645 z|GdDM1j*ftW76cP#yDA~8P#(hZ45qeHqBhDqr{GTnTyEBN51;GY0fpwg{^n~pQiB; z(l60(V>$Z7`2?J(@nWmB^m}rAfm!ONM_BdpA!Al>{QDfk;B=ap z1aka{4d($y7=MDaysS_C9*Rjf5@ut9esLtK z^Qf>h>>$IHpmbj%yj|>2O?(73D*4O%>z9qF-F_KA$^!mtqvB5NANP9^)o;5X(%>gS zD_V6K%-k0~N_;TKI8g@HAdpN80OfulzYno^901z!Io?t^2=uDLg% zq0k$cI`djm2ZJpXfTcoc6p^aJJqSrJ3ReShP!}B*^d$*+=v$^38Dz^yf zoA$Sdr!o9xhF>{g_<0PU@iT;96bb)N^=U`Jq14-X$2#*0?tj?r9kttm`q8((%XZCw z=E6gSM-bVE>L0iXpZYkQmxh{!&sTkmGb^{CTIAx43pNX|+?us*(d>*jd3F!|9adoZ z9mRhzE)JE>Ljj?+ zw1`~vS~w8%HTEy~g?W6QtNsiwK4!b> zPI52@GQy+ZLTirGvbr1aSs9%ByvF)h6DYBWKmU9SS`Pn*Cphp3FN$v5cConaKSfE; z#xK{#f=AML#nMS@!l$AYH-1I<$*X6Y`Ovdj5?UoxW|vf#)hu+*sjaMb=9S?8-8VW@ z>jbT+tb9>rX?fbQ1MshUt) zQC@modELC4lDe`>FLhQ;C|XcgS$5vkY?D5n^wj!Fe|efRVZ!8gtgR|g35%SgI+^rttq>-MvQ1o1)xu>@mkEvL0C;&4dnY*YZkFIXZOC zHp9uwYt|%cn`x;W<9Ds_3o^1x>ip$&S7=iU8>%ZyOW^gu-T6eZkh5;NTR>A@Mmhx+ zRMeH1l$jzezAnipm~mV8RIzwmVWYE$=#+STvItgsE!;%=-Pg(dJ8Rq`EL}pkg!vK< zod1l8)Hjkxn-%gc{iJ-$&XxjH&;BF5sbzwvy86;fGelJ@s;sW`Pbe)_%v#>h!7=5@ zlX=fE9mE{?kyKRj@lM>*l=IG8SX+tv0&oDp6)E`ng>CC2z9Yl#Y$+_iq^`c)SF*UK z!Jk@MQBvnT7Y#~C?WaME7XcHU1=1=jpVzS9y!y%o)g@K+eYn32LY3^2h6NRVcsqtV z&n`PwaXJ^4FLaiamDQEk*E`Rys%j)nUZpi<<$|lIwyvfW3^jH2SC?HwE5W@+s+8H6 z*eONTHPz*`pJ}K_A=xY9L|^alls}^*Ef{c`-^D%@o?b(t7#$ybcF1EZQX0XWI4W%J0;qm|R@Nr!mP{C$Z zEnqq}!d3t_VgIrVFduuwy`42?( zjkM1@;qW@ZbifWkH((dwI>6*(kUpRj(D`0CTu6K`>_WT;{D4h>2H*-ng?0u^0bB=| z4%h{#0T%Cvo{(D$$p0k2;sDYGT!WRb6s)wZ155{O1=IjL0gC~<02={&09ODyzJUDz z`F|B#0rLTO0~Q1J0M-H~qnw)noq#Ie*$e+@LG*M@i5sn!nQogSqcSCZM zGVSC`&YkEw6I8)Nm~dmhPoy|BK{?5-B$(+c$|QtQRwvS(iEaACmNjn0Gr}=_M9TCL z&gmmkr;kYYjL4ihqUpHiq05E@lkQGjo^WTph&LDU46JsHMqNo9z@)(2gBjB(bfkj3(p95RF=SGmLcu2`=M}HeDNGM zHErP;k?I+d-kh{7@$Q7>@zg63dey?WoB{an%4a+u@=@_HdDLy?Hkv=A*NS+rvcAcS^2UR{bW1q=VwAoS9R{q2jOT|OC;F0F#7i9e z;6VEK(}nTYB3|Kk_-f|6aKLz|F8%ZU59sMepY=5LkJ$C-dNSX`z~8Ym9Da@QYTs(3=LJSApI*0KEnDb+@4JpmgX4dd?=`|H2&kZX%Bb)?GzeUQwfdr&)`5APpSbtI!+C%v`96p%} z#Q00QuSBTO_a99Erf|591jr+xoWmHK?S`Cqw!>b#eWHCP`B~4#g1;jKeVK0mvKz3y z(=G*w*Mxc-Yp*KM8wa4bfL=QQeKqJ61JIuWy?6ln3!oQ*j?;+-3LKWzcJcB%obcy6nv{e`1pV(8l@BN4mpcr%_wbvJ-zm(a3k9AFC@!AEI2%v1 z$#yr8;ebU%6v#u0N)?e4fH0(*NQp!^NLJWe9}oCTB0mRG2sn<&g^7v+m!qUI(Oe)D zu$CeFWXNQOgn_VVzh=luh;Rbn<3yGMIUS)QWD;~a75aTnDIAuc2Pi_m1o8^qAIGpF+z z;KYyVTt{REerMx%IgtbS(QXd`iQ~C7BG(e(R|swfA}&1RvSh=BiZXtH#MAMk>^~Cm z;K!6dATkR-iu(q?xQ`|BIg$OiO~y}Lmh4Vw-2w`?4fq8Er3@jcrONk+aGW~|a3YcW zfaKsO*jUAAsv!(X#BC;^xWWma&=wU${%n%W2Vo1cKZ{?L6_N&t)OR~WI7RpyUFB;s}o659dz6=fa+F$@{bkQN}90Di-e%`)U% zhP(iT{}o(Z;e@|7LAgn^K9%DcNTnUW2K>Y|1r+9c217i!oo~{aFH0ZB97Ear@Y{~x zPNvEOan$EMA_Yiw8ek_8{_`=02)DHcNF#;wlD6XGc;0yNf!xfFLNl|p#FdRZYezA$ zEAV607ni9UAM;Iu`M{#R73nE_`M=BxVf$cx79q=lFu$y9%1YdLj80;1xKTcld?Gvpz|gCSY{G90e#Jx%;ddf_xwO>?h@`4BiCh4L?!?Pqs{vRR28b@jCh#ZI9G31wwb2<>ld4Px;2#v*(5c3JDvykc3 z%aDi3_N0s>(%Axp(t0WSbs$XVTOy~R92s(ean1+AbiN?MB?G2Y2B=iw#&jB(PO}U- zOtvi&$zjN=KwhF)Ua}5wIKvcpoLGz@n0AoJ!}t;5kwc{oKh_R0lc0mViBw)@yPSw8 zo>6$4r0eke1t0!<{nrBjwZMNZ@Lvo3*8=~qSipITTd2AQi|o8wC3K%`;))Cxfw)=y zU@ZI_M{2h4mtt_P?eM~sMO^7)+yb(f<@JT`7Vso-M>qUvv3NQ~;!X)Uj^Sm%NloZoWd)Aq+39X-smuKOYhwx6yt3Pt@MwCWqwqXALoxn{$z3rwvq(y zkl`}=cMf``{bLiFFUxh2gm+4KuY`Y)@UIeXm+&)nrG)b(TqNP065cCeYUPsc;lhgs{5usuD(!PqkHkWde_QC=>iRuBA+X-jxUwXOol(u@BisGv`m5sIf_arBaHhk!U9z`|EaKfg-G?~?JUKW%5}FUiV{l5WMf`kh8jt#R!(K_q=EzLozL zgj22+-|ENm#b%14Sp6RD&%Ql2{@tL_CeqA`)$gZs5d+uBCWzdbmi^L!*yHERej#7R z7iS4<5oER^3u!B3;#=dKHFBUayVe#Nk5+t(`pcO3);Q%0Du&DIuT9LfmGw-x20!X= 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 Zl1{2&Do4HfGUleig(9w2Gm diff --git a/tests/Grid_stencil b/tests/Grid_stencil deleted file mode 100755 index 92d844eedd06f93a24b40886982bad57a5f3fb02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97307 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 Y`DmY;|7D-9nn(F`#ZR7^7)xvaAM|vw`Tzg` From 2843264bd859404c09d8415b438ffb8b53c0ed02 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 18 May 2015 12:09:25 +0100 Subject: [PATCH 195/429] Remez tested --- lib/algorithms/approx/Remez.cc | 6 +- lib/algorithms/approx/bigfloat.h | 164 +----------------------- lib/algorithms/approx/bigfloat_double.h | 162 +++++++++++++++++++++++ lib/parallelIO/GridNerscIO.h | 2 +- scripts/configure-commands | 28 ++-- tests/Grid_remez.cc | 103 +++++++++++++++ tests/Makefile.am | 5 +- 7 files changed, 290 insertions(+), 180 deletions(-) create mode 100644 lib/algorithms/approx/bigfloat_double.h create mode 100644 tests/Grid_remez.cc diff --git a/lib/algorithms/approx/Remez.cc b/lib/algorithms/approx/Remez.cc index a787e766..4ec2270d 100755 --- a/lib/algorithms/approx/Remez.cc +++ b/lib/algorithms/approx/Remez.cc @@ -116,7 +116,7 @@ double AlgRemez::generateApprox(int num_degree, int den_degree, int a_len, double *a_param, int *a_pow) { std::cout<<"Degree of the approximation is ("<= tolerance); search(step); diff --git a/lib/algorithms/approx/bigfloat.h b/lib/algorithms/approx/bigfloat.h index 7f59ea33..aee71d03 100755 --- a/lib/algorithms/approx/bigfloat.h +++ b/lib/algorithms/approx/bigfloat.h @@ -10,7 +10,7 @@ #ifndef INCLUDED_BIGFLOAT_H #define INCLUDED_BIGFLOAT_H -#ifdef HAVE_GMP + #include #include #include @@ -202,167 +202,5 @@ public: friend int sgn(const bigfloat&); }; -#else - -typedef double mfloat; -class bigfloat { -private: - - mfloat x; - -public: - - bigfloat() { } - bigfloat(const bigfloat& y) { x=y.x; } - bigfloat(const unsigned long u) { x=u; } - bigfloat(const long i) { x=i; } - bigfloat(const int i) { x=i;} - bigfloat(const float d) { x=d;} - bigfloat(const double d) { x=d;} - bigfloat(const char *str) { x=std::stod(std::string(str));} - ~bigfloat(void) { } - operator double (void) const { return (double)x; } - static void setDefaultPrecision(unsigned long dprec) { - } - - void setPrecision(unsigned long dprec) { - } - - unsigned long getPrecision(void) const { return 64; } - unsigned long getDefaultPrecision(void) const { return 64; } - - bigfloat& operator=(const bigfloat& y) { x=y.x; return *this; } - bigfloat& operator=(const unsigned long y) { x=y; return *this; } - bigfloat& operator=(const signed long y) { x=y; return *this; } - bigfloat& operator=(const float y) { x=y; return *this; } - bigfloat& operator=(const double y) { x=y; return *this; } - - size_t write(void); - size_t read(void); - - /* Arithmetic Functions */ - - bigfloat& operator+=(const bigfloat& y) { return *this = *this + y; } - bigfloat& operator-=(const bigfloat& y) { return *this = *this - y; } - bigfloat& operator*=(const bigfloat& y) { return *this = *this * y; } - bigfloat& operator/=(const bigfloat& y) { return *this = *this / y; } - - friend bigfloat operator+(const bigfloat& x, const bigfloat& y) { - bigfloat a; - a.x=x.x+y.x; - return a; - } - - friend bigfloat operator+(const bigfloat& x, const unsigned long y) { - bigfloat a; - a.x=x.x+y; - return a; - } - - friend bigfloat operator-(const bigfloat& x, const bigfloat& y) { - bigfloat a; - a.x=x.x-y.x; - return a; - } - - friend bigfloat operator-(const unsigned long x, const bigfloat& y) { - bigfloat bx(x); - return bx-y; - } - - friend bigfloat operator-(const bigfloat& x, const unsigned long y) { - bigfloat by(y); - return x-by; - } - - friend bigfloat operator-(const bigfloat& x) { - bigfloat a; - a.x=-x.x; - return a; - } - - friend bigfloat operator*(const bigfloat& x, const bigfloat& y) { - bigfloat a; - a.x=x.x*y.x; - return a; - } - - friend bigfloat operator*(const bigfloat& x, const unsigned long y) { - bigfloat a; - a.x=x.x*y; - return a; - } - - friend bigfloat operator/(const bigfloat& x, const bigfloat& y){ - bigfloat a; - a.x=x.x/y.x; - return a; - } - - friend bigfloat operator/(const unsigned long x, const bigfloat& y){ - bigfloat bx(x); - return bx/y; - } - - friend bigfloat operator/(const bigfloat& x, const unsigned long y){ - bigfloat by(y); - return x/by; - } - - friend bigfloat sqrt_bf(const bigfloat& x){ - bigfloat a; - a.x= sqrt(x.x); - return a; - } - - friend bigfloat sqrt_bf(const unsigned long x){ - bigfloat a(x); - return sqrt_bf(a); - } - - friend bigfloat abs_bf(const bigfloat& x){ - bigfloat a; - a.x=abs(x.x); - return a; - } - - friend bigfloat pow_bf(const bigfloat& a, long power) { - bigfloat b; - b.x=pow(a.x,power); - return b; - } - - friend bigfloat pow_bf(const bigfloat& a, bigfloat &power) { - bigfloat b; - b.x=pow(a.x,power.x); - return b; - } - - friend bigfloat exp_bf(const bigfloat& a) { - bigfloat b; - b.x=exp(a.x); - return b; - } - - /* Comparison Functions */ - friend int operator>(const bigfloat& x, const bigfloat& y) { - return x.x>y.x; - } - - friend int operator<(const bigfloat& x, const bigfloat& y) { - return x.x=0 ) return 1; - else return 0; - } - - /* Miscellaneous Functions */ - - // friend bigfloat& random(void); -}; - -#endif #endif diff --git a/lib/algorithms/approx/bigfloat_double.h b/lib/algorithms/approx/bigfloat_double.h new file mode 100644 index 00000000..d928b4a2 --- /dev/null +++ b/lib/algorithms/approx/bigfloat_double.h @@ -0,0 +1,162 @@ +#include + +typedef double mfloat; +class bigfloat { +private: + + mfloat x; + +public: + + bigfloat() { } + bigfloat(const bigfloat& y) { x=y.x; } + bigfloat(const unsigned long u) { x=u; } + bigfloat(const long i) { x=i; } + bigfloat(const int i) { x=i;} + bigfloat(const float d) { x=d;} + bigfloat(const double d) { x=d;} + bigfloat(const char *str) { x=std::stod(std::string(str));} + ~bigfloat(void) { } + operator double (void) const { return (double)x; } + static void setDefaultPrecision(unsigned long dprec) { + } + + void setPrecision(unsigned long dprec) { + } + + unsigned long getPrecision(void) const { return 64; } + unsigned long getDefaultPrecision(void) const { return 64; } + + bigfloat& operator=(const bigfloat& y) { x=y.x; return *this; } + bigfloat& operator=(const unsigned long y) { x=y; return *this; } + bigfloat& operator=(const signed long y) { x=y; return *this; } + bigfloat& operator=(const float y) { x=y; return *this; } + bigfloat& operator=(const double y) { x=y; return *this; } + + size_t write(void); + size_t read(void); + + /* Arithmetic Functions */ + + bigfloat& operator+=(const bigfloat& y) { return *this = *this + y; } + bigfloat& operator-=(const bigfloat& y) { return *this = *this - y; } + bigfloat& operator*=(const bigfloat& y) { return *this = *this * y; } + bigfloat& operator/=(const bigfloat& y) { return *this = *this / y; } + + friend bigfloat operator+(const bigfloat& x, const bigfloat& y) { + bigfloat a; + a.x=x.x+y.x; + return a; + } + + friend bigfloat operator+(const bigfloat& x, const unsigned long y) { + bigfloat a; + a.x=x.x+y; + return a; + } + + friend bigfloat operator-(const bigfloat& x, const bigfloat& y) { + bigfloat a; + a.x=x.x-y.x; + return a; + } + + friend bigfloat operator-(const unsigned long x, const bigfloat& y) { + bigfloat bx(x); + return bx-y; + } + + friend bigfloat operator-(const bigfloat& x, const unsigned long y) { + bigfloat by(y); + return x-by; + } + + friend bigfloat operator-(const bigfloat& x) { + bigfloat a; + a.x=-x.x; + return a; + } + + friend bigfloat operator*(const bigfloat& x, const bigfloat& y) { + bigfloat a; + a.x=x.x*y.x; + return a; + } + + friend bigfloat operator*(const bigfloat& x, const unsigned long y) { + bigfloat a; + a.x=x.x*y; + return a; + } + + friend bigfloat operator/(const bigfloat& x, const bigfloat& y){ + bigfloat a; + a.x=x.x/y.x; + return a; + } + + friend bigfloat operator/(const unsigned long x, const bigfloat& y){ + bigfloat bx(x); + return bx/y; + } + + friend bigfloat operator/(const bigfloat& x, const unsigned long y){ + bigfloat by(y); + return x/by; + } + + friend bigfloat sqrt_bf(const bigfloat& x){ + bigfloat a; + a.x= sqrt(x.x); + return a; + } + + friend bigfloat sqrt_bf(const unsigned long x){ + bigfloat a(x); + return sqrt_bf(a); + } + + friend bigfloat abs_bf(const bigfloat& x){ + bigfloat a; + a.x=fabs(x.x); + return a; + } + + friend bigfloat pow_bf(const bigfloat& a, long power) { + bigfloat b; + b.x=pow(a.x,power); + return b; + } + + friend bigfloat pow_bf(const bigfloat& a, bigfloat &power) { + bigfloat b; + b.x=pow(a.x,power.x); + return b; + } + + friend bigfloat exp_bf(const bigfloat& a) { + bigfloat b; + b.x=exp(a.x); + return b; + } + + /* Comparison Functions */ + friend int operator>(const bigfloat& x, const bigfloat& y) { + return x.x>y.x; + } + + friend int operator<(const bigfloat& x, const bigfloat& y) { + return x.x=0 ) return 1; + else return 0; + } + + /* Miscellaneous Functions */ + + // friend bigfloat& random(void); +}; + + diff --git a/lib/parallelIO/GridNerscIO.h b/lib/parallelIO/GridNerscIO.h index 4094ab70..8a1775f1 100644 --- a/lib/parallelIO/GridNerscIO.h +++ b/lib/parallelIO/GridNerscIO.h @@ -481,7 +481,7 @@ inline void writeNerscObject(Lattice &Umu,std::string file,munger munge,in // Now write the body ////////////////////////////////////////////////// { - std::ofstream fout(file,std::ios::binary|std::ios::in); + std::ofstream fout(file,std::ios::binary|std::ios::out); fout.seekp(offset); Umu = zero; diff --git a/scripts/configure-commands b/scripts/configure-commands index 5e83fa89..89b72294 100755 --- a/scripts/configure-commands +++ b/scripts/configure-commands @@ -17,46 +17,46 @@ echo -e $YELLOW case $WD in g++-sse4) - CXX=g++-5 ../../configure --enable-simd=SSE4 CXXFLAGS="-msse4 -O3 -std=c++11" --enable-comms=none + CXX=g++-5 ../../configure --enable-simd=SSE4 CXXFLAGS="-msse4 -O3 -std=c++11" LIBS="-lgmp -lmpfr" --enable-comms=none ;; g++-avx) - CXX=g++-5 ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none + CXX=g++-5 ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" LIBS="-lgmp -lmpfr" --enable-comms=none ;; icpc-avx) - CXX=icpc ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none + CXX=icpc ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" LIBS="-lgmp -lmpfr" --enable-comms=none ;; icpc-avx2) - CXX=icpc ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -std=c++11" --enable-comms=none + CXX=icpc ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -std=c++11" LIBS="-lgmp -lmpfr" --enable-comms=none ;; icpc-avx512) - CXX=icpc ../../configure --enable-simd=AVX512 CXXFLAGS="-xCOMMON-AVX512 -O3 -std=c++11" --host=none --enable-comms=none + CXX=icpc ../../configure --enable-simd=AVX512 CXXFLAGS="-xCOMMON-AVX512 -O3 -std=c++11" --host=none LIBS="-lgmp -lmpfr" --enable-comms=none ;; icpc-mic) - CXX=icpc ../../configure --host=none --enable-simd=AVX512 CXXFLAGS="-mmic -O3 -std=c++11" LDFLAGS=-mmic --enable-comms=none + CXX=icpc ../../configure --host=none --enable-simd=AVX512 CXXFLAGS="-mmic -O3 -std=c++11" LDFLAGS=-mmic LIBS="-lgmp -lmpfr" --enable-comms=none ;; clang-avx) -CXX=clang++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" --enable-comms=none +CXX=clang++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" LIBS="-lgmp -lmpfr" --enable-comms=none ;; clang-avx2) -CXX=clang++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -std=c++11" --enable-comms=none +CXX=clang++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -std=c++11" LIBS="-lgmp -lmpfr" --enable-comms=none ;; clang-avx-openmp) -CXX=clang-omp++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -std=c++11" LDFLAGS="-fopenmp" --enable-comms=none +CXX=clang-omp++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -std=c++11" LDFLAGS="-fopenmp" LIBS="-lgmp -lmpfr" --enable-comms=none ;; clang-avx2-openmp) -CXX=clang-omp++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -fopenmp -O3 -std=c++11" LDFLAGS="-fopenmp" --enable-comms=none +CXX=clang-omp++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -fopenmp -O3 -std=c++11" LDFLAGS="-fopenmp" LIBS="-lgmp -lmpfr" --enable-comms=none ;; clang-avx-openmp-mpi) -CXX=clang-omp++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi +CXX=clang-omp++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" LIBS="-lgmp -lmpfr" --enable-comms=mpi ;; clang-avx2-openmp-mpi) -CXX=clang-omp++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" --enable-comms=mpi +CXX=clang-omp++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" LIBS="-lgmp -lmpfr" --enable-comms=mpi ;; clang-avx-mpi) -CXX=clang++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx " --enable-comms=mpi +CXX=clang++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx " LIBS="-lgmp -lmpfr" --enable-comms=mpi ;; clang-avx2-mpi) -CXX=clang++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx " --enable-comms=mpi +CXX=clang++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx " LIBS="-lgmp -lmpfr" --enable-comms=mpi ;; esac echo -e $NORMAL diff --git a/tests/Grid_remez.cc b/tests/Grid_remez.cc new file mode 100644 index 00000000..b5993917 --- /dev/null +++ b/tests/Grid_remez.cc @@ -0,0 +1,103 @@ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +class MultiShiftFunction { +public: + std::vector poles; + std::vector residues; + double norm; + double lo,hi; + MultiShiftFunction(int n,double _lo,double _hi): poles(n), residues(n), lo(_lo), hi(_hi) {;}; + double approx(double x); + void csv(std::ostream &out); + void gnuplot(std::ostream &out); +}; +double MultiShiftFunction::approx(double x) +{ + double a = norm; + for(int n=0;n Date: Mon, 18 May 2015 16:28:29 +0100 Subject: [PATCH 196/429] Convience function --- scripts/linecount | 3 +++ 1 file changed, 3 insertions(+) create mode 100755 scripts/linecount diff --git a/scripts/linecount b/scripts/linecount new file mode 100755 index 00000000..c0731b23 --- /dev/null +++ b/scripts/linecount @@ -0,0 +1,3 @@ +#!/bin/sh + +wc -l */*.h */*/*.h */*/*/*.h */*.cc */*/*.cc */*/*/*.cc \ No newline at end of file From f9a8377fe6bfebf50cd107d3123b9f27fb4e2ecc Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 18 May 2015 16:35:48 +0100 Subject: [PATCH 197/429] lib/algorithms/approx/bigfloat.h --- scripts/cleanup | 3 +++ scripts/substitute | 6 ++++++ 2 files changed, 9 insertions(+) create mode 100755 scripts/cleanup create mode 100755 scripts/substitute diff --git a/scripts/cleanup b/scripts/cleanup new file mode 100755 index 00000000..956a6884 --- /dev/null +++ b/scripts/cleanup @@ -0,0 +1,3 @@ +find . -name "*~" -print -exec rm -f {} \; +find . -name "errs" -print -exec rm -f {} \; +find . -name "log" -print -exec rm -f {} \; diff --git a/scripts/substitute b/scripts/substitute new file mode 100755 index 00000000..3066c4ef --- /dev/null +++ b/scripts/substitute @@ -0,0 +1,6 @@ +#!/bin/bash + +export LANG=C +find . -name "*.cc" -print -exec sed -e "s/${1}/${2}/g" -i .bak {} \; +find . -name "*.h" -print -exec sed -e "s/${1}/${2}/g" -i .bak {} \; +find . -name "*.bak" -exec rm -f {} \; From b5af3fbe45c7270baec80d4309362edcdc84237d Mon Sep 17 00:00:00 2001 From: neo Date: Tue, 19 May 2015 13:36:03 +0900 Subject: [PATCH 198/429] Merging with upstream --- README.md | 2 ++ lib/simd/Grid_vector_types.h | 6 ------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 80714d76..e18ca474 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,8 @@ MPI, OpenMP, and SIMD parallelism are present in the library. by setting variables in the command line or in the environment. Here are examples: + ./configure CXX=clang++ CXXFLAGS="-std=c++11 -O3 -msse4" --enable-simd=SSE4 + ./configure CXX=clang++ CXXFLAGS="-std=c++11 -O3 -mavx" --enable-simd=AVX1 ./configure CXX=clang++ CXXFLAGS="-std=c++11 -O3 -mavx2" --enable-simd=AVX2 diff --git a/lib/simd/Grid_vector_types.h b/lib/simd/Grid_vector_types.h index 14b2ddf0..360e9f1b 100644 --- a/lib/simd/Grid_vector_types.h +++ b/lib/simd/Grid_vector_types.h @@ -37,7 +37,6 @@ namespace Grid { /* @brief Grid_simd class for the SIMD vector type operations - */ template < class Scalar_type, class Vector_type > class Grid_simd { @@ -100,14 +99,9 @@ namespace Grid { template < class S = Scalar_type,typename std::enable_if < std::is_integral < S >::value, int >::type = 0 > friend inline void vzero(Grid_simd &ret) { vsplat(ret,0); } - - // do not compile if real or integer, send an error message from the compiler template < class S = Scalar_type,typename std::enable_if < is_complex < S >::value, int >::type = 0 > friend inline void vcomplex_i(Grid_simd &ret){ vsplat(ret,0.0,1.0);} - - - //////////////////////////////////// // Arithmetic operator overloads +,-,* From 4cadf11d1d4f57f28f564d3d779e82353c8c8d38 Mon Sep 17 00:00:00 2001 From: neo Date: Tue, 19 May 2015 13:54:55 +0900 Subject: [PATCH 199/429] Added check of mpfr and gmp at configure time It generates automatically the linker flags or complains if not found. --- README | 2 + configure | 104 +++++++++++++++++++++++++ configure.ac | 16 +++- lib/Grid_config.h | 121 ----------------------------- lib/Grid_config.h.in | 6 ++ lib/Makefile.am | 3 +- lib/algorithms/approx/.dirstamp | 0 lib/algorithms/approx/Remez.cc | 0 lib/algorithms/approx/Remez.h | 0 lib/algorithms/approx/Zolotarev.cc | 0 lib/algorithms/approx/Zolotarev.h | 0 lib/algorithms/approx/bigfloat.h | 0 lib/communicator/.dirstamp | 0 lib/qcd/.dirstamp | 0 lib/simd/Grid_sse4.cpp | 19 +++++ lib/simd/Grid_vector_types.h | 8 +- lib/stamp-h1 | 1 - lib/stencil/.dirstamp | 0 18 files changed, 155 insertions(+), 125 deletions(-) delete mode 100644 lib/Grid_config.h delete mode 100644 lib/algorithms/approx/.dirstamp mode change 100755 => 100644 lib/algorithms/approx/Remez.cc mode change 100755 => 100644 lib/algorithms/approx/Remez.h mode change 100755 => 100644 lib/algorithms/approx/Zolotarev.cc mode change 100755 => 100644 lib/algorithms/approx/Zolotarev.h mode change 100755 => 100644 lib/algorithms/approx/bigfloat.h delete mode 100644 lib/communicator/.dirstamp delete mode 100644 lib/qcd/.dirstamp create mode 100644 lib/simd/Grid_sse4.cpp delete mode 100644 lib/stamp-h1 delete mode 100644 lib/stencil/.dirstamp diff --git a/README b/README index 41b66b6b..17e92fa0 100644 --- a/README +++ b/README @@ -33,6 +33,8 @@ MPI parallelism is UNIMPLEMENTED and for now only OpenMP and SIMD parallelism is by setting variables in the command line or in the environment. Here is are examples: + ./configure CXX=clang++ CXXFLAGS="-std=c++11 -O3 -msse4" --enable-simd=SSE4 + ./configure CXX=clang++ CXXFLAGS="-std=c++11 -O3 -mavx" --enable-simd=AVX1 ./configure CXX=clang++ CXXFLAGS="-std=c++11 -O3 -mavx2" --enable-simd=AVX2 diff --git a/configure b/configure index e7d9f32f..8c9e8c59 100755 --- a/configure +++ b/configure @@ -4502,6 +4502,11 @@ _ACEOF # Checks for library functions. +echo +echo Checking libraries +echo ::::::::::::::::::::::::::::::::::::::::::: + + for ac_func in gettimeofday do : ac_fn_cxx_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" @@ -4514,6 +4519,105 @@ fi done +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpf_init in -lgmp" >&5 +$as_echo_n "checking for __gmpf_init in -lgmp... " >&6; } +if ${ac_cv_lib_gmp___gmpf_init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgmp $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char __gmpf_init (); +int +main () +{ +return __gmpf_init (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_gmp___gmpf_init=yes +else + ac_cv_lib_gmp___gmpf_init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpf_init" >&5 +$as_echo "$ac_cv_lib_gmp___gmpf_init" >&6; } +if test "x$ac_cv_lib_gmp___gmpf_init" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBGMP 1 +_ACEOF + + LIBS="-lgmp $LIBS" + +else + as_fn_error $? "GNU Multiple Precision GMP library was not found in your system. +Please install or provide the correct path to your installation +Info at: http://www.gmplib.org" "$LINENO" 5 +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpfr_init in -lmpfr" >&5 +$as_echo_n "checking for mpfr_init in -lmpfr... " >&6; } +if ${ac_cv_lib_mpfr_mpfr_init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmpfr $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char mpfr_init (); +int +main () +{ +return mpfr_init (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_mpfr_mpfr_init=yes +else + ac_cv_lib_mpfr_mpfr_init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpfr_mpfr_init" >&5 +$as_echo "$ac_cv_lib_mpfr_mpfr_init" >&6; } +if test "x$ac_cv_lib_mpfr_mpfr_init" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBMPFR 1 +_ACEOF + + LIBS="-lmpfr $LIBS" + +else + as_fn_error $? "GNU Multiple Precision MPFR library was not found in your system. +Please install or provide the correct path to your installation +Info at: http://www.mpfr.org/" "$LINENO" 5 +fi + diff --git a/configure.ac b/configure.ac index 14170f4e..93e2b574 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ # # Project Grid package # -# Time-stamp: <2015-05-18 17:14:20 neo> +# Time-stamp: <2015-05-19 13:51:08 neo> AC_PREREQ([2.69]) AC_INIT([Grid], [1.0], [paboyle@ph.ed.ac.uk]) @@ -46,8 +46,22 @@ AC_TYPE_UINT32_T AC_TYPE_UINT64_T # Checks for library functions. +echo +echo Checking libraries +echo ::::::::::::::::::::::::::::::::::::::::::: + + AC_CHECK_FUNCS([gettimeofday]) +AC_CHECK_LIB([gmp],[__gmpf_init],, + [AC_MSG_ERROR(GNU Multiple Precision GMP library was not found in your system. +Please install or provide the correct path to your installation +Info at: http://www.gmplib.org)]) + +AC_CHECK_LIB([mpfr],[mpfr_init],, + [AC_MSG_ERROR(GNU Multiple Precision MPFR library was not found in your system. +Please install or provide the correct path to your installation +Info at: http://www.mpfr.org/)]) diff --git a/lib/Grid_config.h b/lib/Grid_config.h deleted file mode 100644 index e1674850..00000000 --- a/lib/Grid_config.h +++ /dev/null @@ -1,121 +0,0 @@ -/* lib/Grid_config.h. Generated from Grid_config.h.in by configure. */ -/* lib/Grid_config.h.in. Generated from configure.ac by autoheader. */ - -/* AVX */ -/* #undef AVX1 */ - -/* AVX2 */ -/* #undef AVX2 */ - -/* AVX512 */ -/* #undef AVX512 */ - -/* GRID_COMMS_MPI */ -/* #undef GRID_COMMS_MPI */ - -/* GRID_COMMS_NONE */ -#define GRID_COMMS_NONE 1 - -/* Define to 1 if you have the declaration of `be64toh', and to 0 if you - don't. */ -#define HAVE_DECL_BE64TOH 1 - -/* Define to 1 if you have the declaration of `ntohll', and to 0 if you don't. - */ -#define HAVE_DECL_NTOHLL 0 - -/* Define to 1 if you have the header file. */ -#define HAVE_ENDIAN_H 1 - -/* Define to 1 if you have the `gettimeofday' function. */ -#define HAVE_GETTIMEOFDAY 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_GMP_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MALLOC_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_MALLOC_MALLOC_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MM_MALLOC_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* Name of package */ -#define PACKAGE "grid" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "paboyle@ph.ed.ac.uk" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "Grid" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "Grid 1.0" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "grid" - -/* Define to the home page for this package. */ -#define PACKAGE_URL "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "1.0" - -/* SSE4 */ -#define SSE4 1 - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Version number of package */ -#define VERSION "1.0" - -/* Define for Solaris 2.5.1 so the uint32_t typedef from , - , or is not used. If the typedef were allowed, the - #define below would cause a syntax error. */ -/* #undef _UINT32_T */ - -/* Define for Solaris 2.5.1 so the uint64_t typedef from , - , or is not used. If the typedef were allowed, the - #define below would cause a syntax error. */ -/* #undef _UINT64_T */ - -/* Define to `unsigned int' if does not define. */ -/* #undef size_t */ - -/* Define to the type of an unsigned integer type of width exactly 32 bits if - such a type exists and the standard includes do not define it. */ -/* #undef uint32_t */ - -/* Define to the type of an unsigned integer type of width exactly 64 bits if - such a type exists and the standard includes do not define it. */ -/* #undef uint64_t */ diff --git a/lib/Grid_config.h.in b/lib/Grid_config.h.in index 0ce09cf5..b7f56d5b 100644 --- a/lib/Grid_config.h.in +++ b/lib/Grid_config.h.in @@ -35,6 +35,12 @@ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H +/* Define to 1 if you have the `gmp' library (-lgmp). */ +#undef HAVE_LIBGMP + +/* Define to 1 if you have the `mpfr' library (-lmpfr). */ +#undef HAVE_LIBMPFR + /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H diff --git a/lib/Makefile.am b/lib/Makefile.am index 938f7ca1..557295d5 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -95,5 +95,6 @@ nobase_include_HEADERS = algorithms/approx/bigfloat.h\ simd/Grid_vComplexF.h\ simd/Grid_vInteger.h\ simd/Grid_vRealD.h\ - simd/Grid_vRealF.h + simd/Grid_vRealF.h\ + simd/Grid_vector_types.h diff --git a/lib/algorithms/approx/.dirstamp b/lib/algorithms/approx/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/algorithms/approx/Remez.cc b/lib/algorithms/approx/Remez.cc old mode 100755 new mode 100644 diff --git a/lib/algorithms/approx/Remez.h b/lib/algorithms/approx/Remez.h old mode 100755 new mode 100644 diff --git a/lib/algorithms/approx/Zolotarev.cc b/lib/algorithms/approx/Zolotarev.cc old mode 100755 new mode 100644 diff --git a/lib/algorithms/approx/Zolotarev.h b/lib/algorithms/approx/Zolotarev.h old mode 100755 new mode 100644 diff --git a/lib/algorithms/approx/bigfloat.h b/lib/algorithms/approx/bigfloat.h old mode 100755 new mode 100644 diff --git a/lib/communicator/.dirstamp b/lib/communicator/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/qcd/.dirstamp b/lib/qcd/.dirstamp deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/simd/Grid_sse4.cpp b/lib/simd/Grid_sse4.cpp new file mode 100644 index 00000000..b0be164b --- /dev/null +++ b/lib/simd/Grid_sse4.cpp @@ -0,0 +1,19 @@ +//---------------------------------------------------------------------- +/*! @file Grid_vector_types.h + @brief Defines templated class to deal with inner vector types +*/ +// Time-stamp: <2015-05-19 13:53:47 neo> +//---------------------------------------------------------------------- + +namespace Optimization { + + + + +} + +// Here assign types +namespace Grid { + + +} diff --git a/lib/simd/Grid_vector_types.h b/lib/simd/Grid_vector_types.h index 360e9f1b..7c2b1bed 100644 --- a/lib/simd/Grid_vector_types.h +++ b/lib/simd/Grid_vector_types.h @@ -1,3 +1,9 @@ +//---------------------------------------------------------------------- +/*! @file Grid_vector_types.h + @brief Defines templated class to deal with inner vector types +*/ +// Time-stamp: <2015-05-19 13:41:47 neo> +//---------------------------------------------------------------------- #ifndef GRID_VECTOR_TYPES #define GRID_VECTOR_TYPES @@ -13,8 +19,8 @@ namespace Grid { struct RealPart< std::complex >{ typedef T type; }; - //////////////////////////////////////////////////////// + //////////////////////////////////////////////////////// // Check for complexity with type traits template struct is_complex : std::false_type {}; diff --git a/lib/stamp-h1 b/lib/stamp-h1 deleted file mode 100644 index 753f890f..00000000 --- a/lib/stamp-h1 +++ /dev/null @@ -1 +0,0 @@ -timestamp for lib/Grid_config.h diff --git a/lib/stencil/.dirstamp b/lib/stencil/.dirstamp deleted file mode 100644 index e69de29b..00000000 From b29caead322d1ead527c3f78316a4b67ed9fe17d Mon Sep 17 00:00:00 2001 From: neo Date: Tue, 19 May 2015 17:21:17 +0900 Subject: [PATCH 200/429] Partial implementation of the vector types SIMD Implementing SSE4 now A systematic series of tests must be written. --- lib/Grid_config.h | 127 +++++++++++++++++++++ lib/Makefile.am | 158 +++++++++++++------------- lib/algorithms/approx/.dirstamp | 0 lib/communicator/.dirstamp | 0 lib/qcd/.dirstamp | 0 lib/simd/.dirstamp | 0 lib/simd/Grid_sse4.cpp | 19 ---- lib/simd/Grid_sse4.h | 194 ++++++++++++++++++++++++++++++++ lib/simd/Grid_vector_types.h | 125 ++++++++++++-------- lib/stamp-h1 | 1 + lib/stencil/.dirstamp | 0 tests/Grid_main.cc | 37 ++++++ 12 files changed, 516 insertions(+), 145 deletions(-) create mode 100644 lib/Grid_config.h create mode 100644 lib/algorithms/approx/.dirstamp create mode 100644 lib/communicator/.dirstamp create mode 100644 lib/qcd/.dirstamp create mode 100644 lib/simd/.dirstamp delete mode 100644 lib/simd/Grid_sse4.cpp create mode 100644 lib/simd/Grid_sse4.h create mode 100644 lib/stamp-h1 create mode 100644 lib/stencil/.dirstamp diff --git a/lib/Grid_config.h b/lib/Grid_config.h new file mode 100644 index 00000000..78582f3e --- /dev/null +++ b/lib/Grid_config.h @@ -0,0 +1,127 @@ +/* lib/Grid_config.h. Generated from Grid_config.h.in by configure. */ +/* lib/Grid_config.h.in. Generated from configure.ac by autoheader. */ + +/* AVX */ +/* #undef AVX1 */ + +/* AVX2 */ +/* #undef AVX2 */ + +/* AVX512 */ +/* #undef AVX512 */ + +/* GRID_COMMS_MPI */ +/* #undef GRID_COMMS_MPI */ + +/* GRID_COMMS_NONE */ +#define GRID_COMMS_NONE 1 + +/* Define to 1 if you have the declaration of `be64toh', and to 0 if you + don't. */ +#define HAVE_DECL_BE64TOH 1 + +/* Define to 1 if you have the declaration of `ntohll', and to 0 if you don't. + */ +#define HAVE_DECL_NTOHLL 0 + +/* Define to 1 if you have the header file. */ +#define HAVE_ENDIAN_H 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_GMP_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `gmp' library (-lgmp). */ +#define HAVE_LIBGMP 1 + +/* Define to 1 if you have the `mpfr' library (-lmpfr). */ +#define HAVE_LIBMPFR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MALLOC_MALLOC_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MM_MALLOC_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Name of package */ +#define PACKAGE "grid" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "paboyle@ph.ed.ac.uk" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "Grid" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "Grid 1.0" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "grid" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.0" + +/* SSE4 */ +#define SSE4 1 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "1.0" + +/* Define for Solaris 2.5.1 so the uint32_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +/* #undef _UINT32_T */ + +/* Define for Solaris 2.5.1 so the uint64_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +/* #undef _UINT64_T */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +/* #undef uint32_t */ + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +/* #undef uint64_t */ diff --git a/lib/Makefile.am b/lib/Makefile.am index 557295d5..82459763 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -14,87 +14,89 @@ endif # Libraries # lib_LIBRARIES = libGrid.a -libGrid_a_SOURCES =\ - Grid_init.cc\ - stencil/Grid_stencil_common.cc\ - qcd/Grid_qcd_dirac.cc\ - qcd/Grid_qcd_wilson_dop.cc\ - algorithms/approx/Zolotarev.cc\ - algorithms/approx/Remez.cc\ +libGrid_a_SOURCES = \ + Grid_init.cc \ + stencil/Grid_stencil_common.cc \ + qcd/Grid_qcd_dirac.cc \ + qcd/Grid_qcd_wilson_dop.cc \ + algorithms/approx/Zolotarev.cc \ + algorithms/approx/Remez.cc \ $(extra_sources) # # Include files # -nobase_include_HEADERS = algorithms/approx/bigfloat.h\ - algorithms/approx/Chebyshev.h\ - algorithms/approx/Remez.h\ - algorithms/approx/Zolotarev.h\ - algorithms/iterative/ConjugateGradient.h\ - algorithms/iterative/NormalEquations.h\ - algorithms/iterative/SchurRedBlack.h\ - algorithms/LinearOperator.h\ - algorithms/SparseMatrix.h\ - cartesian/Grid_cartesian_base.h\ - cartesian/Grid_cartesian_full.h\ - cartesian/Grid_cartesian_red_black.h\ - communicator/Grid_communicator_base.h\ - cshift/Grid_cshift_common.h\ - cshift/Grid_cshift_mpi.h\ - cshift/Grid_cshift_none.h\ - Grid.h\ - Grid_algorithms.h\ - Grid_aligned_allocator.h\ - Grid_cartesian.h\ - Grid_communicator.h\ - Grid_comparison.h\ - Grid_cshift.h\ - Grid_extract.h\ - Grid_lattice.h\ - Grid_math.h\ - Grid_simd.h\ - Grid_stencil.h\ - Grid_threads.h\ - lattice/Grid_lattice_arith.h\ - lattice/Grid_lattice_base.h\ - lattice/Grid_lattice_comparison.h\ - lattice/Grid_lattice_conformable.h\ - lattice/Grid_lattice_coordinate.h\ - lattice/Grid_lattice_ET.h\ - lattice/Grid_lattice_local.h\ - lattice/Grid_lattice_overload.h\ - lattice/Grid_lattice_peekpoke.h\ - lattice/Grid_lattice_reality.h\ - lattice/Grid_lattice_reduction.h\ - lattice/Grid_lattice_rng.h\ - lattice/Grid_lattice_trace.h\ - lattice/Grid_lattice_transfer.h\ - lattice/Grid_lattice_transpose.h\ - lattice/Grid_lattice_where.h\ - math/Grid_math_arith.h\ - math/Grid_math_arith_add.h\ - math/Grid_math_arith_mac.h\ - math/Grid_math_arith_mul.h\ - math/Grid_math_arith_scalar.h\ - math/Grid_math_arith_sub.h\ - math/Grid_math_inner.h\ - math/Grid_math_outer.h\ - math/Grid_math_peek.h\ - math/Grid_math_poke.h\ - math/Grid_math_reality.h\ - math/Grid_math_tensors.h\ - math/Grid_math_trace.h\ - math/Grid_math_traits.h\ - math/Grid_math_transpose.h\ - parallelIO/GridNerscIO.h\ - qcd/Grid_qcd.h\ - qcd/Grid_qcd_2spinor.h\ - qcd/Grid_qcd_dirac.h\ - qcd/Grid_qcd_wilson_dop.h\ - simd/Grid_vComplexD.h\ - simd/Grid_vComplexF.h\ - simd/Grid_vInteger.h\ - simd/Grid_vRealD.h\ - simd/Grid_vRealF.h\ - simd/Grid_vector_types.h +nobase_include_HEADERS = algorithms/approx/bigfloat.h \ + algorithms/approx/Chebyshev.h \ + algorithms/approx/Remez.h \ + algorithms/approx/Zolotarev.h \ + algorithms/iterative/ConjugateGradient.h \ + algorithms/iterative/NormalEquations.h \ + algorithms/iterative/SchurRedBlack.h \ + algorithms/LinearOperator.h \ + algorithms/SparseMatrix.h \ + cartesian/Grid_cartesian_base.h \ + cartesian/Grid_cartesian_full.h \ + cartesian/Grid_cartesian_red_black.h \ + communicator/Grid_communicator_base.h \ + cshift/Grid_cshift_common.h \ + cshift/Grid_cshift_mpi.h \ + cshift/Grid_cshift_none.h \ + Grid.h \ + Grid_algorithms.h \ + Grid_aligned_allocator.h \ + Grid_cartesian.h \ + Grid_communicator.h \ + Grid_comparison.h \ + Grid_cshift.h \ + Grid_extract.h \ + Grid_lattice.h \ + Grid_math.h \ + Grid_simd.h \ + Grid_stencil.h \ + Grid_threads.h \ + lattice/Grid_lattice_arith.h \ + lattice/Grid_lattice_base.h \ + lattice/Grid_lattice_comparison.h \ + lattice/Grid_lattice_conformable.h \ + lattice/Grid_lattice_coordinate.h \ + lattice/Grid_lattice_ET.h \ + lattice/Grid_lattice_local.h \ + lattice/Grid_lattice_overload.h \ + lattice/Grid_lattice_peekpoke.h \ + lattice/Grid_lattice_reality.h \ + lattice/Grid_lattice_reduction.h \ + lattice/Grid_lattice_rng.h \ + lattice/Grid_lattice_trace.h \ + lattice/Grid_lattice_transfer.h \ + lattice/Grid_lattice_transpose.h \ + lattice/Grid_lattice_where.h \ + math/Grid_math_arith.h \ + math/Grid_math_arith_add.h \ + math/Grid_math_arith_mac.h \ + math/Grid_math_arith_mul.h \ + math/Grid_math_arith_scalar.h \ + math/Grid_math_arith_sub.h \ + math/Grid_math_inner.h \ + math/Grid_math_outer.h \ + math/Grid_math_peek.h \ + math/Grid_math_poke.h \ + math/Grid_math_reality.h \ + math/Grid_math_tensors.h \ + math/Grid_math_trace.h \ + math/Grid_math_traits.h \ + math/Grid_math_transpose.h \ + parallelIO/GridNerscIO.h \ + qcd/Grid_qcd.h \ + qcd/Grid_qcd_2spinor.h \ + qcd/Grid_qcd_dirac.h \ + qcd/Grid_qcd_wilson_dop.h \ + simd/Grid_vComplexD.h \ + simd/Grid_vComplexF.h \ + simd/Grid_vInteger.h \ + simd/Grid_vRealD.h \ + simd/Grid_vRealF.h \ + simd/Grid_vector_types.h \ + simd/Grid_sse4.h + diff --git a/lib/algorithms/approx/.dirstamp b/lib/algorithms/approx/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/lib/communicator/.dirstamp b/lib/communicator/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/lib/qcd/.dirstamp b/lib/qcd/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/lib/simd/.dirstamp b/lib/simd/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/lib/simd/Grid_sse4.cpp b/lib/simd/Grid_sse4.cpp deleted file mode 100644 index b0be164b..00000000 --- a/lib/simd/Grid_sse4.cpp +++ /dev/null @@ -1,19 +0,0 @@ -//---------------------------------------------------------------------- -/*! @file Grid_vector_types.h - @brief Defines templated class to deal with inner vector types -*/ -// Time-stamp: <2015-05-19 13:53:47 neo> -//---------------------------------------------------------------------- - -namespace Optimization { - - - - -} - -// Here assign types -namespace Grid { - - -} diff --git a/lib/simd/Grid_sse4.h b/lib/simd/Grid_sse4.h new file mode 100644 index 00000000..ed4039b7 --- /dev/null +++ b/lib/simd/Grid_sse4.h @@ -0,0 +1,194 @@ +//---------------------------------------------------------------------- +/*! @file Grid_sse4.h + @brief Optimization libraries +*/ +// Time-stamp: <2015-05-19 17:06:51 neo> +//---------------------------------------------------------------------- + +#include + +namespace Optimization { + + struct Vsplat{ + //Complex float + inline __m128 operator()(float a, float b){ + return _mm_set_ps(b,a,b,a); + } + // Real float + inline __m128 operator()(float a){ + return _mm_set_ps(a,a,a,a); + } + //Complex double + inline __m128d operator()(double a, double b){ + return _mm_set_pd(b,a); + } + //Real double + inline __m128d operator()(double a){ + return _mm_set_pd(a,a); + } + //Integer + inline __m128i operator()(Integer a){ + return _mm_set1_epi32(a); + } + }; + + struct Vstore{ + //Float + inline void operator()(__m128 a, float* F){ + _mm_store_ps(F,a); + } + //Double + inline void operator()(__m128d a, double* D){ + _mm_store_pd(D,a); + } + //Integer + inline void operator()(__m128i a, Integer* I){ + _mm_store_si128((__m128i *)I,a); + } + + }; + + + + struct Vset{ + // Complex float + inline __m128 operator()(Grid::ComplexF *a){ + return _mm_set_ps(a[1].imag(), a[1].real(),a[0].imag(),a[0].real()); + } + // Complex double + inline __m128d operator()(Grid::ComplexD *a){ + return _mm_set_pd(a[0].imag(),a[0].real()); + } + // Real float + inline __m128 operator()(float *a){ + return _mm_set_ps(a[3],a[2],a[1],a[0]); + } + // Real double + inline __m128d operator()(double *a){ + return _mm_set_pd(a[1],a[0]); + } + // Integer + inline __m128i operator()(Integer *a){ + return _mm_set_epi32(a[0],a[1],a[2],a[3]); + } + + + }; + + struct Reduce{ + //Complex float + inline Grid::ComplexF operator()(__m128 in){ + union { + __m128 v1; + float f[4]; + } u128; + u128.v1 = _mm_add_ps(in, _mm_shuffle_ps(in,in, 0b01001110)); // FIXME Prefer to use _MM_SHUFFLE macros + return Grid::ComplexF(u128.f[0], u128.f[1]); + } + //Complex double + inline Grid::ComplexD operator()(__m128d in){ + printf("Missing complex double implementation -> FIX\n"); + return Grid::ComplexD(0,0); // FIXME wrong + } + + + + }; + + + ///////////////////////////////////////////////////// + // Arithmetic operations + ///////////////////////////////////////////////////// + struct Sum{ + //Complex/Real float + inline __m128 operator()(__m128 a, __m128 b){ + return _mm_add_ps(a,b); + } + //Complex/Real double + inline __m128d operator()(__m128d a, __m128d b){ + return _mm_add_pd(a,b); + } + //Integer + inline __m128i operator()(__m128i a, __m128i b){ + return _mm_add_epi32(a,b); + } + }; + + struct Sub{ + //Complex/Real float + inline __m128 operator()(__m128 a, __m128 b){ + return _mm_sub_ps(a,b); + } + //Complex/Real double + inline __m128d operator()(__m128d a, __m128d b){ + return _mm_sub_pd(a,b); + } + //Integer + inline __m128i operator()(__m128i a, __m128i b){ + return _mm_sub_epi32(a,b); + } + }; + + struct MultComplex{ + // Complex float + inline __m128 operator()(__m128 a, __m128 b){ + __m128 ymm0,ymm1,ymm2; + ymm0 = _mm_shuffle_ps(a,a,_MM_SHUFFLE(2,2,0,0)); // ymm0 <- ar ar, + ymm0 = _mm_mul_ps(ymm0,b); // ymm0 <- ar bi, ar br + ymm1 = _mm_shuffle_ps(b,b,_MM_SHUFFLE(2,3,0,1)); // ymm1 <- br,bi + ymm2 = _mm_shuffle_ps(a,a,_MM_SHUFFLE(3,3,1,1)); // ymm2 <- ai,ai + ymm1 = _mm_mul_ps(ymm1,ymm2); // ymm1 <- br ai, ai bi + return _mm_addsub_ps(ymm0,ymm1); + } + // Complex double + inline __m128d operator()(__m128d a, __m128d b){ + __m128d ymm0,ymm1,ymm2; + ymm0 = _mm_shuffle_pd(a,a,0x0); // ymm0 <- ar ar, + ymm0 = _mm_mul_pd(ymm0,b); // ymm0 <- ar bi, ar br + ymm1 = _mm_shuffle_pd(b,b,0x1); // ymm1 <- br,bi b01 + ymm2 = _mm_shuffle_pd(a,a,0x3); // ymm2 <- ai,ai b11 + ymm1 = _mm_mul_pd(ymm1,ymm2); // ymm1 <- br ai, ai bi + return _mm_addsub_pd(ymm0,ymm1); + } + }; + + struct Mult{ + // Real float + inline __m128 operator()(__m128 a, __m128 b){ + return _mm_mul_ps(a,b); + } + // Real double + inline __m128d operator()(__m128d a, __m128d b){ + return _mm_mul_pd(a,b); + } + // Integer + inline __m128i operator()(__m128i a, __m128i b){ + return _mm_mul_epi32(a,b); + } + + }; + + + + +} + +// Here assign types +namespace Grid { + typedef __m128 SIMD_Ftype; // Single precision type + typedef __m128d SIMD_Dtype; // Double precision type + typedef __m128i SIMD_Itype; // Integer type + + + // Function names + typedef Optimization::Vsplat VsplatSIMD; + typedef Optimization::Vstore VstoreSIMD; + + // Arithmetic operations + typedef Optimization::Sum SumSIMD; + typedef Optimization::Sub SubSIMD; + typedef Optimization::Mult MultSIMD; + typedef Optimization::MultComplex MultComplexSIMD; + typedef Optimization::Vset VsetSIMD; + +} diff --git a/lib/simd/Grid_vector_types.h b/lib/simd/Grid_vector_types.h index 7c2b1bed..030a8a79 100644 --- a/lib/simd/Grid_vector_types.h +++ b/lib/simd/Grid_vector_types.h @@ -1,12 +1,14 @@ -//---------------------------------------------------------------------- +//--------------------------------------------------------------------------- /*! @file Grid_vector_types.h - @brief Defines templated class to deal with inner vector types + @brief Defines templated class Grid_simd to deal with inner vector types */ -// Time-stamp: <2015-05-19 13:41:47 neo> -//---------------------------------------------------------------------- +// Time-stamp: <2015-05-19 17:20:36 neo> +//--------------------------------------------------------------------------- #ifndef GRID_VECTOR_TYPES #define GRID_VECTOR_TYPES +#include "Grid_sse4.h" + namespace Grid { @@ -27,18 +29,20 @@ namespace Grid { template < typename T > struct is_complex< std::complex >: std::true_type {}; //////////////////////////////////////////////////////// - - // Define the operation templates functors - template < class SIMD, class Operation > - SIMD binary(SIMD src_1, SIMD src_2, Operation op){ + // general forms to allow for vsplat syntax + // need explicit declaration of types when used since + // clang cannot automatically determine the output type sometimes + template < class Out, class Input1, class Input2, class Operation > + Out binary(Input1 src_1, Input2 src_2, Operation op){ return op(src_1, src_2); - } + } - template < class SIMD, class Operation > - SIMD unary(SIMD src, Operation op){ + template < class SIMDout, class Input, class Operation > + SIMDout unary(Input src, Operation op){ return op(src); - } + } + /////////////////////////////////////////////// /* @@ -74,36 +78,42 @@ namespace Grid { }; - /////////////////////////////////////////////// // mac, mult, sub, add, adj - // Should do an AVX2 version with mac. /////////////////////////////////////////////// friend inline void mac (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ a,const Grid_simd *__restrict__ x){ *y = (*a)*(*x)+(*y); }; friend inline void mult(Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) * (*r); } friend inline void sub (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) - (*r); } friend inline void add (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) + (*r); } + //not for integer types... FIXME friend inline Grid_simd adj(const Grid_simd &in){ return conj(in); } - ////////////////////////////////// - // Initialise to 1,0,i - ////////////////////////////////// + /////////////////////////////////////////////// + // Initialise to 1,0,i for the correct types + /////////////////////////////////////////////// // if not complex overload here - friend inline void vone(Grid_simd &ret) { vsplat(ret,1.0); } - friend inline void vzero(Grid_simd &ret) { vsplat(ret,0.0); } - + template < class S = Scalar_type,typename std::enable_if < !is_complex < S >::value, int >::type = 0 > + friend inline void vone(Grid_simd &ret) { vsplat(ret,1.0); } + template < class S = Scalar_type,typename std::enable_if < !is_complex < S >::value, int >::type = 0 > + friend inline void vzero(Grid_simd &ret) { vsplat(ret,0.0); } + // overload for complex type template < class S = Scalar_type,typename std::enable_if < is_complex < S >::value, int >::type = 0 > - friend inline void vone(Grid_simd &ret) { vsplat(ret,1.0,0.0); } + friend inline void vone(Grid_simd &ret) { vsplat(ret,1.0,0.0); } template < class S = Scalar_type,typename std::enable_if < is_complex < S >::value, int >::type = 0 > - friend inline void vzero(Grid_simd &ret) { vsplat(ret,0.0,0.0); } - + friend inline void vzero(Grid_simd &ret) { vsplat(ret,0.0,0.0); }// use xor? + // For integral type template < class S = Scalar_type,typename std::enable_if < std::is_integral < S >::value, int >::type = 0 > - friend inline void vone(Grid_simd &ret) { vsplat(ret,1); } + friend inline void vone(Grid_simd &ret) { vsplat(ret,1); } template < class S = Scalar_type,typename std::enable_if < std::is_integral < S >::value, int >::type = 0 > - friend inline void vzero(Grid_simd &ret) { vsplat(ret,0); } + friend inline void vzero(Grid_simd &ret) { vsplat(ret,0); } + template < class S = Scalar_type,typename std::enable_if < std::is_integral < S >::value, int >::type = 0 > + friend inline void vtrue (Grid_simd &ret){vsplat(ret,0xFFFFFFFF);} + template < class S = Scalar_type,typename std::enable_if < std::is_integral < S >::value, int >::type = 0 > + friend inline void vfalse(vInteger &ret){vsplat(ret,0);} + // do not compile if real or integer, send an error message from the compiler template < class S = Scalar_type,typename std::enable_if < is_complex < S >::value, int >::type = 0 > @@ -114,31 +124,44 @@ namespace Grid { //////////////////////////////////// friend inline Grid_simd operator + (Grid_simd a, Grid_simd b) { - vComplexF ret; - // FIXME call the binary op + Grid_simd ret; + ret.v = binary(a.v, b.v, SumSIMD()); return ret; }; friend inline Grid_simd operator - (Grid_simd a, Grid_simd b) { - vComplexF ret; - // FIXME call the binary op + Grid_simd ret; + ret.v = binary(a.v, b.v, SubSIMD()); return ret; }; - friend inline Grid_simd operator * (Grid_simd a, Grid_simd b) + // Distinguish between complex types and others + template < class S = Scalar_type, typename std::enable_if < is_complex < S >::value, int >::type = 0 > + friend inline Grid_simd operator * (Grid_simd a, Grid_simd b) { - vComplexF ret; - // FIXME call the binary op + Grid_simd ret; + ret.v = binary(a.v,b.v, MultComplexSIMD()); return ret; }; - + + // Real/Integer types + template < class S = Scalar_type,typename std::enable_if < !is_complex < S >::value, int >::type = 0 > + friend inline Grid_simd operator * (Grid_simd a, Grid_simd b) + { + Grid_simd ret; + ret.v = binary(a.v,b.v, MultSIMD()); + return ret; + }; + + + //////////////////////////////////////////////////////////////////////// // FIXME: gonna remove these load/store, get, set, prefetch //////////////////////////////////////////////////////////////////////// friend inline void vset(Grid_simd &ret, Scalar_type *a){ - // FIXME set + ret.v = unary(a, VsetSIMD()); } /////////////////////// @@ -147,34 +170,33 @@ namespace Grid { // overload if complex template < class S = Scalar_type > friend inline void vsplat(Grid_simd &ret, typename std::enable_if< is_complex < S >::value, S>::type c){ - Real a= real(c); - Real b= imag(c); + Real a = real(c); + Real b = imag(c); vsplat(ret,a,b); } // this only for the complex version template < class S = Scalar_type, typename std::enable_if < is_complex < S >::value, int >::type = 0 > friend inline void vsplat(Grid_simd &ret,Real a, Real b){ - // FIXME add operator + ret.v = binary(a, b, VsplatSIMD()); } - //if real fill with a, if complex fill with a in the real part + //if real fill with a, if complex fill with a in the real part (first function above) friend inline void vsplat(Grid_simd &ret,Real a){ - // FIXME add operator + ret.v = unary(a, VsplatSIMD()); } - friend inline void vstore(const Grid_simd &ret, Scalar_type *a){ - //FIXME + binary(ret.v, (Real*)a, VstoreSIMD()); } + friend inline void vprefetch(const Grid_simd &v) { _mm_prefetch((const char*)&v.v,_MM_HINT_T0); } - friend inline Scalar_type Reduce(const Grid_simd & in) { // FIXME add operator @@ -221,6 +243,7 @@ namespace Grid { inline Grid_simd &operator *=(const Grid_simd &r) { *this = (*this)*r; return *this; + // return (*this)*r; ? } inline Grid_simd &operator +=(const Grid_simd &r) { *this = *this+r; @@ -233,6 +256,12 @@ namespace Grid { + friend inline void permute(Grid_simd &y,Grid_simd b,int perm) + { + Gpermute(y,b,perm); + } + + /* friend inline void permute(Grid_simd &y,Grid_simd b,int perm) { Gpermute(y,b,perm); @@ -253,7 +282,7 @@ namespace Grid { { Gextract(y,extracted); } - + */ };// end of Grid_simd class definition @@ -286,11 +315,11 @@ namespace Grid { // Define available types (now change names to avoid clashing) - typedef __m128 SIMD_type;// decided at compilation time - typedef Grid_simd< float , SIMD_type > MyRealF; - typedef Grid_simd< double , SIMD_type > MyRealD; - typedef Grid_simd< std::complex< float > , SIMD_type > MyComplexF; - typedef Grid_simd< std::complex< double >, SIMD_type > MyComplexD; + + typedef Grid_simd< float , SIMD_Ftype > MyRealF; + typedef Grid_simd< double , SIMD_Dtype > MyRealD; + typedef Grid_simd< std::complex< float > , SIMD_Ftype > MyComplexF; + typedef Grid_simd< std::complex< double >, SIMD_Dtype > MyComplexD; diff --git a/lib/stamp-h1 b/lib/stamp-h1 new file mode 100644 index 00000000..753f890f --- /dev/null +++ b/lib/stamp-h1 @@ -0,0 +1 @@ +timestamp for lib/Grid_config.h diff --git a/lib/stencil/.dirstamp b/lib/stencil/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index 45778922..17e36df9 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -1,5 +1,9 @@ #include "Grid.h" +//DEBUG +#include "simd/Grid_vector_types.h" + + using namespace std; using namespace Grid; using namespace Grid::QCD; @@ -151,6 +155,39 @@ int main (int argc, char ** argv) scMat = sMat*scMat; // LatticeSpinColourMatrix = LatticeSpinMatrix * LatticeSpinColourMatrix + + +#ifdef SSE4 + ///////// Tests the new class Grid_simd + std::complex ctest(3.0,2.0); + std::complex ctestf(3.0,2.0); + MyComplexF TestMe1(1.0); // fill real part + MyComplexD TestMe2(ctest); + MyComplexD TestMe3(ctest);// compiler generate conversion of basic types + //MyRealF TestMe5(ctest);// Must generate compiler error + MyRealD TestMe4(2.0); + + MyComplexF TestMe6(ctestf); + MyComplexF TestMe7(ctestf); + + MyComplexD TheSum= TestMe2*TestMe3; + MyComplexF TheSumF= TestMe6*TestMe7; + + double dsum[2]; + _mm_store_pd(dsum, TheSum.v); + for (int i =0; i< 2; i++) + printf("%f\n", dsum[i]); + + float fsum[4]; + _mm_store_ps(fsum, TheSumF.v); + for (int i =0; i< 4; i++) + printf("%f\n", fsum[i]); + + vstore(TheSum, &ctest); + std::cout << ctest<< std::endl; +#endif + /////////////////////// + // Non-lattice (const objects) * Lattice ColourMatrix cm; SpinColourMatrix scm; From ffc00caea3a3308605028b27b24cf2ad07591cff Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 19 May 2015 13:57:35 +0100 Subject: [PATCH 201/429] Got unpreconditioned conjugate gradient to run and converge on a random (uniform random, not even SU(3) for now) gauge field. Convergence history is correctly indepdendent of decomposition on 1,2,4,8,16 mpi tasks. Found a couple of simd bugs which required fixed and enhanced the Grid_simd.cc test suite. Implemented the Mdag, M, MdagM, Meooe Mooee schur type stuff in the wilson dop. --- Makefile.in | 44 +++-- aclocal.m4 | 61 +++---- benchmarks/Grid_wilson.cc | 35 +++- benchmarks/Grid_wilson_cg_unprec.cc | 56 +++++++ benchmarks/Makefile.am | 6 +- config.guess | 2 +- config.sub | 2 +- configure | 13 +- lib/Grid_simd.h | 20 ++- lib/algorithms/LinearOperator.h | 13 +- lib/algorithms/iterative/ConjugateGradient.h | 16 +- lib/lattice/Grid_lattice_ET.h | 4 +- lib/lattice/Grid_lattice_arith.h | 40 ++++- lib/lattice/Grid_lattice_base.h | 2 +- lib/lattice/Grid_lattice_reality.h | 4 +- lib/math/Grid_math_reality.h | 12 +- lib/qcd/Grid_qcd_wilson_dop.cc | 160 ++++++++++--------- lib/qcd/Grid_qcd_wilson_dop.h | 5 +- lib/simd/Grid_vComplexD.h | 26 +-- lib/simd/Grid_vComplexF.h | 66 +++----- lib/simd/Grid_vInteger.h | 2 +- lib/simd/Grid_vRealD.h | 55 ++----- lib/simd/Grid_vRealF.h | 49 +++--- lib/simd/Grid_vector_types.h | 6 +- scripts/build-all | 4 +- scripts/configure-all | 2 +- scripts/configure-commands | 11 +- tests/Grid_main.cc | 8 +- tests/Grid_rng_fixed.cc | 52 ++++++ tests/Grid_simd.cc | 93 ++++++++++- tests/Grid_stencil.cc | 6 +- tests/Makefile.am | 5 +- tests/test_Grid_jacobi.cc | 2 +- 33 files changed, 566 insertions(+), 316 deletions(-) create mode 100644 benchmarks/Grid_wilson_cg_unprec.cc create mode 100644 tests/Grid_rng_fixed.cc diff --git a/Makefile.in b/Makefile.in index b6894ef6..b9fba168 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. +# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2013 Free Software Foundation, Inc. +# Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -14,7 +14,17 @@ @SET_MAKE@ VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ @@ -79,14 +89,12 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . -DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ - $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/configure $(am__configure_deps) COPYING TODO \ - compile config.guess config.sub depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d @@ -149,6 +157,9 @@ ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING ChangeLog \ + INSTALL NEWS README TODO compile config.guess config.sub \ + depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -314,7 +325,6 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -521,15 +531,15 @@ dist-xz: distdir $(am__post_remove_distdir) dist-tarZ: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) @@ -565,17 +575,17 @@ distcheck: dist esac chmod -R a-w $(distdir) chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_inst + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=.. --prefix="$$dc_install_base" \ + --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -749,6 +759,8 @@ uninstall-am: maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am +.PRECIOUS: Makefile + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/aclocal.m4 b/aclocal.m4 index 389763bf..bf79d078 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.14.1 -*- Autoconf -*- +# generated automatically by aclocal 1.15 -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -20,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002-2013 Free Software Foundation, Inc. +# Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.14' +[am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.14.1], [], +m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.14.1])dnl +[AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -103,15 +103,14 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -142,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -333,7 +332,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -409,7 +408,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -499,8 +498,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -573,7 +572,11 @@ to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi -fi]) +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further @@ -602,7 +605,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -613,7 +616,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -623,7 +626,7 @@ if test x"${install_sh}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2013 Free Software Foundation, Inc. +# Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -644,7 +647,7 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -694,7 +697,7 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -733,7 +736,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -764,7 +767,7 @@ AC_DEFUN([_AM_IF_OPTION], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -845,7 +848,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -905,7 +908,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -933,7 +936,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2013 Free Software Foundation, Inc. +# Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -952,7 +955,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2013 Free Software Foundation, Inc. +# Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/benchmarks/Grid_wilson.cc b/benchmarks/Grid_wilson.cc index e49d4515..69f5b48f 100644 --- a/benchmarks/Grid_wilson.cc +++ b/benchmarks/Grid_wilson.cc @@ -46,6 +46,13 @@ int main (int argc, char ** argv) volume=volume*latt_size[mu]; } + // Only one non-zero (y) + Umu=zero; + for(int nn=0;nn(Umu,U[nn],nn); + } + for(int mu=0;mu(Umu,mu); } @@ -53,7 +60,6 @@ int main (int argc, char ** argv) { // Naive wilson implementation ref = zero; for(int mu=0;mu + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +template +struct scal { + d internal; +}; + + Gamma::GammaMatrix Gmu [] = { + Gamma::GammaX, + Gamma::GammaY, + Gamma::GammaZ, + Gamma::GammaT + }; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(Nd,vComplexF::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + + std::vector seeds({1,2,3,4}); + GridParallelRNG pRNG(&Grid); pRNG.SeedFixedIntegers(seeds); + + LatticeFermion src(&Grid); random(pRNG,src); + std::cout << "src norm" << norm2(src)< U(4,&Grid); + + double volume=1; + for(int mu=0;mu(Umu,mu); + } + + RealD mass=0.5; + WilsonMatrix Dw(Umu,mass); + HermitianOperator HermOp(Dw); + ConjugateGradient CG(1.0e-8,10000); + CG(HermOp,src,result); + + + Grid_finalize(); +} diff --git a/benchmarks/Makefile.am b/benchmarks/Makefile.am index 2fe40feb..77ce7663 100644 --- a/benchmarks/Makefile.am +++ b/benchmarks/Makefile.am @@ -5,12 +5,14 @@ AM_LDFLAGS = -L$(top_builddir)/lib # # Test code # -bin_PROGRAMS = Grid_wilson Grid_comms Grid_memory_bandwidth Grid_su3 - +bin_PROGRAMS = Grid_wilson Grid_comms Grid_memory_bandwidth Grid_su3 Grid_wilson_cg_unprec Grid_wilson_SOURCES = Grid_wilson.cc Grid_wilson_LDADD = -lGrid +Grid_wilson_cg_unprec_SOURCES = Grid_wilson_cg_unprec.cc +Grid_wilson_cg_unprec_LDADD = -lGrid + Grid_comms_SOURCES = Grid_comms.cc Grid_comms_LDADD = -lGrid diff --git a/config.guess b/config.guess index 5f6aa02d..a12faba2 120000 --- a/config.guess +++ b/config.guess @@ -1 +1 @@ -/usr/share/automake-1.14/config.guess \ No newline at end of file +/opt/local/share/automake-1.15/config.guess \ No newline at end of file diff --git a/config.sub b/config.sub index 0abfe18c..e3c9b5ca 120000 --- a/config.sub +++ b/config.sub @@ -1 +1 @@ -/usr/share/automake-1.14/config.sub \ No newline at end of file +/opt/local/share/automake-1.15/config.sub \ No newline at end of file diff --git a/configure b/configure index e7d9f32f..b42143e2 100755 --- a/configure +++ b/configure @@ -2466,7 +2466,7 @@ test -n "$target_alias" && NONENONEs,x,x, && program_prefix=${target_alias}- -am__api_version='1.14' +am__api_version='1.15' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -2638,8 +2638,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2658,7 +2658,7 @@ else $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2986,8 +2986,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # mkdir_p='$(MKDIR_P)' -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' @@ -3046,6 +3046,7 @@ END fi + ac_config_headers="$ac_config_headers lib/Grid_config.h" # Check whether --enable-silent-rules was given. diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index af77591c..6d7411d3 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -50,15 +50,20 @@ namespace Grid { typedef std::complex Complex; inline RealF adj(const RealF & r){ return r; } - inline RealF conj(const RealF & r){ return r; } + inline RealF conjugate(const RealF & r){ return r; } inline RealF real(const RealF & r){ return r; } inline RealD adj(const RealD & r){ return r; } - inline RealD conj(const RealD & r){ return r; } + inline RealD conjugate(const RealD & r){ return r; } inline RealD real(const RealD & r){ return r; } - inline ComplexD innerProduct(const ComplexD & l, const ComplexD & r) { return conj(l)*r; } - inline ComplexF innerProduct(const ComplexF & l, const ComplexF & r) { return conj(l)*r; } + inline ComplexD conjugate(const ComplexD& r){ return(conj(r)); } + inline ComplexD adj(const ComplexD& r){ return(conjugate(r)); } + inline ComplexF conjugate(const ComplexF& r ){ return(conj(r)); } + inline ComplexF adj(const ComplexF& r ){ return(conjugate(r)); } + + inline ComplexD innerProduct(const ComplexD & l, const ComplexD & r) { return conjugate(l)*r; } + inline ComplexF innerProduct(const ComplexF & l, const ComplexF & r) { return conjugate(l)*r; } inline RealD innerProduct(const RealD & l, const RealD & r) { return l*r; } inline RealF innerProduct(const RealF & l, const RealF & r) { return l*r; } @@ -70,15 +75,14 @@ namespace Grid { inline void mult(ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) * (*r);} inline void sub (ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) - (*r);} inline void add (ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) + (*r);} - inline ComplexD adj(const ComplexD& r){ return(conj(r)); } - // conj already supported for complex + // conjugate already supported for complex inline void mac (ComplexF * __restrict__ y,const ComplexF * __restrict__ a,const ComplexF *__restrict__ x){ *y = (*a) * (*x)+(*y); } inline void mult(ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) * (*r); } inline void sub (ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) - (*r); } inline void add (ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) + (*r); } - inline ComplexF adj(const ComplexF& r ){ return(conj(r)); } - //conj already supported for complex + + //conjugate already supported for complex inline ComplexF timesI(const ComplexF &r) { return(r*ComplexF(0.0,1.0));} inline ComplexD timesI(const ComplexD &r) { return(r*ComplexD(0.0,1.0));} diff --git a/lib/algorithms/LinearOperator.h b/lib/algorithms/LinearOperator.h index bb948b95..bdb6c387 100644 --- a/lib/algorithms/LinearOperator.h +++ b/lib/algorithms/LinearOperator.h @@ -7,8 +7,8 @@ namespace Grid { // LinearOperators Take a something and return a something. ///////////////////////////////////////////////////////////////////////////////////////////// // - // Hopefully linearity is satisfied and the AdjOp is indeed the Hermitian conjugate (transpose if real): - // + // Hopefully linearity is satisfied and the AdjOp is indeed the Hermitian conjugateugate (transpose if real): + //SBase // i) F(a x + b y) = aF(x) + b F(y). // ii) = ^\ast // @@ -25,12 +25,13 @@ namespace Grid { ///////////////////////////////////////////////////////////////////////////////////////////// template class HermitianOperatorBase : public LinearOperatorBase { public: - virtual RealD OpAndNorm(const Field &in, Field &out); + virtual void OpAndNorm(const Field &in, Field &out,double &n1,double &n2); void AdjOp(const Field &in, Field &out) { Op(in,out); }; void Op(const Field &in, Field &out) { - OpAndNorm(in,out); + double n1,n2; + OpAndNorm(in,out,n1,n2); }; }; @@ -80,8 +81,8 @@ namespace Grid { Matrix &_Mat; public: HermitianOperator(Matrix &Mat): _Mat(Mat) {}; - RealD OpAndNorm(const Field &in, Field &out){ - return _Mat.MdagM(in,out); + void OpAndNorm(const Field &in, Field &out,double &n1,double &n2){ + return _Mat.MdagM(in,out,n1,n2); } }; diff --git a/lib/algorithms/iterative/ConjugateGradient.h b/lib/algorithms/iterative/ConjugateGradient.h index bcb6ab60..f7f8559e 100644 --- a/lib/algorithms/iterative/ConjugateGradient.h +++ b/lib/algorithms/iterative/ConjugateGradient.h @@ -18,6 +18,7 @@ public: std::cout << Tolerance< &Linop,const Field &src, Field &psi) {assert(0);}; void operator() (HermitianOperatorBase &Linop,const Field &src, Field &psi){ RealD cp,c,a,d,b,ssq,qq,b_pred; @@ -61,21 +62,27 @@ public: Linop.OpAndNorm(p,mmp,d,qq); + // std::cout < struct name\ GridUnopClass(UnarySub,-a); GridUnopClass(UnaryAdj,adj(a)); -GridUnopClass(UnaryConj,conj(a)); +GridUnopClass(UnaryConj,conjugate(a)); GridUnopClass(UnaryTrace,trace(a)); GridUnopClass(UnaryTranspose,transpose(a)); @@ -178,7 +178,7 @@ template inline auto op(const T1 &pred,con GRID_DEF_UNOP(operator -,UnarySub); GRID_DEF_UNOP(adj,UnaryAdj); -GRID_DEF_UNOP(conj,UnaryConj); +GRID_DEF_UNOP(conjugate,UnaryConj); GRID_DEF_UNOP(trace,UnaryTrace); GRID_DEF_UNOP(transpose,UnaryTranspose); diff --git a/lib/lattice/Grid_lattice_arith.h b/lib/lattice/Grid_lattice_arith.h index c0bbb2b6..f1e566a2 100644 --- a/lib/lattice/Grid_lattice_arith.h +++ b/lib/lattice/Grid_lattice_arith.h @@ -144,14 +144,44 @@ PARALLEL_FOR_LOOP } template strong_inline - void axpy(Lattice &ret,sobj a,const Lattice &lhs,const Lattice &rhs){ - conformable(lhs,rhs); + void axpy(Lattice &ret,sobj a,const Lattice &x,const Lattice &y){ + conformable(x,y); #pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - vobj tmp = a*lhs._odata[ss]; - vstream(ret._odata[ss],tmp+rhs._odata[ss]); + for(int ss=0;ssoSites();ss++){ + vobj tmp = a*x._odata[ss]+y._odata[ss]; + vstream(ret._odata[ss],tmp); } } + template strong_inline + void axpby(Lattice &ret,sobj a,sobj b,const Lattice &x,const Lattice &y){ + conformable(x,y); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + vobj tmp = a*x._odata[ss]+b*y._odata[ss]; + vstream(ret._odata[ss],tmp); + } + } + + template strong_inline + RealD axpy_norm(Lattice &ret,sobj a,const Lattice &x,const Lattice &y){ + conformable(x,y); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + vobj tmp = a*x._odata[ss]+y._odata[ss]; + vstream(ret._odata[ss],tmp); + } + return norm2(ret); + } + template strong_inline + RealD axpby_norm(Lattice &ret,sobj a,sobj b,const Lattice &x,const Lattice &y){ + conformable(x,y); +#pragma omp parallel for + for(int ss=0;ssoSites();ss++){ + vobj tmp = a*x._odata[ss]+b*y._odata[ss]; + vstream(ret._odata[ss],tmp); + } + return norm2(ret); // FIXME implement parallel norm in ss loop + } } #endif diff --git a/lib/lattice/Grid_lattice_base.h b/lib/lattice/Grid_lattice_base.h index ae606ae7..0016bafa 100644 --- a/lib/lattice/Grid_lattice_base.h +++ b/lib/lattice/Grid_lattice_base.h @@ -9,7 +9,7 @@ namespace Grid { // Functionality: // -=,+=,*=,() // add,+,sub,-,mult,mac,* -// adj,conj +// adj,conjugate // real,imag // transpose,transposeIndex // trace,traceIndex diff --git a/lib/lattice/Grid_lattice_reality.h b/lib/lattice/Grid_lattice_reality.h index cf86d700..2f52ed22 100644 --- a/lib/lattice/Grid_lattice_reality.h +++ b/lib/lattice/Grid_lattice_reality.h @@ -18,11 +18,11 @@ PARALLEL_FOR_LOOP return ret; }; - template inline Lattice conj(const Lattice &lhs){ + template inline Lattice conjugate(const Lattice &lhs){ Lattice ret(lhs._grid); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ - ret._odata[ss] = conj(lhs._odata[ss]); + ret._odata[ss] = conjugate(lhs._odata[ss]); } return ret; }; diff --git a/lib/math/Grid_math_reality.h b/lib/math/Grid_math_reality.h index 18a2f89b..40d4c624 100644 --- a/lib/math/Grid_math_reality.h +++ b/lib/math/Grid_math_reality.h @@ -98,26 +98,26 @@ template inline void timesMinusI(iMatrix &ret,const /////////////////////////////////////////////// // Conj function for scalar, vector, matrix /////////////////////////////////////////////// -template inline iScalar conj(const iScalar&r) +template inline iScalar conjugate(const iScalar&r) { iScalar ret; - ret._internal = conj(r._internal); + ret._internal = conjugate(r._internal); return ret; } -template inline iVector conj(const iVector&r) +template inline iVector conjugate(const iVector&r) { iVector ret; for(int i=0;i inline iMatrix conj(const iMatrix&r) +template inline iMatrix conjugate(const iMatrix&r) { iMatrix ret; for(int i=0;i(in,comm_buf,compressor); PARALLEL_FOR_LOOP @@ -140,13 +159,13 @@ PARALLEL_FOR_LOOP int ssu= ss; // Xp - offset = Stencil._offsets [Xp][ss]; - local = Stencil._is_local[Xp][ss]; - perm = Stencil._permute[Xp][ss]; - ptype = Stencil._permute_type[Xp]; + int idx = (Xp+dag*4)%8; + offset = Stencil._offsets [idx][ss]; + local = Stencil._is_local[idx][ss]; + perm = Stencil._permute[idx][ss]; - if ( local && perm ) - { + ptype = Stencil._permute_type[idx]; + if ( local && perm ) { spProjXp(tmp,in._odata[offset]); permute(chi,tmp,ptype); } else if ( local ) { @@ -154,18 +173,17 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Xp),&chi()); - //prefetch(Umu._odata[ssu](Yp)); + mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); spReconXp(result,Uchi); // Yp - offset = Stencil._offsets [Yp][ss]; - local = Stencil._is_local[Yp][ss]; - perm = Stencil._permute[Yp][ss]; - ptype = Stencil._permute_type[Yp]; + idx = (Yp+dag*4)%8; + offset = Stencil._offsets [idx][ss]; + local = Stencil._is_local[idx][ss]; + perm = Stencil._permute[idx][ss]; + ptype = Stencil._permute_type[idx]; - if ( local && perm ) - { + if ( local && perm ) { spProjYp(tmp,in._odata[offset]); permute(chi,tmp,ptype); } else if ( local ) { @@ -173,18 +191,16 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Yp),&chi()); - // prefetch(Umu._odata[ssu](Zp)); + mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); accumReconYp(result,Uchi); // Zp - offset = Stencil._offsets [Zp][ss]; - local = Stencil._is_local[Zp][ss]; - perm = Stencil._permute[Zp][ss]; - ptype = Stencil._permute_type[Zp]; - - if ( local && perm ) - { + idx = (Zp+dag*4)%8; + offset = Stencil._offsets [idx][ss]; + local = Stencil._is_local[idx][ss]; + perm = Stencil._permute[idx][ss]; + ptype = Stencil._permute_type[idx]; + if ( local && perm ) { spProjZp(tmp,in._odata[offset]); permute(chi,tmp,ptype); } else if ( local ) { @@ -192,18 +208,16 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Zp),&chi()); - // prefetch(Umu._odata[ssu](Tp)); + mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); accumReconZp(result,Uchi); // Tp - offset = Stencil._offsets [Tp][ss]; - local = Stencil._is_local[Tp][ss]; - perm = Stencil._permute[Tp][ss]; - ptype = Stencil._permute_type[Tp]; - - if ( local && perm ) - { + idx = (Tp+dag*4)%8; + offset = Stencil._offsets [idx][ss]; + local = Stencil._is_local[idx][ss]; + perm = Stencil._permute[idx][ss]; + ptype = Stencil._permute_type[idx]; + if ( local && perm ) { spProjTp(tmp,in._odata[offset]); permute(chi,tmp,ptype); } else if ( local ) { @@ -211,15 +225,15 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Tp),&chi()); - // prefetch(Umu._odata[ssu](Xm)); + mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); accumReconTp(result,Uchi); // Xm - offset = Stencil._offsets [Xm][ss]; - local = Stencil._is_local[Xm][ss]; - perm = Stencil._permute[Xm][ss]; - ptype = Stencil._permute_type[Xm]; + idx = (Xm+dag*4)%8; + offset = Stencil._offsets [idx][ss]; + local = Stencil._is_local[idx][ss]; + perm = Stencil._permute[idx][ss]; + ptype = Stencil._permute_type[idx]; if ( local && perm ) { @@ -230,18 +244,18 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Xm),&chi()); + mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); accumReconXm(result,Uchi); // Ym - offset = Stencil._offsets [Ym][ss]; - local = Stencil._is_local[Ym][ss]; - perm = Stencil._permute[Ym][ss]; - ptype = Stencil._permute_type[Ym]; + idx = (Ym+dag*4)%8; + offset = Stencil._offsets [idx][ss]; + local = Stencil._is_local[idx][ss]; + perm = Stencil._permute[idx][ss]; + ptype = Stencil._permute_type[idx]; - if ( local && perm ) - { + if ( local && perm ) { spProjYm(tmp,in._odata[offset]); permute(chi,tmp,ptype); } else if ( local ) { @@ -249,17 +263,16 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Ym),&chi()); + mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); accumReconYm(result,Uchi); // Zm - offset = Stencil._offsets [Zm][ss]; - local = Stencil._is_local[Zm][ss]; - perm = Stencil._permute[Zm][ss]; - ptype = Stencil._permute_type[Zm]; - - if ( local && perm ) - { + idx = (Zm+dag*4)%8; + offset = Stencil._offsets [idx][ss]; + local = Stencil._is_local[idx][ss]; + perm = Stencil._permute[idx][ss]; + ptype = Stencil._permute_type[idx]; + if ( local && perm ) { spProjZm(tmp,in._odata[offset]); permute(chi,tmp,ptype); } else if ( local ) { @@ -267,17 +280,16 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Zm),&chi()); + mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); accumReconZm(result,Uchi); // Tm - offset = Stencil._offsets [Tm][ss]; - local = Stencil._is_local[Tm][ss]; - perm = Stencil._permute[Tm][ss]; - ptype = Stencil._permute_type[Tm]; - - if ( local && perm ) - { + idx = (Tm+dag*4)%8; + offset = Stencil._offsets [idx][ss]; + local = Stencil._is_local[idx][ss]; + perm = Stencil._permute[idx][ss]; + ptype = Stencil._permute_type[idx]; + if ( local && perm ) { spProjTm(tmp,in._odata[offset]); permute(chi,tmp,ptype); } else if ( local ) { @@ -285,7 +297,7 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Tm),&chi()); + mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); accumReconTm(result,Uchi); vstream(out._odata[ss],result); @@ -294,10 +306,6 @@ PARALLEL_FOR_LOOP } -void WilsonMatrix::Dw(const LatticeFermion &in, LatticeFermion &out) -{ - return; -} diff --git a/lib/qcd/Grid_qcd_wilson_dop.h b/lib/qcd/Grid_qcd_wilson_dop.h index 1098d330..1db95b33 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.h +++ b/lib/qcd/Grid_qcd_wilson_dop.h @@ -45,10 +45,7 @@ namespace Grid { virtual void MooeeInvDag (const LatticeFermion &in, LatticeFermion &out); // non-hermitian hopping term; half cb or both - void Dhop(const LatticeFermion &in, LatticeFermion &out); - - // m+4r -1/2 Dhop; both cb's - void Dw(const LatticeFermion &in, LatticeFermion &out); + void Dhop(const LatticeFermion &in, LatticeFermion &out,int dag); typedef iScalar > matrix; diff --git a/lib/simd/Grid_vComplexD.h b/lib/simd/Grid_vComplexD.h index 41c8509f..2b03c825 100644 --- a/lib/simd/Grid_vComplexD.h +++ b/lib/simd/Grid_vComplexD.h @@ -32,7 +32,7 @@ namespace Grid { friend inline void mult(vComplexD * __restrict__ y,const vComplexD * __restrict__ l,const vComplexD *__restrict__ r) {*y = (*l) * (*r);} friend inline void sub (vComplexD * __restrict__ y,const vComplexD * __restrict__ l,const vComplexD *__restrict__ r) {*y = (*l) - (*r);} friend inline void add (vComplexD * __restrict__ y,const vComplexD * __restrict__ l,const vComplexD *__restrict__ r) {*y = (*l) + (*r);} - friend inline vComplexD adj(const vComplexD &in){ return conj(in); } + friend inline vComplexD adj(const vComplexD &in){ return conjugate(in); } ////////////////////////////////// // Initialise to 1,0,i @@ -166,11 +166,11 @@ namespace Grid { // all subtypes; may not be a good assumption, but could // add the vector width as a template param for BG/Q for example //////////////////////////////////////////////////////////////////// - /* friend inline void permute(vComplexD &y,vComplexD b,int perm) { Gpermute(y,b,perm); } + /* friend inline void merge(vComplexD &y,std::vector &extracted) { Gmerge(y,extracted); @@ -269,7 +269,7 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ //////////////////////// // Conjugate //////////////////////// - friend inline vComplexD conj(const vComplexD &in){ + friend inline vComplexD conjugate(const vComplexD &in){ vComplexD ret ; vzero(ret); #if defined (AVX1)|| defined (AVX2) // addsubps 0, inv=>0+in.v[3] 0-in.v[2], 0+in.v[1], 0-in.v[0], ... @@ -345,17 +345,17 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ // REDUCE FIXME must be a cleaner implementation friend inline ComplexD Reduce(const vComplexD & in) { -#if defined SSE4 - return ComplexD(in.v[0], in.v[1]); // inefficient +#ifdef SSE4 + return ComplexD(in.v[0],in.v[1]); +#endif +#if defined(AVX1) || defined (AVX2) + vComplexD v1; + permute(v1,in,0); // sse 128; paired complex single + v1=v1+in; + return ComplexD(v1.v[0],v1.v[1]); #endif -#if defined (AVX1) || defined(AVX2) - // return std::complex(_mm256_mask_reduce_add_pd(0x55, in.v),_mm256_mask_reduce_add_pd(0xAA, in.v)); - __attribute__ ((aligned(32))) double c_[4]; - _mm256_store_pd(c_,in.v); - return ComplexD(c_[0]+c_[2],c_[1]+c_[3]); -#endif #ifdef AVX512 - return ComplexD(_mm512_mask_reduce_add_pd(0x55, in.v),_mm512_mask_reduce_add_pd(0xAA, in.v)); + return ComplexD(_mm512_mask_reduce_add_pd(0x55, in.v),_mm512_mask_reduce_add_pd(0xAA, in.v)); #endif #ifdef QPX #endif @@ -387,7 +387,7 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ }; - inline vComplexD innerProduct(const vComplexD & l, const vComplexD & r) { return conj(l)*r; } + inline vComplexD innerProduct(const vComplexD & l, const vComplexD & r) { return conjugate(l)*r; } typedef vComplexD vDComplex; diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index 8a892d24..713bbdd8 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -47,7 +47,7 @@ namespace Grid { friend inline void mult(vComplexF * __restrict__ y,const vComplexF * __restrict__ l,const vComplexF *__restrict__ r){ *y = (*l) * (*r); } friend inline void sub (vComplexF * __restrict__ y,const vComplexF * __restrict__ l,const vComplexF *__restrict__ r){ *y = (*l) - (*r); } friend inline void add (vComplexF * __restrict__ y,const vComplexF * __restrict__ l,const vComplexF *__restrict__ r){ *y = (*l) + (*r); } - friend inline vComplexF adj(const vComplexF &in){ return conj(in); } + friend inline vComplexF adj(const vComplexF &in){ return conjugate(in); } ////////////////////////////////// // Initialise to 1,0,i @@ -228,42 +228,25 @@ namespace Grid { ret.v = {a,b,a,b}; #endif } - friend inline ComplexF Reduce(const vComplexF & in) - { + friend inline void permute(vComplexF &y,vComplexF b,int perm) + { + Gpermute(y,b,perm); + } + friend inline ComplexF Reduce(const vComplexF & in) + { #ifdef SSE4 - union { - cvec v1; // SSE 4 x float vector - float f[4]; // scalar array of 4 floats - } u128; - u128.v1= _mm_add_ps(in.v, _mm_shuffle_ps(in.v,in.v, 0b01001110)); // FIXME Prefer to use _MM_SHUFFLE macros - return ComplexF(u128.f[0], u128.f[1]); + vComplexF v1; + permute(v1,in,0); // sse 128; paired complex single + v1=v1+in; + return ComplexF(v1.v[0],v1.v[1]); #endif -#ifdef AVX1 - //it would be better passing 2 arguments to saturate the vector lanes - union { - __m256 v1; - float f[8]; - } u256; - //SWAP lanes - // FIXME .. icc complains with lib/lattice/Grid_lattice_reduction.h (49): (col. 20) warning #13211: Immediate parameter to intrinsic call too large - __m256 t0 = _mm256_permute2f128_ps(in.v, in.v, 1); - __m256 t1 = _mm256_permute_ps(in.v , 0b11011000);//real (0,2,1,3) - __m256 t2 = _mm256_permute_ps(t0 , 0b10001101);//imag (1,3,0,2) - t0 = _mm256_blend_ps(t1, t2, 0b0101000001010000);// (0,0,1,1,0,0,1,1) - t1 = _mm256_hadd_ps(t0,t0); - u256.v1 = _mm256_hadd_ps(t1, t1); - return ComplexF(u256.f[0], u256.f[4]); -#endif -#ifdef AVX2 - union { - __m256 v1; - float f[8]; - } u256; - const __m256i mask= _mm256_set_epi32( 7, 5, 3, 1, 6, 4, 2, 0); - __m256 tmp1 = _mm256_permutevar8x32_ps(in.v, mask); - __m256 tmp2 = _mm256_hadd_ps(tmp1, tmp1); - u256.v1 = _mm256_hadd_ps(tmp2, tmp2); - return ComplexF(u256.f[0], u256.f[4]); +#if defined(AVX1) || defined (AVX2) + vComplexF v1,v2; + permute(v1,in,0); // sse 128; paired complex single + v1=v1+in; + permute(v2,v1,1); // avx 256; quad complex single + v1=v1+v2; + return ComplexF(v1.v[0],v1.v[1]); #endif #ifdef AVX512 return ComplexF(_mm512_mask_reduce_add_ps(0x5555, in.v),_mm512_mask_reduce_add_ps(0xAAAA, in.v)); @@ -345,13 +328,10 @@ namespace Grid { // Conjugate /////////////////////// - friend inline vComplexF conj(const vComplexF &in){ + friend inline vComplexF conjugate(const vComplexF &in){ vComplexF ret ; vzero(ret); #if defined (AVX1)|| defined (AVX2) - cvec tmp; - tmp = _mm256_addsub_ps(ret.v,_mm256_shuffle_ps(in.v,in.v,_MM_SHUFFLE(2,3,0,1))); // ymm1 <- br,bi - ret.v=_mm256_shuffle_ps(tmp,tmp,_MM_SHUFFLE(2,3,0,1)); - + ret.v = _mm256_xor_ps(_mm256_addsub_ps(ret.v,in.v), _mm256_set1_ps(-0.f)); #endif #ifdef SSE4 ret.v = _mm_xor_ps(_mm_addsub_ps(ret.v,in.v), _mm_set1_ps(-0.f)); @@ -433,10 +413,6 @@ namespace Grid { return *this; } - friend inline void permute(vComplexF &y,vComplexF b,int perm) - { - Gpermute(y,b,perm); - } /* friend inline void merge(vComplexF &y,std::vector &extracted) { @@ -460,7 +436,7 @@ namespace Grid { inline vComplexF innerProduct(const vComplexF & l, const vComplexF & r) { - return conj(l)*r; + return conjugate(l)*r; } inline void zeroit(vComplexF &z){ vzero(z);} diff --git a/lib/simd/Grid_vInteger.h b/lib/simd/Grid_vInteger.h index 63e8c720..ee4a3633 100644 --- a/lib/simd/Grid_vInteger.h +++ b/lib/simd/Grid_vInteger.h @@ -117,7 +117,7 @@ namespace Grid { }; /////////////////////////////////////////////// - // mult, sub, add, adj,conj, mac functions + // mult, sub, add, adj,conjugate, mac functions /////////////////////////////////////////////// friend inline void mult(vInteger * __restrict__ y,const vInteger * __restrict__ l,const vInteger *__restrict__ r) {*y = (*l) * (*r);} friend inline void sub (vInteger * __restrict__ y,const vInteger * __restrict__ l,const vInteger *__restrict__ r) {*y = (*l) - (*r);} diff --git a/lib/simd/Grid_vRealD.h b/lib/simd/Grid_vRealD.h index dbfacb0c..83979d14 100644 --- a/lib/simd/Grid_vRealD.h +++ b/lib/simd/Grid_vRealD.h @@ -26,7 +26,7 @@ namespace Grid { friend inline void sub (vRealD * __restrict__ y,const vRealD * __restrict__ l,const vRealD *__restrict__ r) {*y = (*l) - (*r);} friend inline void add (vRealD * __restrict__ y,const vRealD * __restrict__ l,const vRealD *__restrict__ r) {*y = (*l) + (*r);} friend inline vRealD adj(const vRealD &in) { return in; } - friend inline vRealD conj(const vRealD &in){ return in; } + friend inline vRealD conjugate(const vRealD &in){ return in; } friend inline void mac (vRealD &y,const vRealD a,const vRealD x){ #if defined (AVX1) || defined (SSE4) @@ -112,11 +112,12 @@ namespace Grid { // all subtypes; may not be a good assumption, but could // add the vector width as a template param for BG/Q for example //////////////////////////////////////////////////////////////////// - /* + friend inline void permute(vRealD &y,vRealD b,int perm) { Gpermute(y,b,perm); } + /* friend inline void merge(vRealD &y,std::vector &extracted) { Gmerge(y,extracted); @@ -209,48 +210,26 @@ namespace Grid { friend inline RealD Reduce(const vRealD & in) { -#if defined (SSE4) - // FIXME Hack - const RealD * ptr =(const RealD *) ∈ - RealD ret = 0; - for(int i=0;i(y,b,perm); } + /* friend inline void merge(vRealF &y,std::vector &extracted) { Gmerge(y,extracted); @@ -155,7 +156,6 @@ namespace Grid { Gextract(y,extracted); } */ - ///////////////////////////////////////////////////// // Broadcast a value across Nsimd copies. @@ -243,33 +243,26 @@ friend inline void vstore(const vRealF &ret, float *a){ } friend inline RealF Reduce(const vRealF & in) { -#if defined (SSE4) - // FIXME Hack - const RealF * ptr = (const RealF *) ∈ - RealF ret = 0; - for(int i=0;i inline Grid_simd< scalar_type, vector_type> innerProduct(const Grid_simd< scalar_type, vector_type> & l, const Grid_simd< scalar_type, vector_type> & r) { - return conj(l)*r; + return conjugate(l)*r; } template diff --git a/scripts/build-all b/scripts/build-all index d3a978b7..b97dca19 100755 --- a/scripts/build-all +++ b/scripts/build-all @@ -1,6 +1,6 @@ -#!/bin/bash +#!/bin/bash -e -DIRS="clang-avx clang-avx-openmp clang-avx-openmp-mpi clang-avx-mpi clang-avx2 clang-avx2-openmp clang-avx2-openmp-mpi clang-avx2-mpi" +DIRS="clang-avx clang-avx-openmp clang-avx-openmp-mpi clang-avx-mpi clang-avx2 clang-avx2-openmp clang-avx2-openmp-mpi clang-avx2-mpi clang-sse" EXTRADIRS="g++-avx g++-sse4 icpc-avx icpc-avx2 icpc-avx512" BLACK="\033[30m" RED="\033[31m" diff --git a/scripts/configure-all b/scripts/configure-all index 2f80b60a..f42b1960 100755 --- a/scripts/configure-all +++ b/scripts/configure-all @@ -1,6 +1,6 @@ #!/bin/bash -DIRS="clang-avx clang-avx-openmp clang-avx-openmp-mpi clang-avx-mpi clang-avx2 clang-avx2-openmp clang-avx2-openmp-mpi clang-avx2-mpi icpc-avx icpc-avx2 icpc-avx512 g++-sse4 g++-avx" +DIRS="clang-avx clang-avx-openmp clang-avx-openmp-mpi clang-avx-mpi clang-avx2 clang-avx2-openmp clang-avx2-openmp-mpi clang-avx2-mpi icpc-avx icpc-avx2 icpc-avx512 g++-sse4 g++-avx clang-sse" for D in $DIRS do diff --git a/scripts/configure-commands b/scripts/configure-commands index 89b72294..c7c35e1c 100755 --- a/scripts/configure-commands +++ b/scripts/configure-commands @@ -34,6 +34,9 @@ icpc-avx512) icpc-mic) CXX=icpc ../../configure --host=none --enable-simd=AVX512 CXXFLAGS="-mmic -O3 -std=c++11" LDFLAGS=-mmic LIBS="-lgmp -lmpfr" --enable-comms=none ;; +clang-sse) +CXX=clang++ ../../configure --enable-simd=SSE4 CXXFLAGS="-msse4 -O3 -std=c++11" LIBS="-lgmp -lmpfr" --enable-comms=none + ;; clang-avx) CXX=clang++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" LIBS="-lgmp -lmpfr" --enable-comms=none ;; @@ -47,16 +50,16 @@ clang-avx2-openmp) CXX=clang-omp++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -fopenmp -O3 -std=c++11" LDFLAGS="-fopenmp" LIBS="-lgmp -lmpfr" --enable-comms=none ;; clang-avx-openmp-mpi) -CXX=clang-omp++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" LIBS="-lgmp -lmpfr" --enable-comms=mpi +CXX=clang-omp++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp -lgmp -lmpfr" --enable-comms=mpi ;; clang-avx2-openmp-mpi) -CXX=clang-omp++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp" LIBS="-lgmp -lmpfr" --enable-comms=mpi +CXX=clang-omp++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp -lgmp -lmpfr" --enable-comms=mpi ;; clang-avx-mpi) -CXX=clang++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx " LIBS="-lgmp -lmpfr" --enable-comms=mpi +CXX=clang++ ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -lgmp -lmpfr" --enable-comms=mpi ;; clang-avx2-mpi) -CXX=clang++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx " LIBS="-lgmp -lmpfr" --enable-comms=mpi +CXX=clang++ ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -lgmp -lmpfr" --enable-comms=mpi ;; esac echo -e $NORMAL diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index 45778922..1aa4fc43 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -140,7 +140,7 @@ int main (int argc, char ** argv) // -=,+=,*=,() // add,+,sub,-,mult,mac,* -// adj,conj +// adj,conjugate // real,imag // transpose,transposeIndex // trace,traceIndex @@ -437,7 +437,7 @@ int main (int argc, char ** argv) for(int r=0;r<3;r++){ for(int c=0;c<3;c++){ diff =shifted1()()(r,c)-shifted2()()(r,c); - nn=real(conj(diff)*diff); + nn=real(conjugate(diff)*diff); if ( nn > 0 ) cout<<"Shift fail (shifted1/shifted2-ref) "< 0 ) cout<<"Shift rb fail (shifted3/shifted2-ref) "< +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(4,vComplexF::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + + std::vector seeds({1,2,3,4}); + + GridSerialRNG fsRNG; fsRNG.SeedFixedIntegers(seeds); + GridParallelRNG fpRNG(&Grid); fpRNG.SeedFixedIntegers(seeds); + + vComplexF tmp; random(fsRNG,tmp); + std::cout<<"Random vComplexF (fixed seed)\n"<< tmp< void operator()(vec &rr,vec &i1,vec &i2) const { rr = conj(i1);} + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = conjugate(i1);} std::string name(void) const { return std::string("Conj"); } }; class funcAdj { @@ -49,6 +49,34 @@ public: template void operator()(vec &rr,vec &i1,vec &i2) const { rr = timesMinusI(i1);} std::string name(void) const { return std::string("timesMinusI"); } }; +class funcInnerProduct { +public: + funcInnerProduct() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = innerProduct(i1,i2);} + std::string name(void) const { return std::string("innerProduct"); } +}; + +// FIXME still to test: +// +// innerProduct, +// norm2, +// Reduce, +// +// mac,mult,sub,add, vone,vzero,vcomplex_i, =zero, +// vset,vsplat,vstore,vstream,vload, scalar*vec, vec*scalar +// unary -, +// *= , -=, += +// outerproduct, +// zeroit +// permute + +class funcReduce { +public: + funcReduce() {}; +template void vfunc(reduce &rr,vec &i1,vec &i2) const { rr = Reduce(i1);} +template void sfunc(reduce &rr,scal &i1,scal &i2) const { rr = i1;} + std::string name(void) const { return std::string("Reduce"); } +}; template void Tester(const functor &func) @@ -96,8 +124,59 @@ void Tester(const functor &func) ok++; } } - if ( ok==0 ) std::cout << " OK!" < +void ReductionTester(const functor &func) +{ + GridSerialRNG sRNG; + sRNG.SeedRandomDevice(); + + int Nsimd = vec::Nsimd(); + + std::vector input1(Nsimd); + std::vector input2(Nsimd); + reduced result(0); + reduced reference(0); + reduced tmp; + + std::vector > buf(3); + vec & v_input1 = buf[0]; + vec & v_input2 = buf[1]; + + + for(int i=0;i(v_input1,input1); + merge(v_input2,input2); + + func.template vfunc(result,v_input1,v_input2); + + for(int i=0;i(tmp,input1[i],input2[i]); + reference+=tmp; + } + + std::cout << " " << func.name()< 1.0e-6 ){ // rounding is possible for reduce order + std::cout<< "*****" << std::endl; + std::cout<< abs(reference-result) << " " <(funcTimes()); Tester(funcConj()); Tester(funcAdj()); + Tester(funcInnerProduct()); + ReductionTester(funcReduce()); std::cout << "==================================="<< std::endl; std::cout << "Testing vComplexD "<(funcTimes()); Tester(funcConj()); Tester(funcAdj()); + Tester(funcInnerProduct()); + ReductionTester(funcReduce()); std::cout << "==================================="<< std::endl; std::cout << "Testing vRealF "<(funcMinus()); Tester(funcTimes()); Tester(funcAdj()); + Tester(funcConj()); + Tester(funcInnerProduct()); + ReductionTester(funcReduce()); std::cout << "==================================="<< std::endl; std::cout << "Testing vRealD "<(funcMinus()); Tester(funcTimes()); Tester(funcAdj()); + Tester(funcConj()); + Tester(funcInnerProduct()); + ReductionTester(funcReduce()); Grid_finalize(); } diff --git a/tests/Grid_stencil.cc b/tests/Grid_stencil.cc index 1fdb7265..9770ed7c 100644 --- a/tests/Grid_stencil.cc +++ b/tests/Grid_stencil.cc @@ -93,7 +93,7 @@ int main (int argc, char ** argv) for(int r=0;r<3;r++){ for(int c=0;c<3;c++){ diff =check()()(r,c)-bar()()(r,c); - double nn=real(conj(diff)*diff); + double nn=real(conjugate(diff)*diff); if ( nn > 0){ printf("Coor (%d %d %d %d) \t rc %d%d \t %le (%le,%le) %le\n", coor[0],coor[1],coor[2],coor[3],r,c, @@ -103,8 +103,8 @@ int main (int argc, char ** argv) real(bar()()(r,c)) ); } - snrmC=snrmC+real(conj(check()()(r,c))*check()()(r,c)); - snrmB=snrmB+real(conj(bar()()(r,c))*bar()()(r,c)); + snrmC=snrmC+real(conjugate(check()()(r,c))*check()()(r,c)); + snrmB=snrmB+real(conjugate(bar()()(r,c))*bar()()(r,c)); snrm=snrm+nn; }} diff --git a/tests/Makefile.am b/tests/Makefile.am index 82d1b3be..80f3a34c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -5,7 +5,7 @@ AM_LDFLAGS = -L$(top_builddir)/lib # # Test code # -bin_PROGRAMS = Grid_main Grid_stencil Grid_nersc_io Grid_cshift Grid_gamma Grid_simd Grid_rng Grid_remez +bin_PROGRAMS = Grid_main Grid_stencil Grid_nersc_io Grid_cshift Grid_gamma Grid_simd Grid_rng Grid_remez Grid_rng_fixed Grid_main_SOURCES = Grid_main.cc Grid_main_LDADD = -lGrid @@ -13,6 +13,9 @@ Grid_main_LDADD = -lGrid Grid_rng_SOURCES = Grid_rng.cc Grid_rng_LDADD = -lGrid +Grid_rng_fixed_SOURCES = Grid_rng_fixed.cc +Grid_rng_fixed_LDADD = -lGrid + Grid_remez_SOURCES = Grid_remez.cc Grid_remez_LDADD = -lGrid diff --git a/tests/test_Grid_jacobi.cc b/tests/test_Grid_jacobi.cc index 95e808f1..0cf15a6f 100644 --- a/tests/test_Grid_jacobi.cc +++ b/tests/test_Grid_jacobi.cc @@ -186,7 +186,7 @@ int main (int argc, char ** argv) for(int r=0;r<3;r++){ for(int c=0;c<3;c++){ diff =check._internal._internal[r][c]-bar._internal._internal[r][c]; - double nn=real(conj(diff)*diff); + double nn=real(conjugate(diff)*diff); if ( nn > 0 ){ printf("Coor (%d %d %d %d) \t rc %d%d \t %le %le %le\n", coor[0],coor[1],coor[2],coor[3],r,c, From 592cec72e28a268cd448b988e3b2fe3b4a55d88f Mon Sep 17 00:00:00 2001 From: azusayamaguchi Date: Tue, 19 May 2015 14:54:42 +0100 Subject: [PATCH 202/429] Add messages to get the number of threads for openmp --- Makefile.in | 44 +++++++++++++-------- aclocal.m4 | 61 +++++++++++++++-------------- benchmarks/Grid_comms.cc | 2 + benchmarks/Grid_memory_bandwidth.cc | 3 ++ benchmarks/Grid_su3.cc | 3 ++ benchmarks/Grid_wilson.cc | 3 ++ config.guess | 2 +- config.sub | 2 +- configure | 13 +++--- lib/Grid.h | 2 +- lib/Grid_init.cc | 23 +++++++++++ 11 files changed, 104 insertions(+), 54 deletions(-) diff --git a/Makefile.in b/Makefile.in index b6894ef6..b9fba168 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. +# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2013 Free Software Foundation, Inc. +# Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -14,7 +14,17 @@ @SET_MAKE@ VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ @@ -79,14 +89,12 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . -DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ - $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/configure $(am__configure_deps) COPYING TODO \ - compile config.guess config.sub depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d @@ -149,6 +157,9 @@ ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING ChangeLog \ + INSTALL NEWS README TODO compile config.guess config.sub \ + depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -314,7 +325,6 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -521,15 +531,15 @@ dist-xz: distdir $(am__post_remove_distdir) dist-tarZ: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) @@ -565,17 +575,17 @@ distcheck: dist esac chmod -R a-w $(distdir) chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_inst + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=.. --prefix="$$dc_install_base" \ + --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -749,6 +759,8 @@ uninstall-am: maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am +.PRECIOUS: Makefile + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/aclocal.m4 b/aclocal.m4 index 389763bf..bf79d078 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.14.1 -*- Autoconf -*- +# generated automatically by aclocal 1.15 -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -20,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002-2013 Free Software Foundation, Inc. +# Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.14' +[am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.14.1], [], +m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.14.1])dnl +[AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -103,15 +103,14 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -142,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -333,7 +332,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -409,7 +408,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -499,8 +498,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -573,7 +572,11 @@ to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi -fi]) +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further @@ -602,7 +605,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -613,7 +616,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -623,7 +626,7 @@ if test x"${install_sh}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2013 Free Software Foundation, Inc. +# Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -644,7 +647,7 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -694,7 +697,7 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -733,7 +736,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -764,7 +767,7 @@ AC_DEFUN([_AM_IF_OPTION], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -845,7 +848,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -905,7 +908,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -933,7 +936,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2013 Free Software Foundation, Inc. +# Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -952,7 +955,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2013 Free Software Foundation, Inc. +# Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/benchmarks/Grid_comms.cc b/benchmarks/Grid_comms.cc index 810cfd06..e844c5d3 100644 --- a/benchmarks/Grid_comms.cc +++ b/benchmarks/Grid_comms.cc @@ -10,6 +10,8 @@ int main (int argc, char ** argv) std::vector simd_layout = GridDefaultSimd(Nd,vComplexD::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); + int threads = GridThread::GetThreads(); + std::cout << "Grid is setup to use "< simd_layout = GridDefaultSimd(Nd,vReal::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); + int threads = GridThread::GetThreads(); + std::cout << "Grid is setup to use "< simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); + int threads = GridThread::GetThreads(); + std::cout << "Grid is setup to use "< mpi_layout = GridDefaultMpi(); GridCartesian Grid(latt_size,simd_layout,mpi_layout); + int threads = GridThread::GetThreads(); + std::cout << "Grid is setup to use "< seeds({1,2,3,4}); GridParallelRNG pRNG(&Grid); diff --git a/config.guess b/config.guess index 5f6aa02d..a12faba2 120000 --- a/config.guess +++ b/config.guess @@ -1 +1 @@ -/usr/share/automake-1.14/config.guess \ No newline at end of file +/opt/local/share/automake-1.15/config.guess \ No newline at end of file diff --git a/config.sub b/config.sub index 0abfe18c..e3c9b5ca 120000 --- a/config.sub +++ b/config.sub @@ -1 +1 @@ -/usr/share/automake-1.14/config.sub \ No newline at end of file +/opt/local/share/automake-1.15/config.sub \ No newline at end of file diff --git a/configure b/configure index e7d9f32f..b42143e2 100755 --- a/configure +++ b/configure @@ -2466,7 +2466,7 @@ test -n "$target_alias" && NONENONEs,x,x, && program_prefix=${target_alias}- -am__api_version='1.14' +am__api_version='1.15' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -2638,8 +2638,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2658,7 +2658,7 @@ else $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2986,8 +2986,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # mkdir_p='$(MKDIR_P)' -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' @@ -3046,6 +3046,7 @@ END fi + ac_config_headers="$ac_config_headers lib/Grid_config.h" # Check whether --enable-silent-rules was given. diff --git a/lib/Grid.h b/lib/Grid.h index edd94769..a1ad74c4 100644 --- a/lib/Grid.h +++ b/lib/Grid.h @@ -86,7 +86,7 @@ namespace Grid { // Common parsing chores std::string GridCmdOptionPayload(char ** begin, char ** end, const std::string & option); bool GridCmdOptionExists(char** begin, char** end, const std::string& option); - void GridParseIntVector(std::string &str,std::vector & vec); + std::string GridCmdVectorIntToString(const std::vector & vec); void GridParseLayout(char **argv,int argc, std::vector &latt, diff --git a/lib/Grid_init.cc b/lib/Grid_init.cc index c804e810..6af0be84 100644 --- a/lib/Grid_init.cc +++ b/lib/Grid_init.cc @@ -111,6 +111,11 @@ void GridParseLayout(char **argv,int argc, } +std::string GridCmdVectorIntToString(const std::vector & vec){ + std::ostringstream oss; + std::copy(vec.begin(), vec.end(),std::ostream_iterator(oss, " ")); + return oss.str(); +} ///////////////////////////////////////////////////////// ///////////////////////////////////////////////////////// void Grid_init(int *argc,char ***argv) @@ -120,6 +125,15 @@ void Grid_init(int *argc,char ***argv) #endif // Parse command line args. + if( GridCmdOptionExists(*argv,*argv+*argc,"--help") ){ + std::cout<<"--help : this message"< Date: Tue, 19 May 2015 15:50:47 +0100 Subject: [PATCH 203/429] Optimisation... --- lib/qcd/Grid_qcd_wilson_dop.cc | 265 +++++++++++++++++++++++++-------- lib/qcd/Grid_qcd_wilson_dop.h | 2 + scripts/bench_wilson.sh | 9 ++ scripts/wilson.gnu | 7 + 4 files changed, 223 insertions(+), 60 deletions(-) create mode 100755 scripts/bench_wilson.sh create mode 100644 scripts/wilson.gnu diff --git a/lib/qcd/Grid_qcd_wilson_dop.cc b/lib/qcd/Grid_qcd_wilson_dop.cc index 5143daf3..9ef4af0c 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.cc +++ b/lib/qcd/Grid_qcd_wilson_dop.cc @@ -138,16 +138,8 @@ void WilsonMatrix::MooeeInvDag(const LatticeFermion &in, LatticeFermion &out) return ; } -void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out,int dag) +void WilsonMatrix::DhopSite(int ss,const LatticeFermion &in, LatticeFermion &out) { - assert((dag==0) ||(dag==1)); - - WilsonCompressor compressor(dag); - Stencil.HaloExchange(in,comm_buf,compressor); - -PARALLEL_FOR_LOOP - for(int sss=0;sssoSites();sss++){ - vHalfSpinColourVector tmp; vHalfSpinColourVector chi; vSpinColourVector result; @@ -155,16 +147,14 @@ PARALLEL_FOR_LOOP int offset,local,perm, ptype; // int ss = Stencil._LebesgueReorder[sss]; - int ss = sss; int ssu= ss; // Xp - int idx = (Xp+dag*4)%8; - offset = Stencil._offsets [idx][ss]; - local = Stencil._is_local[idx][ss]; - perm = Stencil._permute[idx][ss]; + offset = Stencil._offsets [Xp][ss]; + local = Stencil._is_local[Xp][ss]; + perm = Stencil._permute[Xp][ss]; - ptype = Stencil._permute_type[idx]; + ptype = Stencil._permute_type[Xp]; if ( local && perm ) { spProjXp(tmp,in._odata[offset]); permute(chi,tmp,ptype); @@ -173,16 +163,14 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Xp),&chi()); spReconXp(result,Uchi); // Yp - idx = (Yp+dag*4)%8; - offset = Stencil._offsets [idx][ss]; - local = Stencil._is_local[idx][ss]; - perm = Stencil._permute[idx][ss]; - ptype = Stencil._permute_type[idx]; - + offset = Stencil._offsets [Yp][ss]; + local = Stencil._is_local[Yp][ss]; + perm = Stencil._permute[Yp][ss]; + ptype = Stencil._permute_type[Yp]; if ( local && perm ) { spProjYp(tmp,in._odata[offset]); permute(chi,tmp,ptype); @@ -191,15 +179,14 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Yp),&chi()); accumReconYp(result,Uchi); // Zp - idx = (Zp+dag*4)%8; - offset = Stencil._offsets [idx][ss]; - local = Stencil._is_local[idx][ss]; - perm = Stencil._permute[idx][ss]; - ptype = Stencil._permute_type[idx]; + offset = Stencil._offsets [Zp][ss]; + local = Stencil._is_local[Zp][ss]; + perm = Stencil._permute[Zp][ss]; + ptype = Stencil._permute_type[Zp]; if ( local && perm ) { spProjZp(tmp,in._odata[offset]); permute(chi,tmp,ptype); @@ -208,15 +195,14 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Zp),&chi()); accumReconZp(result,Uchi); // Tp - idx = (Tp+dag*4)%8; - offset = Stencil._offsets [idx][ss]; - local = Stencil._is_local[idx][ss]; - perm = Stencil._permute[idx][ss]; - ptype = Stencil._permute_type[idx]; + offset = Stencil._offsets [Tp][ss]; + local = Stencil._is_local[Tp][ss]; + perm = Stencil._permute[Tp][ss]; + ptype = Stencil._permute_type[Tp]; if ( local && perm ) { spProjTp(tmp,in._odata[offset]); permute(chi,tmp,ptype); @@ -225,15 +211,14 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Tp),&chi()); accumReconTp(result,Uchi); // Xm - idx = (Xm+dag*4)%8; - offset = Stencil._offsets [idx][ss]; - local = Stencil._is_local[idx][ss]; - perm = Stencil._permute[idx][ss]; - ptype = Stencil._permute_type[idx]; + offset = Stencil._offsets [Xm][ss]; + local = Stencil._is_local[Xm][ss]; + perm = Stencil._permute[Xm][ss]; + ptype = Stencil._permute_type[Xm]; if ( local && perm ) { @@ -244,16 +229,15 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Xm),&chi()); accumReconXm(result,Uchi); // Ym - idx = (Ym+dag*4)%8; - offset = Stencil._offsets [idx][ss]; - local = Stencil._is_local[idx][ss]; - perm = Stencil._permute[idx][ss]; - ptype = Stencil._permute_type[idx]; + offset = Stencil._offsets [Ym][ss]; + local = Stencil._is_local[Ym][ss]; + perm = Stencil._permute[Ym][ss]; + ptype = Stencil._permute_type[Ym]; if ( local && perm ) { spProjYm(tmp,in._odata[offset]); @@ -263,15 +247,14 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Ym),&chi()); accumReconYm(result,Uchi); // Zm - idx = (Zm+dag*4)%8; - offset = Stencil._offsets [idx][ss]; - local = Stencil._is_local[idx][ss]; - perm = Stencil._permute[idx][ss]; - ptype = Stencil._permute_type[idx]; + offset = Stencil._offsets [Zm][ss]; + local = Stencil._is_local[Zm][ss]; + perm = Stencil._permute[Zm][ss]; + ptype = Stencil._permute_type[Zm]; if ( local && perm ) { spProjZm(tmp,in._odata[offset]); permute(chi,tmp,ptype); @@ -280,15 +263,14 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Zm),&chi()); accumReconZm(result,Uchi); // Tm - idx = (Tm+dag*4)%8; - offset = Stencil._offsets [idx][ss]; - local = Stencil._is_local[idx][ss]; - perm = Stencil._permute[idx][ss]; - ptype = Stencil._permute_type[idx]; + offset = Stencil._offsets [Tm][ss]; + local = Stencil._is_local[Tm][ss]; + perm = Stencil._permute[Tm][ss]; + ptype = Stencil._permute_type[Tm]; if ( local && perm ) { spProjTm(tmp,in._odata[offset]); permute(chi,tmp,ptype); @@ -297,12 +279,175 @@ PARALLEL_FOR_LOOP } else { chi=comm_buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](idx),&chi()); + mult(&Uchi(),&Umu._odata[ssu](Tm),&chi()); accumReconTm(result,Uchi); vstream(out._odata[ss],result); - } +} +void WilsonMatrix::DhopSiteDag(int ss,const LatticeFermion &in, LatticeFermion &out) +{ + vHalfSpinColourVector tmp; + vHalfSpinColourVector chi; + vSpinColourVector result; + vHalfSpinColourVector Uchi; + int offset,local,perm, ptype; + int ssu= ss; + + // Xp + offset = Stencil._offsets [Xm][ss]; + local = Stencil._is_local[Xm][ss]; + perm = Stencil._permute[Xm][ss]; + + ptype = Stencil._permute_type[Xm]; + if ( local && perm ) { + spProjXp(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjXp(chi,in._odata[offset]); + } else { + chi=comm_buf[offset]; + } + mult(&Uchi(),&Umu._odata[ssu](Xm),&chi()); + spReconXp(result,Uchi); + + // Yp + offset = Stencil._offsets [Ym][ss]; + local = Stencil._is_local[Ym][ss]; + perm = Stencil._permute[Ym][ss]; + ptype = Stencil._permute_type[Ym]; + if ( local && perm ) { + spProjYp(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjYp(chi,in._odata[offset]); + } else { + chi=comm_buf[offset]; + } + mult(&Uchi(),&Umu._odata[ssu](Ym),&chi()); + accumReconYp(result,Uchi); + + // Zp + offset = Stencil._offsets [Zm][ss]; + local = Stencil._is_local[Zm][ss]; + perm = Stencil._permute[Zm][ss]; + ptype = Stencil._permute_type[Zm]; + if ( local && perm ) { + spProjZp(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjZp(chi,in._odata[offset]); + } else { + chi=comm_buf[offset]; + } + mult(&Uchi(),&Umu._odata[ssu](Zm),&chi()); + accumReconZp(result,Uchi); + + // Tp + offset = Stencil._offsets [Tm][ss]; + local = Stencil._is_local[Tm][ss]; + perm = Stencil._permute[Tm][ss]; + ptype = Stencil._permute_type[Tm]; + if ( local && perm ) { + spProjTp(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjTp(chi,in._odata[offset]); + } else { + chi=comm_buf[offset]; + } + mult(&Uchi(),&Umu._odata[ssu](Tm),&chi()); + accumReconTp(result,Uchi); + + // Xm + offset = Stencil._offsets [Xp][ss]; + local = Stencil._is_local[Xp][ss]; + perm = Stencil._permute[Xp][ss]; + ptype = Stencil._permute_type[Xp]; + + if ( local && perm ) + { + spProjXm(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjXm(chi,in._odata[offset]); + } else { + chi=comm_buf[offset]; + } + mult(&Uchi(),&Umu._odata[ssu](Xp),&chi()); + accumReconXm(result,Uchi); + + + // Ym + offset = Stencil._offsets [Yp][ss]; + local = Stencil._is_local[Yp][ss]; + perm = Stencil._permute[Yp][ss]; + ptype = Stencil._permute_type[Yp]; + + if ( local && perm ) { + spProjYm(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjYm(chi,in._odata[offset]); + } else { + chi=comm_buf[offset]; + } + mult(&Uchi(),&Umu._odata[ssu](Yp),&chi()); + accumReconYm(result,Uchi); + + // Zm + offset = Stencil._offsets [Zp][ss]; + local = Stencil._is_local[Zp][ss]; + perm = Stencil._permute[Zp][ss]; + ptype = Stencil._permute_type[Zp]; + if ( local && perm ) { + spProjZm(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjZm(chi,in._odata[offset]); + } else { + chi=comm_buf[offset]; + } + mult(&Uchi(),&Umu._odata[ssu](Zp),&chi()); + accumReconZm(result,Uchi); + + // Tm + offset = Stencil._offsets [Tp][ss]; + local = Stencil._is_local[Tp][ss]; + perm = Stencil._permute[Tp][ss]; + ptype = Stencil._permute_type[Tp]; + if ( local && perm ) { + spProjTm(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjTm(chi,in._odata[offset]); + } else { + chi=comm_buf[offset]; + } + mult(&Uchi(),&Umu._odata[ssu](Tp),&chi()); + accumReconTm(result,Uchi); + + vstream(out._odata[ss],result); +} + +void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out,int dag) +{ + assert((dag==0) ||(dag==1)); + + WilsonCompressor compressor(dag); + Stencil.HaloExchange(in,comm_buf,compressor); + + if ( dag ) { +PARALLEL_FOR_LOOP + for(int sss=0;sssoSites();sss++){ + DhopSiteDag(sss,in,out); + } + } else { +PARALLEL_FOR_LOOP + for(int sss=0;sssoSites();sss++){ + DhopSite(sss,in,out); + } + } } diff --git a/lib/qcd/Grid_qcd_wilson_dop.h b/lib/qcd/Grid_qcd_wilson_dop.h index 1db95b33..8d93a926 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.h +++ b/lib/qcd/Grid_qcd_wilson_dop.h @@ -46,6 +46,8 @@ namespace Grid { // non-hermitian hopping term; half cb or both void Dhop(const LatticeFermion &in, LatticeFermion &out,int dag); + void DhopSite (int ss,const LatticeFermion &in, LatticeFermion &out); + void DhopSiteDag(int ss,const LatticeFermion &in, LatticeFermion &out); typedef iScalar > matrix; diff --git a/scripts/bench_wilson.sh b/scripts/bench_wilson.sh new file mode 100755 index 00000000..af73d591 --- /dev/null +++ b/scripts/bench_wilson.sh @@ -0,0 +1,9 @@ +for omp in 1 2 4 +do +echo > wilson.t$omp +for vol in 4.4.4.4 4.4.4.8 4.4.8.8 4.8.8.8 8.8.8.8 8.8.8.16 8.8.16.16 8.16.16.16 +do +perf=` ./benchmarks/Grid_wilson --grid $vol --omp $omp | grep mflop | awk '{print $3}'` +echo $vol $perf >> wilson.t$omp +done +done \ No newline at end of file diff --git a/scripts/wilson.gnu b/scripts/wilson.gnu new file mode 100644 index 00000000..69bca5b5 --- /dev/null +++ b/scripts/wilson.gnu @@ -0,0 +1,7 @@ +plot 'wilson.t1' u 2 w l t "AVX1-OMP=1" +replot 'wilson.t2' u 2 w l t "AVX1-OMP=2" +replot 'wilson.t4' u 2 w l t "AVX1-OMP=4" +set terminal 'pdf' +set output 'wilson_clang.pdf' +replot +quit From b562b50196a699587a3477e37fcedc4e3f86861c Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 19 May 2015 21:29:07 +0100 Subject: [PATCH 204/429] Reworking to keep intel compiler happy --- benchmarks/Makefile.am | 2 +- lib/algorithms/LinearOperator.h | 2 +- lib/algorithms/approx/bigfloat.h | 2 +- lib/simd/Grid_vComplexD.h | 18 ++++++++++++++---- lib/simd/Grid_vComplexF.h | 18 +++++++++++++----- lib/simd/Grid_vRealD.h | 18 +++++++++++++----- lib/simd/Grid_vRealF.h | 20 +++++++++++++++----- tests/Grid_nersc_io.cc | 6 ++++-- 8 files changed, 62 insertions(+), 24 deletions(-) diff --git a/benchmarks/Makefile.am b/benchmarks/Makefile.am index 77ce7663..ae09a6db 100644 --- a/benchmarks/Makefile.am +++ b/benchmarks/Makefile.am @@ -16,7 +16,7 @@ Grid_wilson_cg_unprec_LDADD = -lGrid Grid_comms_SOURCES = Grid_comms.cc Grid_comms_LDADD = -lGrid -Grid_su3_SOURCES = Grid_su3.cc +Grid_su3_SOURCES = Grid_su3.cc Grid_su3_test.cc Grid_su3_LDADD = -lGrid Grid_memory_bandwidth_SOURCES = Grid_memory_bandwidth.cc diff --git a/lib/algorithms/LinearOperator.h b/lib/algorithms/LinearOperator.h index bdb6c387..167213ec 100644 --- a/lib/algorithms/LinearOperator.h +++ b/lib/algorithms/LinearOperator.h @@ -25,7 +25,7 @@ namespace Grid { ///////////////////////////////////////////////////////////////////////////////////////////// template class HermitianOperatorBase : public LinearOperatorBase { public: - virtual void OpAndNorm(const Field &in, Field &out,double &n1,double &n2); + virtual void OpAndNorm(const Field &in, Field &out,double &n1,double &n2)=0; void AdjOp(const Field &in, Field &out) { Op(in,out); }; diff --git a/lib/algorithms/approx/bigfloat.h b/lib/algorithms/approx/bigfloat.h index aee71d03..a749fa81 100755 --- a/lib/algorithms/approx/bigfloat.h +++ b/lib/algorithms/approx/bigfloat.h @@ -31,7 +31,7 @@ public: bigfloat(const double d) { mpf_init_set_d(x, d); } bigfloat(const char *str) { mpf_init_set_str(x, (char*)str, 10); } ~bigfloat(void) { mpf_clear(x); } - operator const double (void) const { return (double)mpf_get_d(x); } + operator double (void) const { return (double)mpf_get_d(x); } static void setDefaultPrecision(unsigned long dprec) { unsigned long bprec = (unsigned long)(3.321928094 * (double)dprec); mpf_set_default_prec(bprec); diff --git a/lib/simd/Grid_vComplexD.h b/lib/simd/Grid_vComplexD.h index 2b03c825..116c2866 100644 --- a/lib/simd/Grid_vComplexD.h +++ b/lib/simd/Grid_vComplexD.h @@ -345,20 +345,30 @@ friend inline void vstore(const vComplexD &ret, ComplexD *a){ // REDUCE FIXME must be a cleaner implementation friend inline ComplexD Reduce(const vComplexD & in) { + vComplexD v1,v2; + union { + zvec v; + double f[sizeof(zvec)/sizeof(double)]; + } conv; + #ifdef SSE4 - return ComplexD(in.v[0],in.v[1]); + v1=in; #endif #if defined(AVX1) || defined (AVX2) - vComplexD v1; permute(v1,in,0); // sse 128; paired complex single v1=v1+in; - return ComplexD(v1.v[0],v1.v[1]); #endif #ifdef AVX512 - return ComplexD(_mm512_mask_reduce_add_pd(0x55, in.v),_mm512_mask_reduce_add_pd(0xAA, in.v)); + permute(v1,in,0); // sse 128; paired complex single + v1=v1+in; + permute(v2,v1,1); // avx 256; quad complex single + v1=v1+v2; #endif #ifdef QPX +#error #endif + conv.v = v1.v; + return ComplexD(conv.f[0],conv.f[1]); } // Unary negation diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Grid_vComplexF.h index 713bbdd8..cf74ff03 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Grid_vComplexF.h @@ -234,26 +234,34 @@ namespace Grid { } friend inline ComplexF Reduce(const vComplexF & in) { + vComplexF v1,v2; + union { + cvec v; + float f[sizeof(cvec)/sizeof(float)]; + } conv; #ifdef SSE4 - vComplexF v1; permute(v1,in,0); // sse 128; paired complex single v1=v1+in; - return ComplexF(v1.v[0],v1.v[1]); #endif #if defined(AVX1) || defined (AVX2) - vComplexF v1,v2; permute(v1,in,0); // sse 128; paired complex single v1=v1+in; permute(v2,v1,1); // avx 256; quad complex single v1=v1+v2; - return ComplexF(v1.v[0],v1.v[1]); #endif #ifdef AVX512 - return ComplexF(_mm512_mask_reduce_add_ps(0x5555, in.v),_mm512_mask_reduce_add_ps(0xAAAA, in.v)); + permute(v1,in,0); // avx512 octo-complex single + v1=v1+in; + permute(v2,v1,1); + v1=v1+v2; + permute(v2,v1,2); + v1=v1+v2; #endif #ifdef QPX #error #endif + conv.v = v1.v; + return ComplexF(conv.f[0],conv.f[1]); } friend inline vComplexF operator * (const ComplexF &a, vComplexF b){ diff --git a/lib/simd/Grid_vRealD.h b/lib/simd/Grid_vRealD.h index 83979d14..a32e579e 100644 --- a/lib/simd/Grid_vRealD.h +++ b/lib/simd/Grid_vRealD.h @@ -210,25 +210,33 @@ namespace Grid { friend inline RealD Reduce(const vRealD & in) { + vRealD v1,v2; + union { + dvec v; + double f[sizeof(dvec)/sizeof(double)]; + } conv; #ifdef SSE4 - vRealD v1; permute(v1,in,0); // sse 128; paired real double v1=v1+in; - return RealD(v1.v[0]); #endif #if defined(AVX1) || defined (AVX2) - vRealD v1,v2; permute(v1,in,0); // avx 256; quad double v1=v1+in; permute(v2,v1,1); v1=v1+v2; - return v1.v[0]; #endif #ifdef AVX512 - return _mm512_reduce_add_pd(in.v); + permute(v1,in,0); // avx 512; octo-double + v1=v1+in; + permute(v2,v1,1); + v1=v1+v2; + permute(v2,v1,2); + v1=v1+v2; #endif #ifdef QPX #endif + conv.v=v1.v; + return conv.f[0]; } // *=,+=,-= operators diff --git a/lib/simd/Grid_vRealF.h b/lib/simd/Grid_vRealF.h index 754c5121..05bfa2f5 100644 --- a/lib/simd/Grid_vRealF.h +++ b/lib/simd/Grid_vRealF.h @@ -243,29 +243,39 @@ friend inline void vstore(const vRealF &ret, float *a){ } friend inline RealF Reduce(const vRealF & in) { -#ifdef SSE4 vRealF v1,v2; + union { + fvec v; + float f[sizeof(fvec)/sizeof(double)]; + } conv; +#ifdef SSE4 permute(v1,in,0); // sse 128; quad single v1=v1+in; permute(v2,v1,1); v1=v1+v2; - return v1.v[0]; #endif #if defined(AVX1) || defined (AVX2) - vRealF v1,v2; permute(v1,in,0); // avx 256; octo-double v1=v1+in; permute(v2,v1,1); v1=v1+v2; permute(v2,v1,2); v1=v1+v2; - return v1.v[0]; #endif #ifdef AVX512 - return _mm512_reduce_add_ps(in.v); + permute(v1,in,0); // avx 256; octo-double + v1=v1+in; + permute(v2,v1,1); + v1=v1+v2; + permute(v2,v1,2); + v1=v1+v2; + permute(v2,v1,3); + v1=v1+v2; #endif #ifdef QPX #endif + conv.v=v1.v; + return conv.f[0]; } // *=,+=,-= operators diff --git a/tests/Grid_nersc_io.cc b/tests/Grid_nersc_io.cc index fbef3cb1..6fe587a6 100644 --- a/tests/Grid_nersc_io.cc +++ b/tests/Grid_nersc_io.cc @@ -13,7 +13,7 @@ int main (int argc, char ** argv) std::vector simd_layout = GridDefaultSimd(4,vComplexF::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); - std::vector latt_size ({16,16,16,32}); + std::vector latt_size = GridDefaultLatt(); std::vector clatt_size ({4,4,4,8}); int orthodir=3; int orthosz =latt_size[orthodir]; @@ -44,13 +44,15 @@ int main (int argc, char ** argv) // (1+2+3)=6 = N(N-1)/2 terms LatticeComplex Plaq(&Fine); LatticeComplex cPlaq(&Coarse); + Plaq = zero; +#if 1 for(int mu=1;mu Date: Tue, 19 May 2015 21:29:40 +0100 Subject: [PATCH 205/429] Build a simple kernel to compare intel compiler and clang in simple environment --- benchmarks/Grid_su3_test.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 benchmarks/Grid_su3_test.cc diff --git a/benchmarks/Grid_su3_test.cc b/benchmarks/Grid_su3_test.cc new file mode 100644 index 00000000..e4d4ec0a --- /dev/null +++ b/benchmarks/Grid_su3_test.cc @@ -0,0 +1,10 @@ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +void su3_test_mult(LatticeColourMatrix &z, LatticeColourMatrix &x,LatticeColourMatrix &y) +{ + z=x*y; +} From 3a3f54932aa4eab5f72d914d3e7b19a09fed3669 Mon Sep 17 00:00:00 2001 From: neo Date: Wed, 20 May 2015 17:22:40 +0900 Subject: [PATCH 206/429] Implemented all SSE4 functions. A test code Grid_simd_new.cc has been created to test the new class. Tests are all OK. --- lib/simd/Grid_sse4.h | 170 +++++++++++++++++++++++++----- lib/simd/Grid_vector_types.h | 194 ++++++++++++++++++++++++----------- tests/Grid_main.cc | 16 ++- tests/Grid_simd_new.cc | 165 +++++++++++++++++++++++++++++ tests/Makefile.am | 5 +- 5 files changed, 458 insertions(+), 92 deletions(-) create mode 100644 tests/Grid_simd_new.cc diff --git a/lib/simd/Grid_sse4.h b/lib/simd/Grid_sse4.h index ed4039b7..ddc3490b 100644 --- a/lib/simd/Grid_sse4.h +++ b/lib/simd/Grid_sse4.h @@ -1,8 +1,10 @@ //---------------------------------------------------------------------- /*! @file Grid_sse4.h - @brief Optimization libraries + @brief Optimization libraries for SSE4 instructions set + + Using intrinsics */ -// Time-stamp: <2015-05-19 17:06:51 neo> +// Time-stamp: <2015-05-20 16:45:39 neo> //---------------------------------------------------------------------- #include @@ -49,6 +51,20 @@ namespace Optimization { }; + struct Vstream{ + //Float + inline void operator()(__m128 a, __m128 b){ + _mm_stream_ps((float *)&a,b); + } + //Double + inline void operator()(__m128d a, __m128d b){ + _mm_stream_pd((double *)&a,b); + } + + + }; + + struct Vset{ // Complex float @@ -75,27 +91,20 @@ namespace Optimization { }; + template struct Reduce{ - //Complex float - inline Grid::ComplexF operator()(__m128 in){ - union { - __m128 v1; - float f[4]; - } u128; - u128.v1 = _mm_add_ps(in, _mm_shuffle_ps(in,in, 0b01001110)); // FIXME Prefer to use _MM_SHUFFLE macros - return Grid::ComplexF(u128.f[0], u128.f[1]); + //Need templated class to overload output type + //General form must generate error if compiled + inline Out_type operator()(In_type in){ + printf("Error, using wrong Reduce function\n"); + exit(1); + return 0; } - //Complex double - inline Grid::ComplexD operator()(__m128d in){ - printf("Missing complex double implementation -> FIX\n"); - return Grid::ComplexD(0,0); // FIXME wrong - } - - - }; + + ///////////////////////////////////////////////////// // Arithmetic operations ///////////////////////////////////////////////////// @@ -129,25 +138,26 @@ namespace Optimization { } }; + struct MultComplex{ // Complex float inline __m128 operator()(__m128 a, __m128 b){ __m128 ymm0,ymm1,ymm2; ymm0 = _mm_shuffle_ps(a,a,_MM_SHUFFLE(2,2,0,0)); // ymm0 <- ar ar, - ymm0 = _mm_mul_ps(ymm0,b); // ymm0 <- ar bi, ar br + ymm0 = _mm_mul_ps(ymm0,b); // ymm0 <- ar bi, ar br ymm1 = _mm_shuffle_ps(b,b,_MM_SHUFFLE(2,3,0,1)); // ymm1 <- br,bi ymm2 = _mm_shuffle_ps(a,a,_MM_SHUFFLE(3,3,1,1)); // ymm2 <- ai,ai - ymm1 = _mm_mul_ps(ymm1,ymm2); // ymm1 <- br ai, ai bi + ymm1 = _mm_mul_ps(ymm1,ymm2); // ymm1 <- br ai, ai bi return _mm_addsub_ps(ymm0,ymm1); } // Complex double inline __m128d operator()(__m128d a, __m128d b){ __m128d ymm0,ymm1,ymm2; - ymm0 = _mm_shuffle_pd(a,a,0x0); // ymm0 <- ar ar, + ymm0 = _mm_shuffle_pd(a,a,0x0); // ymm0 <- ar ar, ymm0 = _mm_mul_pd(ymm0,b); // ymm0 <- ar bi, ar br - ymm1 = _mm_shuffle_pd(b,b,0x1); // ymm1 <- br,bi b01 - ymm2 = _mm_shuffle_pd(a,a,0x3); // ymm2 <- ai,ai b11 - ymm1 = _mm_mul_pd(ymm1,ymm2); // ymm1 <- br ai, ai bi + ymm1 = _mm_shuffle_pd(b,b,0x1); // ymm1 <- br,bi b01 + ymm2 = _mm_shuffle_pd(a,a,0x3); // ymm2 <- ai,ai b11 + ymm1 = _mm_mul_pd(ymm1,ymm2); // ymm1 <- br ai, ai bi return _mm_addsub_pd(ymm0,ymm1); } }; @@ -165,14 +175,112 @@ namespace Optimization { inline __m128i operator()(__m128i a, __m128i b){ return _mm_mul_epi32(a,b); } + }; + + + struct Conj{ + // Complex single + inline __m128 operator()(__m128 in){ + return _mm_xor_ps(_mm_addsub_ps(_mm_setzero_ps(),in), _mm_set1_ps(-0.f)); + } + // Complex double + inline __m128d operator()(__m128d in){ + return _mm_xor_pd(_mm_addsub_pd(_mm_setzero_pd(),in), _mm_set1_pd(-0.f));//untested + } + // do not define for integer input + }; + + struct TimesMinusI{ + //Complex single + inline __m128 operator()(__m128 in, __m128 ret){ + __m128 tmp =_mm_addsub_ps(_mm_setzero_ps(),in); // r,-i + return _mm_shuffle_ps(tmp,tmp,_MM_SHUFFLE(2,3,0,1)); + } + //Complex double + inline __m128d operator()(__m128d in, __m128d ret){ + __m128d tmp =_mm_addsub_pd(_mm_setzero_pd(),in); // r,-i + return _mm_shuffle_pd(tmp,tmp,0x1); + } + + + }; + + struct TimesI{ + //Complex single + inline __m128 operator()(__m128 in, __m128 ret){ + __m128 tmp =_mm_shuffle_ps(in,in,_MM_SHUFFLE(2,3,0,1)); + return _mm_addsub_ps(_mm_setzero_ps(),tmp); // r,-i + } + //Complex double + inline __m128d operator()(__m128d in, __m128d ret){ + __m128d tmp = _mm_shuffle_pd(in,in,0x1); + return _mm_addsub_pd(_mm_setzero_pd(),tmp); // r,-i + } + }; + + ////////////////////////////////////////////// + // Some Template specialization + + //Complex float Reduce + template<> + inline Grid::ComplexF Reduce::operator()(__m128 in){ + union { + __m128 v1; + float f[4]; + } u128; + u128.v1 = _mm_add_ps(in, _mm_shuffle_ps(in,in, 0b01001110)); // FIXME Prefer to use _MM_SHUFFLE macros + return Grid::ComplexF(u128.f[0], u128.f[1]); + } + //Real float Reduce + template<> + inline Grid::RealF Reduce::operator()(__m128 in){ + // FIXME Hack + const Grid::RealF * ptr = (const Grid::RealF *) ∈ + Grid::RealF ret = 0; + for(int i=0;i< 4 ;i++){ // 4 number of simd lanes for float + ret = ret+ptr[i]; + } + return ret; + } + + + //Complex double Reduce + template<> + inline Grid::ComplexD Reduce::operator()(__m128d in){ + printf("Reduce : Missing good complex double implementation -> FIX\n"); + return Grid::ComplexD(in[0], in[1]); // inefficient + } + + //Real double Reduce + template<> + inline Grid::RealD Reduce::operator()(__m128d in){ + // FIXME Hack + const Grid::RealD * ptr =(const Grid::RealD *) ∈ + Grid::RealD ret = 0; + for(int i=0;i< 2 ;i++){// 2 number of simd lanes for float + ret = ret+ptr[i]; + } + return ret; + } + + //Integer Reduce + template<> + inline Integer Reduce::operator()(__m128i in){ + // FIXME unimplemented + printf("Reduce : Missing integer implementation -> FIX\n"); + assert(0); + } + + } +////////////////////////////////////////////////////////////////////////////////////// // Here assign types namespace Grid { typedef __m128 SIMD_Ftype; // Single precision type @@ -180,15 +288,21 @@ namespace Grid { typedef __m128i SIMD_Itype; // Integer type - // Function names - typedef Optimization::Vsplat VsplatSIMD; - typedef Optimization::Vstore VstoreSIMD; + // Function name aliases + typedef Optimization::Vsplat VsplatSIMD; + typedef Optimization::Vstore VstoreSIMD; + typedef Optimization::Vset VsetSIMD; + typedef Optimization::Vstream VstreamSIMD; + template using ReduceSIMD = Optimization::Reduce; + // Arithmetic operations typedef Optimization::Sum SumSIMD; typedef Optimization::Sub SubSIMD; typedef Optimization::Mult MultSIMD; typedef Optimization::MultComplex MultComplexSIMD; - typedef Optimization::Vset VsetSIMD; + typedef Optimization::Conj ConjSIMD; + typedef Optimization::TimesMinusI TimesMinusISIMD; + typedef Optimization::TimesI TimesISIMD; } diff --git a/lib/simd/Grid_vector_types.h b/lib/simd/Grid_vector_types.h index 030a8a79..442c5871 100644 --- a/lib/simd/Grid_vector_types.h +++ b/lib/simd/Grid_vector_types.h @@ -2,7 +2,7 @@ /*! @file Grid_vector_types.h @brief Defines templated class Grid_simd to deal with inner vector types */ -// Time-stamp: <2015-05-19 17:20:36 neo> +// Time-stamp: <2015-05-20 17:21:52 neo> //--------------------------------------------------------------------------- #ifndef GRID_VECTOR_TYPES #define GRID_VECTOR_TYPES @@ -22,6 +22,16 @@ namespace Grid { typedef T type; }; + // type alias used to simplify the syntax of std::enable_if + template using Invoke = + typename T::type; + template using EnableIf = + Invoke>; + template using NotEnableIf = + Invoke>; + + + //////////////////////////////////////////////////////// // Check for complexity with type traits template @@ -93,31 +103,32 @@ namespace Grid { // Initialise to 1,0,i for the correct types /////////////////////////////////////////////// // if not complex overload here - template < class S = Scalar_type,typename std::enable_if < !is_complex < S >::value, int >::type = 0 > + template < class S = Scalar_type, NotEnableIf,int> = 0 > friend inline void vone(Grid_simd &ret) { vsplat(ret,1.0); } - template < class S = Scalar_type,typename std::enable_if < !is_complex < S >::value, int >::type = 0 > + template < class S = Scalar_type, NotEnableIf,int> = 0 > friend inline void vzero(Grid_simd &ret) { vsplat(ret,0.0); } - // overload for complex type - template < class S = Scalar_type,typename std::enable_if < is_complex < S >::value, int >::type = 0 > + // For complex types + template < class S = Scalar_type, EnableIf, int> = 0 > friend inline void vone(Grid_simd &ret) { vsplat(ret,1.0,0.0); } - template < class S = Scalar_type,typename std::enable_if < is_complex < S >::value, int >::type = 0 > + template < class S = Scalar_type, EnableIf, int> = 0 > friend inline void vzero(Grid_simd &ret) { vsplat(ret,0.0,0.0); }// use xor? - - // For integral type - template < class S = Scalar_type,typename std::enable_if < std::is_integral < S >::value, int >::type = 0 > + template < class S = Scalar_type, EnableIf, int> = 0 > + friend inline void vcomplex_i(Grid_simd &ret){ vsplat(ret,0.0,1.0);} + + // For integral types + template < class S = Scalar_type, EnableIf, int> = 0 > friend inline void vone(Grid_simd &ret) { vsplat(ret,1); } - template < class S = Scalar_type,typename std::enable_if < std::is_integral < S >::value, int >::type = 0 > + template < class S = Scalar_type, EnableIf, int> = 0 > friend inline void vzero(Grid_simd &ret) { vsplat(ret,0); } - template < class S = Scalar_type,typename std::enable_if < std::is_integral < S >::value, int >::type = 0 > + template < class S = Scalar_type, EnableIf, int> = 0 > friend inline void vtrue (Grid_simd &ret){vsplat(ret,0xFFFFFFFF);} - template < class S = Scalar_type,typename std::enable_if < std::is_integral < S >::value, int >::type = 0 > + template < class S = Scalar_type, EnableIf, int> = 0 > friend inline void vfalse(vInteger &ret){vsplat(ret,0);} - // do not compile if real or integer, send an error message from the compiler - template < class S = Scalar_type,typename std::enable_if < is_complex < S >::value, int >::type = 0 > - friend inline void vcomplex_i(Grid_simd &ret){ vsplat(ret,0.0,1.0);} + + //////////////////////////////////// // Arithmetic operator overloads +,-,* @@ -137,7 +148,7 @@ namespace Grid { }; // Distinguish between complex types and others - template < class S = Scalar_type, typename std::enable_if < is_complex < S >::value, int >::type = 0 > + template < class S = Scalar_type, EnableIf, int> = 0 > friend inline Grid_simd operator * (Grid_simd a, Grid_simd b) { Grid_simd ret; @@ -146,7 +157,7 @@ namespace Grid { }; // Real/Integer types - template < class S = Scalar_type,typename std::enable_if < !is_complex < S >::value, int >::type = 0 > + template < class S = Scalar_type, NotEnableIf, int> = 0 > friend inline Grid_simd operator * (Grid_simd a, Grid_simd b) { Grid_simd ret; @@ -155,8 +166,6 @@ namespace Grid { }; - - //////////////////////////////////////////////////////////////////////// // FIXME: gonna remove these load/store, get, set, prefetch //////////////////////////////////////////////////////////////////////// @@ -169,14 +178,14 @@ namespace Grid { /////////////////////// // overload if complex template < class S = Scalar_type > - friend inline void vsplat(Grid_simd &ret, typename std::enable_if< is_complex < S >::value, S>::type c){ + friend inline void vsplat(Grid_simd &ret, EnableIf, S> c){ Real a = real(c); Real b = imag(c); vsplat(ret,a,b); } - // this only for the complex version - template < class S = Scalar_type, typename std::enable_if < is_complex < S >::value, int >::type = 0 > + // this is only for the complex version + template < class S = Scalar_type, EnableIf, int> = 0 > friend inline void vsplat(Grid_simd &ret,Real a, Real b){ ret.v = binary(a, b, VsplatSIMD()); } @@ -186,22 +195,45 @@ namespace Grid { ret.v = unary(a, VsplatSIMD()); } - + /////////////////////// + // Vstore + /////////////////////// friend inline void vstore(const Grid_simd &ret, Scalar_type *a){ binary(ret.v, (Real*)a, VstoreSIMD()); } + /////////////////////// + // Vstream + /////////////////////// + friend inline void vstream(Grid_simd &out,const Grid_simd &in){ + binary(out.v, in.v, VstreamSIMD()); + } + + template < class S = Scalar_type, EnableIf, int> = 0 > + friend inline void vstream(Grid_simd &out,const Grid_simd &in){ + out=in; + } + + /////////////////////// + // Vprefetch + /////////////////////// friend inline void vprefetch(const Grid_simd &v) { _mm_prefetch((const char*)&v.v,_MM_HINT_T0); } + /////////////////////// + // Reduce + /////////////////////// friend inline Scalar_type Reduce(const Grid_simd & in) { - // FIXME add operator + return unary(in.v, ReduceSIMD()); } + //////////////////////////// + // opreator scalar * simd + //////////////////////////// friend inline Grid_simd operator * (const Scalar_type &a, Grid_simd b){ Grid_simd va; vsplat(va,a); @@ -214,25 +246,63 @@ namespace Grid { /////////////////////// // Conjugate /////////////////////// - + template < class S = Scalar_type, EnableIf, int> = 0 > friend inline Grid_simd conj(const Grid_simd &in){ - Grid_simd ret ; vzero(ret); - // FIXME add operator + Grid_simd ret ; + ret.v = unary(in.v, ConjSIMD()); return ret; } + template < class S = Scalar_type, NotEnableIf, int> = 0 > + friend inline Grid_simd conj(const Grid_simd &in){ + return in; // for real objects + } + + + /////////////////////// + // timesMinusI + /////////////////////// + template < class S = Scalar_type, EnableIf, int> = 0 > + friend inline void timesMinusI( Grid_simd &ret,const Grid_simd &in){ + ret.v = binary(in.v, ret.v, TimesMinusISIMD()); + } + + template < class S = Scalar_type, EnableIf, int> = 0 > friend inline Grid_simd timesMinusI(const Grid_simd &in){ Grid_simd ret; - vzero(ret); - // FIXME add operator + timesMinusI(ret,in); return ret; } - friend inline Grid_simd timesI(const Grid_simd &in){ - Grid_simd ret; vzero(ret); - // FIXME add operator - return ret; + + template < class S = Scalar_type, NotEnableIf, int> = 0 > + friend inline Grid_simd timesMinusI(const Grid_simd &in){ + return in; + } + + + /////////////////////// + // timesI + /////////////////////// + template < class S = Scalar_type, EnableIf, int> = 0 > + friend inline void timesI(Grid_simd &ret,const Grid_simd &in){ + ret.v = binary(in.v, ret.v, TimesISIMD()); } + template < class S = Scalar_type, EnableIf, int> = 0 > + friend inline Grid_simd timesI(const Grid_simd &in){ + Grid_simd ret; + timesI(ret,in); + return ret; + } + + template < class S = Scalar_type, NotEnableIf, int> = 0 > + friend inline Grid_simd timesI(const Grid_simd &in){ + return in; + } + + + /////////////////////// // Unary negation + /////////////////////// friend inline Grid_simd operator -(const Grid_simd &r) { vComplexF ret; vzero(ret); @@ -256,41 +326,22 @@ namespace Grid { - friend inline void permute(Grid_simd &y,Grid_simd b,int perm) - { - Gpermute(y,b,perm); - } - /* + //////////////////////////////////////////////////////////////////// + // General permute; assumes vector length is same across + // all subtypes; may not be a good assumption, but could + // add the vector width as a template param for BG/Q for example + //////////////////////////////////////////////////////////////////// friend inline void permute(Grid_simd &y,Grid_simd b,int perm) { Gpermute(y,b,perm); } - friend inline void merge(Grid_simd &y,std::vector &extracted) - { - Gmerge(y,extracted); - } - friend inline void extract(const Grid_simd &y,std::vector &extracted) - { - Gextract(y,extracted); - } - friend inline void merge(Grid_simd &y,std::vector &extracted) - { - Gmerge(y,extracted); - } - friend inline void extract(const Grid_simd &y,std::vector &extracted) - { - Gextract(y,extracted); - } - */ - + + };// end of Grid_simd class definition - - - template inline Grid_simd< scalar_type, vector_type> innerProduct(const Grid_simd< scalar_type, vector_type> & l, const Grid_simd< scalar_type, vector_type> & r) { @@ -314,7 +365,7 @@ namespace Grid { } - // Define available types (now change names to avoid clashing) + // Define available types (now change names to avoid clashing with the rest of the code) typedef Grid_simd< float , SIMD_Ftype > MyRealF; typedef Grid_simd< double , SIMD_Dtype > MyRealD; @@ -323,6 +374,29 @@ namespace Grid { + + //////////////////////////////////////////////////////////////////// + // Temporary hack to keep independent from the rest of the code + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + template<> struct isGridTensor { + static const bool value = false; + static const bool notvalue = true; + }; + + + + } #endif diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index 17e36df9..2aa44a0f 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -161,30 +161,40 @@ int main (int argc, char ** argv) ///////// Tests the new class Grid_simd std::complex ctest(3.0,2.0); std::complex ctestf(3.0,2.0); - MyComplexF TestMe1(1.0); // fill real part + MyComplexF TestMe1(1.0); // fills only real part MyComplexD TestMe2(ctest); MyComplexD TestMe3(ctest);// compiler generate conversion of basic types //MyRealF TestMe5(ctest);// Must generate compiler error - MyRealD TestMe4(2.0); + MyRealD TestRe1(2.0); + MyRealF TestRe2(3.0); + vone(TestRe2); + MyComplexF TestMe6(ctestf); MyComplexF TestMe7(ctestf); MyComplexD TheSum= TestMe2*TestMe3; MyComplexF TheSumF= TestMe6*TestMe7; + + double dsum[2]; _mm_store_pd(dsum, TheSum.v); for (int i =0; i< 2; i++) printf("%f\n", dsum[i]); + MyComplexD TheSumI = timesMinusI(TheSum); + MyComplexF TheSumIF = timesMinusI(TheSumF); float fsum[4]; _mm_store_ps(fsum, TheSumF.v); for (int i =0; i< 4; i++) printf("%f\n", fsum[i]); - vstore(TheSum, &ctest); + vstore(TheSumI, &ctest); + std::complex sum = Reduce(TheSumF); std::cout << ctest<< std::endl; + std::cout << sum<< std::endl; + #endif /////////////////////// diff --git a/tests/Grid_simd_new.cc b/tests/Grid_simd_new.cc new file mode 100644 index 00000000..3de12231 --- /dev/null +++ b/tests/Grid_simd_new.cc @@ -0,0 +1,165 @@ +#include +#include "simd/Grid_vector_types.h" +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +class funcPlus { +public: + funcPlus() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = i1+i2;} + std::string name(void) const { return std::string("Plus"); } +}; +class funcMinus { +public: + funcMinus() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = i1-i2;} + std::string name(void) const { return std::string("Minus"); } +}; +class funcTimes { +public: + funcTimes() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = i1*i2;} + std::string name(void) const { return std::string("Times"); } +}; +class funcConj { +public: + funcConj() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = conj(i1);} + std::string name(void) const { return std::string("Conj"); } +}; +class funcAdj { +public: + funcAdj() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = adj(i1);} + std::string name(void) const { return std::string("Adj"); } +}; + +class funcTimesI { +public: + funcTimesI() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = timesI(i1);} + std::string name(void) const { return std::string("timesI"); } +}; + +class funcTimesMinusI { +public: + funcTimesMinusI() {}; + template void operator()(vec &rr,vec &i1,vec &i2) const { rr = timesMinusI(i1);} + std::string name(void) const { return std::string("timesMinusI"); } +}; + +template +void Tester(const functor &func) +{ + GridSerialRNG sRNG; + sRNG.SeedRandomDevice(); + + int Nsimd = vec::Nsimd(); + + std::vector input1(Nsimd); + std::vector input2(Nsimd); + std::vector result(Nsimd); + std::vector reference(Nsimd); + + std::vector > buf(3); + vec & v_input1 = buf[0]; + vec & v_input2 = buf[1]; + vec & v_result = buf[2]; + + + for(int i=0;i(v_input1,input1); + merge(v_input2,input2); + merge(v_result,result); + + func(v_result,v_input1,v_input2); + + for(int i=0;i(v_result,result); + std::cout << " " << func.name()<0){ + std::cout<< "*****" << std::endl; + std::cout<< "["< latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(4,MyComplexF::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + std::vector seeds({1,2,3,4}); + + // Insist that operations on random scalars gives + // identical results to on vectors. + + std::cout << "==================================="<< std::endl; + std::cout << "Testing MyComplexF "<(funcTimesI()); + Tester(funcTimesMinusI()); + Tester(funcPlus()); + Tester(funcMinus()); + Tester(funcTimes()); + Tester(funcConj()); + Tester(funcAdj()); + + std::cout << "==================================="<< std::endl; + std::cout << "Testing MyComplexD "<(funcTimesI()); + Tester(funcTimesMinusI()); + Tester(funcPlus()); + Tester(funcMinus()); + Tester(funcTimes()); + Tester(funcConj()); + Tester(funcAdj()); + + std::cout << "==================================="<< std::endl; + std::cout << "Testing MyRealF "<(funcPlus()); + Tester(funcMinus()); + Tester(funcTimes()); + Tester(funcAdj()); + + std::cout << "==================================="<< std::endl; + std::cout << "Testing MyRealD "<(funcPlus()); + Tester(funcMinus()); + Tester(funcTimes()); + Tester(funcAdj()); + + Grid_finalize(); +} diff --git a/tests/Makefile.am b/tests/Makefile.am index 82d1b3be..8b68855d 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -5,7 +5,7 @@ AM_LDFLAGS = -L$(top_builddir)/lib # # Test code # -bin_PROGRAMS = Grid_main Grid_stencil Grid_nersc_io Grid_cshift Grid_gamma Grid_simd Grid_rng Grid_remez +bin_PROGRAMS = Grid_main Grid_stencil Grid_nersc_io Grid_cshift Grid_gamma Grid_simd Grid_rng Grid_remez Grid_simd_new Grid_main_SOURCES = Grid_main.cc Grid_main_LDADD = -lGrid @@ -30,3 +30,6 @@ Grid_stencil_LDADD = -lGrid Grid_simd_SOURCES = Grid_simd.cc Grid_simd_LDADD = -lGrid + +Grid_simd_new_SOURCES = Grid_simd_new.cc +Grid_simd_new_LDADD = -lGrid From 35055ed5c1249c1391a64217a203fe5b3d410b8b Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 21 May 2015 06:34:33 +0100 Subject: [PATCH 207/429] Unroll pragma abstraction --- lib/Grid_threads.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/Grid_threads.h b/lib/Grid_threads.h index 89a56d80..24581855 100644 --- a/lib/Grid_threads.h +++ b/lib/Grid_threads.h @@ -5,6 +5,8 @@ #define GRID_OMP #endif +#define UNROLL _Pragma("unroll") + #ifdef GRID_OMP #include #define PARALLEL_FOR_LOOP _Pragma("omp parallel for") From d8065816662c56de8741569686947e0b9c03fe06 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 21 May 2015 06:35:46 +0100 Subject: [PATCH 208/429] better comms benchmarking --- benchmarks/Grid_comms.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/benchmarks/Grid_comms.cc b/benchmarks/Grid_comms.cc index e844c5d3..59d709a0 100644 --- a/benchmarks/Grid_comms.cc +++ b/benchmarks/Grid_comms.cc @@ -23,7 +23,7 @@ int main (int argc, char ** argv) - for(int lat=4;lat<=16;lat+=4){ + for(int lat=4;lat<=32;lat+=2){ for(int Ls=1;Ls<=16;Ls*=2){ std::vector latt_size ({lat,lat,lat,lat}); @@ -94,8 +94,7 @@ int main (int argc, char ** argv) std::cout << " L "<<"\t\t"<<" Ls "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"< latt_size ({lat,lat,lat,lat}); From 57a01e6bbb69f3b2d98fb0e060d58987d283f94a Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 21 May 2015 06:36:15 +0100 Subject: [PATCH 209/429] Didn't like a print statement --- lib/algorithms/iterative/ConjugateGradient.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/algorithms/iterative/ConjugateGradient.h b/lib/algorithms/iterative/ConjugateGradient.h index f7f8559e..85b196e9 100644 --- a/lib/algorithms/iterative/ConjugateGradient.h +++ b/lib/algorithms/iterative/ConjugateGradient.h @@ -15,7 +15,6 @@ public: Integer MaxIterations; ConjugateGradient(RealD tol,Integer maxit) : Tolerance(tol), MaxIterations(maxit) { - std::cout << Tolerance< &Linop,const Field &src, Field &psi) {assert(0);}; From c96af471eedb11379b1700fd2667aa462526191a Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 21 May 2015 06:36:47 +0100 Subject: [PATCH 210/429] useful to dump assembler --- benchmarks/Grid_su3_test.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/benchmarks/Grid_su3_test.cc b/benchmarks/Grid_su3_test.cc index e4d4ec0a..8a7f6246 100644 --- a/benchmarks/Grid_su3_test.cc +++ b/benchmarks/Grid_su3_test.cc @@ -4,7 +4,8 @@ using namespace std; using namespace Grid; using namespace Grid::QCD; -void su3_test_mult(LatticeColourMatrix &z, LatticeColourMatrix &x,LatticeColourMatrix &y) + +void su3_test_mult_routine(LatticeColourMatrix &z, LatticeColourMatrix &x,LatticeColourMatrix &y) { - z=x*y; + mult(z,x,y); } From 3e1d1aff185c7917670893361dfb298e84b7581b Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 21 May 2015 06:37:20 +0100 Subject: [PATCH 211/429] Minor change --- benchmarks/Grid_wilson_cg_unprec.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/Grid_wilson_cg_unprec.cc b/benchmarks/Grid_wilson_cg_unprec.cc index 2a91864b..93023534 100644 --- a/benchmarks/Grid_wilson_cg_unprec.cc +++ b/benchmarks/Grid_wilson_cg_unprec.cc @@ -30,7 +30,7 @@ int main (int argc, char ** argv) GridParallelRNG pRNG(&Grid); pRNG.SeedFixedIntegers(seeds); LatticeFermion src(&Grid); random(pRNG,src); - std::cout << "src norm" << norm2(src)< Date: Thu, 21 May 2015 06:37:46 +0100 Subject: [PATCH 212/429] adding two routines containing only a single operation so I can easily see the assembly dump --- benchmarks/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/Makefile.am b/benchmarks/Makefile.am index ae09a6db..fc513e86 100644 --- a/benchmarks/Makefile.am +++ b/benchmarks/Makefile.am @@ -16,7 +16,7 @@ Grid_wilson_cg_unprec_LDADD = -lGrid Grid_comms_SOURCES = Grid_comms.cc Grid_comms_LDADD = -lGrid -Grid_su3_SOURCES = Grid_su3.cc Grid_su3_test.cc +Grid_su3_SOURCES = Grid_su3.cc Grid_su3_test.cc Grid_su3_expr.cc Grid_su3_LDADD = -lGrid Grid_memory_bandwidth_SOURCES = Grid_memory_bandwidth.cc From 874b2eb32de3334528e856d59cb6399cb849c7ae Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 21 May 2015 06:39:00 +0100 Subject: [PATCH 213/429] Compile time select if we do the streaming store copy. Relies on Clang++ eliminating object copies, and other compliers do not necessarily cope. --- lib/lattice/Grid_lattice_arith.h | 61 ++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/lib/lattice/Grid_lattice_arith.h b/lib/lattice/Grid_lattice_arith.h index f1e566a2..ff966578 100644 --- a/lib/lattice/Grid_lattice_arith.h +++ b/lib/lattice/Grid_lattice_arith.h @@ -12,10 +12,13 @@ namespace Grid { conformable(lhs,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ +#ifdef STREAMING_STORES obj1 tmp; mult(&tmp,&lhs._odata[ss],&rhs._odata[ss]); vstream(ret._odata[ss],tmp); - // mult(&ret._odata[ss],&lhs._odata[ss],&rhs._odata[ss]); +#else + mult(&ret._odata[ss],&lhs._odata[ss],&rhs._odata[ss]); +#endif } } @@ -24,9 +27,13 @@ PARALLEL_FOR_LOOP conformable(lhs,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ +#ifdef STREAMING_STORES obj1 tmp; mac(&tmp,&lhs._odata[ss],&rhs._odata[ss]); vstream(ret._odata[ss],tmp); +#else + mac(&ret._odata[ss],&lhs._odata[ss],&rhs._odata[ss]); +#endif } } @@ -35,9 +42,13 @@ PARALLEL_FOR_LOOP conformable(lhs,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ +#ifdef STREAMING_STORES obj1 tmp; sub(&tmp,&lhs._odata[ss],&rhs._odata[ss]); vstream(ret._odata[ss],tmp); +#else + sub(&ret._odata[ss],&lhs._odata[ss],&rhs._odata[ss]); +#endif } } template strong_inline @@ -45,9 +56,13 @@ PARALLEL_FOR_LOOP conformable(lhs,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ +#ifdef STREAMING_STORES obj1 tmp; add(&tmp,&lhs._odata[ss],&rhs._odata[ss]); vstream(ret._odata[ss],tmp); +#else + add(&ret._odata[ss],&lhs._odata[ss],&rhs._odata[ss]); +#endif } } @@ -81,9 +96,13 @@ PARALLEL_FOR_LOOP conformable(lhs,ret); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ +#ifdef STREAMING_STORES obj1 tmp; sub(&tmp,&lhs._odata[ss],&rhs); vstream(ret._odata[ss],tmp); +#else + sub(&ret._odata[ss],&lhs._odata[ss],&rhs); +#endif } } template strong_inline @@ -91,9 +110,13 @@ PARALLEL_FOR_LOOP conformable(lhs,ret); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ +#ifdef STREAMING_STORES obj1 tmp; add(&tmp,&lhs._odata[ss],&rhs); vstream(ret._odata[ss],tmp); +#else + add(&ret._odata[ss],&lhs._odata[ss],&rhs); +#endif } } @@ -105,9 +128,13 @@ PARALLEL_FOR_LOOP conformable(ret,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ +#ifdef STREAMING_STORES obj1 tmp; mult(&tmp,&lhs,&rhs._odata[ss]); vstream(ret._odata[ss],tmp); +#else + mult(&ret._odata[ss],&lhs,&rhs._odata[ss]); +#endif } } @@ -116,9 +143,13 @@ PARALLEL_FOR_LOOP conformable(ret,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ +#ifdef STREAMING_STORES obj1 tmp; mac(&tmp,&lhs,&rhs._odata[ss]); vstream(ret._odata[ss],tmp); +#else + mac(&ret._odata[ss],&lhs,&rhs._odata[ss]); +#endif } } @@ -127,9 +158,13 @@ PARALLEL_FOR_LOOP conformable(ret,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ +#ifdef STREAMING_STORES obj1 tmp; sub(&tmp,&lhs,&rhs._odata[ss]); vstream(ret._odata[ss],tmp); +#else + sub(&ret._odata[ss],&lhs,&rhs._odata[ss]); +#endif } } template strong_inline @@ -137,9 +172,13 @@ PARALLEL_FOR_LOOP conformable(ret,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ +#ifdef STREAMING_STORES obj1 tmp; add(&tmp,&lhs,&rhs._odata[ss]); vstream(ret._odata[ss],tmp); +#else + add(&ret._odata[ss],&lhs,&rhs._odata[ss]); +#endif } } @@ -148,8 +187,12 @@ PARALLEL_FOR_LOOP conformable(x,y); #pragma omp parallel for for(int ss=0;ssoSites();ss++){ +#ifdef STREAMING_STORES vobj tmp = a*x._odata[ss]+y._odata[ss]; vstream(ret._odata[ss],tmp); +#else + ret._odata[ss]=a*x._odata[ss]+y._odata[ss]; +#endif } } template strong_inline @@ -157,29 +200,25 @@ PARALLEL_FOR_LOOP conformable(x,y); #pragma omp parallel for for(int ss=0;ssoSites();ss++){ +#ifdef STREAMING_STORES vobj tmp = a*x._odata[ss]+b*y._odata[ss]; vstream(ret._odata[ss],tmp); +#else + ret._odata[ss]=a*x._odata[ss]+b*y._odata[ss]; +#endif } } template strong_inline RealD axpy_norm(Lattice &ret,sobj a,const Lattice &x,const Lattice &y){ conformable(x,y); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - vobj tmp = a*x._odata[ss]+y._odata[ss]; - vstream(ret._odata[ss],tmp); - } + axpy(ret,a,x,y); return norm2(ret); } template strong_inline RealD axpby_norm(Lattice &ret,sobj a,sobj b,const Lattice &x,const Lattice &y){ conformable(x,y); -#pragma omp parallel for - for(int ss=0;ssoSites();ss++){ - vobj tmp = a*x._odata[ss]+b*y._odata[ss]; - vstream(ret._odata[ss],tmp); - } + axpby(ret,a,b,x,y); return norm2(ret); // FIXME implement parallel norm in ss loop } From d8061afe2456dc8c46499bd803e1726e6391fc51 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Thu, 21 May 2015 06:47:05 +0100 Subject: [PATCH 214/429] Streaming store option ifdef --- lib/lattice/Grid_lattice_base.h | 41 ++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/lib/lattice/Grid_lattice_base.h b/lib/lattice/Grid_lattice_base.h index 0016bafa..41f349b7 100644 --- a/lib/lattice/Grid_lattice_base.h +++ b/lib/lattice/Grid_lattice_base.h @@ -1,6 +1,8 @@ #ifndef GRID_LATTICE_BASE_H #define GRID_LATTICE_BASE_H +#define STREAMING_STORES + namespace Grid { // TODO: @@ -66,8 +68,12 @@ public: { PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ - vobj tmp= eval(ss,expr); +#ifdef STREAMING_STORES + vobj tmp = eval(ss,expr); vstream(_odata[ss] ,tmp); +#else + _odata[ss]=eval(ss,expr); +#endif } return *this; } @@ -75,8 +81,12 @@ PARALLEL_FOR_LOOP { PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ - vobj tmp= eval(ss,expr); +#ifdef STREAMING_STORES + vobj tmp = eval(ss,expr); vstream(_odata[ss] ,tmp); +#else + _odata[ss]=eval(ss,expr); +#endif } return *this; } @@ -84,8 +94,12 @@ PARALLEL_FOR_LOOP { PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ - vobj tmp= eval(ss,expr); +#ifdef STREAMING_STORES + vobj tmp = eval(ss,expr); vstream(_odata[ss] ,tmp); +#else + _odata[ss] = eval(ss,expr); +#endif } return *this; } @@ -97,7 +111,12 @@ PARALLEL_FOR_LOOP _odata.resize(_grid->oSites()); PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ - _odata[ss] = eval(ss,expr); +#ifdef STREAMING_STORES + vobj tmp = eval(ss,expr); + vstream(_odata[ss] ,tmp); +#else + _odata[ss]=_eval(ss,expr); +#endif } }; template @@ -107,7 +126,12 @@ PARALLEL_FOR_LOOP _odata.resize(_grid->oSites()); PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ - _odata[ss] = eval(ss,expr); +#ifdef STREAMING_STORES + vobj tmp = eval(tmp,ss,expr); + vstream(_odata[ss] ,tmp); +#else + _odata[ss]=eval(ss,expr); +#endif } }; template @@ -117,7 +141,12 @@ PARALLEL_FOR_LOOP _odata.resize(_grid->oSites()); PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ - _odata[ss] = eval(ss,expr); +#ifdef STREAMING_STORES + vobj tmp = eval(ss,expr); + vstream(_odata[ss] ,tmp); +#else + _odata[ss]=eval(ss,expr); +#endif } }; From 1c862dc15b934d86d2debfdfb867ad096a992845 Mon Sep 17 00:00:00 2001 From: neo Date: Fri, 22 May 2015 17:33:15 +0900 Subject: [PATCH 215/429] Completed implementation of new Grid_simd classes Tested performance for SSE4, Ok. AVX1/2, AVX512 yet untested --- configure.ac | 4 +- lib/Grid_simd.h | 6 +- lib/Makefile.am | 10 +- lib/cshift/Grid_cshift_common.h | 3 +- lib/simd/Grid_avx.h | 401 ++++++++++++++++++++++++++++ lib/simd/Grid_knc.h | 323 ++++++++++++++++++++++ lib/simd/Grid_qpx.h | 272 +++++++++++++++++++ lib/simd/Grid_sse4.h | 10 +- lib/simd/Grid_vector_types.h | 94 ++++--- lib/simd/{ => Old}/Grid_vComplexD.h | 0 lib/simd/{ => Old}/Grid_vComplexF.h | 2 +- lib/simd/{ => Old}/Grid_vInteger.h | 0 lib/simd/{ => Old}/Grid_vRealD.h | 0 lib/simd/{ => Old}/Grid_vRealF.h | 0 tests/Grid_main.cc | 42 ++- tests/Makefile.am | 6 +- 16 files changed, 1091 insertions(+), 82 deletions(-) create mode 100644 lib/simd/Grid_avx.h create mode 100644 lib/simd/Grid_knc.h create mode 100644 lib/simd/Grid_qpx.h rename lib/simd/{ => Old}/Grid_vComplexD.h (100%) rename lib/simd/{ => Old}/Grid_vComplexF.h (99%) rename lib/simd/{ => Old}/Grid_vInteger.h (100%) rename lib/simd/{ => Old}/Grid_vRealD.h (100%) rename lib/simd/{ => Old}/Grid_vRealF.h (100%) diff --git a/configure.ac b/configure.ac index 93e2b574..bfcbfcef 100644 --- a/configure.ac +++ b/configure.ac @@ -3,9 +3,9 @@ # # Project Grid package # -# Time-stamp: <2015-05-19 13:51:08 neo> +# Time-stamp: <2015-05-22 15:46:09 neo> -AC_PREREQ([2.69]) +AC_PREREQ([2.63]) AC_INIT([Grid], [1.0], [paboyle@ph.ed.ac.uk]) AC_CANONICAL_SYSTEM AM_INIT_AUTOMAKE(subdir-objects) diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index 6d7411d3..9484c0d6 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -203,11 +203,7 @@ inline void Gpermute(vsimd &y,const vsimd &b,int perm){ }; }; -#include -#include -#include -#include -#include +#include namespace Grid { diff --git a/lib/Makefile.am b/lib/Makefile.am index 82459763..cdb36c71 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -91,12 +91,10 @@ nobase_include_HEADERS = algorithms/approx/bigfloat.h \ qcd/Grid_qcd_2spinor.h \ qcd/Grid_qcd_dirac.h \ qcd/Grid_qcd_wilson_dop.h \ - simd/Grid_vComplexD.h \ - simd/Grid_vComplexF.h \ - simd/Grid_vInteger.h \ - simd/Grid_vRealD.h \ - simd/Grid_vRealF.h \ simd/Grid_vector_types.h \ - simd/Grid_sse4.h + simd/Grid_sse4.h \ + simd/Grid_avx.h \ + simd/Grid_knc.h + diff --git a/lib/cshift/Grid_cshift_common.h b/lib/cshift/Grid_cshift_common.h index cf1f88af..65c0cb87 100644 --- a/lib/cshift/Grid_cshift_common.h +++ b/lib/cshift/Grid_cshift_common.h @@ -154,7 +154,6 @@ template void Copy_plane(Lattice& lhs,Lattice &rhs, int cbmask=0x3; } - int ro = rplane*rhs._grid->_ostride[dimension]; // base offset for start of plane int lo = lplane*lhs._grid->_ostride[dimension]; // base offset for start of plane @@ -170,10 +169,12 @@ PARALLEL_NESTED_LOOP2 } } + } template void Copy_plane_permute(Lattice& lhs,Lattice &rhs, int dimension,int lplane,int rplane,int cbmask,int permute_type) { + int rd = rhs._grid->_rdimensions[dimension]; if ( !rhs._grid->CheckerBoarded(dimension) ) { diff --git a/lib/simd/Grid_avx.h b/lib/simd/Grid_avx.h new file mode 100644 index 00000000..ea796122 --- /dev/null +++ b/lib/simd/Grid_avx.h @@ -0,0 +1,401 @@ +//---------------------------------------------------------------------- +/*! @file Grid_avx.h + @brief Optimization libraries for AVX1/2 instructions set + + Using intrinsics +*/ +// Time-stamp: <2015-05-22 15:51:24 neo> +//---------------------------------------------------------------------- + +#include +// _mm256_set_m128i(hi,lo); // not defined in all versions of immintrin.h +#ifndef _mm256_set_m128i +#define _mm256_set_m128i(hi,lo) _mm256_insertf128_si256(_mm256_castsi128_si256(lo),(hi),1) +#endif + +namespace Optimization { + + struct Vsplat{ + //Complex float + inline __m256 operator()(float a, float b){ + return _mm256_set_ps(b,a,b,a,b,a,b,a); + } + // Real float + inline __m256 operator()(float a){ + return _mm256_set_ps(a,a,a,a,a,a,a,a); + } + //Complex double + inline __m256d operator()(double a, double b){ + return _mm256_set_pd(b,a,b,a); + } + //Real double + inline __m256d operator()(double a){ + return _mm256_set_pd(a,a,a,a); + } + //Integer + inline __m256i operator()(Integer a){ + return _mm256_set1_epi32(a); + } + }; + + struct Vstore{ + //Float + inline void operator()(__m256 a, float* F){ + _mm256_store_ps(F,a); + } + //Double + inline void operator()(__m256d a, double* D){ + _mm256_store_pd(D,a); + } + //Integer + inline void operator()(__m256i a, Integer* I){ + _mm256_store_si256((__m256i*)I,a); + } + + }; + + + struct Vstream{ + //Float + inline void operator()(float * a, __m256 b){ + _mm256_stream_ps(a,b); + } + //Double + inline void operator()(double * a, __m256d b){ + _mm256_stream_pd(a,b); + } + + + }; + + + + struct Vset{ + // Complex float + inline __m256 operator()(Grid::ComplexF *a){ + return _mm256_set_ps(a[3].imag(),a[3].real(),a[2].imag(),a[2].real(),a[1].imag(),a[1].real(),a[0].imag(),a[0].real()); + } + // Complex double + inline __m256d operator()(Grid::ComplexD *a){ + return _mm256_set_pd(a[1].imag(),a[1].real(),a[0].imag(),a[0].real()); + } + // Real float + inline __m256 operator()(float *a){ + return _mm256_set_ps(a[7],a[6],a[5],a[4],a[3],a[2],a[1],a[0]); + } + // Real double + inline __m256d operator()(double *a){ + return _mm256_set_pd(a[3],a[2],a[1],a[0]); + } + // Integer + inline __m256i operator()(Integer *a){ + return _mm256_set_epi32(a[7],a[6],a[5],a[4],a[3],a[2],a[1],a[0]); + } + + + }; + + template + struct Reduce{ + //Need templated class to overload output type + //General form must generate error if compiled + inline Out_type operator()(In_type in){ + printf("Error, using wrong Reduce function\n"); + exit(1); + return 0; + } + }; + + + + + ///////////////////////////////////////////////////// + // Arithmetic operations + ///////////////////////////////////////////////////// + struct Sum{ + //Complex/Real float + inline __m256 operator()(__m256 a, __m256 b){ + return _mm256_add_ps(a,b); + } + //Complex/Real double + inline __m256d operator()(__m256d a, __m256d b){ + return _mm256_add_pd(a,b); + } + //Integer + inline __m256i operator()(__m256i a, __m256i b){ +#if defined (AVX1) + __m128i a0,a1; + __m128i b0,b1; + a0 = _mm256_extractf128_si256(a,0); + b0 = _mm256_extractf128_si256(b,0); + a1 = _mm256_extractf128_si256(a,1); + b1 = _mm256_extractf128_si256(b,1); + a0 = _mm_add_epi32(a0,b0); + a1 = _mm_add_epi32(a1,b1); + return _mm256_set_m128i(a1,a0); +#endif +#if defined (AVX2) + return _mm256_add_epi32(a,b); +#endif + + } + }; + + struct Sub{ + //Complex/Real float + inline __m256 operator()(__m256 a, __m256 b){ + return _mm256_sub_ps(a,b); + } + //Complex/Real double + inline __m256d operator()(__m256d a, __m256d b){ + return _mm256_sub_pd(a,b); + } + //Integer + inline __m256i operator()(__m256i a, __m256i b){ +#if defined (AVX1) + __m128i a0,a1; + __m128i b0,b1; + a0 = _mm256_extractf128_si256(a,0); + b0 = _mm256_extractf128_si256(b,0); + a1 = _mm256_extractf128_si256(a,1); + b1 = _mm256_extractf128_si256(b,1); + a0 = _mm_sub_epi32(a0,b0); + a1 = _mm_sub_epi32(a1,b1); + return _mm256_set_m128i(a1,a0); +#endif +#if defined (AVX2) + return _mm256_sub_epi32(a,b); +#endif + + } + }; + + + struct MultComplex{ + // Complex float + inline __m256 operator()(__m256 a, __m256 b){ + __m256 ymm0,ymm1,ymm2; + ymm0 = _mm256_shuffle_ps(a,a,_MM_SHUFFLE(2,2,0,0)); // ymm0 <- ar ar, + ymm0 = _mm256_mul_ps(ymm0,b); // ymm0 <- ar bi, ar br + // FIXME AVX2 could MAC + ymm1 = _mm256_shuffle_ps(b,b,_MM_SHUFFLE(2,3,0,1)); // ymm1 <- br,bi + ymm2 = _mm256_shuffle_ps(a,a,_MM_SHUFFLE(3,3,1,1)); // ymm2 <- ai,ai + ymm1 = _mm256_mul_ps(ymm1,ymm2); // ymm1 <- br ai, ai bi + return _mm256_addsub_ps(ymm0,ymm1); + } + // Complex double + inline __m256d operator()(__m256d a, __m256d b){ + //Multiplication of (ak+ibk)*(ck+idk) + // a + i b can be stored as a data structure + //From intel optimisation reference guide + /* + movsldup xmm0, Src1; load real parts into the destination, + ; a1, a1, a0, a0 + movaps xmm1, src2; load the 2nd pair of complex values, ; i.e. d1, c1, d0, c0 + mulps xmm0, xmm1; temporary results, a1d1, a1c1, a0d0, ; a0c0 + shufps xmm1, xmm1, b1; reorder the real and imaginary ; parts, c1, d1, c0, d0 + movshdup xmm2, Src1; load the imaginary parts into the ; destination, b1, b1, b0, b0 + mulps xmm2, xmm1; temporary results, b1c1, b1d1, b0c0, ; b0d0 + addsubps xmm0, xmm2; b1c1+a1d1, a1c1 -b1d1, b0c0+a0d + VSHUFPD (VEX.256 encoded version) + IF IMM0[0] = 0 + THEN DEST[63:0]=SRC1[63:0] ELSE DEST[63:0]=SRC1[127:64] FI; + IF IMM0[1] = 0 + THEN DEST[127:64]=SRC2[63:0] ELSE DEST[127:64]=SRC2[127:64] FI; + IF IMM0[2] = 0 + THEN DEST[191:128]=SRC1[191:128] ELSE DEST[191:128]=SRC1[255:192] FI; + IF IMM0[3] = 0 + THEN DEST[255:192]=SRC2[191:128] ELSE DEST[255:192]=SRC2[255:192] FI; // Ox5 r<->i ; 0xC unchanged + */ + + __m256d ymm0,ymm1,ymm2; + ymm0 = _mm256_shuffle_pd(a,a,0x0); // ymm0 <- ar ar, ar,ar b'00,00 + ymm0 = _mm256_mul_pd(ymm0,b); // ymm0 <- ar bi, ar br + ymm1 = _mm256_shuffle_pd(b,b,0x5); // ymm1 <- br,bi b'01,01 + ymm2 = _mm256_shuffle_pd(a,a,0xF); // ymm2 <- ai,ai b'11,11 + ymm1 = _mm256_mul_pd(ymm1,ymm2); // ymm1 <- br ai, ai bi + return _mm256_addsub_pd(ymm0,ymm1); + } + }; + + struct Mult{ + // Real float + inline __m256 operator()(__m256 a, __m256 b){ + return _mm256_mul_ps(a,b); + } + // Real double + inline __m256d operator()(__m256d a, __m256d b){ + return _mm256_mul_pd(a,b); + } + // Integer + inline __m256i operator()(__m256i a, __m256i b){ +#if defined (AVX1) + __m128i a0,a1; + __m128i b0,b1; + a0 = _mm256_extractf128_si256(a,0); + b0 = _mm256_extractf128_si256(b,0); + a1 = _mm256_extractf128_si256(a,1); + b1 = _mm256_extractf128_si256(b,1); + a0 = _mm_mul_epi32(a0,b0); + a1 = _mm_mul_epi32(a1,b1); + return _mm256_set_m128i(a1,a0); +#endif +#if defined (AVX2) + return _mm256_mul_epi32(a,b); +#endif + + } + }; + + + struct Conj{ + // Complex single + inline __m256 operator()(__m256 in){ + return _mm256_xor_ps(_mm256_addsub_ps(_mm256_setzero_ps(),in), _mm256_set1_ps(-0.f)); + } + // Complex double + inline __m256d operator()(__m256d in){ + return _mm256_xor_pd(_mm256_addsub_pd(_mm256_setzero_pd(),in), _mm256_set1_pd(-0.f));//untested + /* + // original + // addsubps 0, inv=>0+in.v[3] 0-in.v[2], 0+in.v[1], 0-in.v[0], ... + __m256d tmp = _mm256_addsub_pd(_mm256_setzero_pd(),_mm256_shuffle_pd(in,in,0x5)); + return _mm256_shuffle_pd(tmp,tmp,0x5); + */ + } + // do not define for integer input + }; + + struct TimesMinusI{ + //Complex single + inline __m256 operator()(__m256 in, __m256 ret){ + __m256 tmp =_mm256_addsub_ps(_mm256_setzero_ps(),in); // r,-i + return _mm256_shuffle_ps(tmp,tmp,_MM_SHUFFLE(2,3,0,1)); //-i,r + } + //Complex double + inline __m256d operator()(__m256d in, __m256d ret){ + __m256d tmp = _mm256_addsub_pd(_mm256_setzero_pd(),in); // r,-i + return _mm256_shuffle_pd(tmp,tmp,0x5); + } + }; + + struct TimesI{ + //Complex single + inline __m256 operator()(__m256 in, __m256 ret){ + __m256 tmp =_mm256_shuffle_ps(in,in,_MM_SHUFFLE(2,3,0,1)); // i,r + return _mm256_addsub_ps(_mm256_setzero_ps(),tmp); // i,-r + } + //Complex double + inline __m256d operator()(__m256d in, __m256d ret){ + __m256d tmp = _mm256_shuffle_pd(in,in,0x5); + return _mm256_addsub_pd(_mm256_setzero_pd(),tmp); // i,-r + } + }; + + + + + + ////////////////////////////////////////////// + // Some Template specialization + template < typename vtype > + void permute(vtype a, vtype b, int perm) { + union { + __m256 f; + vtype v; + } conv; + conv.v = b; + switch (perm){ + // 8x32 bits=>3 permutes + case 2: + conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); + break; + case 1: conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2)); break; + case 0: conv.f = _mm256_permute2f128_ps(conv.f,conv.f,0x01); break; + default: assert(0); break; + } + a = conv.v; + + } + + //Complex float Reduce + template<> + inline Grid::ComplexF Reduce::operator()(__m256 in){ + __m256 v1,v2; + Optimization::permute(v1,in,0); // sse 128; paired complex single + v1 = _mm256_add_ps(v1,in); + Optimization::permute(v2,v1,1); // avx 256; quad complex single + v1 = _mm256_add_ps(v1,v2); + return Grid::ComplexF(v1[0],v1[1]); + } + //Real float Reduce + template<> + inline Grid::RealF Reduce::operator()(__m256 in){ + __m256 v1,v2; + Optimization::permute(v1,in,0); // avx 256; octo-double + v1 = _mm256_add_ps(v1,in); + Optimization::permute(v2,v1,1); + v1 = _mm256_add_ps(v1,v2); + Optimization::permute(v2,v1,2); + v1 = _mm256_add_ps(v1,v2); + return v1[0]; + } + + + //Complex double Reduce + template<> + inline Grid::ComplexD Reduce::operator()(__m256d in){ + __m256d v1; + Optimization::permute(v1,in,0); // sse 128; paired complex single + v1 = _mm256_add_pd(v1,in); + return Grid::ComplexD(v1[0],v1[1]); + } + + //Real double Reduce + template<> + inline Grid::RealD Reduce::operator()(__m256d in){ + __m256d v1,v2; + Optimization::permute(v1,in,0); // avx 256; quad double + v1 = _mm256_add_pd(v1,in); + Optimization::permute(v2,v1,1); + v1 = _mm256_add_pd(v1,v2); + return v1[0]; + } + + //Integer Reduce + template<> + inline Integer Reduce::operator()(__m256i in){ + // FIXME unimplemented + printf("Reduce : Missing integer implementation -> FIX\n"); + assert(0); + } + + +} + +////////////////////////////////////////////////////////////////////////////////////// +// Here assign types +namespace Grid { + typedef __m256 SIMD_Ftype; // Single precision type + typedef __m256d SIMD_Dtype; // Double precision type + typedef __m256i SIMD_Itype; // Integer type + + + // Function name aliases + typedef Optimization::Vsplat VsplatSIMD; + typedef Optimization::Vstore VstoreSIMD; + typedef Optimization::Vset VsetSIMD; + typedef Optimization::Vstream VstreamSIMD; + template using ReduceSIMD = Optimization::Reduce; + + + // Arithmetic operations + typedef Optimization::Sum SumSIMD; + typedef Optimization::Sub SubSIMD; + typedef Optimization::Mult MultSIMD; + typedef Optimization::MultComplex MultComplexSIMD; + typedef Optimization::Conj ConjSIMD; + typedef Optimization::TimesMinusI TimesMinusISIMD; + typedef Optimization::TimesI TimesISIMD; + +} diff --git a/lib/simd/Grid_knc.h b/lib/simd/Grid_knc.h new file mode 100644 index 00000000..daec3973 --- /dev/null +++ b/lib/simd/Grid_knc.h @@ -0,0 +1,323 @@ +//---------------------------------------------------------------------- +/*! @file Grid_knc.h + @brief Optimization libraries for AVX512 instructions set for KNC + + Using intrinsics +*/ +// Time-stamp: <2015-05-22 17:12:44 neo> +//---------------------------------------------------------------------- + +#include +#ifndef KNC_ONLY_STORES +#define _mm512_storenrngo_ps _mm512_store_ps // not present in AVX512 +#define _mm512_storenrngo_pd _mm512_store_pd // not present in AVX512 +#endif + + +namespace Optimization { + + struct Vsplat{ + //Complex float + inline __m512 operator()(float a, float b){ + return _mm512_set_ps(b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a); + } + // Real float + inline __m512 operator()(float a){ + return _mm512_set1_ps(a); + } + //Complex double + inline __m512d operator()(double a, double b){ + return _mm512_set_pd(b,a,b,a,b,a,b,a); + } + //Real double + inline __m512d operator()(double a){ + return _mm512_set1_pd(a); + } + //Integer + inline __m512i operator()(Integer a){ + return _mm512_set1_epi32(a); + } + }; + + struct Vstore{ + //Float + inline void operator()(__m512 a, float* F){ + _mm512_store_ps(F,a); + } + //Double + inline void operator()(__m512d a, double* D){ + _mm512_store_pd(D,a); + } + //Integer + inline void operator()(__m512i a, Integer* I){ + _mm512_store_si512((__m512i *)I,a); + } + + }; + + + struct Vstream{ + //Float + inline void operator()(float * a, __m512 b){ + _mm512_storenrngo_ps(a,b); + } + //Double + inline void operator()(double * a, __m512d b){ + _mm512_storenrngo_pd(a,b); + } + + + }; + + + + struct Vset{ + // Complex float + inline __m512 operator()(Grid::ComplexF *a){ + return _mm512_set_ps(a[7].imag(),a[7].real(),a[6].imag(),a[6].real(), + a[5].imag(),a[5].real(),a[4].imag(),a[4].real(), + a[3].imag(),a[3].real(),a[2].imag(),a[2].real(), + a[1].imag(),a[1].real(),a[0].imag(),a[0].real()); + } + // Complex double + inline __m512d operator()(Grid::ComplexD *a){ + return _mm512_set_pd(a[3].imag(),a[3].real(),a[2].imag(),a[2].real(), + a[1].imag(),a[1].real(),a[0].imag(),a[0].real()); + } + // Real float + inline __m512 operator()(float *a){ + return _mm512_set_ps( a[15],a[14],a[13],a[12],a[11],a[10],a[9],a[8], + a[7],a[6],a[5],a[4],a[3],a[2],a[1],a[0]); + } + // Real double + inline __m512d operator()(double *a){ + return _mm512_set_pd(a[7],a[6],a[5],a[4],a[3],a[2],a[1],a[0]); + } + // Integer + inline __m512i operator()(Integer *a){ + return _mm512_set_epi32( a[15],a[14],a[13],a[12],a[11],a[10],a[9],a[8], + a[7],a[6],a[5],a[4],a[3],a[2],a[1],a[0]); + } + + + }; + + template + struct Reduce{ + //Need templated class to overload output type + //General form must generate error if compiled + inline Out_type operator()(In_type in){ + printf("Error, using wrong Reduce function\n"); + exit(1); + return 0; + } + }; + + + + + ///////////////////////////////////////////////////// + // Arithmetic operations + ///////////////////////////////////////////////////// + struct Sum{ + //Complex/Real float + inline __m512 operator()(__m512 a, __m512 b){ + return _mm512_add_ps(a,b); + } + //Complex/Real double + inline __m512d operator()(__m512d a, __m512d b){ + return _mm512_add_pd(a,b); + } + //Integer + inline __m512i operator()(__m512i a, __m512i b){ + return _mm512_add_epi32(a,b); + } + }; + + struct Sub{ + //Complex/Real float + inline __m512 operator()(__m512 a, __m512 b){ + return _mm512_sub_ps(a,b); + } + //Complex/Real double + inline __m512d operator()(__m512d a, __m512d b){ + return _mm512_sub_pd(a,b); + } + //Integer + inline __m512i operator()(__m512i a, __m512i b){ + return _mm512_sub_epi32(a,b); + } + }; + + + struct MultComplex{ + // Complex float + inline __m512 operator()(__m512 a, __m512 b){ + __m512 vzero,ymm0,ymm1,real, imag; + vzero = _mm512_setzero_ps(); + ymm0 = _mm512_swizzle_ps(a, _MM_SWIZ_REG_CDAB); // + real = (__m512)_mm512_mask_or_epi32((__m512i)a, 0xAAAA,(__m512i)vzero,(__m512i)ymm0); + imag = _mm512_mask_sub_ps(a, 0x5555,vzero, ymm0); + ymm1 = _mm512_mul_ps(real, b); + ymm0 = _mm512_swizzle_ps(b, _MM_SWIZ_REG_CDAB); // OK + return _mm512_fmadd_ps(ymm0,imag,ymm1); + } + // Complex double + inline __m512d operator()(__m512d a, __m512d b){ + /* This is from + * Automatic SIMD Vectorization of Fast Fourier Transforms for the Larrabee and AVX Instruction Sets + * @inproceedings{McFarlin:2011:ASV:1995896.1995938, + * author = {McFarlin, Daniel S. and Arbatov, Volodymyr and Franchetti, Franz and P\"{u}schel, Markus}, + * title = {Automatic SIMD Vectorization of Fast Fourier Transforms for the Larrabee and AVX Instruction Sets}, + * booktitle = {Proceedings of the International Conference on Supercomputing}, + * series = {ICS '11}, + * year = {2011}, + * isbn = {978-1-4503-0102-2}, + * location = {Tucson, Arizona, USA}, + * pages = {265--274}, + * numpages = {10}, + * url = {http://doi.acm.org/10.1145/1995896.1995938}, + * doi = {10.1145/1995896.1995938}, + * acmid = {1995938}, + * publisher = {ACM}, + * address = {New York, NY, USA}, + * keywords = {autovectorization, fourier transform, program generation, simd, super-optimization}, + * } + */ + __m512d vzero,ymm0,ymm1,real,imag; + vzero =_mm512_setzero_pd(); + ymm0 = _mm512_swizzle_pd(a, _MM_SWIZ_REG_CDAB); // + real =(__m512d)_mm512_mask_or_epi64((__m512i)a, 0xAA,(__m512i)vzero,(__m512i) ymm0); + imag = _mm512_mask_sub_pd(a, 0x55,vzero, ymm0); + ymm1 = _mm512_mul_pd(real, b); + ymm0 = _mm512_swizzle_pd(b, _MM_SWIZ_REG_CDAB); // OK + return _mm512_fmadd_pd(ymm0,imag,ymm1); + } + }; + + struct Mult{ + // Real float + inline __m512 operator()(__m512 a, __m512 b){ + return _mm512_mul_ps(a,b); + } + // Real double + inline __m512d operator()(__m512d a, __m512d b){ + return _mm512_mul_pd(a,b); + } + // Integer + inline __m512i operator()(__m512i a, __m512i b){ + return _mm512_mullo_epi32(a,b); + } + }; + + + struct Conj{ + // Complex single + inline __m512 operator()(__m512 in){ + return _mm512_mask_sub_ps(in,0xaaaa,_mm512_setzero_ps(),in); // Zero out 0+real 0-imag + } + // Complex double + inline __m512d operator()(__m512d in){ + return _mm512_mask_sub_pd(in, 0xaa,_mm512_setzero_pd(), in); + } + // do not define for integer input + }; + + struct TimesMinusI{ + //Complex single + inline __m512 operator()(__m512 in, __m512 ret){ + __m512 tmp = _mm512_mask_sub_ps(in,0xaaaa,_mm512_setzero_ps(),in); // real -imag + return _mm512_swizzle_ps(tmp, _MM_SWIZ_REG_CDAB);// OK + } + //Complex double + inline __m512d operator()(__m512d in, __m512d ret){ + __m512d tmp = _mm512_mask_sub_pd(in,0xaa,_mm512_setzero_pd(),in); // real -imag + return _mm512_swizzle_pd(tmp, _MM_SWIZ_REG_CDAB);// OK + } + + + }; + + struct TimesI{ + //Complex single + inline __m512 operator()(__m512 in, __m512 ret){ + __m512 tmp = _mm512_swizzle_ps(in, _MM_SWIZ_REG_CDAB);// OK + return _mm512_mask_sub_ps(tmp,0xaaaa,_mm512_setzero_ps(),tmp); // real -imag + } + //Complex double + inline __m512d operator()(__m512d in, __m512d ret){ + __m512d tmp = _mm512_swizzle_pd(in, _MM_SWIZ_REG_CDAB);// OK + return _mm512_mask_sub_pd(tmp,0xaa,_mm512_setzero_pd(),tmp); // real -imag + } + + + }; + + + + + + ////////////////////////////////////////////// + // Some Template specialization + + //Complex float Reduce + template<> + inline Grid::ComplexF Reduce::operator()(__m512 in){ + return Grid::ComplexF(_mm512_mask_reduce_add_ps(0x5555, in),_mm512_mask_reduce_add_ps(0xAAAA, in)); + } + //Real float Reduce + template<> + inline Grid::RealF Reduce::operator()(__m512 in){ + return _mm512_reduce_add_ps(in); + } + + + //Complex double Reduce + template<> + inline Grid::ComplexD Reduce::operator()(__m512d in){ + return Grid::ComplexD(_mm512_mask_reduce_add_pd(0x55, in),_mm512_mask_reduce_add_pd(0xAA, in)); + } + + //Real double Reduce + template<> + inline Grid::RealD Reduce::operator()(__m512d in){ + return _mm512_reduce_add_pd(in); + } + + //Integer Reduce + template<> + inline Integer Reduce::operator()(__m512i in){ + // FIXME unimplemented + printf("Reduce : Missing integer implementation -> FIX\n"); + assert(0); + } + + +} + +////////////////////////////////////////////////////////////////////////////////////// +// Here assign types +namespace Grid { + typedef __m512 SIMD_Ftype; // Single precision type + typedef __m512d SIMD_Dtype; // Double precision type + typedef __m512i SIMD_Itype; // Integer type + + + // Function name aliases + typedef Optimization::Vsplat VsplatSIMD; + typedef Optimization::Vstore VstoreSIMD; + typedef Optimization::Vset VsetSIMD; + typedef Optimization::Vstream VstreamSIMD; + template using ReduceSIMD = Optimization::Reduce; + + + // Arithmetic operations + typedef Optimization::Sum SumSIMD; + typedef Optimization::Sub SubSIMD; + typedef Optimization::Mult MultSIMD; + typedef Optimization::MultComplex MultComplexSIMD; + typedef Optimization::Conj ConjSIMD; + typedef Optimization::TimesMinusI TimesMinusISIMD; + typedef Optimization::TimesI TimesISIMD; + +} diff --git a/lib/simd/Grid_qpx.h b/lib/simd/Grid_qpx.h new file mode 100644 index 00000000..dc0251f8 --- /dev/null +++ b/lib/simd/Grid_qpx.h @@ -0,0 +1,272 @@ +//---------------------------------------------------------------------- +/*! @file Grid_qpx.h + @brief Optimization libraries for QPX instructions set for BG/Q + + Using intrinsics +*/ +// Time-stamp: <2015-05-22 17:29:26 neo> +//---------------------------------------------------------------------- + +// lot of undefined functions + +namespace Optimization { + + struct Vsplat{ + //Complex float + inline float operator()(float a, float b){ + return {a,b,a,b}; + } + // Real float + inline float operator()(float a){ + return {a,a,a,a}; + } + //Complex double + inline vector4double operator()(double a, double b){ + return {a,b,a,b}; + } + //Real double + inline vector4double operator()(double a){ + return {a,a,a,a}; + } + //Integer + inline int operator()(Integer a){ +#error + } + }; + + struct Vstore{ + //Float + inline void operator()(float a, float* F){ + assert(0); + } + //Double + inline void operator()(vector4double a, double* D){ + assert(0); + } + //Integer + inline void operator()(int a, Integer* I){ + assert(0); + } + + }; + + + struct Vstream{ + //Float + inline void operator()(float * a, float b){ + assert(0); + } + //Double + inline void operator()(double * a, vector4double b){ + assert(0); + } + + + }; + + + + struct Vset{ + // Complex float + inline float operator()(Grid::ComplexF *a){ + return {a[0].real(),a[0].imag(),a[1].real(),a[1].imag(),a[2].real(),a[2].imag(),a[3].real(),a[3].imag()}; + } + // Complex double + inline vector4double operator()(Grid::ComplexD *a){ + return {a[0].real(),a[0].imag(),a[1].real(),a[1].imag(),a[2].real(),a[2].imag(),a[3].real(),a[3].imag()}; + } + // Real float + inline float operator()(float *a){ + return {a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]}; + } + // Real double + inline vector4double operator()(double *a){ + return {a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]}; + } + // Integer + inline int operator()(Integer *a){ +#error + } + + + }; + + template + struct Reduce{ + //Need templated class to overload output type + //General form must generate error if compiled + inline Out_type operator()(In_type in){ + printf("Error, using wrong Reduce function\n"); + exit(1); + return 0; + } + }; + + + + + ///////////////////////////////////////////////////// + // Arithmetic operations + ///////////////////////////////////////////////////// + struct Sum{ + //Complex/Real float + inline float operator()(float a, float b){ +#error + } + //Complex/Real double + inline vector4double operator()(vector4double a, vector4double b){ + return vec_add(a,b); + } + //Integer + inline int operator()(int a, int b){ +#error + } + }; + + struct Sub{ + //Complex/Real float + inline float operator()(float a, float b){ +#error + } + //Complex/Real double + inline vector4double operator()(vector4double a, vector4double b){ +#error + } + //Integer + inline floati operator()(int a, int b){ +#error + } + }; + + + struct MultComplex{ + // Complex float + inline float operator()(float a, float b){ +#error + } + // Complex double + inline vector4double operator()(vector4double a, vector4double b){ +#error + } + }; + + struct Mult{ + // Real float + inline float operator()(float a, float b){ +#error + } + // Real double + inline vector4double operator()(vector4double a, vector4double b){ +#error + } + // Integer + inline int operator()(int a, int b){ +#error + } + }; + + + struct Conj{ + // Complex single + inline float operator()(float in){ + assert(0); + } + // Complex double + inline vector4double operator()(vector4double in){ + assert(0); + } + // do not define for integer input + }; + + struct TimesMinusI{ + //Complex single + inline float operator()(float in, float ret){ + assert(0); + } + //Complex double + inline vector4double operator()(vector4double in, vector4double ret){ + assert(0); + } + + + }; + + struct TimesI{ + //Complex single + inline float operator()(float in, float ret){ + + } + //Complex double + inline vector4double operator()(vector4double in, vector4double ret){ + + } + + + }; + + + + + + ////////////////////////////////////////////// + // Some Template specialization + + //Complex float Reduce + template<> + inline Grid::ComplexF Reduce::operator()(float in){ + assert(0); + } + //Real float Reduce + template<> + inline Grid::RealF Reduce::operator()(float in){ + assert(0); + } + + + //Complex double Reduce + template<> + inline Grid::ComplexD Reduce::operator()(vector4double in){ + assert(0); + } + + //Real double Reduce + template<> + inline Grid::RealD Reduce::operator()(vector4double in){ + assert(0); + } + + //Integer Reduce + template<> + inline Integer Reduce::operator()(float in){ + assert(0); + } + + +} + +////////////////////////////////////////////////////////////////////////////////////// +// Here assign types +namespace Grid { + typedef float SIMD_Ftype __attribute__ ((vector_size (16))); // Single precision type + typedef vector4double SIMD_Dtype; // Double precision type + typedef int SIMD_Itype; // Integer type + + + // Function name aliases + typedef Optimization::Vsplat VsplatSIMD; + typedef Optimization::Vstore VstoreSIMD; + typedef Optimization::Vset VsetSIMD; + typedef Optimization::Vstream VstreamSIMD; + template using ReduceSIMD = Optimization::Reduce; + + + // Arithmetic operations + typedef Optimization::Sum SumSIMD; + typedef Optimization::Sub SubSIMD; + typedef Optimization::Mult MultSIMD; + typedef Optimization::MultComplex MultComplexSIMD; + typedef Optimization::Conj ConjSIMD; + typedef Optimization::TimesMinusI TimesMinusISIMD; + typedef Optimization::TimesI TimesISIMD; + +} diff --git a/lib/simd/Grid_sse4.h b/lib/simd/Grid_sse4.h index ddc3490b..fa0e3ec3 100644 --- a/lib/simd/Grid_sse4.h +++ b/lib/simd/Grid_sse4.h @@ -4,7 +4,7 @@ Using intrinsics */ -// Time-stamp: <2015-05-20 16:45:39 neo> +// Time-stamp: <2015-05-21 18:06:30 neo> //---------------------------------------------------------------------- #include @@ -53,12 +53,12 @@ namespace Optimization { struct Vstream{ //Float - inline void operator()(__m128 a, __m128 b){ - _mm_stream_ps((float *)&a,b); + inline void operator()(float * a, __m128 b){ + _mm_stream_ps(a,b); } //Double - inline void operator()(__m128d a, __m128d b){ - _mm_stream_pd((double *)&a,b); + inline void operator()(double * a, __m128d b){ + _mm_stream_pd(a,b); } diff --git a/lib/simd/Grid_vector_types.h b/lib/simd/Grid_vector_types.h index 57480621..34c63964 100644 --- a/lib/simd/Grid_vector_types.h +++ b/lib/simd/Grid_vector_types.h @@ -2,12 +2,20 @@ /*! @file Grid_vector_types.h @brief Defines templated class Grid_simd to deal with inner vector types */ -// Time-stamp: <2015-05-20 17:31:55 neo> +// Time-stamp: <2015-05-22 17:08:19 neo> //--------------------------------------------------------------------------- #ifndef GRID_VECTOR_TYPES #define GRID_VECTOR_TYPES +#ifdef SSE4 #include "Grid_sse4.h" +#endif +#if defined (AVX1)|| defined (AVX2) +#include "Grid_avx.h" +#endif +#if defined AVX512 +#include "Grid_knc.h" +#endif namespace Grid { @@ -43,13 +51,14 @@ namespace Grid { // general forms to allow for vsplat syntax // need explicit declaration of types when used since // clang cannot automatically determine the output type sometimes + // use decltype? template < class Out, class Input1, class Input2, class Operation > Out binary(Input1 src_1, Input2 src_2, Operation op){ return op(src_1, src_2); } - template < class SIMDout, class Input, class Operation > - SIMDout unary(Input src, Operation op){ + template < class Out, class Input, class Operation > + Out unary(Input src, Operation op){ return op(src); } @@ -63,27 +72,34 @@ namespace Grid { public: typedef typename RealPart < Scalar_type >::type Real; + typedef Vector_type vector_type; + typedef Scalar_type scalar_type; + Vector_type v; - + static inline int Nsimd(void) { return sizeof(Vector_type)/sizeof(Scalar_type);} - + // Constructors Grid_simd & operator = ( Zero & z){ vzero(*this); return (*this); } - Grid_simd(){}; - + Grid_simd& operator=(const Grid_simd&& rhs){v=rhs.v;return *this;}; + Grid_simd& operator=(const Grid_simd& rhs){v=rhs.v;return *this;}; //faster than not declaring it and leaving to the compiler + Grid_simd()=default; + Grid_simd(const Grid_simd& rhs):v(rhs.v){}; //compiles in movaps + Grid_simd(const Grid_simd&& rhs):v(rhs.v){}; + //Enable if complex type template < class S = Scalar_type > - Grid_simd(typename std::enable_if< is_complex < S >::value, S>::type a){ + Grid_simd(const typename std::enable_if< is_complex < S >::value, S>::type a){ vsplat(*this,a); }; - Grid_simd(Real a){ + Grid_simd(const Real a){ vsplat(*this,Scalar_type(a)); }; @@ -97,18 +113,13 @@ namespace Grid { friend inline void sub (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) - (*r); } friend inline void add (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) + (*r); } - //not for integer types... FIXME + //not for integer types... + template < class S = Scalar_type, NotEnableIf, int> = 0 > friend inline Grid_simd adj(const Grid_simd &in){ return conjugate(in); } /////////////////////////////////////////////// // Initialise to 1,0,i for the correct types /////////////////////////////////////////////// - // if not complex overload here - template < class S = Scalar_type, NotEnableIf,int> = 0 > - friend inline void vone(Grid_simd &ret) { vsplat(ret,1.0); } - template < class S = Scalar_type, NotEnableIf,int> = 0 > - friend inline void vzero(Grid_simd &ret) { vsplat(ret,0.0); } - // For complex types template < class S = Scalar_type, EnableIf, int> = 0 > friend inline void vone(Grid_simd &ret) { vsplat(ret,1.0,0.0); } @@ -116,6 +127,14 @@ namespace Grid { friend inline void vzero(Grid_simd &ret) { vsplat(ret,0.0,0.0); }// use xor? template < class S = Scalar_type, EnableIf, int> = 0 > friend inline void vcomplex_i(Grid_simd &ret){ vsplat(ret,0.0,1.0);} + + // if not complex overload here + template < class S = Scalar_type, EnableIf,int> = 0 > + friend inline void vone(Grid_simd &ret) { vsplat(ret,1.0); } + template < class S = Scalar_type, EnableIf,int> = 0 > + friend inline void vzero(Grid_simd &ret) { vsplat(ret,0.0); } + + // For integral types template < class S = Scalar_type, EnableIf, int> = 0 > @@ -125,7 +144,7 @@ namespace Grid { template < class S = Scalar_type, EnableIf, int> = 0 > friend inline void vtrue (Grid_simd &ret){vsplat(ret,0xFFFFFFFF);} template < class S = Scalar_type, EnableIf, int> = 0 > - friend inline void vfalse(vInteger &ret){vsplat(ret,0);} + friend inline void vfalse(Grid_simd &ret){vsplat(ret,0);} @@ -206,8 +225,9 @@ namespace Grid { /////////////////////// // Vstream /////////////////////// + template < class S = Scalar_type, NotEnableIf, int> = 0 > friend inline void vstream(Grid_simd &out,const Grid_simd &in){ - binary(out.v, in.v, VstreamSIMD()); + binary((Real*)&out.v, in.v, VstreamSIMD()); } template < class S = Scalar_type, EnableIf, int> = 0 > @@ -305,7 +325,7 @@ namespace Grid { // Unary negation /////////////////////// friend inline Grid_simd operator -(const Grid_simd &r) { - vComplexF ret; + Grid_simd ret; vzero(ret); ret = ret - r; return ret; @@ -350,7 +370,7 @@ namespace Grid { } template - inline void zeroit(Grid_simd< scalar_type, vector_type> &z){ vzero(z);} + inline void zeroit(Grid_simd< scalar_type, vector_type> &z){ vzero(z);} template @@ -368,35 +388,11 @@ namespace Grid { // Define available types (now change names to avoid clashing with the rest of the code) - typedef Grid_simd< float , SIMD_Ftype > MyRealF; - typedef Grid_simd< double , SIMD_Dtype > MyRealD; - typedef Grid_simd< std::complex< float > , SIMD_Ftype > MyComplexF; - typedef Grid_simd< std::complex< double >, SIMD_Dtype > MyComplexD; - - - - - //////////////////////////////////////////////////////////////////// - // Temporary hack to keep independent from the rest of the code - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - template<> struct isGridTensor { - static const bool value = false; - static const bool notvalue = true; - }; - - - + typedef Grid_simd< float , SIMD_Ftype > vRealF; + typedef Grid_simd< double , SIMD_Dtype > vRealD; + typedef Grid_simd< std::complex< float > , SIMD_Ftype > vComplexF; + typedef Grid_simd< std::complex< double >, SIMD_Dtype > vComplexD; + typedef Grid_simd< Integer , SIMD_Itype > vInteger; } diff --git a/lib/simd/Grid_vComplexD.h b/lib/simd/Old/Grid_vComplexD.h similarity index 100% rename from lib/simd/Grid_vComplexD.h rename to lib/simd/Old/Grid_vComplexD.h diff --git a/lib/simd/Grid_vComplexF.h b/lib/simd/Old/Grid_vComplexF.h similarity index 99% rename from lib/simd/Grid_vComplexF.h rename to lib/simd/Old/Grid_vComplexF.h index 713bbdd8..37760b98 100644 --- a/lib/simd/Grid_vComplexF.h +++ b/lib/simd/Old/Grid_vComplexF.h @@ -54,7 +54,7 @@ namespace Grid { ////////////////////////////////// friend inline void vone(vComplexF &ret) { vsplat(ret,1.0,0.0); } friend inline void vzero(vComplexF &ret) { vsplat(ret,0.0,0.0); } - friend inline void vcomplex_i(vComplexF &ret){ vsplat(ret,0.0,1.0);} + friend inline void vcomplex_i(vComplexF &ret){ vsplat(ret,0.0,1.0); } //////////////////////////////////// // Arithmetic operator overloads +,-,* diff --git a/lib/simd/Grid_vInteger.h b/lib/simd/Old/Grid_vInteger.h similarity index 100% rename from lib/simd/Grid_vInteger.h rename to lib/simd/Old/Grid_vInteger.h diff --git a/lib/simd/Grid_vRealD.h b/lib/simd/Old/Grid_vRealD.h similarity index 100% rename from lib/simd/Grid_vRealD.h rename to lib/simd/Old/Grid_vRealD.h diff --git a/lib/simd/Grid_vRealF.h b/lib/simd/Old/Grid_vRealF.h similarity index 100% rename from lib/simd/Grid_vRealF.h rename to lib/simd/Old/Grid_vRealF.h diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index 10e74099..c1f1c5d0 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -103,6 +103,9 @@ int main (int argc, char ** argv) random(FineRNG,scVec); fflush(stdout); + + + /* cVec = cMat * cVec; // LatticeColourVector = LatticeColourMatrix * LatticeColourVector sVec = sMat * sVec; // LatticeSpinVector = LatticeSpinMatrix * LatticeSpinVector scVec= scMat * scVec;// LatticeSpinColourVector = LatticeSpinColourMatrix * LatticeSpinColourVector @@ -112,12 +115,14 @@ int main (int argc, char ** argv) cMat = outerProduct(cVec,cVec); scalar = localInnerProduct(cVec,cVec); + scalar += scalar; scalar -= scalar; scalar *= scalar; add(scalar,scalar,scalar); sub(scalar,scalar,scalar); mult(scalar,scalar,scalar); + mac(scalar,scalar,scalar); scalar = scalar+scalar; scalar = scalar-scalar; @@ -141,7 +146,7 @@ int main (int argc, char ** argv) scalar=trace(scalar); scalar=localInnerProduct(cVec,cVec); scalar=localNorm2(cVec); - + */ // -=,+=,*=,() // add,+,sub,-,mult,mac,* // adj,conjugate @@ -153,10 +158,11 @@ int main (int argc, char ** argv) // localNorm2 // localInnerProduct + scMat = sMat*scMat; // LatticeSpinColourMatrix = LatticeSpinMatrix * LatticeSpinColourMatrix - - + + /* #ifdef SSE4 ///////// Tests the new class Grid_simd std::complex ctest(3.0,2.0); @@ -196,8 +202,10 @@ int main (int argc, char ** argv) std::cout << sum<< std::endl; #endif + */ /////////////////////// - + /* + printf("DEBUG: calling 3.5 \n"); // Non-lattice (const objects) * Lattice ColourMatrix cm; SpinColourMatrix scm; @@ -217,6 +225,7 @@ int main (int argc, char ** argv) vscm = vscm*cplx; scMat = scMat*cplx; + printf("DEBUG: calling 3.7 \n"); scm = cplx*scm; vscm = cplx*vscm; scMat = cplx*scMat; @@ -224,12 +233,14 @@ int main (int argc, char ** argv) vscm = myint*vscm; scMat = scMat*myint; + printf("DEBUG: calling 3.9 \n"); scm = scm*mydouble; vscm = vscm*mydouble; scMat = scMat*mydouble; scMat = mydouble*scMat; cMat = mydouble*cMat; - + + printf("DEBUG: calling 4 \n"); sMat = adj(sMat); // LatticeSpinMatrix adjoint sMat = iGammaFive*sMat; // SpinMatrix * LatticeSpinMatrix sMat = GammaFive*sMat; // SpinMatrix * LatticeSpinMatrix @@ -240,6 +251,9 @@ int main (int argc, char ** argv) scm=transpose(scm); scm=transposeIndex<1>(scm); + + + // Foo = Foo+scalar; // LatticeColourMatrix+Scalar // Foo = Foo*scalar; // LatticeColourMatrix*Scalar // Foo = Foo-scalar; // LatticeColourMatrix-Scalar @@ -279,7 +293,8 @@ int main (int argc, char ** argv) pokeIndex<1> (c_m,c,0,0); } - + */ + FooBar = Bar; /* @@ -332,14 +347,14 @@ int main (int argc, char ** argv) // Lattice SU(3) x SU(3) Fine.Barrier(); FooBar = Foo * Bar; - + // Lattice 12x12 GEMM scFooBar = scFoo * scBar; - + // Benchmark some simple operations LatticeSU3 * Lattice SU3. double t0,t1,flops; double bytes; - int ncall=100; + int ncall=5000; int Nc = Grid::QCD::Nc; LatticeGaugeField U(&Fine); @@ -351,19 +366,21 @@ int main (int argc, char ** argv) if ( Fine.IsBoss() ) { printf("%f flop and %f bytes\n",flops,bytes/ncall); } - FooBar = Foo * Bar; + FooBar = Foo * Bar; Fine.Barrier(); t0=usecond(); for(int i=0;i Date: Sat, 23 May 2015 09:30:28 +0100 Subject: [PATCH 216/429] Iterator required --- lib/Grid_init.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Grid_init.cc b/lib/Grid_init.cc index 6af0be84..572672eb 100644 --- a/lib/Grid_init.cc +++ b/lib/Grid_init.cc @@ -11,6 +11,7 @@ #include #include #include +#include #include #include From 764732944f1501368d07f92fafd5f65901764a47 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 23 May 2015 09:31:15 +0100 Subject: [PATCH 217/429] Cosmetic --- lib/math/Grid_math_arith_mul.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/math/Grid_math_arith_mul.h b/lib/math/Grid_math_arith_mul.h index 04b05bb4..fcdd60ee 100644 --- a/lib/math/Grid_math_arith_mul.h +++ b/lib/math/Grid_math_arith_mul.h @@ -16,19 +16,18 @@ strong_inline void mult(iScalar * __restrict__ ret,const iScalar * template strong_inline void mult(iMatrix * __restrict__ ret,const iMatrix * __restrict__ lhs,const iMatrix * __restrict__ rhs){ for(int c1=0;c1_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); + mult(&ret->_internal[c1][c2],&lhs->_internal[c1][0],&rhs->_internal[0][c2]); } } - for(int c3=1;c3_internal[c1][c2],&lhs->_internal[c1][c3],&rhs->_internal[c3][c2]); } } } - return; + return; } template From a2928321b6c9fa23686208fb18225916980698bc Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 23 May 2015 09:32:37 +0100 Subject: [PATCH 218/429] Better pragma use --- lib/lattice/Grid_lattice_arith.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/lattice/Grid_lattice_arith.h b/lib/lattice/Grid_lattice_arith.h index ff966578..a6f59b56 100644 --- a/lib/lattice/Grid_lattice_arith.h +++ b/lib/lattice/Grid_lattice_arith.h @@ -185,7 +185,7 @@ PARALLEL_FOR_LOOP template strong_inline void axpy(Lattice &ret,sobj a,const Lattice &x,const Lattice &y){ conformable(x,y); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ #ifdef STREAMING_STORES vobj tmp = a*x._odata[ss]+y._odata[ss]; @@ -198,7 +198,7 @@ PARALLEL_FOR_LOOP template strong_inline void axpby(Lattice &ret,sobj a,sobj b,const Lattice &x,const Lattice &y){ conformable(x,y); -#pragma omp parallel for +PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ #ifdef STREAMING_STORES vobj tmp = a*x._odata[ss]+b*y._odata[ss]; From d07a5c084d803450f2379721854b4e61e1faf79d Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 23 May 2015 09:33:42 +0100 Subject: [PATCH 219/429] Rely on default constructors --- lib/math/Grid_math_tensors.h | 120 +++++++++++++++++++---------------- 1 file changed, 66 insertions(+), 54 deletions(-) diff --git a/lib/math/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h index a0424576..32ca78e5 100644 --- a/lib/math/Grid_math_tensors.h +++ b/lib/math/Grid_math_tensors.h @@ -34,62 +34,64 @@ public: // Scalar no action // template using tensor_reduce_level = typename iScalar::tensor_reduce_level >; - iScalar()=default; + iScalar() = default; + /* + iScalar(const iScalar ©me)=default; + iScalar(iScalar &©me)=default; + iScalar & operator= (const iScalar ©me) = default; + iScalar & operator= (iScalar &©me) = default; + */ iScalar(scalar_type s) : _internal(s) {};// recurse down and hit the constructor for vector_type iScalar(const Zero &z){ *this = zero; }; - iScalar & operator= (const Zero &hero){ - zeroit(*this); - return *this; - } - friend strong_inline void vstream(iScalar &out,const iScalar &in){ - vstream(out._internal,in._internal); - } + iScalar & operator= (const Zero &hero){ + zeroit(*this); + return *this; + } + friend strong_inline void vstream(iScalar &out,const iScalar &in){ + vstream(out._internal,in._internal); + } + friend strong_inline void zeroit(iScalar &that){ + zeroit(that._internal); + } + friend strong_inline void prefetch(iScalar &that){ + prefetch(that._internal); + } + friend strong_inline void permute(iScalar &out,const iScalar &in,int permutetype){ + permute(out._internal,in._internal,permutetype); + } - - friend strong_inline void zeroit(iScalar &that){ - zeroit(that._internal); - } - friend strong_inline void prefetch(iScalar &that){ - prefetch(that._internal); - } - friend strong_inline void permute(iScalar &out,const iScalar &in,int permutetype){ - permute(out._internal,in._internal,permutetype); - } - - // Unary negation - friend strong_inline iScalar operator -(const iScalar &r) { - iScalar ret; - ret._internal= -r._internal; - return ret; - } - // *=,+=,-= operators inherit from corresponding "*,-,+" behaviour - strong_inline iScalar &operator *=(const iScalar &r) { - *this = (*this)*r; - return *this; - } - strong_inline iScalar &operator -=(const iScalar &r) { - *this = (*this)-r; - return *this; - } - strong_inline iScalar &operator +=(const iScalar &r) { - *this = (*this)+r; - return *this; - } - - strong_inline vtype & operator ()(void) { - return _internal; - } - - strong_inline const vtype & operator ()(void) const { - return _internal; - } - - operator ComplexD () const { return(TensorRemove(_internal)); }; - operator RealD () const { return(real(TensorRemove(_internal))); } - - // convert from a something to a scalar - template::value, T>::type* = nullptr > strong_inline auto operator = (T arg) -> iScalar + // Unary negation + friend strong_inline iScalar operator -(const iScalar &r) { + iScalar ret; + ret._internal= -r._internal; + return ret; + } + // *=,+=,-= operators inherit from corresponding "*,-,+" behaviour + strong_inline iScalar &operator *=(const iScalar &r) { + *this = (*this)*r; + return *this; + } + strong_inline iScalar &operator -=(const iScalar &r) { + *this = (*this)-r; + return *this; + } + strong_inline iScalar &operator +=(const iScalar &r) { + *this = (*this)+r; + return *this; + } + strong_inline vtype & operator ()(void) { + return _internal; + } + strong_inline const vtype & operator ()(void) const { + return _internal; + } + + operator ComplexD () const { return(TensorRemove(_internal)); }; + operator RealD () const { return(real(TensorRemove(_internal))); } + + // convert from a something to a scalar + template::value, T>::type* = nullptr > strong_inline auto operator = (T arg) -> iScalar { _internal = vtype(arg); return *this; @@ -125,6 +127,12 @@ public: enum { TensorLevel = GridTypeMapper::TensorLevel + 1}; iVector(const Zero &z){ *this = zero; }; iVector() =default; + /* + iVector(const iVector ©me)=default; + iVector(iVector &©me)=default; + iVector & operator= (const iVector ©me) = default; + iVector & operator= (iVector &©me) = default; + */ iVector & operator= (const Zero &hero){ zeroit(*this); @@ -205,8 +213,12 @@ public: iMatrix(const Zero &z){ *this = zero; }; iMatrix() =default; - - + /* + iMatrix(const iMatrix ©me)=default; + iMatrix(iMatrix &©me)=default; + iMatrix & operator= (const iMatrix ©me) = default; + iMatrix & operator= (iMatrix &©me) = default; + */ iMatrix & operator= (const Zero &hero){ zeroit(*this); return *this; From 65f2e6b2696394992656f8a6a01c4ffd80507488 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 23 May 2015 09:34:16 +0100 Subject: [PATCH 220/429] Improving even odd sector; lot of work and through required cleaning this --- lib/qcd/Grid_qcd_wilson_dop.cc | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/lib/qcd/Grid_qcd_wilson_dop.cc b/lib/qcd/Grid_qcd_wilson_dop.cc index 9ef4af0c..2020a9ec 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.cc +++ b/lib/qcd/Grid_qcd_wilson_dop.cc @@ -97,45 +97,44 @@ void WilsonMatrix::DoubleStore(LatticeDoubledGaugeField &Uds,const LatticeGaugeF RealD WilsonMatrix::M(const LatticeFermion &in, LatticeFermion &out) { - Dhop(in,out,0); + this->Dhop(in,out,0); out = (4+mass)*in - 0.5*out ; // FIXME : axpby_norm! fusion fun return norm2(out); } RealD WilsonMatrix::Mdag(const LatticeFermion &in, LatticeFermion &out) { - Dhop(in,out,1); + this->Dhop(in,out,1); out = (4+mass)*in - 0.5*out ; // FIXME : axpby_norm! fusion fun return norm2(out); } void WilsonMatrix::Meooe(const LatticeFermion &in, LatticeFermion &out) { - Dhop(in,out,0); + this->Dhop(in,out,0); out = 0.5*out; // FIXME : scale factor in Dhop } void WilsonMatrix::MeooeDag(const LatticeFermion &in, LatticeFermion &out) { - Dhop(in,out,1); + this->Dhop(in,out,1); + out = 0.5*out; // FIXME : scale factor in Dhop } void WilsonMatrix::Mooee(const LatticeFermion &in, LatticeFermion &out) { out = (4.0+mass)*in; return ; } -void WilsonMatrix::MooeeInv(const LatticeFermion &in, LatticeFermion &out) -{ - out = (1.0/(4.0+mass))*in; - return ; -} void WilsonMatrix::MooeeDag(const LatticeFermion &in, LatticeFermion &out) +{ + this->Mooee(in,out); +} +void WilsonMatrix::MooeeInv(const LatticeFermion &in, LatticeFermion &out) { out = (1.0/(4.0+mass))*in; return ; } void WilsonMatrix::MooeeInvDag(const LatticeFermion &in, LatticeFermion &out) { - out = (1.0/(4.0+mass))*in; - return ; + this->MooeeInv(in,out); } void WilsonMatrix::DhopSite(int ss,const LatticeFermion &in, LatticeFermion &out) @@ -451,8 +450,6 @@ PARALLEL_FOR_LOOP } - - - -}} +} +} From b8fdb65fbf89273f8cfd7e7b8691bf16a8ea89b1 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 23 May 2015 09:34:50 +0100 Subject: [PATCH 221/429] More targets --- scripts/configure-all | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/configure-all b/scripts/configure-all index f42b1960..ad91034d 100755 --- a/scripts/configure-all +++ b/scripts/configure-all @@ -1,6 +1,6 @@ #!/bin/bash -DIRS="clang-avx clang-avx-openmp clang-avx-openmp-mpi clang-avx-mpi clang-avx2 clang-avx2-openmp clang-avx2-openmp-mpi clang-avx2-mpi icpc-avx icpc-avx2 icpc-avx512 g++-sse4 g++-avx clang-sse" +DIRS="clang-avx clang-avx-openmp clang-avx-openmp-mpi clang-avx-mpi clang-avx2 clang-avx2-openmp clang-avx2-openmp-mpi clang-avx2-mpi icpc-avx icpc-avx2 icpc-avx512 g++-sse4 g++-avx clang-sse icpc-avx-openmp-mpi icpc-avx-openmp" for D in $DIRS do From 73ee36c48d14d02c5be8937b84eb6eda1778b4e6 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 23 May 2015 09:35:37 +0100 Subject: [PATCH 222/429] Extra targets --- scripts/configure-commands | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/configure-commands b/scripts/configure-commands index c7c35e1c..538f3661 100755 --- a/scripts/configure-commands +++ b/scripts/configure-commands @@ -25,6 +25,12 @@ g++-avx) icpc-avx) CXX=icpc ../../configure --enable-simd=AVX CXXFLAGS="-mavx -O3 -std=c++11" LIBS="-lgmp -lmpfr" --enable-comms=none ;; +icpc-avx-openmp-mpi) +CXX=icpc ../../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -I/opt/local/include/openmpi-mp/ -std=c++11" LDFLAGS=-L/opt/local/lib/openmpi-mp/ LIBS="-lmpi -lmpi_cxx -fopenmp -lgmp -lmpfr" --enable-comms=mpi +;; +icpc-avx-openmp) +CXX=icpc ../../configure --enable-simd=AVX CXXFLAGS="-mavx -fopenmp -O3 -std=c++11" LIBS="-fopenmp -lgmp -lmpfr" --enable-comms=mpi +;; icpc-avx2) CXX=icpc ../../configure --enable-simd=AVX2 CXXFLAGS="-mavx2 -mfma -O3 -std=c++11" LIBS="-lgmp -lmpfr" --enable-comms=none ;; From 280627334076bfafe30a77b30a5d1eab824f98cd Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Sat, 23 May 2015 09:36:01 +0100 Subject: [PATCH 223/429] Added --- benchmarks/Grid_su3_expr.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 benchmarks/Grid_su3_expr.cc diff --git a/benchmarks/Grid_su3_expr.cc b/benchmarks/Grid_su3_expr.cc new file mode 100644 index 00000000..e20bcef4 --- /dev/null +++ b/benchmarks/Grid_su3_expr.cc @@ -0,0 +1,11 @@ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +void su3_test_mult_expression(LatticeColourMatrix &z, LatticeColourMatrix &x,LatticeColourMatrix &y) +{ + z=x*y; +} + From 17a06af1ff2c79edd662cc436ddf1ba061fe2f31 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 25 May 2015 13:42:12 +0100 Subject: [PATCH 224/429] red black fix --- lib/Grid_stencil.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Grid_stencil.h b/lib/Grid_stencil.h index ce987746..fa22361b 100644 --- a/lib/Grid_stencil.h +++ b/lib/Grid_stencil.h @@ -120,8 +120,8 @@ namespace Grid { // Map to always positive shift modulo global full dimension. int shift = (displacement+fd)%fd; - int checkerboard = _grid->CheckerBoardDestination(source.checkerboard,shift); - assert (checkerboard== _checkerboard); + // int checkerboard = _grid->CheckerBoardDestination(source.checkerboard,shift); + assert (source.checkerboard== _checkerboard); // the permute type int simd_layout = _grid->_simd_layout[dimension]; From 9b5633ff4f6b13bfd07cebffadbe7bd70177efea Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 25 May 2015 13:42:36 +0100 Subject: [PATCH 225/429] Herm op --- lib/algorithms/LinearOperator.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/algorithms/LinearOperator.h b/lib/algorithms/LinearOperator.h index 167213ec..cb6240ba 100644 --- a/lib/algorithms/LinearOperator.h +++ b/lib/algorithms/LinearOperator.h @@ -106,6 +106,10 @@ namespace Grid { public: virtual void operator() (LinearOperatorBase &Linop, const Field &in, Field &out) = 0; }; + template class HermitianOperatorFunction { + public: + virtual void operator() (HermitianOperatorBase &Linop, const Field &in, Field &out) = 0; + }; // FIXME : To think about From 29f72292ba44ec5408b73dc94da2cedc5a03b3c0 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 25 May 2015 13:43:58 +0100 Subject: [PATCH 226/429] Updates now schur red black solver working --- lib/algorithms/SparseMatrix.h | 18 ++--- lib/algorithms/iterative/ConjugateGradient.h | 49 ++++++++----- lib/algorithms/iterative/SchurRedBlack.h | 73 +++++++++++--------- 3 files changed, 82 insertions(+), 58 deletions(-) diff --git a/lib/algorithms/SparseMatrix.h b/lib/algorithms/SparseMatrix.h index 6c54fc92..7bfe959b 100644 --- a/lib/algorithms/SparseMatrix.h +++ b/lib/algorithms/SparseMatrix.h @@ -10,6 +10,7 @@ namespace Grid { ///////////////////////////////////////////////////////////////////////////////////////////// template class SparseMatrixBase { public: + GridBase *_grid; // Full checkerboar operations virtual RealD M (const Field &in, Field &out)=0; virtual RealD Mdag (const Field &in, Field &out)=0; @@ -18,6 +19,7 @@ namespace Grid { ni=M(in,tmp); no=Mdag(tmp,out); } + SparseMatrixBase(GridBase *grid) : _grid(grid) {}; }; ///////////////////////////////////////////////////////////////////////////////////////////// @@ -25,7 +27,7 @@ namespace Grid { ///////////////////////////////////////////////////////////////////////////////////////////// template class CheckerBoardedSparseMatrixBase : public SparseMatrixBase { public: - + GridBase *_cbgrid; // half checkerboard operaions virtual void Meooe (const Field &in, Field &out)=0; virtual void Mooee (const Field &in, Field &out)=0; @@ -44,9 +46,7 @@ namespace Grid { Meooe(out,tmp); Mooee(in,out); - out=out-tmp; // axpy_norm - RealD n=norm2(out); - return n; + return axpy_norm(out,-1.0,tmp,out); } virtual RealD MpcDag (const Field &in, Field &out){ Field tmp(in._grid); @@ -56,15 +56,15 @@ namespace Grid { MeooeDag(out,tmp); MooeeDag(in,out); - out=out-tmp; // axpy_norm - RealD n=norm2(out); - return n; + return axpy_norm(out,-1.0,tmp,out); } - virtual void MpcDagMpc(const Field &in, Field &out,RealD ni,RealD no) { + virtual void MpcDagMpc(const Field &in, Field &out,RealD &ni,RealD &no) { Field tmp(in._grid); ni=Mpc(in,tmp); - no=Mpc(tmp,out); + no=MpcDag(tmp,out); + // std::cout<<"MpcDagMpc "<(grid), _cbgrid(cbgrid) {}; }; } diff --git a/lib/algorithms/iterative/ConjugateGradient.h b/lib/algorithms/iterative/ConjugateGradient.h index 85b196e9..d4f89662 100644 --- a/lib/algorithms/iterative/ConjugateGradient.h +++ b/lib/algorithms/iterative/ConjugateGradient.h @@ -9,17 +9,21 @@ namespace Grid { ///////////////////////////////////////////////////////////// template - class ConjugateGradient : public OperatorFunction { + class ConjugateGradient : public HermitianOperatorFunction { public: RealD Tolerance; Integer MaxIterations; - + int verbose; ConjugateGradient(RealD tol,Integer maxit) : Tolerance(tol), MaxIterations(maxit) { + verbose=0; }; - void operator() (LinearOperatorBase &Linop,const Field &src, Field &psi) {assert(0);}; + void operator() (HermitianOperatorBase &Linop,const Field &src, Field &psi){ + psi.checkerboard = src.checkerboard; + conformable(psi,src); + RealD cp,c,a,d,b,ssq,qq,b_pred; Field p(src); @@ -37,14 +41,16 @@ public: a =norm2(p); cp =a; ssq=norm2(src); - - std::cout < sol_e = M_ee^-1 * ( src_e - Meo sol_o )... * */ - namespace Grid { /////////////////////////////////////////////////////////////////////////////////////////////////////// // Take a matrix and form a Red Black solver calling a Herm solver // Use of RB info prevents making SchurRedBlackSolve conform to standard interface /////////////////////////////////////////////////////////////////////////////////////////////////////// - template class SchurRedBlackSolve : public OperatorFunction{ + template class SchurRedBlackSolve { private: - SparseMatrixBase & _Matrix; - OperatorFunction & _HermitianRBSolver; + HermitianOperatorFunction & _HermitianRBSolver; int CBfactorise; public: ///////////////////////////////////////////////////// // Wrap the usual normal equations Schur trick ///////////////////////////////////////////////////// - SchurRedBlackSolve(SparseMatrixBase &Matrix, OperatorFunction &HermitianRBSolver) - : _Matrix(Matrix), _HermitianRBSolver(HermitianRBSolver) { + SchurRedBlackSolve(HermitianOperatorFunction &HermitianRBSolver) : + _HermitianRBSolver(HermitianRBSolver) + { CBfactorise=0; }; - void operator() (const Field &in, Field &out){ + template + void operator() (Matrix & _Matrix,const Field &in, Field &out){ // FIXME CGdiagonalMee not implemented virtual function - // FIXME need to make eo grid from full grid. // FIXME use CBfactorise to control schur decomp - const int Even=0; - const int Odd =1; - - // Make a cartesianRedBlack from full Grid - GridRedBlackCartesian grid(in._grid); + GridBase *grid = _Matrix._cbgrid; + GridBase *fgrid= _Matrix._grid; - Field src_e(&grid); - Field src_o(&grid); - Field sol_e(&grid); - Field sol_o(&grid); - Field tmp(&grid); - Field Mtmp(&grid); - + Field src_e(grid); + Field src_o(grid); + Field sol_e(grid); + Field sol_o(grid); + Field tmp(grid); + Field Mtmp(grid); + Field resid(fgrid); + pickCheckerboard(Even,src_e,in); pickCheckerboard(Odd ,src_o,in); ///////////////////////////////////////////////////// // src_o = Mdag * (source_o - Moe MeeInv source_e) ///////////////////////////////////////////////////// - _Matrix.MooeeInv(src_e,tmp); // MooeeInv(source[Even],tmp,DaggerNo,Even); - _Matrix.Meooe (tmp,Mtmp); // Meo (tmp,src,Odd,DaggerNo); - tmp=src_o-Mtmp; // axpy (tmp,src,source[Odd],-1.0); - _Matrix.MpcDag(tmp,src_o); // Mprec(tmp,src,Mtmp,DaggerYes); + _Matrix.MooeeInv(src_e,tmp); assert( tmp.checkerboard ==Even); + _Matrix.Meooe (tmp,Mtmp); assert( Mtmp.checkerboard ==Odd); + tmp=src_o-Mtmp; assert( tmp.checkerboard ==Odd); + _Matrix.MpcDag(tmp,src_o); assert(src_o.checkerboard ==Odd); ////////////////////////////////////////////////////////////// // Call the red-black solver ////////////////////////////////////////////////////////////// - _HermitianRBSolver(src_o,sol_o); // CGNE_prec_MdagM(solution[Odd],src); + HermitianCheckerBoardedOperator _HermOpEO(_Matrix); + std::cout << "SchurRedBlack solver calling the MpcDagMp solver" < Date: Mon, 25 May 2015 13:44:35 +0100 Subject: [PATCH 227/429] move constants into red black --- lib/cartesian/Grid_cartesian_red_black.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/cartesian/Grid_cartesian_red_black.h b/lib/cartesian/Grid_cartesian_red_black.h index 475b47c2..ff2d3ba8 100644 --- a/lib/cartesian/Grid_cartesian_red_black.h +++ b/lib/cartesian/Grid_cartesian_red_black.h @@ -4,6 +4,13 @@ namespace Grid { + static const int CbRed =0; + static const int CbBlack=1; + static const int Even =CbRed; + static const int Odd =CbBlack; + static const int DaggerNo=0; + static const int DaggerYes=1; + // Specialise this for red black grids storing half the data like a chess board. class GridRedBlackCartesian : public GridBase { @@ -44,6 +51,9 @@ public: return source_cb; } }; + + GridRedBlackCartesian(GridBase *base) : GridRedBlackCartesian(base->_fdimensions,base->_simd_layout,base->_processors) {}; + GridRedBlackCartesian(std::vector &dimensions, std::vector &simd_layout, std::vector &processor_grid ) : GridBase(processor_grid) From 3358a77c7a111193b6310ed7b68b2cee48d34775 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 25 May 2015 13:45:08 +0100 Subject: [PATCH 228/429] Better checkerboard tracking. --- lib/lattice/Grid_lattice_ET.h | 41 ++++++++++++++++++++++++++ lib/lattice/Grid_lattice_arith.h | 28 ++++++++++++++++-- lib/lattice/Grid_lattice_base.h | 50 ++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 2 deletions(-) diff --git a/lib/lattice/Grid_lattice_ET.h b/lib/lattice/Grid_lattice_ET.h index b0205f2f..2a7172ea 100644 --- a/lib/lattice/Grid_lattice_ET.h +++ b/lib/lattice/Grid_lattice_ET.h @@ -91,6 +91,47 @@ inline void GridFromExpression( GridBase * &grid,const LatticeTrinaryExpression< GridFromExpression(grid,std::get<2>(expr.second)); } + +////////////////////////////////////////////////////////////////////////// +// Obtain the CB from an expression, ensuring conformable. This must follow a tree recursion +////////////////////////////////////////////////////////////////////////// +template::value, T1>::type * =nullptr > +inline void CBFromExpression(int &cb,const T1& lat) // Lattice leaf +{ + if ( (cb==Odd) || (cb==Even) ) { + assert(cb==lat.checkerboard); + } + cb=lat.checkerboard; + // std::cout<<"Lattice leaf cb "<::value, T1>::type * = nullptr > +inline void CBFromExpression(int &cb,const T1& notlat) // non-lattice leaf +{ + // std::cout<<"Non lattice leaf cb"< +inline void CBFromExpression(int &cb,const LatticeUnaryExpression &expr) +{ + CBFromExpression(cb,std::get<0>(expr.second));// recurse + // std::cout<<"Unary node cb "< +inline void CBFromExpression(int &cb,const LatticeBinaryExpression &expr) +{ + CBFromExpression(cb,std::get<0>(expr.second));// recurse + CBFromExpression(cb,std::get<1>(expr.second)); + // std::cout<<"Binary node cb "< +inline void CBFromExpression( int &cb,const LatticeTrinaryExpression &expr) +{ + CBFromExpression(cb,std::get<0>(expr.second));// recurse + CBFromExpression(cb,std::get<1>(expr.second)); + CBFromExpression(cb,std::get<2>(expr.second)); + // std::cout<<"Trinary node cb "< strong_inline void mult(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ + ret.checkerboard = lhs.checkerboard; + conformable(ret,rhs); conformable(lhs,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ @@ -24,6 +26,8 @@ PARALLEL_FOR_LOOP template strong_inline void mac(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ + ret.checkerboard = lhs.checkerboard; + conformable(ret,rhs); conformable(lhs,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ @@ -39,6 +43,8 @@ PARALLEL_FOR_LOOP template strong_inline void sub(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ + ret.checkerboard = lhs.checkerboard; + conformable(ret,rhs); conformable(lhs,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ @@ -53,6 +59,8 @@ PARALLEL_FOR_LOOP } template strong_inline void add(Lattice &ret,const Lattice &lhs,const Lattice &rhs){ + ret.checkerboard = lhs.checkerboard; + conformable(ret,rhs); conformable(lhs,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ @@ -71,6 +79,7 @@ PARALLEL_FOR_LOOP ////////////////////////////////////////////////////////////////////////////////////////////////////// template strong_inline void mult(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ + ret.checkerboard = lhs.checkerboard; conformable(lhs,ret); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ @@ -82,7 +91,8 @@ PARALLEL_FOR_LOOP template strong_inline void mac(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ - conformable(lhs,ret); + ret.checkerboard = lhs.checkerboard; + conformable(ret,lhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ obj1 tmp; @@ -93,7 +103,8 @@ PARALLEL_FOR_LOOP template strong_inline void sub(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ - conformable(lhs,ret); + ret.checkerboard = lhs.checkerboard; + conformable(ret,lhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ #ifdef STREAMING_STORES @@ -107,6 +118,7 @@ PARALLEL_FOR_LOOP } template strong_inline void add(Lattice &ret,const Lattice &lhs,const obj3 &rhs){ + ret.checkerboard = lhs.checkerboard; conformable(lhs,ret); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ @@ -125,6 +137,7 @@ PARALLEL_FOR_LOOP ////////////////////////////////////////////////////////////////////////////////////////////////////// template strong_inline void mult(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ + ret.checkerboard = rhs.checkerboard; conformable(ret,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ @@ -140,6 +153,7 @@ PARALLEL_FOR_LOOP template strong_inline void mac(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ + ret.checkerboard = rhs.checkerboard; conformable(ret,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ @@ -155,6 +169,7 @@ PARALLEL_FOR_LOOP template strong_inline void sub(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ + ret.checkerboard = rhs.checkerboard; conformable(ret,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ @@ -169,6 +184,7 @@ PARALLEL_FOR_LOOP } template strong_inline void add(Lattice &ret,const obj2 &lhs,const Lattice &rhs){ + ret.checkerboard = rhs.checkerboard; conformable(ret,rhs); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ @@ -184,6 +200,8 @@ PARALLEL_FOR_LOOP template strong_inline void axpy(Lattice &ret,sobj a,const Lattice &x,const Lattice &y){ + ret.checkerboard = x.checkerboard; + conformable(ret,x); conformable(x,y); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ @@ -197,6 +215,8 @@ PARALLEL_FOR_LOOP } template strong_inline void axpby(Lattice &ret,sobj a,sobj b,const Lattice &x,const Lattice &y){ + ret.checkerboard = x.checkerboard; + conformable(ret,x); conformable(x,y); PARALLEL_FOR_LOOP for(int ss=0;ssoSites();ss++){ @@ -211,12 +231,16 @@ PARALLEL_FOR_LOOP template strong_inline RealD axpy_norm(Lattice &ret,sobj a,const Lattice &x,const Lattice &y){ + ret.checkerboard = x.checkerboard; + conformable(ret,x); conformable(x,y); axpy(ret,a,x,y); return norm2(ret); } template strong_inline RealD axpby_norm(Lattice &ret,sobj a,sobj b,const Lattice &x,const Lattice &y){ + ret.checkerboard = x.checkerboard; + conformable(ret,x); conformable(x,y); axpby(ret,a,b,x,y); return norm2(ret); // FIXME implement parallel norm in ss loop diff --git a/lib/lattice/Grid_lattice_base.h b/lib/lattice/Grid_lattice_base.h index 41f349b7..1d3b1efb 100644 --- a/lib/lattice/Grid_lattice_base.h +++ b/lib/lattice/Grid_lattice_base.h @@ -66,6 +66,16 @@ public: //////////////////////////////////////////////////////////////////////////////// template strong_inline Lattice & operator=(const LatticeUnaryExpression &expr) { + GridBase *egrid(nullptr); + GridFromExpression(egrid,expr); + assert(egrid!=nullptr); + conformable(_grid,egrid); + + int cb=-1; + CBFromExpression(cb,expr); + assert( (cb==Odd) || (cb==Even)); + checkerboard=cb; + PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ #ifdef STREAMING_STORES @@ -79,6 +89,16 @@ PARALLEL_FOR_LOOP } template strong_inline Lattice & operator=(const LatticeBinaryExpression &expr) { + GridBase *egrid(nullptr); + GridFromExpression(egrid,expr); + assert(egrid!=nullptr); + conformable(_grid,egrid); + + int cb=-1; + CBFromExpression(cb,expr); + assert( (cb==Odd) || (cb==Even)); + checkerboard=cb; + PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ #ifdef STREAMING_STORES @@ -92,6 +112,16 @@ PARALLEL_FOR_LOOP } template strong_inline Lattice & operator=(const LatticeTrinaryExpression &expr) { + GridBase *egrid(nullptr); + GridFromExpression(egrid,expr); + assert(egrid!=nullptr); + conformable(_grid,egrid); + + int cb=-1; + CBFromExpression(cb,expr); + assert( (cb==Odd) || (cb==Even)); + checkerboard=cb; + PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ #ifdef STREAMING_STORES @@ -106,8 +136,15 @@ PARALLEL_FOR_LOOP //GridFromExpression is tricky to do template Lattice(const LatticeUnaryExpression & expr): _grid(nullptr){ + GridFromExpression(_grid,expr); assert(_grid!=nullptr); + + int cb=-1; + CBFromExpression(cb,expr); + assert( (cb==Odd) || (cb==Even)); + checkerboard=cb; + _odata.resize(_grid->oSites()); PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ @@ -123,6 +160,12 @@ PARALLEL_FOR_LOOP Lattice(const LatticeBinaryExpression & expr): _grid(nullptr){ GridFromExpression(_grid,expr); assert(_grid!=nullptr); + + int cb=-1; + CBFromExpression(cb,expr); + assert( (cb==Odd) || (cb==Even)); + checkerboard=cb; + _odata.resize(_grid->oSites()); PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ @@ -138,6 +181,12 @@ PARALLEL_FOR_LOOP Lattice(const LatticeTrinaryExpression & expr): _grid(nullptr){ GridFromExpression(_grid,expr); assert(_grid!=nullptr); + + int cb=-1; + CBFromExpression(cb,expr); + assert( (cb==Odd) || (cb==Even)); + checkerboard=cb; + _odata.resize(_grid->oSites()); PARALLEL_FOR_LOOP for(int ss=0;ss<_grid->oSites();ss++){ @@ -169,6 +218,7 @@ PARALLEL_FOR_LOOP return *this; } template strong_inline Lattice & operator = (const Lattice & r){ + this->checkerboard = r.checkerboard; conformable(*this,r); std::cout<<"Lattice operator ="< Date: Mon, 25 May 2015 13:45:32 +0100 Subject: [PATCH 229/429] Most cosmetic --- lib/math/Grid_math_tensors.h | 113 ++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 56 deletions(-) diff --git a/lib/math/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h index 32ca78e5..4e6752e9 100644 --- a/lib/math/Grid_math_tensors.h +++ b/lib/math/Grid_math_tensors.h @@ -134,66 +134,65 @@ public: iVector & operator= (iVector &©me) = default; */ - iVector & operator= (const Zero &hero){ - zeroit(*this); - return *this; + iVector & operator= (const Zero &hero){ + zeroit(*this); + return *this; + } + friend strong_inline void zeroit(iVector &that){ + for(int i=0;i &that){ - for(int i=0;i &that){ + for(int i=0;i &out,const iVector &in){ + for(int i=0;i &that){ - for(int i=0;i &out,const iVector &in,int permutetype){ + for(int i=0;i &out,const iVector &in){ - for(int i=0;i operator -(const iVector &r) { + iVector ret; + for(int i=0;i &operator *=(const iScalar &r) { + *this = (*this)*r; + return *this; + } + strong_inline iVector &operator -=(const iVector &r) { + *this = (*this)-r; + return *this; + } + strong_inline iVector &operator +=(const iVector &r) { + *this = (*this)+r; + return *this; + } + strong_inline vtype & operator ()(int i) { + return _internal[i]; + } + strong_inline const vtype & operator ()(int i) const { + return _internal[i]; + } + friend std::ostream& operator<< (std::ostream& stream, const iVector &o){ + stream<< "V<"<{"; + for(int i=0;i &out,const iVector &in,int permutetype){ - for(int i=0;i operator -(const iVector &r) { - iVector ret; - for(int i=0;i &operator *=(const iScalar &r) { - *this = (*this)*r; - return *this; - } - strong_inline iVector &operator -=(const iVector &r) { - *this = (*this)-r; - return *this; - } - strong_inline iVector &operator +=(const iVector &r) { - *this = (*this)+r; - return *this; - } - strong_inline vtype & operator ()(int i) { - return _internal[i]; - } - strong_inline const vtype & operator ()(int i) const { - return _internal[i]; - } - friend std::ostream& operator<< (std::ostream& stream, const iVector &o){ - stream<< "V<"<{"; - for(int i=0;i class iMatrix @@ -213,6 +212,8 @@ public: iMatrix(const Zero &z){ *this = zero; }; iMatrix() =default; + iMatrix(scalar_type s) { (*this) = s ;};// recurse down and hit the constructor for vector_type + /* iMatrix(const iMatrix ©me)=default; iMatrix(iMatrix &©me)=default; From 1a9841a0f1991b0e4d58c0361936bea74bbc6c3f Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 25 May 2015 13:46:28 +0100 Subject: [PATCH 230/429] Better EO support letting Schur solver work --- lib/qcd/Grid_qcd.h | 3 - lib/qcd/Grid_qcd_wilson_dop.cc | 317 +++++++++++++++++++-------------- lib/qcd/Grid_qcd_wilson_dop.h | 36 ++-- 3 files changed, 210 insertions(+), 146 deletions(-) diff --git a/lib/qcd/Grid_qcd.h b/lib/qcd/Grid_qcd.h index 0bf68632..959f3529 100644 --- a/lib/qcd/Grid_qcd.h +++ b/lib/qcd/Grid_qcd.h @@ -10,9 +10,6 @@ namespace QCD { static const int Nhs=2; // half spinor static const int Nds=8; // double stored gauge field - static const int CbRed =0; - static const int CbBlack=1; - ////////////////////////////////////////////////////////////////////////////// // QCD iMatrix types // Index conventions: Lorentz x Spin x Colour diff --git a/lib/qcd/Grid_qcd_wilson_dop.cc b/lib/qcd/Grid_qcd_wilson_dop.cc index 2020a9ec..318e18df 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.cc +++ b/lib/qcd/Grid_qcd_wilson_dop.cc @@ -4,8 +4,8 @@ namespace Grid { namespace QCD { -const std::vector WilsonMatrix::directions ({0,1,2,3, 0, 1, 2, 3,0}); -const std::vector WilsonMatrix::displacements({1,1,1,1,-1,-1,-1,-1,0}); +const std::vector WilsonMatrix::directions ({0,1,2,3, 0, 1, 2, 3}); +const std::vector WilsonMatrix::displacements({1,1,1,1,-1,-1,-1,-1}); // Should be in header? const int WilsonMatrix::Xp = 0; @@ -16,7 +16,6 @@ const int WilsonMatrix::Xm = 4; const int WilsonMatrix::Ym = 5; const int WilsonMatrix::Zm = 6; const int WilsonMatrix::Tm = 7; - //const int WilsonMatrix::X0 = 8; class WilsonCompressor { public: @@ -72,20 +71,27 @@ const int WilsonMatrix::Tm = 7; } }; - WilsonMatrix::WilsonMatrix(LatticeGaugeField &_Umu,double _mass) - : Stencil(Umu._grid,npoint,0,directions,displacements), + WilsonMatrix::WilsonMatrix(LatticeGaugeField &_Umu,GridCartesian &Fgrid,GridRedBlackCartesian &Hgrid, double _mass) : + CheckerBoardedSparseMatrixBase(&Fgrid,&Hgrid), + Stencil ( _grid,npoint,Even,directions,displacements), + StencilEven(_cbgrid,npoint,Even,directions,displacements), // source is Even + StencilOdd (_cbgrid,npoint,Odd ,directions,displacements), // source is Odd mass(_mass), - Umu(_Umu._grid) -{ - // Allocate the required comms buffer - grid = _Umu._grid; - comm_buf.resize(Stencil._unified_buffer_size); - DoubleStore(Umu,_Umu); -} + Umu(_grid), + UmuEven(_cbgrid), + UmuOdd (_cbgrid) + { + // Allocate the required comms buffer + comm_buf.resize(Stencil._unified_buffer_size); // this is always big enough to contain EO + + DoubleStore(Umu,_Umu); + pickCheckerboard(Even,UmuEven,Umu); + pickCheckerboard(Odd ,UmuOdd,Umu); + } void WilsonMatrix::DoubleStore(LatticeDoubledGaugeField &Uds,const LatticeGaugeField &Umu) { - LatticeColourMatrix U(grid); + LatticeColourMatrix U(_grid); for(int mu=0;mu(Umu,mu); @@ -97,47 +103,63 @@ void WilsonMatrix::DoubleStore(LatticeDoubledGaugeField &Uds,const LatticeGaugeF RealD WilsonMatrix::M(const LatticeFermion &in, LatticeFermion &out) { - this->Dhop(in,out,0); + out.checkerboard=in.checkerboard; + Dhop(in,out,DaggerNo); out = (4+mass)*in - 0.5*out ; // FIXME : axpby_norm! fusion fun return norm2(out); } RealD WilsonMatrix::Mdag(const LatticeFermion &in, LatticeFermion &out) { - this->Dhop(in,out,1); + out.checkerboard=in.checkerboard; + Dhop(in,out,DaggerYes); out = (4+mass)*in - 0.5*out ; // FIXME : axpby_norm! fusion fun return norm2(out); } void WilsonMatrix::Meooe(const LatticeFermion &in, LatticeFermion &out) { - this->Dhop(in,out,0); - out = 0.5*out; // FIXME : scale factor in Dhop + if ( in.checkerboard == Odd ) { + DhopEO(in,out,DaggerNo); + } else { + DhopOE(in,out,DaggerNo); + } + out = (-0.5)*out; // FIXME : scale factor in Dhop } void WilsonMatrix::MeooeDag(const LatticeFermion &in, LatticeFermion &out) { - this->Dhop(in,out,1); - out = 0.5*out; // FIXME : scale factor in Dhop + if ( in.checkerboard == Odd ) { + DhopEO(in,out,DaggerYes); + } else { + DhopOE(in,out,DaggerYes); + } + out = (-0.5)*out; // FIXME : scale factor in Dhop } void WilsonMatrix::Mooee(const LatticeFermion &in, LatticeFermion &out) { + out.checkerboard = in.checkerboard; out = (4.0+mass)*in; return ; } void WilsonMatrix::MooeeDag(const LatticeFermion &in, LatticeFermion &out) { - this->Mooee(in,out); + out.checkerboard = in.checkerboard; + Mooee(in,out); } void WilsonMatrix::MooeeInv(const LatticeFermion &in, LatticeFermion &out) { + out.checkerboard = in.checkerboard; out = (1.0/(4.0+mass))*in; return ; } void WilsonMatrix::MooeeInvDag(const LatticeFermion &in, LatticeFermion &out) { - this->MooeeInv(in,out); + out.checkerboard = in.checkerboard; + MooeeInv(in,out); } -void WilsonMatrix::DhopSite(int ss,const LatticeFermion &in, LatticeFermion &out) +void WilsonMatrix::DhopSite(CartesianStencil &st,LatticeDoubledGaugeField &U, + std::vector > &buf, + int ss,const LatticeFermion &in, LatticeFermion &out) { vHalfSpinColourVector tmp; vHalfSpinColourVector chi; @@ -145,79 +167,78 @@ void WilsonMatrix::DhopSite(int ss,const LatticeFermion &in, LatticeFermion &out vHalfSpinColourVector Uchi; int offset,local,perm, ptype; - // int ss = Stencil._LebesgueReorder[sss]; - int ssu= ss; + //#define VERBOSE( A) if ( ss<10 ) { std::cout << "site " < > &buf, + int ss,const LatticeFermion &in, LatticeFermion &out) { vHalfSpinColourVector tmp; vHalfSpinColourVector chi; @@ -291,78 +315,76 @@ void WilsonMatrix::DhopSiteDag(int ss,const LatticeFermion &in, LatticeFermion & vHalfSpinColourVector Uchi; int offset,local,perm, ptype; - int ssu= ss; - // Xp - offset = Stencil._offsets [Xm][ss]; - local = Stencil._is_local[Xm][ss]; - perm = Stencil._permute[Xm][ss]; + offset = st._offsets [Xm][ss]; + local = st._is_local[Xm][ss]; + perm = st._permute[Xm][ss]; - ptype = Stencil._permute_type[Xm]; + ptype = st._permute_type[Xm]; if ( local && perm ) { spProjXp(tmp,in._odata[offset]); permute(chi,tmp,ptype); } else if ( local ) { spProjXp(chi,in._odata[offset]); } else { - chi=comm_buf[offset]; + chi=buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Xm),&chi()); + mult(&Uchi(),&U._odata[ss](Xm),&chi()); spReconXp(result,Uchi); // Yp - offset = Stencil._offsets [Ym][ss]; - local = Stencil._is_local[Ym][ss]; - perm = Stencil._permute[Ym][ss]; - ptype = Stencil._permute_type[Ym]; + offset = st._offsets [Ym][ss]; + local = st._is_local[Ym][ss]; + perm = st._permute[Ym][ss]; + ptype = st._permute_type[Ym]; if ( local && perm ) { spProjYp(tmp,in._odata[offset]); permute(chi,tmp,ptype); } else if ( local ) { spProjYp(chi,in._odata[offset]); } else { - chi=comm_buf[offset]; + chi=buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Ym),&chi()); + mult(&Uchi(),&U._odata[ss](Ym),&chi()); accumReconYp(result,Uchi); // Zp - offset = Stencil._offsets [Zm][ss]; - local = Stencil._is_local[Zm][ss]; - perm = Stencil._permute[Zm][ss]; - ptype = Stencil._permute_type[Zm]; + offset = st._offsets [Zm][ss]; + local = st._is_local[Zm][ss]; + perm = st._permute[Zm][ss]; + ptype = st._permute_type[Zm]; if ( local && perm ) { spProjZp(tmp,in._odata[offset]); permute(chi,tmp,ptype); } else if ( local ) { spProjZp(chi,in._odata[offset]); } else { - chi=comm_buf[offset]; + chi=buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Zm),&chi()); + mult(&Uchi(),&U._odata[ss](Zm),&chi()); accumReconZp(result,Uchi); // Tp - offset = Stencil._offsets [Tm][ss]; - local = Stencil._is_local[Tm][ss]; - perm = Stencil._permute[Tm][ss]; - ptype = Stencil._permute_type[Tm]; + offset = st._offsets [Tm][ss]; + local = st._is_local[Tm][ss]; + perm = st._permute[Tm][ss]; + ptype = st._permute_type[Tm]; if ( local && perm ) { spProjTp(tmp,in._odata[offset]); permute(chi,tmp,ptype); } else if ( local ) { spProjTp(chi,in._odata[offset]); } else { - chi=comm_buf[offset]; + chi=buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Tm),&chi()); + mult(&Uchi(),&U._odata[ss](Tm),&chi()); accumReconTp(result,Uchi); // Xm - offset = Stencil._offsets [Xp][ss]; - local = Stencil._is_local[Xp][ss]; - perm = Stencil._permute[Xp][ss]; - ptype = Stencil._permute_type[Xp]; + offset = st._offsets [Xp][ss]; + local = st._is_local[Xp][ss]; + perm = st._permute[Xp][ss]; + ptype = st._permute_type[Xp]; if ( local && perm ) { @@ -371,17 +393,16 @@ void WilsonMatrix::DhopSiteDag(int ss,const LatticeFermion &in, LatticeFermion & } else if ( local ) { spProjXm(chi,in._odata[offset]); } else { - chi=comm_buf[offset]; + chi=buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Xp),&chi()); + mult(&Uchi(),&U._odata[ss](Xp),&chi()); accumReconXm(result,Uchi); - // Ym - offset = Stencil._offsets [Yp][ss]; - local = Stencil._is_local[Yp][ss]; - perm = Stencil._permute[Yp][ss]; - ptype = Stencil._permute_type[Yp]; + offset = st._offsets [Yp][ss]; + local = st._is_local[Yp][ss]; + perm = st._permute[Yp][ss]; + ptype = st._permute_type[Yp]; if ( local && perm ) { spProjYm(tmp,in._odata[offset]); @@ -389,67 +410,97 @@ void WilsonMatrix::DhopSiteDag(int ss,const LatticeFermion &in, LatticeFermion & } else if ( local ) { spProjYm(chi,in._odata[offset]); } else { - chi=comm_buf[offset]; + chi=buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Yp),&chi()); + mult(&Uchi(),&U._odata[ss](Yp),&chi()); accumReconYm(result,Uchi); // Zm - offset = Stencil._offsets [Zp][ss]; - local = Stencil._is_local[Zp][ss]; - perm = Stencil._permute[Zp][ss]; - ptype = Stencil._permute_type[Zp]; + offset = st._offsets [Zp][ss]; + local = st._is_local[Zp][ss]; + perm = st._permute[Zp][ss]; + ptype = st._permute_type[Zp]; if ( local && perm ) { spProjZm(tmp,in._odata[offset]); permute(chi,tmp,ptype); } else if ( local ) { spProjZm(chi,in._odata[offset]); } else { - chi=comm_buf[offset]; + chi=buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Zp),&chi()); + mult(&Uchi(),&U._odata[ss](Zp),&chi()); accumReconZm(result,Uchi); // Tm - offset = Stencil._offsets [Tp][ss]; - local = Stencil._is_local[Tp][ss]; - perm = Stencil._permute[Tp][ss]; - ptype = Stencil._permute_type[Tp]; + offset = st._offsets [Tp][ss]; + local = st._is_local[Tp][ss]; + perm = st._permute[Tp][ss]; + ptype = st._permute_type[Tp]; if ( local && perm ) { spProjTm(tmp,in._odata[offset]); permute(chi,tmp,ptype); } else if ( local ) { spProjTm(chi,in._odata[offset]); } else { - chi=comm_buf[offset]; + chi=buf[offset]; } - mult(&Uchi(),&Umu._odata[ssu](Tp),&chi()); + mult(&Uchi(),&U._odata[ss](Tp),&chi()); accumReconTm(result,Uchi); vstream(out._odata[ss],result); } -void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out,int dag) +void WilsonMatrix::DhopInternal(CartesianStencil & st,LatticeDoubledGaugeField & U, + const LatticeFermion &in, LatticeFermion &out,int dag) { - assert((dag==0) ||(dag==1)); - + assert((dag==DaggerNo) ||(dag==DaggerYes)); WilsonCompressor compressor(dag); - Stencil.HaloExchange(in,comm_buf,compressor); - if ( dag ) { + st.HaloExchange(in,comm_buf,compressor); + + if ( dag == DaggerYes ) { PARALLEL_FOR_LOOP - for(int sss=0;sssoSites();sss++){ - DhopSiteDag(sss,in,out); + for(int sss=0;sssoSites();sss++){ + DhopSiteDag(st,U,comm_buf,sss,in,out); } } else { PARALLEL_FOR_LOOP - for(int sss=0;sssoSites();sss++){ - DhopSite(sss,in,out); + for(int sss=0;sssoSites();sss++){ + DhopSite(st,U,comm_buf,sss,in,out); } } } +void WilsonMatrix::DhopOE(const LatticeFermion &in, LatticeFermion &out,int dag) +{ + conformable(in._grid,_cbgrid); // verifies half grid + conformable(in._grid,out._grid); // drops the cb check + assert(in.checkerboard==Even); + out.checkerboard = Odd; + DhopInternal(StencilEven,UmuOdd,in,out,dag); } +void WilsonMatrix::DhopEO(const LatticeFermion &in, LatticeFermion &out,int dag) +{ + conformable(in._grid,_cbgrid); // verifies half grid + conformable(in._grid,out._grid); // drops the cb check + + assert(in.checkerboard==Odd); + out.checkerboard = Even; + + DhopInternal(StencilOdd,UmuEven,in,out,dag); +} +void WilsonMatrix::Dhop(const LatticeFermion &in, LatticeFermion &out,int dag) +{ + conformable(in._grid,_grid); // verifies full grid + conformable(in._grid,out._grid); + + out.checkerboard = in.checkerboard; + + DhopInternal(Stencil,Umu,in,out,dag); } +}} + + + diff --git a/lib/qcd/Grid_qcd_wilson_dop.h b/lib/qcd/Grid_qcd_wilson_dop.h index 8d93a926..96b29cd0 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.h +++ b/lib/qcd/Grid_qcd_wilson_dop.h @@ -11,14 +11,20 @@ namespace Grid { //NB r=1; public: double mass; - GridBase *grid; + // GridBase * grid; // Inherited + // GridBase * cbgrid; - // Copy of the gauge field - LatticeDoubledGaugeField Umu; + //Defines the stencils for even and odd + CartesianStencil Stencil; + CartesianStencil StencilEven; + CartesianStencil StencilOdd; - //Defines the stencil - CartesianStencil Stencil; - static const int npoint=9; + // Copy of the gauge field , with even and odd subsets + LatticeDoubledGaugeField Umu; + LatticeDoubledGaugeField UmuEven; + LatticeDoubledGaugeField UmuOdd; + + static const int npoint=8; static const std::vector directions ; static const std::vector displacements; static const int Xp,Xm,Yp,Ym,Zp,Zm,Tp,Tm; @@ -27,7 +33,7 @@ namespace Grid { std::vector > comm_buf; // Constructor - WilsonMatrix(LatticeGaugeField &Umu,double mass); + WilsonMatrix(LatticeGaugeField &_Umu,GridCartesian &Fgrid,GridRedBlackCartesian &Hgrid,double _mass); // DoubleStore void DoubleStore(LatticeDoubledGaugeField &Uds,const LatticeGaugeField &Umu); @@ -45,9 +51,19 @@ namespace Grid { virtual void MooeeInvDag (const LatticeFermion &in, LatticeFermion &out); // non-hermitian hopping term; half cb or both - void Dhop(const LatticeFermion &in, LatticeFermion &out,int dag); - void DhopSite (int ss,const LatticeFermion &in, LatticeFermion &out); - void DhopSiteDag(int ss,const LatticeFermion &in, LatticeFermion &out); + void Dhop (const LatticeFermion &in, LatticeFermion &out,int dag); + void DhopOE(const LatticeFermion &in, LatticeFermion &out,int dag); + void DhopEO(const LatticeFermion &in, LatticeFermion &out,int dag); + void DhopInternal(CartesianStencil & st,LatticeDoubledGaugeField &U, + const LatticeFermion &in, LatticeFermion &out,int dag); + // These ones will need to be package intelligently. WilsonType base class + // for use by DWF etc.. + void DhopSite(CartesianStencil &st,LatticeDoubledGaugeField &U, + std::vector > &buf, + int ss,const LatticeFermion &in, LatticeFermion &out); + void DhopSiteDag(CartesianStencil &st,LatticeDoubledGaugeField &U, + std::vector > &buf, + int ss,const LatticeFermion &in, LatticeFermion &out); typedef iScalar > matrix; From 2ae6214104f945ebcb4d6876e5052bb4dcb24878 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 25 May 2015 13:47:12 +0100 Subject: [PATCH 231/429] Schur complement based red-black inversion working --- benchmarks/Grid_wilson.cc | 17 ++- benchmarks/Grid_wilson_cg_prec.cc | 61 +++++++++ benchmarks/Grid_wilson_cg_schur.cc | 48 +++++++ benchmarks/Grid_wilson_cg_unprec.cc | 7 +- benchmarks/Grid_wilson_evenodd.cc | 201 ++++++++++++++++++++++++++++ lib/simd/Grid_sse4.h | 1 + lib/simd/Grid_vector_types.h | 32 ++--- tests/Grid_main.cc | 3 +- 8 files changed, 336 insertions(+), 34 deletions(-) create mode 100644 benchmarks/Grid_wilson_cg_prec.cc create mode 100644 benchmarks/Grid_wilson_cg_schur.cc create mode 100644 benchmarks/Grid_wilson_evenodd.cc diff --git a/benchmarks/Grid_wilson.cc b/benchmarks/Grid_wilson.cc index adfb6fd4..32255b3e 100644 --- a/benchmarks/Grid_wilson.cc +++ b/benchmarks/Grid_wilson.cc @@ -24,7 +24,8 @@ int main (int argc, char ** argv) std::vector latt_size = GridDefaultLatt(); std::vector simd_layout = GridDefaultSimd(Nd,vComplexF::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); - GridCartesian Grid(latt_size,simd_layout,mpi_layout); + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + GridRedBlackCartesian RBGrid(latt_size,simd_layout,mpi_layout); int threads = GridThread::GetThreads(); std::cout << "Grid is setup to use "< U(4,&Grid); @@ -51,8 +52,11 @@ int main (int argc, char ** argv) // Only one non-zero (y) Umu=zero; + Complex cone(1.0,0.0); for(int nn=0;nn(Umu,U[nn],nn); } @@ -78,7 +82,7 @@ int main (int argc, char ** argv) } RealD mass=0.1; - WilsonMatrix Dw(Umu,mass); + WilsonMatrix Dw(Umu,Grid,RBGrid,mass); std::cout << "Calling Dw"< + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +template +struct scal { + d internal; +}; + + Gamma::GammaMatrix Gmu [] = { + Gamma::GammaX, + Gamma::GammaY, + Gamma::GammaZ, + Gamma::GammaT + }; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(Nd,vComplexF::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + GridRedBlackCartesian RBGrid(latt_size,simd_layout,mpi_layout); + + std::vector seeds({1,2,3,4}); + GridParallelRNG pRNG(&Grid); pRNG.SeedFixedIntegers(seeds); + + LatticeFermion src(&Grid); random(pRNG,src); + RealD nrm = norm2(src); + LatticeFermion result(&Grid); result=zero; + LatticeGaugeField Umu(&Grid); random(pRNG,Umu); + + std::vector U(4,&Grid); + + for(int mu=0;mu(Umu,mu); + } + + RealD mass=0.5; + WilsonMatrix Dw(Umu,Grid,RBGrid,mass); + + // HermitianOperator HermOp(Dw); + // ConjugateGradient CG(1.0e-8,10000); + // CG(HermOp,src,result); + + LatticeFermion src_o(&RBGrid); + LatticeFermion result_o(&RBGrid); + pickCheckerboard(Odd,src_o,src); + result_o=zero; + + HermitianCheckerBoardedOperator HermOpEO(Dw); + ConjugateGradient CG(1.0e-8,10000); + CG(HermOpEO,src_o,result_o); + + Grid_finalize(); +} diff --git a/benchmarks/Grid_wilson_cg_schur.cc b/benchmarks/Grid_wilson_cg_schur.cc new file mode 100644 index 00000000..af630ae1 --- /dev/null +++ b/benchmarks/Grid_wilson_cg_schur.cc @@ -0,0 +1,48 @@ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +template +struct scal { + d internal; +}; + + Gamma::GammaMatrix Gmu [] = { + Gamma::GammaX, + Gamma::GammaY, + Gamma::GammaZ, + Gamma::GammaT + }; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(Nd,vComplexF::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + GridRedBlackCartesian RBGrid(latt_size,simd_layout,mpi_layout); + + std::vector seeds({1,2,3,4}); + GridParallelRNG pRNG(&Grid); pRNG.SeedFixedIntegers(seeds); + + LatticeGaugeField Umu(&Grid); random(pRNG,Umu); + + LatticeFermion src(&Grid); random(pRNG,src); + LatticeFermion result(&Grid); result=zero; + LatticeFermion resid(&Grid); + + RealD mass=0.5; + WilsonMatrix Dw(Umu,Grid,RBGrid,mass); + + ConjugateGradient CG(1.0e-8,10000); + SchurRedBlackSolve SchurSolver(CG); + + SchurSolver(Dw,src,result); + + Grid_finalize(); +} diff --git a/benchmarks/Grid_wilson_cg_unprec.cc b/benchmarks/Grid_wilson_cg_unprec.cc index 93023534..15302aab 100644 --- a/benchmarks/Grid_wilson_cg_unprec.cc +++ b/benchmarks/Grid_wilson_cg_unprec.cc @@ -24,7 +24,8 @@ int main (int argc, char ** argv) std::vector latt_size = GridDefaultLatt(); std::vector simd_layout = GridDefaultSimd(Nd,vComplexF::Nsimd()); std::vector mpi_layout = GridDefaultMpi(); - GridCartesian Grid(latt_size,simd_layout,mpi_layout); + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + GridRedBlackCartesian RBGrid(latt_size,simd_layout,mpi_layout); std::vector seeds({1,2,3,4}); GridParallelRNG pRNG(&Grid); pRNG.SeedFixedIntegers(seeds); @@ -46,11 +47,11 @@ int main (int argc, char ** argv) } RealD mass=0.5; - WilsonMatrix Dw(Umu,mass); + WilsonMatrix Dw(Umu,Grid,RBGrid,mass); + HermitianOperator HermOp(Dw); ConjugateGradient CG(1.0e-8,10000); CG(HermOp,src,result); - Grid_finalize(); } diff --git a/benchmarks/Grid_wilson_evenodd.cc b/benchmarks/Grid_wilson_evenodd.cc new file mode 100644 index 00000000..4bc8c357 --- /dev/null +++ b/benchmarks/Grid_wilson_evenodd.cc @@ -0,0 +1,201 @@ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + +template +struct scal { + d internal; +}; + + Gamma::GammaMatrix Gmu [] = { + Gamma::GammaX, + Gamma::GammaY, + Gamma::GammaZ, + Gamma::GammaT + }; + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + std::vector latt_size = GridDefaultLatt(); + std::vector simd_layout = GridDefaultSimd(Nd,vComplexF::Nsimd()); + std::vector mpi_layout = GridDefaultMpi(); + GridCartesian Grid(latt_size,simd_layout,mpi_layout); + GridRedBlackCartesian RBGrid(latt_size,simd_layout,mpi_layout); + + int threads = GridThread::GetThreads(); + std::cout << "Grid is setup to use "< seeds({1,2,3,4}); + + GridParallelRNG pRNG(&Grid); + // std::vector seeds({1,2,3,4}); + // pRNG.SeedFixedIntegers(seeds); + pRNG.SeedRandomDevice(); + + LatticeFermion src (&Grid); random(pRNG,src); + LatticeFermion phi (&Grid); random(pRNG,phi); + LatticeFermion chi (&Grid); random(pRNG,chi); + LatticeFermion result(&Grid); result=zero; + LatticeFermion ref(&Grid); ref=zero; + LatticeFermion tmp(&Grid); tmp=zero; + LatticeFermion err(&Grid); tmp=zero; + LatticeGaugeField Umu(&Grid); random(pRNG,Umu); + std::vector U(4,&Grid); + + double volume=1; + for(int mu=0;mu(Umu,U[nn],nn); + } + + RealD mass=0.1; + + WilsonMatrix Dw(Umu,Grid,RBGrid,mass); + + LatticeFermion src_e (&RBGrid); + LatticeFermion src_o (&RBGrid); + LatticeFermion r_e (&RBGrid); + LatticeFermion r_o (&RBGrid); + LatticeFermion r_eo (&Grid); + + const int Even=0; + const int Odd=1; + std::cout<<"=========================================================="< * = < chi | Deo^dag| phi> "< - struct RealPart { - typedef T type; - }; - template - struct RealPart< std::complex >{ + template struct RealPart { + typedef T type; + }; + template struct RealPart< std::complex >{ typedef T type; }; // type alias used to simplify the syntax of std::enable_if - template using Invoke = - typename T::type; - template using EnableIf = - Invoke>; - template using NotEnableIf = - Invoke>; + template using Invoke = typename T::type; + template using EnableIf = Invoke>; + template using NotEnableIf= Invoke>; //////////////////////////////////////////////////////// // Check for complexity with type traits - template - struct is_complex : std::false_type {}; - template < typename T > - struct is_complex< std::complex >: std::true_type {}; + template struct is_complex : std::false_type {}; + template < typename T > struct is_complex< std::complex >: std::true_type {}; //////////////////////////////////////////////////////// // Define the operation templates functors // general forms to allow for vsplat syntax @@ -86,8 +79,6 @@ namespace Grid { Grid_simd(Real a){ vsplat(*this,Scalar_type(a)); }; - - /////////////////////////////////////////////// // mac, mult, sub, add, adj @@ -126,10 +117,6 @@ namespace Grid { friend inline void vtrue (Grid_simd &ret){vsplat(ret,0xFFFFFFFF);} template < class S = Scalar_type, EnableIf, int> = 0 > friend inline void vfalse(vInteger &ret){vsplat(ret,0);} - - - - //////////////////////////////////// // Arithmetic operator overloads +,-,* @@ -165,7 +152,6 @@ namespace Grid { ret.v = binary(a.v,b.v, MultSIMD()); return ret; }; - //////////////////////////////////////////////////////////////////////// // FIXME: gonna remove these load/store, get, set, prefetch diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index 10e74099..1a761042 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -1,8 +1,9 @@ #include "Grid.h" //DEBUG +#ifdef SSE4 #include "simd/Grid_vector_types.h" - +#endif using namespace std; using namespace Grid; From 3a6ff2d7b86233ae1da83119c3f97b5cb3177ed7 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Mon, 25 May 2015 14:43:08 +0100 Subject: [PATCH 232/429] Makefile update --- Makefile.in | 44 +++++++++++++++++++----------- aclocal.m4 | 61 ++++++++++++++++++++++-------------------- benchmarks/Makefile.am | 11 +++++++- config.guess | 2 +- config.sub | 2 +- configure | 13 ++++----- 6 files changed, 79 insertions(+), 54 deletions(-) diff --git a/Makefile.in b/Makefile.in index b6894ef6..b9fba168 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. +# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2013 Free Software Foundation, Inc. +# Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -14,7 +14,17 @@ @SET_MAKE@ VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ @@ -79,14 +89,12 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . -DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ - $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/configure $(am__configure_deps) COPYING TODO \ - compile config.guess config.sub depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d @@ -149,6 +157,9 @@ ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING ChangeLog \ + INSTALL NEWS README TODO compile config.guess config.sub \ + depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -314,7 +325,6 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -521,15 +531,15 @@ dist-xz: distdir $(am__post_remove_distdir) dist-tarZ: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) @@ -565,17 +575,17 @@ distcheck: dist esac chmod -R a-w $(distdir) chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_inst + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=.. --prefix="$$dc_install_base" \ + --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -749,6 +759,8 @@ uninstall-am: maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am +.PRECIOUS: Makefile + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/aclocal.m4 b/aclocal.m4 index 389763bf..bf79d078 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.14.1 -*- Autoconf -*- +# generated automatically by aclocal 1.15 -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -20,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002-2013 Free Software Foundation, Inc. +# Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.14' +[am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.14.1], [], +m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.14.1])dnl +[AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -103,15 +103,14 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -142,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -333,7 +332,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -409,7 +408,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -499,8 +498,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -573,7 +572,11 @@ to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi -fi]) +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further @@ -602,7 +605,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -613,7 +616,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -623,7 +626,7 @@ if test x"${install_sh}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2013 Free Software Foundation, Inc. +# Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -644,7 +647,7 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -694,7 +697,7 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -733,7 +736,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -764,7 +767,7 @@ AC_DEFUN([_AM_IF_OPTION], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -845,7 +848,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -905,7 +908,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -933,7 +936,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2013 Free Software Foundation, Inc. +# Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -952,7 +955,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2013 Free Software Foundation, Inc. +# Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/benchmarks/Makefile.am b/benchmarks/Makefile.am index fc513e86..95ae5eca 100644 --- a/benchmarks/Makefile.am +++ b/benchmarks/Makefile.am @@ -5,14 +5,23 @@ AM_LDFLAGS = -L$(top_builddir)/lib # # Test code # -bin_PROGRAMS = Grid_wilson Grid_comms Grid_memory_bandwidth Grid_su3 Grid_wilson_cg_unprec +bin_PROGRAMS = Grid_wilson Grid_comms Grid_memory_bandwidth Grid_su3 Grid_wilson_cg_unprec Grid_wilson_evenodd Grid_wilson_cg_prec Grid_wilson_cg_schur Grid_wilson_SOURCES = Grid_wilson.cc Grid_wilson_LDADD = -lGrid +Grid_wilson_evenodd_SOURCES = Grid_wilson_evenodd.cc +Grid_wilson_evenodd_LDADD = -lGrid + Grid_wilson_cg_unprec_SOURCES = Grid_wilson_cg_unprec.cc Grid_wilson_cg_unprec_LDADD = -lGrid +Grid_wilson_cg_prec_SOURCES = Grid_wilson_cg_prec.cc +Grid_wilson_cg_prec_LDADD = -lGrid + +Grid_wilson_cg_schur_SOURCES = Grid_wilson_cg_schur.cc +Grid_wilson_cg_schur_LDADD = -lGrid + Grid_comms_SOURCES = Grid_comms.cc Grid_comms_LDADD = -lGrid diff --git a/config.guess b/config.guess index 5f6aa02d..a12faba2 120000 --- a/config.guess +++ b/config.guess @@ -1 +1 @@ -/usr/share/automake-1.14/config.guess \ No newline at end of file +/opt/local/share/automake-1.15/config.guess \ No newline at end of file diff --git a/config.sub b/config.sub index 0abfe18c..e3c9b5ca 120000 --- a/config.sub +++ b/config.sub @@ -1 +1 @@ -/usr/share/automake-1.14/config.sub \ No newline at end of file +/opt/local/share/automake-1.15/config.sub \ No newline at end of file diff --git a/configure b/configure index 8c9e8c59..6e27ab11 100755 --- a/configure +++ b/configure @@ -2466,7 +2466,7 @@ test -n "$target_alias" && NONENONEs,x,x, && program_prefix=${target_alias}- -am__api_version='1.14' +am__api_version='1.15' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -2638,8 +2638,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2658,7 +2658,7 @@ else $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2986,8 +2986,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # mkdir_p='$(MKDIR_P)' -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' @@ -3046,6 +3046,7 @@ END fi + ac_config_headers="$ac_config_headers lib/Grid_config.h" # Check whether --enable-silent-rules was given. From ece86f717bc115afd0eed7593417f7a99da12784 Mon Sep 17 00:00:00 2001 From: neo Date: Tue, 26 May 2015 12:02:54 +0900 Subject: [PATCH 233/429] checked performance of new vector libaries. Added check for c++11 support on the configure.ac --- Makefile.in | 4 +- aclocal.m4 | 1 + configure | 186 ++++++++++++++++++++++++++++++++ configure.ac | 4 +- lib/Grid_config.h | 3 + lib/Grid_config.h.in | 3 + lib/Grid_simd.h | 4 + lib/cshift/Grid_cshift_common.h | 12 ++- lib/math/Grid_math_tensors.h | 14 +++ lib/simd/Grid_avx.h | 6 +- m4/ax_cxx_compile_stdcxx_11.m4 | 167 ++++++++++++++++++++++++++++ tests/Grid_main.cc | 53 +-------- 12 files changed, 398 insertions(+), 59 deletions(-) create mode 100644 m4/ax_cxx_compile_stdcxx_11.m4 diff --git a/Makefile.in b/Makefile.in index b6894ef6..d473c2df 100644 --- a/Makefile.in +++ b/Makefile.in @@ -84,7 +84,8 @@ DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ $(top_srcdir)/configure $(am__configure_deps) COPYING TODO \ compile config.guess config.sub depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ @@ -212,6 +213,7 @@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ +HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ diff --git a/aclocal.m4 b/aclocal.m4 index 389763bf..a3d1bc9c 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1083,3 +1083,4 @@ AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR +m4_include([m4/ax_cxx_compile_stdcxx_11.m4]) diff --git a/configure b/configure index 8c9e8c59..b7bd49f0 100755 --- a/configure +++ b/configure @@ -633,6 +633,7 @@ BUILD_COMMS_MPI_TRUE EGREP GREP CXXCPP +HAVE_CXX11 RANLIB OPENMP_CXXFLAGS am__fastdepCXX_FALSE @@ -3965,6 +3966,191 @@ else RANLIB="$ac_cv_prog_RANLIB" fi + ax_cxx_compile_cxx11_required=true + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + ac_success=no + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5 +$as_echo_n "checking whether $CXX supports C++11 features by default... " >&6; } +if ${ax_cv_cxx_compile_cxx11+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + struct Base { + virtual void f() {} + }; + struct Child : public Base { + virtual void f() override {} + }; + + typedef check> right_angle_brackets; + + int a; + decltype(a) b; + + typedef check check_type; + check_type c; + check_type&& cr = static_cast(c); + + auto d = a; + auto l = [](){}; + // Prevent Clang error: unused variable 'l' [-Werror,-Wunused-variable] + struct use_l { use_l() { l(); } }; + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function because of this + namespace test_template_alias_sfinae { + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { + func(0); + } + } + +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ax_cv_cxx_compile_cxx11=yes +else + ax_cv_cxx_compile_cxx11=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5 +$as_echo "$ax_cv_cxx_compile_cxx11" >&6; } + if test x$ax_cv_cxx_compile_cxx11 = xyes; then + ac_success=yes + fi + + + + if test x$ac_success = xno; then + for switch in -std=c++11 -std=c++0x +std=c++11; do + cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 +$as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; } +if eval \${$cachevar+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $switch" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + struct Base { + virtual void f() {} + }; + struct Child : public Base { + virtual void f() override {} + }; + + typedef check> right_angle_brackets; + + int a; + decltype(a) b; + + typedef check check_type; + check_type c; + check_type&& cr = static_cast(c); + + auto d = a; + auto l = [](){}; + // Prevent Clang error: unused variable 'l' [-Werror,-Wunused-variable] + struct use_l { use_l() { l(); } }; + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function because of this + namespace test_template_alias_sfinae { + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { + func(0); + } + } + +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + eval $cachevar=yes +else + eval $cachevar=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CXXFLAGS="$ac_save_CXXFLAGS" +fi +eval ac_res=\$$cachevar + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + if eval test x\$$cachevar = xyes; then + CXXFLAGS="$CXXFLAGS $switch" + ac_success=yes + break + fi + done + fi + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test x$ax_cxx_compile_cxx11_required = xtrue; then + if test x$ac_success = xno; then + as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5 + fi + else + if test x$ac_success = xno; then + HAVE_CXX11=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5 +$as_echo "$as_me: No compiler with C++11 support was found" >&6;} + else + HAVE_CXX11=1 + +$as_echo "#define HAVE_CXX11 1" >>confdefs.h + + fi + + + fi + + # Checks for libraries. #AX_GCC_VAR_ATTRIBUTE(aligned) diff --git a/configure.ac b/configure.ac index bfcbfcef..54a36eb1 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ # # Project Grid package # -# Time-stamp: <2015-05-22 15:46:09 neo> +# Time-stamp: <2015-05-25 14:54:34 neo> AC_PREREQ([2.63]) AC_INIT([Grid], [1.0], [paboyle@ph.ed.ac.uk]) @@ -26,6 +26,8 @@ AC_LANG(C++) AC_PROG_CXX AC_OPENMP AC_PROG_RANLIB +AX_CXX_COMPILE_STDCXX_11(noext, mandatory) + # Checks for libraries. #AX_GCC_VAR_ATTRIBUTE(aligned) diff --git a/lib/Grid_config.h b/lib/Grid_config.h index 78582f3e..2397894f 100644 --- a/lib/Grid_config.h +++ b/lib/Grid_config.h @@ -16,6 +16,9 @@ /* GRID_COMMS_NONE */ #define GRID_COMMS_NONE 1 +/* define if the compiler supports basic C++11 syntax */ +/* #undef HAVE_CXX11 */ + /* Define to 1 if you have the declaration of `be64toh', and to 0 if you don't. */ #define HAVE_DECL_BE64TOH 1 diff --git a/lib/Grid_config.h.in b/lib/Grid_config.h.in index b7f56d5b..6f05d6cb 100644 --- a/lib/Grid_config.h.in +++ b/lib/Grid_config.h.in @@ -15,6 +15,9 @@ /* GRID_COMMS_NONE */ #undef GRID_COMMS_NONE +/* define if the compiler supports basic C++11 syntax */ +#undef HAVE_CXX11 + /* Define to 1 if you have the declaration of `be64toh', and to 0 if you don't. */ #undef HAVE_DECL_BE64TOH diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index 9484c0d6..bdcb2d1b 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -103,6 +103,10 @@ namespace Grid { inline void sub (RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) - (*r); } inline void add (RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) + (*r); } + inline void vstream(ComplexF &l, const ComplexF &r){ l=r;} + inline void vstream(ComplexD &l, const ComplexD &r){ l=r;} + inline void vstream(RealF &l, const RealF &r){ l=r;} + inline void vstream(RealD &l, const RealD &r){ l=r;} class Zero{}; diff --git a/lib/cshift/Grid_cshift_common.h b/lib/cshift/Grid_cshift_common.h index 65c0cb87..90fc10b7 100644 --- a/lib/cshift/Grid_cshift_common.h +++ b/lib/cshift/Grid_cshift_common.h @@ -160,13 +160,21 @@ template void Copy_plane(Lattice& lhs,Lattice &rhs, int PARALLEL_NESTED_LOOP2 for(int n=0;n_slice_nblock[dimension];n++){ for(int b=0;b_slice_block[dimension];b++){ - + /* int o =n*rhs._grid->_slice_stride[dimension]; int ocb=1<CheckerBoardFromOindex(o+b); if ( ocb&cbmask ) { lhs._odata[lo+o+b]=rhs._odata[ro+o+b]; } - + */ + + int o =n*rhs._grid->_slice_stride[dimension]+b; + int ocb=1<CheckerBoardFromOindex(o); + if ( ocb&cbmask ) { + //lhs._odata[lo+o]=rhs._odata[ro+o]; + vstream(lhs._odata[lo+o],rhs._odata[ro+o]); + } + } } diff --git a/lib/math/Grid_math_tensors.h b/lib/math/Grid_math_tensors.h index a0424576..94cd3d58 100644 --- a/lib/math/Grid_math_tensors.h +++ b/lib/math/Grid_math_tensors.h @@ -38,6 +38,10 @@ public: iScalar(scalar_type s) : _internal(s) {};// recurse down and hit the constructor for vector_type iScalar(const Zero &z){ *this = zero; }; + + + + iScalar & operator= (const Zero &hero){ zeroit(*this); return *this; @@ -206,6 +210,16 @@ public: iMatrix(const Zero &z){ *this = zero; }; iMatrix() =default; + // No copy constructor... + + iMatrix& operator=(const iMatrix& rhs){ + for(int i=0;i & operator= (const Zero &hero){ zeroit(*this); diff --git a/lib/simd/Grid_avx.h b/lib/simd/Grid_avx.h index ea796122..303f30c5 100644 --- a/lib/simd/Grid_avx.h +++ b/lib/simd/Grid_avx.h @@ -4,7 +4,7 @@ Using intrinsics */ -// Time-stamp: <2015-05-22 15:51:24 neo> +// Time-stamp: <2015-05-22 18:58:27 neo> //---------------------------------------------------------------------- #include @@ -307,9 +307,7 @@ namespace Optimization { conv.v = b; switch (perm){ // 8x32 bits=>3 permutes - case 2: - conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); - break; + case 2: conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); break; case 1: conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2)); break; case 0: conv.f = _mm256_permute2f128_ps(conv.f,conv.f,0x01); break; default: assert(0); break; diff --git a/m4/ax_cxx_compile_stdcxx_11.m4 b/m4/ax_cxx_compile_stdcxx_11.m4 new file mode 100644 index 00000000..395b13d2 --- /dev/null +++ b/m4/ax_cxx_compile_stdcxx_11.m4 @@ -0,0 +1,167 @@ +# ============================================================================ +# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html +# ============================================================================ +# +# SYNOPSIS +# +# AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional]) +# +# DESCRIPTION +# +# Check for baseline language coverage in the compiler for the C++11 +# standard; if necessary, add switches to CXXFLAGS to enable support. +# +# The first argument, if specified, indicates whether you insist on an +# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. +# -std=c++11). If neither is specified, you get whatever works, with +# preference for an extended mode. +# +# The second argument, if specified 'mandatory' or if left unspecified, +# indicates that baseline C++11 support is required and that the macro +# should error out if no mode with that support is found. If specified +# 'optional', then configuration proceeds regardless, after defining +# HAVE_CXX11 if and only if a supporting mode is found. +# +# LICENSE +# +# Copyright (c) 2008 Benjamin Kosnik +# Copyright (c) 2012 Zack Weinberg +# Copyright (c) 2013 Roy Stogner +# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 11 + +m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[ + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + struct Base { + virtual void f() {} + }; + struct Child : public Base { + virtual void f() override {} + }; + + typedef check> right_angle_brackets; + + int a; + decltype(a) b; + + typedef check check_type; + check_type c; + check_type&& cr = static_cast(c); + + auto d = a; + auto l = [](){}; + // Prevent Clang error: unused variable 'l' [-Werror,-Wunused-variable] + struct use_l { use_l() { l(); } }; + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function because of this + namespace test_template_alias_sfinae { + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { + func(0); + } + } +]]) + +AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl + m4_if([$1], [], [], + [$1], [ext], [], + [$1], [noext], [], + [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl + m4_if([$2], [], [ax_cxx_compile_cxx11_required=true], + [$2], [mandatory], [ax_cxx_compile_cxx11_required=true], + [$2], [optional], [ax_cxx_compile_cxx11_required=false], + [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])]) + AC_LANG_PUSH([C++])dnl + ac_success=no + AC_CACHE_CHECK(whether $CXX supports C++11 features by default, + ax_cv_cxx_compile_cxx11, + [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], + [ax_cv_cxx_compile_cxx11=yes], + [ax_cv_cxx_compile_cxx11=no])]) + if test x$ax_cv_cxx_compile_cxx11 = xyes; then + ac_success=yes + fi + + m4_if([$1], [noext], [], [dnl + if test x$ac_success = xno; then + for switch in -std=gnu++11 -std=gnu++0x; do + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, + $cachevar, + [ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXXFLAGS="$ac_save_CXXFLAGS"]) + if eval test x\$$cachevar = xyes; then + CXXFLAGS="$CXXFLAGS $switch" + ac_success=yes + break + fi + done + fi]) + + m4_if([$1], [ext], [], [dnl + if test x$ac_success = xno; then + dnl HP's aCC needs +std=c++11 according to: + dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf + for switch in -std=c++11 -std=c++0x +std=c++11; do + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, + $cachevar, + [ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXXFLAGS="$ac_save_CXXFLAGS"]) + if eval test x\$$cachevar = xyes; then + CXXFLAGS="$CXXFLAGS $switch" + ac_success=yes + break + fi + done + fi]) + AC_LANG_POP([C++]) + if test x$ax_cxx_compile_cxx11_required = xtrue; then + if test x$ac_success = xno; then + AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.]) + fi + else + if test x$ac_success = xno; then + HAVE_CXX11=0 + AC_MSG_NOTICE([No compiler with C++11 support was found]) + else + HAVE_CXX11=1 + AC_DEFINE(HAVE_CXX11,1, + [define if the compiler supports basic C++11 syntax]) + fi + + AC_SUBST(HAVE_CXX11) + fi +]) diff --git a/tests/Grid_main.cc b/tests/Grid_main.cc index c1f1c5d0..fd198f30 100644 --- a/tests/Grid_main.cc +++ b/tests/Grid_main.cc @@ -105,7 +105,7 @@ int main (int argc, char ** argv) fflush(stdout); - /* + cVec = cMat * cVec; // LatticeColourVector = LatticeColourMatrix * LatticeColourVector sVec = sMat * sVec; // LatticeSpinVector = LatticeSpinMatrix * LatticeSpinVector scVec= scMat * scVec;// LatticeSpinColourVector = LatticeSpinColourMatrix * LatticeSpinColourVector @@ -146,7 +146,7 @@ int main (int argc, char ** argv) scalar=trace(scalar); scalar=localInnerProduct(cVec,cVec); scalar=localNorm2(cVec); - */ + // -=,+=,*=,() // add,+,sub,-,mult,mac,* // adj,conjugate @@ -162,50 +162,7 @@ int main (int argc, char ** argv) scMat = sMat*scMat; // LatticeSpinColourMatrix = LatticeSpinMatrix * LatticeSpinColourMatrix - /* -#ifdef SSE4 - ///////// Tests the new class Grid_simd - std::complex ctest(3.0,2.0); - std::complex ctestf(3.0,2.0); - MyComplexF TestMe1(1.0); // fills only real part - MyComplexD TestMe2(ctest); - MyComplexD TestMe3(ctest);// compiler generate conversion of basic types - //MyRealF TestMe5(ctest);// Must generate compiler error - MyRealD TestRe1(2.0); - MyRealF TestRe2(3.0); - - vone(TestRe2); - - MyComplexF TestMe6(ctestf); - MyComplexF TestMe7(ctestf); - - MyComplexD TheSum= TestMe2*TestMe3; - MyComplexF TheSumF= TestMe6*TestMe7; - - - - double dsum[2]; - _mm_store_pd(dsum, TheSum.v); - for (int i =0; i< 2; i++) - printf("%f\n", dsum[i]); - MyComplexD TheSumI = timesMinusI(TheSum); - MyComplexF TheSumIF = timesMinusI(TheSumF); - - float fsum[4]; - _mm_store_ps(fsum, TheSumF.v); - for (int i =0; i< 4; i++) - printf("%f\n", fsum[i]); - - vstore(TheSumI, &ctest); - std::complex sum = Reduce(TheSumF); - std::cout << ctest<< std::endl; - std::cout << sum<< std::endl; - -#endif - */ /////////////////////// - /* - printf("DEBUG: calling 3.5 \n"); // Non-lattice (const objects) * Lattice ColourMatrix cm; SpinColourMatrix scm; @@ -225,7 +182,6 @@ int main (int argc, char ** argv) vscm = vscm*cplx; scMat = scMat*cplx; - printf("DEBUG: calling 3.7 \n"); scm = cplx*scm; vscm = cplx*vscm; scMat = cplx*scMat; @@ -233,14 +189,12 @@ int main (int argc, char ** argv) vscm = myint*vscm; scMat = scMat*myint; - printf("DEBUG: calling 3.9 \n"); scm = scm*mydouble; vscm = vscm*mydouble; scMat = scMat*mydouble; scMat = mydouble*scMat; cMat = mydouble*cMat; - printf("DEBUG: calling 4 \n"); sMat = adj(sMat); // LatticeSpinMatrix adjoint sMat = iGammaFive*sMat; // SpinMatrix * LatticeSpinMatrix sMat = GammaFive*sMat; // SpinMatrix * LatticeSpinMatrix @@ -293,8 +247,6 @@ int main (int argc, char ** argv) pokeIndex<1> (c_m,c,0,0); } - */ - FooBar = Bar; /* @@ -392,7 +344,6 @@ int main (int argc, char ** argv) t0=usecond(); for(int i=0;i Date: Tue, 26 May 2015 13:31:10 +0900 Subject: [PATCH 234/429] Cleaning up simd files --- TODO | 4 +- lib/Grid_simd.h | 90 ------------------------------------ lib/simd/Grid_vector_types.h | 66 ++++++++++++++++++++++++-- 3 files changed, 64 insertions(+), 96 deletions(-) diff --git a/TODO b/TODO index ed4dedd4..670c53e3 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,8 @@ ================================================================ *** Hacks and bug fixes to clean up and Audits ================================================================ -* Base class to share common code between vRealF, VComplexF etc... - - Performance check on Guido's reimplementation strategy +* Base class to share common code between vRealF, VComplexF etc... done + - Performance check on Guido's reimplementation strategy - (GUIDO) tested and no difference was found, merged * FIXME audit diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index 19b30f03..39eb4654 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -95,100 +95,10 @@ namespace Grid { template<> inline void zeroit(RealF &arg){ arg=0; }; template<> inline void zeroit(RealD &arg){ arg=0; }; - // Eventually delete this part -#if defined (SSE4) - typedef __m128 fvec; - typedef __m128d dvec; - typedef __m128 cvec; - typedef __m128d zvec; - typedef __m128i ivec; -#endif -#if defined (AVX1) || defined (AVX2) - typedef __m256 fvec; - typedef __m256d dvec; - typedef __m256 cvec; - typedef __m256d zvec; - typedef __m256i ivec; -#endif -#if defined (AVX512) - typedef __m512 fvec; - typedef __m512d dvec; - typedef __m512 cvec; - typedef __m512d zvec; - typedef __m512i ivec; -#endif -#if defined (QPX) - typedef float fvec __attribute__ ((vector_size (16))); // QPX has same SIMD width irrespective of precision - typedef float cvec __attribute__ ((vector_size (16))); - - typedef vector4double dvec; - typedef vector4double zvec; -#endif - -#if defined (AVX1) || defined (AVX2) || defined (AVX512) - inline void v_prefetch0(int size, const char *ptr){ - for(int i=0;i BA DC FE HG -// Permute 1 every ABCDEFGH -> CD AB GH EF -// Permute 2 every ABCDEFGH -> EFGH ABCD -// Permute 3 possible on longer iVector lengths (512bit = 8 double = 16 single) -// Permute 4 possible on half precision @512bit vectors. -////////////////////////////////////////////////////////// -template -inline void Gpermute(vsimd &y,const vsimd &b,int perm){ - union { - fvec f; - decltype(vsimd::v) v; - } conv; - conv.v = b.v; - switch (perm){ -#if defined(AVX1)||defined(AVX2) - // 8x32 bits=>3 permutes - case 2: - conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); - break; - case 1: conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2)); break; - case 0: conv.f = _mm256_permute2f128_ps(conv.f,conv.f,0x01); break; -#endif -#ifdef SSE4 - case 1: conv.f = _mm_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); break; - case 0: conv.f = _mm_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2));break; -#endif -#ifdef AVX512 - // 16 floats=> permutes - // Permute 0 every abcd efgh ijkl mnop -> badc fehg jilk nmpo - // Permute 1 every abcd efgh ijkl mnop -> cdab ghef jkij opmn - // Permute 2 every abcd efgh ijkl mnop -> efgh abcd mnop ijkl - // Permute 3 every abcd efgh ijkl mnop -> ijkl mnop abcd efgh - case 3: conv.f = _mm512_swizzle_ps(conv.f,_MM_SWIZ_REG_CDAB); break; - case 2: conv.f = _mm512_swizzle_ps(conv.f,_MM_SWIZ_REG_BADC); break; - case 1: conv.f = _mm512_permute4f128_ps(conv.f,(_MM_PERM_ENUM)_MM_SHUFFLE(2,3,0,1)); break; - case 0: conv.f = _mm512_permute4f128_ps(conv.f,(_MM_PERM_ENUM)_MM_SHUFFLE(1,0,3,2)); break; -#endif -#ifdef QPX -#error not implemented -#endif - default: assert(0); break; - } - y.v=conv.v; - - }; }; #include - namespace Grid { // NB: Template the following on "type Complex" and then implement *,+,- for diff --git a/lib/simd/Grid_vector_types.h b/lib/simd/Grid_vector_types.h index a77cf963..3664e0f7 100644 --- a/lib/simd/Grid_vector_types.h +++ b/lib/simd/Grid_vector_types.h @@ -2,7 +2,7 @@ /*! @file Grid_vector_types.h @brief Defines templated class Grid_simd to deal with inner vector types */ -// Time-stamp: <2015-05-26 12:05:39 neo> +// Time-stamp: <2015-05-26 13:22:36 neo> //--------------------------------------------------------------------------- #ifndef GRID_VECTOR_TYPES #define GRID_VECTOR_TYPES @@ -16,7 +16,9 @@ #if defined AVX512 #include "Grid_knc.h" #endif - +#if defined QPX +#include "Grid_qpx.h" +#endif namespace Grid { @@ -33,8 +35,6 @@ namespace Grid { template using EnableIf = Invoke>; template using NotEnableIf= Invoke>; - - //////////////////////////////////////////////////////// // Check for complexity with type traits template struct is_complex : std::false_type {}; @@ -57,6 +57,58 @@ namespace Grid { /////////////////////////////////////////////// +////////////////////////////////////////////////////////// +// Permute +// Permute 0 every ABCDEFGH -> BA DC FE HG +// Permute 1 every ABCDEFGH -> CD AB GH EF +// Permute 2 every ABCDEFGH -> EFGH ABCD +// Permute 3 possible on longer iVector lengths (512bit = 8 double = 16 single) +// Permute 4 possible on half precision @512bit vectors. +////////////////////////////////////////////////////////// +template +inline void Gpermute(vsimd &y,const vsimd &b,int perm){ + union { + SIMD_Ftype f; + decltype(vsimd::v) v; + } conv; + conv.v = b.v; + switch (perm){ +#if defined(AVX1)||defined(AVX2) + // 8x32 bits=>3 permutes + case 2: + conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); + break; + case 1: conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2)); break; + case 0: conv.f = _mm256_permute2f128_ps(conv.f,conv.f,0x01); break; +#endif +#ifdef SSE4 + case 1: conv.f = _mm_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); break; + case 0: conv.f = _mm_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2));break; +#endif +#ifdef AVX512 + // 16 floats=> permutes + // Permute 0 every abcd efgh ijkl mnop -> badc fehg jilk nmpo + // Permute 1 every abcd efgh ijkl mnop -> cdab ghef jkij opmn + // Permute 2 every abcd efgh ijkl mnop -> efgh abcd mnop ijkl + // Permute 3 every abcd efgh ijkl mnop -> ijkl mnop abcd efgh + case 3: conv.f = _mm512_swizzle_ps(conv.f,_MM_SWIZ_REG_CDAB); break; + case 2: conv.f = _mm512_swizzle_ps(conv.f,_MM_SWIZ_REG_BADC); break; + case 1: conv.f = _mm512_permute4f128_ps(conv.f,(_MM_PERM_ENUM)_MM_SHUFFLE(2,3,0,1)); break; + case 0: conv.f = _mm512_permute4f128_ps(conv.f,(_MM_PERM_ENUM)_MM_SHUFFLE(1,0,3,2)); break; +#endif +#ifdef QPX +#error not implemented +#endif + default: assert(0); break; + } + y.v=conv.v; + + }; + +/////////////////////////////////////// + + + /* @brief Grid_simd class for the SIMD vector type operations */ @@ -380,6 +432,12 @@ namespace Grid { typedef Grid_simd< std::complex< double >, SIMD_Dtype > vComplexD; typedef Grid_simd< Integer , SIMD_Itype > vInteger; + + + + + + } #endif From fb5d72973e4e642487b0fa1c8919cd4a674ce0ef Mon Sep 17 00:00:00 2001 From: neo Date: Tue, 26 May 2015 13:54:34 +0900 Subject: [PATCH 235/429] More cleanup of Grid_simd.h --- lib/Grid_simd.h | 128 ++++++++++++----------------------- lib/simd/Grid_vector_types.h | 14 +++- 2 files changed, 57 insertions(+), 85 deletions(-) diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index 39eb4654..cccc82e0 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -44,49 +44,49 @@ namespace Grid { inline ComplexF innerProduct(const ComplexF & l, const ComplexF & r) { return conjugate(l)*r; } inline RealD innerProduct(const RealD & l, const RealD & r) { return l*r; } inline RealF innerProduct(const RealF & l, const RealF & r) { return l*r; } - - //////////////////////////////////////////////////////////////////////////////// - //Provide support functions for basic real and complex data types required by Grid - //Single and double precision versions. Should be able to template this once only. - //////////////////////////////////////////////////////////////////////////////// - inline void mac (ComplexD * __restrict__ y,const ComplexD * __restrict__ a,const ComplexD *__restrict__ x){ *y = (*a) * (*x)+(*y); }; - inline void mult(ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) * (*r);} - inline void sub (ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) - (*r);} - inline void add (ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) + (*r);} - // conjugate already supported for complex - - inline void mac (ComplexF * __restrict__ y,const ComplexF * __restrict__ a,const ComplexF *__restrict__ x){ *y = (*a) * (*x)+(*y); } - inline void mult(ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) * (*r); } - inline void sub (ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) - (*r); } - inline void add (ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) + (*r); } - - //conjugate already supported for complex - - inline ComplexF timesI(const ComplexF &r) { return(r*ComplexF(0.0,1.0));} - inline ComplexD timesI(const ComplexD &r) { return(r*ComplexD(0.0,1.0));} - inline ComplexF timesMinusI(const ComplexF &r){ return(r*ComplexF(0.0,-1.0));} - inline ComplexD timesMinusI(const ComplexD &r){ return(r*ComplexD(0.0,-1.0));} - inline void timesI(ComplexF &ret,const ComplexF &r) { ret = timesI(r);} - inline void timesI(ComplexD &ret,const ComplexD &r) { ret = timesI(r);} - inline void timesMinusI(ComplexF &ret,const ComplexF &r){ ret = timesMinusI(r);} - inline void timesMinusI(ComplexD &ret,const ComplexD &r){ ret = timesMinusI(r);} - - inline void mac (RealD * __restrict__ y,const RealD * __restrict__ a,const RealD *__restrict__ x){ *y = (*a) * (*x)+(*y);} - inline void mult(RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) * (*r);} - inline void sub (RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) - (*r);} - inline void add (RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) + (*r);} - - inline void mac (RealF * __restrict__ y,const RealF * __restrict__ a,const RealF *__restrict__ x){ *y = (*a) * (*x)+(*y); } - inline void mult(RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) * (*r); } - inline void sub (RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) - (*r); } - inline void add (RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) + (*r); } - - inline void vstream(ComplexF &l, const ComplexF &r){ l=r;} - inline void vstream(ComplexD &l, const ComplexD &r){ l=r;} - inline void vstream(RealF &l, const RealF &r){ l=r;} - inline void vstream(RealD &l, const RealD &r){ l=r;} - - + + //////////////////////////////////////////////////////////////////////////////// + //Provide support functions for basic real and complex data types required by Grid + //Single and double precision versions. Should be able to template this once only. + //////////////////////////////////////////////////////////////////////////////// + inline void mac (ComplexD * __restrict__ y,const ComplexD * __restrict__ a,const ComplexD *__restrict__ x){ *y = (*a) * (*x)+(*y); }; + inline void mult(ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) * (*r);} + inline void sub (ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) - (*r);} + inline void add (ComplexD * __restrict__ y,const ComplexD * __restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) + (*r);} + // conjugate already supported for complex + + inline void mac (ComplexF * __restrict__ y,const ComplexF * __restrict__ a,const ComplexF *__restrict__ x){ *y = (*a) * (*x)+(*y); } + inline void mult(ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) * (*r); } + inline void sub (ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) - (*r); } + inline void add (ComplexF * __restrict__ y,const ComplexF * __restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) + (*r); } + + //conjugate already supported for complex + + inline ComplexF timesI(const ComplexF &r) { return(r*ComplexF(0.0,1.0));} + inline ComplexD timesI(const ComplexD &r) { return(r*ComplexD(0.0,1.0));} + inline ComplexF timesMinusI(const ComplexF &r){ return(r*ComplexF(0.0,-1.0));} + inline ComplexD timesMinusI(const ComplexD &r){ return(r*ComplexD(0.0,-1.0));} + inline void timesI(ComplexF &ret,const ComplexF &r) { ret = timesI(r);} + inline void timesI(ComplexD &ret,const ComplexD &r) { ret = timesI(r);} + inline void timesMinusI(ComplexF &ret,const ComplexF &r){ ret = timesMinusI(r);} + inline void timesMinusI(ComplexD &ret,const ComplexD &r){ ret = timesMinusI(r);} + + inline void mac (RealD * __restrict__ y,const RealD * __restrict__ a,const RealD *__restrict__ x){ *y = (*a) * (*x)+(*y);} + inline void mult(RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) * (*r);} + inline void sub (RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) - (*r);} + inline void add (RealD * __restrict__ y,const RealD * __restrict__ l,const RealD *__restrict__ r){ *y = (*l) + (*r);} + + inline void mac (RealF * __restrict__ y,const RealF * __restrict__ a,const RealF *__restrict__ x){ *y = (*a) * (*x)+(*y); } + inline void mult(RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) * (*r); } + inline void sub (RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) - (*r); } + inline void add (RealF * __restrict__ y,const RealF * __restrict__ l,const RealF *__restrict__ r){ *y = (*l) + (*r); } + + inline void vstream(ComplexF &l, const ComplexF &r){ l=r;} + inline void vstream(ComplexD &l, const ComplexD &r){ l=r;} + inline void vstream(RealF &l, const RealF &r){ l=r;} + inline void vstream(RealD &l, const RealD &r){ l=r;} + + class Zero{}; static Zero zero; template inline void zeroit(itype &arg){ arg=zero;}; @@ -94,52 +94,12 @@ namespace Grid { template<> inline void zeroit(ComplexD &arg){ arg=0; }; template<> inline void zeroit(RealF &arg){ arg=0; }; template<> inline void zeroit(RealD &arg){ arg=0; }; - + }; #include namespace Grid { - - // NB: Template the following on "type Complex" and then implement *,+,- for - // ComplexF, ComplexD, RealF, RealD above to - // get full generality of binops with scalars. - inline void mac (vComplexF *__restrict__ y,const ComplexF *__restrict__ a,const vComplexF *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - inline void mult(vComplexF *__restrict__ y,const ComplexF *__restrict__ l,const vComplexF *__restrict__ r){ *y = (*l) * (*r); } - inline void sub (vComplexF *__restrict__ y,const ComplexF *__restrict__ l,const vComplexF *__restrict__ r){ *y = (*l) - (*r); } - inline void add (vComplexF *__restrict__ y,const ComplexF *__restrict__ l,const vComplexF *__restrict__ r){ *y = (*l) + (*r); } - inline void mac (vComplexF *__restrict__ y,const vComplexF *__restrict__ a,const ComplexF *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - inline void mult(vComplexF *__restrict__ y,const vComplexF *__restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) * (*r); } - inline void sub (vComplexF *__restrict__ y,const vComplexF *__restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) - (*r); } - inline void add (vComplexF *__restrict__ y,const vComplexF *__restrict__ l,const ComplexF *__restrict__ r){ *y = (*l) + (*r); } - - inline void mac (vComplexD *__restrict__ y,const ComplexD *__restrict__ a,const vComplexD *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - inline void mult(vComplexD *__restrict__ y,const ComplexD *__restrict__ l,const vComplexD *__restrict__ r){ *y = (*l) * (*r); } - inline void sub (vComplexD *__restrict__ y,const ComplexD *__restrict__ l,const vComplexD *__restrict__ r){ *y = (*l) - (*r); } - inline void add (vComplexD *__restrict__ y,const ComplexD *__restrict__ l,const vComplexD *__restrict__ r){ *y = (*l) + (*r); } - inline void mac (vComplexD *__restrict__ y,const vComplexD *__restrict__ a,const ComplexD *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - inline void mult(vComplexD *__restrict__ y,const vComplexD *__restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) * (*r); } - inline void sub (vComplexD *__restrict__ y,const vComplexD *__restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) - (*r); } - inline void add (vComplexD *__restrict__ y,const vComplexD *__restrict__ l,const ComplexD *__restrict__ r){ *y = (*l) + (*r); } - - inline void mac (vRealF *__restrict__ y,const RealF *__restrict__ a,const vRealF *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - inline void mult(vRealF *__restrict__ y,const RealF *__restrict__ l,const vRealF *__restrict__ r){ *y = (*l) * (*r); } - inline void sub (vRealF *__restrict__ y,const RealF *__restrict__ l,const vRealF *__restrict__ r){ *y = (*l) - (*r); } - inline void add (vRealF *__restrict__ y,const RealF *__restrict__ l,const vRealF *__restrict__ r){ *y = (*l) + (*r); } - inline void mac (vRealF *__restrict__ y,const vRealF *__restrict__ a,const RealF *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - inline void mult(vRealF *__restrict__ y,const vRealF *__restrict__ l,const RealF *__restrict__ r){ *y = (*l) * (*r); } - inline void sub (vRealF *__restrict__ y,const vRealF *__restrict__ l,const RealF *__restrict__ r){ *y = (*l) - (*r); } - inline void add (vRealF *__restrict__ y,const vRealF *__restrict__ l,const RealF *__restrict__ r){ *y = (*l) + (*r); } - - inline void mac (vRealD *__restrict__ y,const RealD *__restrict__ a,const vRealD *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - inline void mult(vRealD *__restrict__ y,const RealD *__restrict__ l,const vRealD *__restrict__ r){ *y = (*l) * (*r); } - inline void sub (vRealD *__restrict__ y,const RealD *__restrict__ l,const vRealD *__restrict__ r){ *y = (*l) - (*r); } - inline void add (vRealD *__restrict__ y,const RealD *__restrict__ l,const vRealD *__restrict__ r){ *y = (*l) + (*r); } - inline void mac (vRealD *__restrict__ y,const vRealD *__restrict__ a,const RealD *__restrict__ x){ *y = (*a)*(*x)+(*y); }; - inline void mult(vRealD *__restrict__ y,const vRealD *__restrict__ l,const RealD *__restrict__ r){ *y = (*l) * (*r); } - inline void sub (vRealD *__restrict__ y,const vRealD *__restrict__ l,const RealD *__restrict__ r){ *y = (*l) - (*r); } - inline void add (vRealD *__restrict__ y,const vRealD *__restrict__ l,const RealD *__restrict__ r){ *y = (*l) + (*r); } - // Default precision #ifdef GRID_DEFAULT_PRECISION_DOUBLE typedef vRealD vReal; diff --git a/lib/simd/Grid_vector_types.h b/lib/simd/Grid_vector_types.h index 3664e0f7..ae01269f 100644 --- a/lib/simd/Grid_vector_types.h +++ b/lib/simd/Grid_vector_types.h @@ -2,7 +2,7 @@ /*! @file Grid_vector_types.h @brief Defines templated class Grid_simd to deal with inner vector types */ -// Time-stamp: <2015-05-26 13:22:36 neo> +// Time-stamp: <2015-05-26 13:44:54 neo> //--------------------------------------------------------------------------- #ifndef GRID_VECTOR_TYPES #define GRID_VECTOR_TYPES @@ -156,6 +156,18 @@ inline void Gpermute(vsimd &y,const vsimd &b,int perm){ friend inline void sub (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) - (*r); } friend inline void add (Grid_simd * __restrict__ y,const Grid_simd * __restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) + (*r); } + + friend inline void mac (Grid_simd *__restrict__ y,const Scalar_type *__restrict__ a,const Grid_simd *__restrict__ x){ *y = (*a)*(*x)+(*y); }; + friend inline void mult(Grid_simd *__restrict__ y,const Scalar_type *__restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) * (*r); } + friend inline void sub (Grid_simd *__restrict__ y,const Scalar_type *__restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) - (*r); } + friend inline void add (Grid_simd *__restrict__ y,const Scalar_type *__restrict__ l,const Grid_simd *__restrict__ r){ *y = (*l) + (*r); } + friend inline void mac (Grid_simd *__restrict__ y,const Grid_simd *__restrict__ a,const Scalar_type *__restrict__ x){ *y = (*a)*(*x)+(*y); }; + friend inline void mult(Grid_simd *__restrict__ y,const Grid_simd *__restrict__ l,const Scalar_type *__restrict__ r){ *y = (*l) * (*r); } + friend inline void sub (Grid_simd *__restrict__ y,const Grid_simd *__restrict__ l,const Scalar_type *__restrict__ r){ *y = (*l) - (*r); } + friend inline void add (Grid_simd *__restrict__ y,const Grid_simd *__restrict__ l,const Scalar_type *__restrict__ r){ *y = (*l) + (*r); } + + + //not for integer types... template < class S = Scalar_type, NotEnableIf, int> = 0 > friend inline Grid_simd adj(const Grid_simd &in){ return conjugate(in); } From a32ac287bb1eccc88088de51d5fc483f5f8e2f72 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 26 May 2015 19:54:03 +0100 Subject: [PATCH 236/429] Hand unrolled version of dslash in a separate class. Useful to compare; raises Intel compiler from 9GFlop/s to 17.5 Gflops. on ivybridge core. Raises Clang form 14.5 to 17.5 --- benchmarks/Grid_wilson.cc | 14 +- lib/Grid.h | 1 - lib/Grid_init.cc | 3 + lib/Grid_simd.h | 100 +++++-- lib/Makefile.am | 2 + lib/lattice/Grid_lattice_base.h | 12 +- lib/lattice/Grid_lattice_conformable.h | 7 +- lib/qcd/Grid_qcd_wilson_dop.cc | 343 ++----------------------- lib/qcd/Grid_qcd_wilson_dop.h | 45 +++- 9 files changed, 157 insertions(+), 370 deletions(-) diff --git a/benchmarks/Grid_wilson.cc b/benchmarks/Grid_wilson.cc index 32255b3e..3b0d04bc 100644 --- a/benchmarks/Grid_wilson.cc +++ b/benchmarks/Grid_wilson.cc @@ -31,11 +31,9 @@ int main (int argc, char ** argv) std::cout << "Grid is setup to use "< seeds({1,2,3,4}); - GridParallelRNG pRNG(&Grid); - // std::vector seeds({1,2,3,4}); - // pRNG.SeedFixedIntegers(seeds); - pRNG.SeedRandomDevice(); + pRNG.SeedFixedIntegers(seeds); + // pRNG.SeedRandomDevice(); LatticeFermion src (&Grid); random(pRNG,src); LatticeFermion result(&Grid); result=zero; @@ -55,8 +53,10 @@ int main (int argc, char ** argv) Complex cone(1.0,0.0); for(int nn=0;nn(Umu,U[nn],nn); } @@ -85,7 +85,7 @@ int main (int argc, char ** argv) WilsonMatrix Dw(Umu,Grid,RBGrid,mass); std::cout << "Calling Dw"< +inline void Gpermute0(vsimd &y,const vsimd &b) { + union { + fvec f; + decltype(vsimd::v) v; + } conv; + conv.v = b.v; +#ifdef SSE4 + conv.f = _mm_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2)); +#endif +#if defined(AVX1)||defined(AVX2) + conv.f = _mm256_permute2f128_ps(conv.f,conv.f,0x01); +#endif +#ifdef AVX512 + conv.f = _mm512_permute4f128_ps(conv.f,(_MM_PERM_ENUM)_MM_SHUFFLE(1,0,3,2)); +#endif + y.v=conv.v; +}; +template +inline void Gpermute1(vsimd &y,const vsimd &b) { + union { + fvec f; + decltype(vsimd::v) v; + } conv; + conv.v = b.v; +#ifdef SSE4 + conv.f = _mm_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); +#endif +#if defined(AVX1)||defined(AVX2) + conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2)); +#endif +#ifdef AVX512 + conv.f = _mm512_permute4f128_ps(conv.f,(_MM_PERM_ENUM)_MM_SHUFFLE(2,3,0,1)); +#endif + y.v=conv.v; +}; +template +inline void Gpermute2(vsimd &y,const vsimd &b) { + union { + fvec f; + decltype(vsimd::v) v; + } conv; + conv.v = b.v; +#ifdef SSE4 +#endif +#if defined(AVX1)||defined(AVX2) + conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); +#endif +#ifdef AVX512 + conv.f = _mm512_swizzle_ps(conv.f,_MM_SWIZ_REG_BADC); +#endif + y.v=conv.v; + +}; +template +inline void Gpermute3(vsimd &y,const vsimd &b) { + union { + fvec f; + decltype(vsimd::v) v; + } conv; + conv.v = b.v; +#ifdef AVX512 + conv.f = _mm512_swizzle_ps(conv.f,_MM_SWIZ_REG_CDAB); +#endif + y.v=conv.v; + +}; + template inline void Gpermute(vsimd &y,const vsimd &b,int perm){ union { @@ -170,36 +238,12 @@ inline void Gpermute(vsimd &y,const vsimd &b,int perm){ } conv; conv.v = b.v; switch (perm){ -#if defined(AVX1)||defined(AVX2) - // 8x32 bits=>3 permutes - case 2: - conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); - break; - case 1: conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2)); break; - case 0: conv.f = _mm256_permute2f128_ps(conv.f,conv.f,0x01); break; -#endif -#ifdef SSE4 - case 1: conv.f = _mm_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); break; - case 0: conv.f = _mm_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2));break; -#endif -#ifdef AVX512 - // 16 floats=> permutes - // Permute 0 every abcd efgh ijkl mnop -> badc fehg jilk nmpo - // Permute 1 every abcd efgh ijkl mnop -> cdab ghef jkij opmn - // Permute 2 every abcd efgh ijkl mnop -> efgh abcd mnop ijkl - // Permute 3 every abcd efgh ijkl mnop -> ijkl mnop abcd efgh - case 3: conv.f = _mm512_swizzle_ps(conv.f,_MM_SWIZ_REG_CDAB); break; - case 2: conv.f = _mm512_swizzle_ps(conv.f,_MM_SWIZ_REG_BADC); break; - case 1: conv.f = _mm512_permute4f128_ps(conv.f,(_MM_PERM_ENUM)_MM_SHUFFLE(2,3,0,1)); break; - case 0: conv.f = _mm512_permute4f128_ps(conv.f,(_MM_PERM_ENUM)_MM_SHUFFLE(1,0,3,2)); break; -#endif -#ifdef QPX -#error not implemented -#endif + case 3: Gpermute3(y,b); break; + case 2: Gpermute2(y,b); break; + case 1: Gpermute1(y,b); break; + case 0: Gpermute0(y,b); break; default: assert(0); break; } - y.v=conv.v; - }; }; diff --git a/lib/Makefile.am b/lib/Makefile.am index 82459763..6bb5e187 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -18,6 +18,8 @@ libGrid_a_SOURCES = \ Grid_init.cc \ stencil/Grid_stencil_common.cc \ qcd/Grid_qcd_dirac.cc \ + qcd/Grid_qcd_dhop.cc \ + qcd/Grid_qcd_dhop_hand.cc \ qcd/Grid_qcd_wilson_dop.cc \ algorithms/approx/Zolotarev.cc \ algorithms/approx/Remez.cc \ diff --git a/lib/lattice/Grid_lattice_base.h b/lib/lattice/Grid_lattice_base.h index 1d3b1efb..4a6d3180 100644 --- a/lib/lattice/Grid_lattice_base.h +++ b/lib/lattice/Grid_lattice_base.h @@ -47,6 +47,11 @@ class LatticeTrinaryExpression :public std::pair >, publ LatticeTrinaryExpression(const std::pair > &arg): std::pair >(arg) {}; }; +void inline conformable(GridBase *lhs,GridBase *rhs) +{ + assert(lhs == rhs); +} + template class Lattice : public LatticeBase { @@ -60,7 +65,8 @@ public: typedef typename vobj::scalar_type scalar_type; typedef typename vobj::vector_type vector_type; typedef vobj vector_object; - + + //////////////////////////////////////////////////////////////////////////////// // Expression Template closure support //////////////////////////////////////////////////////////////////////////////// @@ -276,17 +282,15 @@ PARALLEL_FOR_LOOP } -#include +#include #define GRID_LATTICE_EXPRESSION_TEMPLATES #ifdef GRID_LATTICE_EXPRESSION_TEMPLATES #include #else #include #endif - #include - #include #include #include diff --git a/lib/lattice/Grid_lattice_conformable.h b/lib/lattice/Grid_lattice_conformable.h index faa8c7a7..a77e57af 100644 --- a/lib/lattice/Grid_lattice_conformable.h +++ b/lib/lattice/Grid_lattice_conformable.h @@ -3,16 +3,11 @@ namespace Grid { - template - void conformable(const Lattice &lhs,const Lattice &rhs) + template void conformable(const Lattice &lhs,const Lattice &rhs) { assert(lhs._grid == rhs._grid); assert(lhs.checkerboard == rhs.checkerboard); } - void inline conformable(const GridBase *lhs,GridBase *rhs) - { - assert(lhs == rhs); - } } #endif diff --git a/lib/qcd/Grid_qcd_wilson_dop.cc b/lib/qcd/Grid_qcd_wilson_dop.cc index 318e18df..9a3f5f6a 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.cc +++ b/lib/qcd/Grid_qcd_wilson_dop.cc @@ -1,4 +1,3 @@ - #include namespace Grid { @@ -7,15 +6,7 @@ namespace QCD { const std::vector WilsonMatrix::directions ({0,1,2,3, 0, 1, 2, 3}); const std::vector WilsonMatrix::displacements({1,1,1,1,-1,-1,-1,-1}); - // Should be in header? -const int WilsonMatrix::Xp = 0; -const int WilsonMatrix::Yp = 1; -const int WilsonMatrix::Zp = 2; -const int WilsonMatrix::Tp = 3; -const int WilsonMatrix::Xm = 4; -const int WilsonMatrix::Ym = 5; -const int WilsonMatrix::Zm = 6; -const int WilsonMatrix::Tm = 7; + int WilsonMatrix::HandOptDslash; class WilsonCompressor { public: @@ -39,28 +30,28 @@ const int WilsonMatrix::Tm = 7; mudag=(mu+Nd)%(2*Nd); } switch(mudag) { - case WilsonMatrix::Xp: + case Xp: spProjXp(ret,in); break; - case WilsonMatrix::Yp: + case Yp: spProjYp(ret,in); break; - case WilsonMatrix::Zp: + case Zp: spProjZp(ret,in); break; - case WilsonMatrix::Tp: + case Tp: spProjTp(ret,in); break; - case WilsonMatrix::Xm: + case Xm: spProjXm(ret,in); break; - case WilsonMatrix::Ym: + case Ym: spProjYm(ret,in); break; - case WilsonMatrix::Zm: + case Zm: spProjZm(ret,in); break; - case WilsonMatrix::Tm: + case Tm: spProjTm(ret,in); break; default: @@ -157,316 +148,36 @@ void WilsonMatrix::MooeeInvDag(const LatticeFermion &in, LatticeFermion &out) MooeeInv(in,out); } -void WilsonMatrix::DhopSite(CartesianStencil &st,LatticeDoubledGaugeField &U, - std::vector > &buf, - int ss,const LatticeFermion &in, LatticeFermion &out) -{ - vHalfSpinColourVector tmp; - vHalfSpinColourVector chi; - vSpinColourVector result; - vHalfSpinColourVector Uchi; - int offset,local,perm, ptype; - - //#define VERBOSE( A) if ( ss<10 ) { std::cout << "site " < > &buf, - int ss,const LatticeFermion &in, LatticeFermion &out) -{ - vHalfSpinColourVector tmp; - vHalfSpinColourVector chi; - vSpinColourVector result; - vHalfSpinColourVector Uchi; - int offset,local,perm, ptype; - - // Xp - offset = st._offsets [Xm][ss]; - local = st._is_local[Xm][ss]; - perm = st._permute[Xm][ss]; - - ptype = st._permute_type[Xm]; - if ( local && perm ) { - spProjXp(tmp,in._odata[offset]); - permute(chi,tmp,ptype); - } else if ( local ) { - spProjXp(chi,in._odata[offset]); - } else { - chi=buf[offset]; - } - mult(&Uchi(),&U._odata[ss](Xm),&chi()); - spReconXp(result,Uchi); - - // Yp - offset = st._offsets [Ym][ss]; - local = st._is_local[Ym][ss]; - perm = st._permute[Ym][ss]; - ptype = st._permute_type[Ym]; - if ( local && perm ) { - spProjYp(tmp,in._odata[offset]); - permute(chi,tmp,ptype); - } else if ( local ) { - spProjYp(chi,in._odata[offset]); - } else { - chi=buf[offset]; - } - mult(&Uchi(),&U._odata[ss](Ym),&chi()); - accumReconYp(result,Uchi); - - // Zp - offset = st._offsets [Zm][ss]; - local = st._is_local[Zm][ss]; - perm = st._permute[Zm][ss]; - ptype = st._permute_type[Zm]; - if ( local && perm ) { - spProjZp(tmp,in._odata[offset]); - permute(chi,tmp,ptype); - } else if ( local ) { - spProjZp(chi,in._odata[offset]); - } else { - chi=buf[offset]; - } - mult(&Uchi(),&U._odata[ss](Zm),&chi()); - accumReconZp(result,Uchi); - - // Tp - offset = st._offsets [Tm][ss]; - local = st._is_local[Tm][ss]; - perm = st._permute[Tm][ss]; - ptype = st._permute_type[Tm]; - if ( local && perm ) { - spProjTp(tmp,in._odata[offset]); - permute(chi,tmp,ptype); - } else if ( local ) { - spProjTp(chi,in._odata[offset]); - } else { - chi=buf[offset]; - } - mult(&Uchi(),&U._odata[ss](Tm),&chi()); - accumReconTp(result,Uchi); - - // Xm - offset = st._offsets [Xp][ss]; - local = st._is_local[Xp][ss]; - perm = st._permute[Xp][ss]; - ptype = st._permute_type[Xp]; - - if ( local && perm ) - { - spProjXm(tmp,in._odata[offset]); - permute(chi,tmp,ptype); - } else if ( local ) { - spProjXm(chi,in._odata[offset]); - } else { - chi=buf[offset]; - } - mult(&Uchi(),&U._odata[ss](Xp),&chi()); - accumReconXm(result,Uchi); - - // Ym - offset = st._offsets [Yp][ss]; - local = st._is_local[Yp][ss]; - perm = st._permute[Yp][ss]; - ptype = st._permute_type[Yp]; - - if ( local && perm ) { - spProjYm(tmp,in._odata[offset]); - permute(chi,tmp,ptype); - } else if ( local ) { - spProjYm(chi,in._odata[offset]); - } else { - chi=buf[offset]; - } - mult(&Uchi(),&U._odata[ss](Yp),&chi()); - accumReconYm(result,Uchi); - - // Zm - offset = st._offsets [Zp][ss]; - local = st._is_local[Zp][ss]; - perm = st._permute[Zp][ss]; - ptype = st._permute_type[Zp]; - if ( local && perm ) { - spProjZm(tmp,in._odata[offset]); - permute(chi,tmp,ptype); - } else if ( local ) { - spProjZm(chi,in._odata[offset]); - } else { - chi=buf[offset]; - } - mult(&Uchi(),&U._odata[ss](Zp),&chi()); - accumReconZm(result,Uchi); - - // Tm - offset = st._offsets [Tp][ss]; - local = st._is_local[Tp][ss]; - perm = st._permute[Tp][ss]; - ptype = st._permute_type[Tp]; - if ( local && perm ) { - spProjTm(tmp,in._odata[offset]); - permute(chi,tmp,ptype); - } else if ( local ) { - spProjTm(chi,in._odata[offset]); - } else { - chi=buf[offset]; - } - mult(&Uchi(),&U._odata[ss](Tp),&chi()); - accumReconTm(result,Uchi); - - vstream(out._odata[ss],result); -} - void WilsonMatrix::DhopInternal(CartesianStencil & st,LatticeDoubledGaugeField & U, const LatticeFermion &in, LatticeFermion &out,int dag) { assert((dag==DaggerNo) ||(dag==DaggerYes)); WilsonCompressor compressor(dag); - st.HaloExchange(in,comm_buf,compressor); if ( dag == DaggerYes ) { + if( HandOptDslash ) { PARALLEL_FOR_LOOP - for(int sss=0;sssoSites();sss++){ - DhopSiteDag(st,U,comm_buf,sss,in,out); + for(int sss=0;sssoSites();sss++){ + DiracOptHand::DhopSiteDag(st,U,comm_buf,sss,in,out); + } + } else { +PARALLEL_FOR_LOOP + for(int sss=0;sssoSites();sss++){ + DiracOpt::DhopSiteDag(st,U,comm_buf,sss,in,out); + } } } else { + if( HandOptDslash ) { PARALLEL_FOR_LOOP - for(int sss=0;sssoSites();sss++){ - DhopSite(st,U,comm_buf,sss,in,out); + for(int sss=0;sssoSites();sss++){ + DiracOptHand::DhopSite(st,U,comm_buf,sss,in,out); + } + } else { +PARALLEL_FOR_LOOP + for(int sss=0;sssoSites();sss++){ + DiracOpt::DhopSite(st,U,comm_buf,sss,in,out); + } } } } diff --git a/lib/qcd/Grid_qcd_wilson_dop.h b/lib/qcd/Grid_qcd_wilson_dop.h index 96b29cd0..87418603 100644 --- a/lib/qcd/Grid_qcd_wilson_dop.h +++ b/lib/qcd/Grid_qcd_wilson_dop.h @@ -6,10 +6,22 @@ namespace Grid { namespace QCD { + // Should be in header? + const int Xp = 0; + const int Yp = 1; + const int Zp = 2; + const int Tp = 3; + const int Xm = 4; + const int Ym = 5; + const int Zm = 6; + const int Tm = 7; + class WilsonMatrix : public CheckerBoardedSparseMatrixBase { //NB r=1; public: + static int HandOptDslash; + double mass; // GridBase * grid; // Inherited // GridBase * cbgrid; @@ -56,14 +68,6 @@ namespace Grid { void DhopEO(const LatticeFermion &in, LatticeFermion &out,int dag); void DhopInternal(CartesianStencil & st,LatticeDoubledGaugeField &U, const LatticeFermion &in, LatticeFermion &out,int dag); - // These ones will need to be package intelligently. WilsonType base class - // for use by DWF etc.. - void DhopSite(CartesianStencil &st,LatticeDoubledGaugeField &U, - std::vector > &buf, - int ss,const LatticeFermion &in, LatticeFermion &out); - void DhopSiteDag(CartesianStencil &st,LatticeDoubledGaugeField &U, - std::vector > &buf, - int ss,const LatticeFermion &in, LatticeFermion &out); typedef iScalar > matrix; @@ -71,6 +75,31 @@ namespace Grid { }; + class DiracOpt { + public: + // These ones will need to be package intelligently. WilsonType base class + // for use by DWF etc.. + static void DhopSite(CartesianStencil &st,LatticeDoubledGaugeField &U, + std::vector > &buf, + int ss,const LatticeFermion &in, LatticeFermion &out); + static void DhopSiteDag(CartesianStencil &st,LatticeDoubledGaugeField &U, + std::vector > &buf, + int ss,const LatticeFermion &in, LatticeFermion &out); + + }; + class DiracOptHand { + public: + // These ones will need to be package intelligently. WilsonType base class + // for use by DWF etc.. + static void DhopSite(CartesianStencil &st,LatticeDoubledGaugeField &U, + std::vector > &buf, + int ss,const LatticeFermion &in, LatticeFermion &out); + static void DhopSiteDag(CartesianStencil &st,LatticeDoubledGaugeField &U, + std::vector > &buf, + int ss,const LatticeFermion &in, LatticeFermion &out); + + }; + } } #endif From 5e72e4c0d9690bcf36951d4e29b14b134e80b2d8 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 26 May 2015 19:55:18 +0100 Subject: [PATCH 237/429] Strip out the dslash kernel implementation --- lib/qcd/Grid_qcd_dhop.cc | 309 ++++++++++++++ lib/qcd/Grid_qcd_dhop_hand.cc | 769 ++++++++++++++++++++++++++++++++++ 2 files changed, 1078 insertions(+) create mode 100644 lib/qcd/Grid_qcd_dhop.cc create mode 100644 lib/qcd/Grid_qcd_dhop_hand.cc diff --git a/lib/qcd/Grid_qcd_dhop.cc b/lib/qcd/Grid_qcd_dhop.cc new file mode 100644 index 00000000..1e5dcd16 --- /dev/null +++ b/lib/qcd/Grid_qcd_dhop.cc @@ -0,0 +1,309 @@ +#include + +namespace Grid { +namespace QCD { + +void DiracOpt::DhopSite(CartesianStencil &st,LatticeDoubledGaugeField &U, + std::vector > &buf, + int ss,const LatticeFermion &in, LatticeFermion &out) +{ + vHalfSpinColourVector tmp; + vHalfSpinColourVector chi; + vSpinColourVector result; + vHalfSpinColourVector Uchi; + int offset,local,perm, ptype; + + //#define VERBOSE( A) if ( ss<10 ) { std::cout << "site " < > &buf, + int ss,const LatticeFermion &in, LatticeFermion &out) +{ + vHalfSpinColourVector tmp; + vHalfSpinColourVector chi; + vSpinColourVector result; + vHalfSpinColourVector Uchi; + int offset,local,perm, ptype; + + // Xp + offset = st._offsets [Xm][ss]; + local = st._is_local[Xm][ss]; + perm = st._permute[Xm][ss]; + + ptype = st._permute_type[Xm]; + if ( local && perm ) { + spProjXp(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjXp(chi,in._odata[offset]); + } else { + chi=buf[offset]; + } + mult(&Uchi(),&U._odata[ss](Xm),&chi()); + spReconXp(result,Uchi); + + // Yp + offset = st._offsets [Ym][ss]; + local = st._is_local[Ym][ss]; + perm = st._permute[Ym][ss]; + ptype = st._permute_type[Ym]; + if ( local && perm ) { + spProjYp(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjYp(chi,in._odata[offset]); + } else { + chi=buf[offset]; + } + mult(&Uchi(),&U._odata[ss](Ym),&chi()); + accumReconYp(result,Uchi); + + // Zp + offset = st._offsets [Zm][ss]; + local = st._is_local[Zm][ss]; + perm = st._permute[Zm][ss]; + ptype = st._permute_type[Zm]; + if ( local && perm ) { + spProjZp(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjZp(chi,in._odata[offset]); + } else { + chi=buf[offset]; + } + mult(&Uchi(),&U._odata[ss](Zm),&chi()); + accumReconZp(result,Uchi); + + // Tp + offset = st._offsets [Tm][ss]; + local = st._is_local[Tm][ss]; + perm = st._permute[Tm][ss]; + ptype = st._permute_type[Tm]; + if ( local && perm ) { + spProjTp(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjTp(chi,in._odata[offset]); + } else { + chi=buf[offset]; + } + mult(&Uchi(),&U._odata[ss](Tm),&chi()); + accumReconTp(result,Uchi); + + // Xm + offset = st._offsets [Xp][ss]; + local = st._is_local[Xp][ss]; + perm = st._permute[Xp][ss]; + ptype = st._permute_type[Xp]; + + if ( local && perm ) + { + spProjXm(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjXm(chi,in._odata[offset]); + } else { + chi=buf[offset]; + } + mult(&Uchi(),&U._odata[ss](Xp),&chi()); + accumReconXm(result,Uchi); + + // Ym + offset = st._offsets [Yp][ss]; + local = st._is_local[Yp][ss]; + perm = st._permute[Yp][ss]; + ptype = st._permute_type[Yp]; + + if ( local && perm ) { + spProjYm(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjYm(chi,in._odata[offset]); + } else { + chi=buf[offset]; + } + mult(&Uchi(),&U._odata[ss](Yp),&chi()); + accumReconYm(result,Uchi); + + // Zm + offset = st._offsets [Zp][ss]; + local = st._is_local[Zp][ss]; + perm = st._permute[Zp][ss]; + ptype = st._permute_type[Zp]; + if ( local && perm ) { + spProjZm(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjZm(chi,in._odata[offset]); + } else { + chi=buf[offset]; + } + mult(&Uchi(),&U._odata[ss](Zp),&chi()); + accumReconZm(result,Uchi); + + // Tm + offset = st._offsets [Tp][ss]; + local = st._is_local[Tp][ss]; + perm = st._permute[Tp][ss]; + ptype = st._permute_type[Tp]; + if ( local && perm ) { + spProjTm(tmp,in._odata[offset]); + permute(chi,tmp,ptype); + } else if ( local ) { + spProjTm(chi,in._odata[offset]); + } else { + chi=buf[offset]; + } + mult(&Uchi(),&U._odata[ss](Tp),&chi()); + accumReconTm(result,Uchi); + + vstream(out._odata[ss],result); +} +}} diff --git a/lib/qcd/Grid_qcd_dhop_hand.cc b/lib/qcd/Grid_qcd_dhop_hand.cc new file mode 100644 index 00000000..f8d464fb --- /dev/null +++ b/lib/qcd/Grid_qcd_dhop_hand.cc @@ -0,0 +1,769 @@ +#include + +#define REGISTER + +#define LOAD_CHIMU \ + const vSpinColourVector & ref (in._odata[offset]); \ + Chimu_00=ref()(0)(0);\ + Chimu_01=ref()(0)(1);\ + Chimu_02=ref()(0)(2);\ + Chimu_10=ref()(1)(0);\ + Chimu_11=ref()(1)(1);\ + Chimu_12=ref()(1)(2);\ + Chimu_20=ref()(2)(0);\ + Chimu_21=ref()(2)(1);\ + Chimu_22=ref()(2)(2);\ + Chimu_30=ref()(3)(0);\ + Chimu_31=ref()(3)(1);\ + Chimu_32=ref()(3)(2); + +#define LOAD_CHI\ + const vHalfSpinColourVector &ref(buf[offset]); \ + Chi_00 = ref()(0)(0);\ + Chi_01 = ref()(0)(1);\ + Chi_02 = ref()(0)(2);\ + Chi_10 = ref()(1)(0);\ + Chi_11 = ref()(1)(1);\ + Chi_12 = ref()(1)(2); + +#define MULT_2SPIN(A)\ + auto & ref(U._odata[ss](A)); \ + U_00 = ref()(0,0);\ + U_10 = ref()(1,0);\ + U_20 = ref()(2,0);\ + U_01 = ref()(0,1);\ + U_11 = ref()(1,1); \ + U_21 = ref()(2,1);\ + UChi_00 = U_00*Chi_00;\ + UChi_10 = U_00*Chi_10;\ + UChi_01 = U_10*Chi_00;\ + UChi_11 = U_10*Chi_10;\ + UChi_02 = U_20*Chi_00;\ + UChi_12 = U_20*Chi_10;\ + UChi_00+= U_01*Chi_01;\ + UChi_10+= U_01*Chi_11;\ + UChi_01+= U_11*Chi_01;\ + UChi_11+= U_11*Chi_11;\ + UChi_02+= U_21*Chi_01;\ + UChi_12+= U_21*Chi_11;\ + U_00 = ref()(0,2);\ + U_10 = ref()(1,2);\ + U_20 = ref()(2,2);\ + UChi_00+= U_00*Chi_02;\ + UChi_10+= U_00*Chi_12;\ + UChi_01+= U_10*Chi_02;\ + UChi_11+= U_10*Chi_12;\ + UChi_02+= U_20*Chi_02;\ + UChi_12+= U_20*Chi_12; + +#define PERMUTE\ + permute(Chi_00,Chi_00,ptype);\ + permute(Chi_01,Chi_01,ptype);\ + permute(Chi_02,Chi_02,ptype);\ + permute(Chi_10,Chi_10,ptype);\ + permute(Chi_11,Chi_11,ptype);\ + permute(Chi_12,Chi_12,ptype); + +// hspin(0)=fspin(0)+timesI(fspin(3)); +// hspin(1)=fspin(1)+timesI(fspin(2)); +#define XP_PROJ \ + Chi_00 = Chimu_00+timesI(Chimu_30);\ + Chi_01 = Chimu_01+timesI(Chimu_31);\ + Chi_02 = Chimu_02+timesI(Chimu_32);\ + Chi_10 = Chimu_10+timesI(Chimu_20);\ + Chi_11 = Chimu_11+timesI(Chimu_21);\ + Chi_12 = Chimu_12+timesI(Chimu_22); + +#define YP_PROJ \ + Chi_00 = Chimu_00-Chimu_30;\ + Chi_01 = Chimu_01-Chimu_31;\ + Chi_02 = Chimu_02-Chimu_32;\ + Chi_10 = Chimu_10+Chimu_20;\ + Chi_11 = Chimu_11+Chimu_21;\ + Chi_12 = Chimu_12+Chimu_22; + +#define ZP_PROJ \ + Chi_00 = Chimu_00+timesI(Chimu_20); \ + Chi_01 = Chimu_01+timesI(Chimu_21); \ + Chi_02 = Chimu_02+timesI(Chimu_22); \ + Chi_10 = Chimu_10-timesI(Chimu_30); \ + Chi_11 = Chimu_11-timesI(Chimu_31); \ + Chi_12 = Chimu_12-timesI(Chimu_32); + +#define TP_PROJ \ + Chi_00 = Chimu_00+Chimu_20; \ + Chi_01 = Chimu_01+Chimu_21; \ + Chi_02 = Chimu_02+Chimu_22; \ + Chi_10 = Chimu_10+Chimu_30; \ + Chi_11 = Chimu_11+Chimu_31; \ + Chi_12 = Chimu_12+Chimu_32; + + +// hspin(0)=fspin(0)-timesI(fspin(3)); +// hspin(1)=fspin(1)-timesI(fspin(2)); +#define XM_PROJ \ + Chi_00 = Chimu_00-timesI(Chimu_30);\ + Chi_01 = Chimu_01-timesI(Chimu_31);\ + Chi_02 = Chimu_02-timesI(Chimu_32);\ + Chi_10 = Chimu_10-timesI(Chimu_20);\ + Chi_11 = Chimu_11-timesI(Chimu_21);\ + Chi_12 = Chimu_12-timesI(Chimu_22); + +#define YM_PROJ \ + Chi_00 = Chimu_00+Chimu_30;\ + Chi_01 = Chimu_01+Chimu_31;\ + Chi_02 = Chimu_02+Chimu_32;\ + Chi_10 = Chimu_10-Chimu_20;\ + Chi_11 = Chimu_11-Chimu_21;\ + Chi_12 = Chimu_12-Chimu_22; + +#define ZM_PROJ \ + Chi_00 = Chimu_00-timesI(Chimu_20); \ + Chi_01 = Chimu_01-timesI(Chimu_21); \ + Chi_02 = Chimu_02-timesI(Chimu_22); \ + Chi_10 = Chimu_10+timesI(Chimu_30); \ + Chi_11 = Chimu_11+timesI(Chimu_31); \ + Chi_12 = Chimu_12+timesI(Chimu_32); + +#define TM_PROJ \ + Chi_00 = Chimu_00-Chimu_20; \ + Chi_01 = Chimu_01-Chimu_21; \ + Chi_02 = Chimu_02-Chimu_22; \ + Chi_10 = Chimu_10-Chimu_30; \ + Chi_11 = Chimu_11-Chimu_31; \ + Chi_12 = Chimu_12-Chimu_32; + +// fspin(0)=hspin(0); +// fspin(1)=hspin(1); +// fspin(2)=timesMinusI(hspin(1)); +// fspin(3)=timesMinusI(hspin(0)); +#define XP_RECON\ + result_00 = UChi_00;\ + result_01 = UChi_01;\ + result_02 = UChi_02;\ + result_10 = UChi_10;\ + result_11 = UChi_11;\ + result_12 = UChi_12;\ + result_20 = timesMinusI(UChi_10);\ + result_21 = timesMinusI(UChi_11);\ + result_22 = timesMinusI(UChi_12);\ + result_30 = timesMinusI(UChi_00);\ + result_31 = timesMinusI(UChi_01);\ + result_32 = timesMinusI(UChi_02); + +#define XP_RECON_ACCUM\ + result_00+=UChi_00;\ + result_01+=UChi_01;\ + result_02+=UChi_02;\ + result_10+=UChi_10;\ + result_11+=UChi_11;\ + result_12+=UChi_12;\ + result_20-=timesI(UChi_10);\ + result_21-=timesI(UChi_11);\ + result_22-=timesI(UChi_12);\ + result_30-=timesI(UChi_00);\ + result_31-=timesI(UChi_01);\ + result_32-=timesI(UChi_02); + +#define XM_RECON\ + result_00 = UChi_00;\ + result_01 = UChi_01;\ + result_02 = UChi_02;\ + result_10 = UChi_10;\ + result_11 = UChi_11;\ + result_12 = UChi_12;\ + result_20 = timesI(UChi_10);\ + result_21 = timesI(UChi_11);\ + result_22 = timesI(UChi_12);\ + result_30 = timesI(UChi_00);\ + result_31 = timesI(UChi_01);\ + result_32 = timesI(UChi_02); + +#define XM_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20+= timesI(UChi_10);\ + result_21+= timesI(UChi_11);\ + result_22+= timesI(UChi_12);\ + result_30+= timesI(UChi_00);\ + result_31+= timesI(UChi_01);\ + result_32+= timesI(UChi_02); + +#define YP_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20+= UChi_10;\ + result_21+= UChi_11;\ + result_22+= UChi_12;\ + result_30-= UChi_00;\ + result_31-= UChi_01;\ + result_32-= UChi_02; + +#define YM_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20-= UChi_10;\ + result_21-= UChi_11;\ + result_22-= UChi_12;\ + result_30+= UChi_00;\ + result_31+= UChi_01;\ + result_32+= UChi_02; + +#define ZP_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20-= timesI(UChi_00); \ + result_21-= timesI(UChi_01); \ + result_22-= timesI(UChi_02); \ + result_30+= timesI(UChi_10); \ + result_31+= timesI(UChi_11); \ + result_32+= timesI(UChi_12); + +#define ZM_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20+= timesI(UChi_00); \ + result_21+= timesI(UChi_01); \ + result_22+= timesI(UChi_02); \ + result_30-= timesI(UChi_10); \ + result_31-= timesI(UChi_11); \ + result_32-= timesI(UChi_12); + +#define TP_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20+= UChi_00; \ + result_21+= UChi_01; \ + result_22+= UChi_02; \ + result_30+= UChi_10; \ + result_31+= UChi_11; \ + result_32+= UChi_12; + +#define TM_RECON_ACCUM\ + result_00+= UChi_00;\ + result_01+= UChi_01;\ + result_02+= UChi_02;\ + result_10+= UChi_10;\ + result_11+= UChi_11;\ + result_12+= UChi_12;\ + result_20-= UChi_00; \ + result_21-= UChi_01; \ + result_22-= UChi_02; \ + result_30-= UChi_10; \ + result_31-= UChi_11; \ + result_32-= UChi_12; + +namespace Grid { +namespace QCD { + +void DiracOptHand::DhopSite(CartesianStencil &st,LatticeDoubledGaugeField &U, + std::vector > &buf, + int ss,const LatticeFermion &in, LatticeFermion &out) +{ + REGISTER vComplex result_00; // 12 regs on knc + REGISTER vComplex result_01; + REGISTER vComplex result_02; + + REGISTER vComplex result_10; + REGISTER vComplex result_11; + REGISTER vComplex result_12; + + REGISTER vComplex result_20; + REGISTER vComplex result_21; + REGISTER vComplex result_22; + + REGISTER vComplex result_30; + REGISTER vComplex result_31; + REGISTER vComplex result_32; // 20 left + + REGISTER vComplex Chi_00; // two spinor; 6 regs + REGISTER vComplex Chi_01; + REGISTER vComplex Chi_02; + + REGISTER vComplex Chi_10; + REGISTER vComplex Chi_11; + REGISTER vComplex Chi_12; // 14 left + + REGISTER vComplex UChi_00; // two spinor; 6 regs + REGISTER vComplex UChi_01; + REGISTER vComplex UChi_02; + + REGISTER vComplex UChi_10; + REGISTER vComplex UChi_11; + REGISTER vComplex UChi_12; // 8 left + + REGISTER vComplex U_00; // two rows of U matrix + REGISTER vComplex U_10; + REGISTER vComplex U_20; + REGISTER vComplex U_01; + REGISTER vComplex U_11; + REGISTER vComplex U_21; // 2 reg left. + +#define Chimu_00 Chi_00 +#define Chimu_01 Chi_01 +#define Chimu_02 Chi_02 +#define Chimu_10 Chi_10 +#define Chimu_11 Chi_11 +#define Chimu_12 Chi_12 +#define Chimu_20 UChi_00 +#define Chimu_21 UChi_01 +#define Chimu_22 UChi_02 +#define Chimu_30 UChi_10 +#define Chimu_31 UChi_11 +#define Chimu_32 UChi_12 + + + int offset,local,perm, ptype; + + // Xp + offset = st._offsets [Xp][ss]; + local = st._is_local[Xp][ss]; + perm = st._permute[Xp][ss]; + ptype = st._permute_type[Xp]; + + if ( local ) { + LOAD_CHIMU; + XP_PROJ; + if ( perm) { + PERMUTE; + } + } else { + LOAD_CHI; + } + + { + MULT_2SPIN(Xp); + } + XP_RECON; + // std::cout << "XP_RECON"< > &buf, + int ss,const LatticeFermion &in, LatticeFermion &out) +{ + REGISTER vComplex result_00; // 12 regs on knc + REGISTER vComplex result_01; + REGISTER vComplex result_02; + + REGISTER vComplex result_10; + REGISTER vComplex result_11; + REGISTER vComplex result_12; + + REGISTER vComplex result_20; + REGISTER vComplex result_21; + REGISTER vComplex result_22; + + REGISTER vComplex result_30; + REGISTER vComplex result_31; + REGISTER vComplex result_32; // 20 left + + REGISTER vComplex Chi_00; // two spinor; 6 regs + REGISTER vComplex Chi_01; + REGISTER vComplex Chi_02; + + REGISTER vComplex Chi_10; + REGISTER vComplex Chi_11; + REGISTER vComplex Chi_12; // 14 left + + REGISTER vComplex UChi_00; // two spinor; 6 regs + REGISTER vComplex UChi_01; + REGISTER vComplex UChi_02; + + REGISTER vComplex UChi_10; + REGISTER vComplex UChi_11; + REGISTER vComplex UChi_12; // 8 left + + REGISTER vComplex U_00; // two rows of U matrix + REGISTER vComplex U_10; + REGISTER vComplex U_20; + REGISTER vComplex U_01; + REGISTER vComplex U_11; + REGISTER vComplex U_21; // 2 reg left. + +#define Chimu_00 Chi_00 +#define Chimu_01 Chi_01 +#define Chimu_02 Chi_02 +#define Chimu_10 Chi_10 +#define Chimu_11 Chi_11 +#define Chimu_12 Chi_12 +#define Chimu_20 UChi_00 +#define Chimu_21 UChi_01 +#define Chimu_22 UChi_02 +#define Chimu_30 UChi_10 +#define Chimu_31 UChi_11 +#define Chimu_32 UChi_12 + + + int offset,local,perm, ptype; + + // Xp + offset = st._offsets [Xp][ss]; + local = st._is_local[Xp][ss]; + perm = st._permute[Xp][ss]; + ptype = st._permute_type[Xp]; + + if ( local ) { + LOAD_CHIMU; + XM_PROJ; + if ( perm) { + PERMUTE; + } + } else { + LOAD_CHI; + } + { + MULT_2SPIN(Xp); + } + XM_RECON; + + // Yp + offset = st._offsets [Yp][ss]; + local = st._is_local[Yp][ss]; + perm = st._permute[Yp][ss]; + ptype = st._permute_type[Yp]; + + if ( local ) { + LOAD_CHIMU; + YM_PROJ; + if ( perm) { + PERMUTE; + } + } else { + LOAD_CHI; + } + { + MULT_2SPIN(Yp); + } + YM_RECON_ACCUM; + + + // Zp + offset = st._offsets [Zp][ss]; + local = st._is_local[Zp][ss]; + perm = st._permute[Zp][ss]; + ptype = st._permute_type[Zp]; + + if ( local ) { + LOAD_CHIMU; + ZM_PROJ; + if ( perm) { + PERMUTE; + } + } else { + LOAD_CHI; + } + { + MULT_2SPIN(Zp); + } + ZM_RECON_ACCUM; + + // Tp + offset = st._offsets [Tp][ss]; + local = st._is_local[Tp][ss]; + perm = st._permute[Tp][ss]; + ptype = st._permute_type[Tp]; + + if ( local ) { + LOAD_CHIMU; + TM_PROJ; + if ( perm) { + PERMUTE; + } + } else { + LOAD_CHI; + } + { + MULT_2SPIN(Tp); + } + TM_RECON_ACCUM; + + // Xm + offset = st._offsets [Xm][ss]; + local = st._is_local[Xm][ss]; + perm = st._permute[Xm][ss]; + ptype = st._permute_type[Xm]; + + if ( local ) { + LOAD_CHIMU; + XP_PROJ; + if ( perm) { + PERMUTE; + } + } else { + LOAD_CHI; + } + { + MULT_2SPIN(Xm); + } + XP_RECON_ACCUM; + + + // Ym + offset = st._offsets [Ym][ss]; + local = st._is_local[Ym][ss]; + perm = st._permute[Ym][ss]; + ptype = st._permute_type[Ym]; + + if ( local ) { + LOAD_CHIMU; + YP_PROJ; + if ( perm) { + PERMUTE; + } + } else { + LOAD_CHI; + } + { + MULT_2SPIN(Ym); + } + YP_RECON_ACCUM; + + // Zm + offset = st._offsets [Zm][ss]; + local = st._is_local[Zm][ss]; + perm = st._permute[Zm][ss]; + ptype = st._permute_type[Zm]; + + if ( local ) { + LOAD_CHIMU; + ZP_PROJ; + if ( perm) { + PERMUTE; + } + } else { + LOAD_CHI; + } + { + MULT_2SPIN(Zm); + } + ZP_RECON_ACCUM; + + // Tm + offset = st._offsets [Tm][ss]; + local = st._is_local[Tm][ss]; + perm = st._permute[Tm][ss]; + ptype = st._permute_type[Tm]; + + if ( local ) { + LOAD_CHIMU; + TP_PROJ; + if ( perm) { + PERMUTE; + } + } else { + LOAD_CHI; + } + { + MULT_2SPIN(Tm); + } + TP_RECON_ACCUM; + + { + vSpinColourVector & ref (out._odata[ss]); + vstream(ref()(0)(0),result_00); + vstream(ref()(0)(1),result_01); + vstream(ref()(0)(2),result_02); + vstream(ref()(1)(0),result_10); + vstream(ref()(1)(1),result_11); + vstream(ref()(1)(2),result_12); + vstream(ref()(2)(0),result_20); + vstream(ref()(2)(1),result_21); + vstream(ref()(2)(2),result_22); + vstream(ref()(3)(0),result_30); + vstream(ref()(3)(1),result_31); + vstream(ref()(3)(2),result_32); + } +} +}} From 6d2e056187f620e90919478e50125ed22da590b8 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 26 May 2015 22:20:09 +0100 Subject: [PATCH 238/429] Simd revert to Guido's commit. I edited concurrently and things went bad. --- lib/Grid_simd.h | 134 +----------------------------------------------- 1 file changed, 1 insertion(+), 133 deletions(-) diff --git a/lib/Grid_simd.h b/lib/Grid_simd.h index 504e1c17..cccc82e0 100644 --- a/lib/Grid_simd.h +++ b/lib/Grid_simd.h @@ -94,139 +94,7 @@ namespace Grid { template<> inline void zeroit(ComplexD &arg){ arg=0; }; template<> inline void zeroit(RealF &arg){ arg=0; }; template<> inline void zeroit(RealD &arg){ arg=0; }; - -#if defined (SSE4) - typedef __m128 fvec; - typedef __m128d dvec; - typedef __m128 cvec; - typedef __m128d zvec; - typedef __m128i ivec; -#endif -#if defined (AVX1) || defined (AVX2) - typedef __m256 fvec; - typedef __m256d dvec; - typedef __m256 cvec; - typedef __m256d zvec; - typedef __m256i ivec; -#endif -#if defined (AVX512) - typedef __m512 fvec; - typedef __m512d dvec; - typedef __m512 cvec; - typedef __m512d zvec; - typedef __m512i ivec; -#endif -#if defined (QPX) - typedef float fvec __attribute__ ((vector_size (16))); // QPX has same SIMD width irrespective of precision - typedef float cvec __attribute__ ((vector_size (16))); - - typedef vector4double dvec; - typedef vector4double zvec; -#endif -#if defined (AVX1) || defined (AVX2) || defined (AVX512) - inline void v_prefetch0(int size, const char *ptr){ - for(int i=0;i BA DC FE HG -// Permute 1 every ABCDEFGH -> CD AB GH EF -// Permute 2 every ABCDEFGH -> EFGH ABCD -// Permute 3 possible on longer iVector lengths (512bit = 8 double = 16 single) -// Permute 4 possible on half precision @512bit vectors. -////////////////////////////////////////////////////////// -template -inline void Gpermute0(vsimd &y,const vsimd &b) { - union { - fvec f; - decltype(vsimd::v) v; - } conv; - conv.v = b.v; -#ifdef SSE4 - conv.f = _mm_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2)); -#endif -#if defined(AVX1)||defined(AVX2) - conv.f = _mm256_permute2f128_ps(conv.f,conv.f,0x01); -#endif -#ifdef AVX512 - conv.f = _mm512_permute4f128_ps(conv.f,(_MM_PERM_ENUM)_MM_SHUFFLE(1,0,3,2)); -#endif - y.v=conv.v; -}; -template -inline void Gpermute1(vsimd &y,const vsimd &b) { - union { - fvec f; - decltype(vsimd::v) v; - } conv; - conv.v = b.v; -#ifdef SSE4 - conv.f = _mm_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); -#endif -#if defined(AVX1)||defined(AVX2) - conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(1,0,3,2)); -#endif -#ifdef AVX512 - conv.f = _mm512_permute4f128_ps(conv.f,(_MM_PERM_ENUM)_MM_SHUFFLE(2,3,0,1)); -#endif - y.v=conv.v; -}; -template -inline void Gpermute2(vsimd &y,const vsimd &b) { - union { - fvec f; - decltype(vsimd::v) v; - } conv; - conv.v = b.v; -#ifdef SSE4 -#endif -#if defined(AVX1)||defined(AVX2) - conv.f = _mm256_shuffle_ps(conv.f,conv.f,_MM_SHUFFLE(2,3,0,1)); -#endif -#ifdef AVX512 - conv.f = _mm512_swizzle_ps(conv.f,_MM_SWIZ_REG_BADC); -#endif - y.v=conv.v; - -}; -template -inline void Gpermute3(vsimd &y,const vsimd &b) { - union { - fvec f; - decltype(vsimd::v) v; - } conv; - conv.v = b.v; -#ifdef AVX512 - conv.f = _mm512_swizzle_ps(conv.f,_MM_SWIZ_REG_CDAB); -#endif - y.v=conv.v; - -}; - -template -inline void Gpermute(vsimd &y,const vsimd &b,int perm){ - union { - fvec f; - decltype(vsimd::v) v; - } conv; - conv.v = b.v; - switch (perm){ - case 3: Gpermute3(y,b); break; - case 2: Gpermute2(y,b); break; - case 1: Gpermute1(y,b); break; - case 0: Gpermute0(y,b); break; - default: assert(0); break; - } - }; - + }; #include From b6a28f1de786216b9b6fd026e1d7b4f0145ddb77 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Tue, 26 May 2015 22:20:40 +0100 Subject: [PATCH 239/429] Auto gen files should never have been committed, but making everyone run aclocal, automake, autoconf is a pain in the ass. --- Makefile.in | 44 +++++++++++++++++++++++-------------- aclocal.m4 | 61 +++++++++++++++++++++++++++------------------------- config.guess | 2 +- config.sub | 2 +- configure | 13 +++++------ 5 files changed, 69 insertions(+), 53 deletions(-) diff --git a/Makefile.in b/Makefile.in index d473c2df..a6508b45 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. +# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2013 Free Software Foundation, Inc. +# Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -14,7 +14,17 @@ @SET_MAKE@ VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ @@ -79,15 +89,13 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . -DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ - $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/configure $(am__configure_deps) COPYING TODO \ - compile config.guess config.sub depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d @@ -150,6 +158,9 @@ ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in AUTHORS COPYING ChangeLog \ + INSTALL NEWS README TODO compile config.guess config.sub \ + depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -316,7 +327,6 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -523,15 +533,15 @@ dist-xz: distdir $(am__post_remove_distdir) dist-tarZ: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) @@ -567,17 +577,17 @@ distcheck: dist esac chmod -R a-w $(distdir) chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_inst + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=.. --prefix="$$dc_install_base" \ + --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -751,6 +761,8 @@ uninstall-am: maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am +.PRECIOUS: Makefile + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/aclocal.m4 b/aclocal.m4 index a3d1bc9c..a358f21e 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.14.1 -*- Autoconf -*- +# generated automatically by aclocal 1.15 -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -20,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002-2013 Free Software Foundation, Inc. +# Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.14' +[am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.14.1], [], +m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.14.1])dnl +[AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -103,15 +103,14 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -142,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -333,7 +332,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -409,7 +408,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -499,8 +498,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -573,7 +572,11 @@ to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi -fi]) +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further @@ -602,7 +605,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -613,7 +616,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -623,7 +626,7 @@ if test x"${install_sh}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2013 Free Software Foundation, Inc. +# Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -644,7 +647,7 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -694,7 +697,7 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -733,7 +736,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -764,7 +767,7 @@ AC_DEFUN([_AM_IF_OPTION], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -845,7 +848,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -905,7 +908,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -933,7 +936,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2013 Free Software Foundation, Inc. +# Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -952,7 +955,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2013 Free Software Foundation, Inc. +# Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/config.guess b/config.guess index 5f6aa02d..a12faba2 120000 --- a/config.guess +++ b/config.guess @@ -1 +1 @@ -/usr/share/automake-1.14/config.guess \ No newline at end of file +/opt/local/share/automake-1.15/config.guess \ No newline at end of file diff --git a/config.sub b/config.sub index 0abfe18c..e3c9b5ca 120000 --- a/config.sub +++ b/config.sub @@ -1 +1 @@ -/usr/share/automake-1.14/config.sub \ No newline at end of file +/opt/local/share/automake-1.15/config.sub \ No newline at end of file diff --git a/configure b/configure index b7bd49f0..6681b765 100755 --- a/configure +++ b/configure @@ -2467,7 +2467,7 @@ test -n "$target_alias" && NONENONEs,x,x, && program_prefix=${target_alias}- -am__api_version='1.14' +am__api_version='1.15' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -2639,8 +2639,8 @@ test "$program_suffix" != NONE && ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in @@ -2659,7 +2659,7 @@ else $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2987,8 +2987,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # mkdir_p='$(MKDIR_P)' -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' @@ -3047,6 +3047,7 @@ END fi + ac_config_headers="$ac_config_headers lib/Grid_config.h" # Check whether --enable-silent-rules was given. From 538bc41bbbf4e0c61f9bfbcbf7ab997e4a99c89f Mon Sep 17 00:00:00 2001 From: neo Date: Wed, 27 May 2015 10:34:56 +0900 Subject: [PATCH 240/429] Adding support for doxygen generation --- Makefile.am | 9 +- Makefile.in | 23 +- TODO | 3 + aclocal.m4 | 1 + configure | 183 +++ configure.ac | 19 +- docs/doxy.cfg | 2305 +++++++++++++++++++++++++++++++ docs/doxy.cfg.in | 2305 +++++++++++++++++++++++++++++++ docs/doxy.cfg.test | 2305 +++++++++++++++++++++++++++++++ lib/cshift/Grid_cshift_common.h | 10 +- lib/simd/Grid_vector_types.h | 6 +- m4/ac_prog_doxygen.m4 | 54 + m4/m4-ax_prog_doxygen.m4 | 533 +++++++ 13 files changed, 7739 insertions(+), 17 deletions(-) create mode 100644 docs/doxy.cfg create mode 100644 docs/doxy.cfg.in create mode 100644 docs/doxy.cfg.test create mode 100644 m4/ac_prog_doxygen.m4 create mode 100644 m4/m4-ax_prog_doxygen.m4 diff --git a/Makefile.am b/Makefile.am index fae10e5d..5bb858eb 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,11 @@ # additional include paths necessary to compile the C++ library AM_CXXFLAGS = -I$(top_srcdir)/ -SUBDIRS = lib tests benchmarks +SUBDIRS = lib tests benchmarks docs + +if DOXYGEN_DOC +directory = $(top_srcdir)/docs/ + +doxyfile: + (cd $(directory) && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; +endif diff --git a/Makefile.in b/Makefile.in index d473c2df..8c277dae 100644 --- a/Makefile.in +++ b/Makefile.in @@ -81,10 +81,12 @@ target_triplet = @target@ subdir = . DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/configure $(am__configure_deps) COPYING TODO \ - compile config.guess config.sub depcomp install-sh missing + $(top_srcdir)/configure $(am__configure_deps) \ + $(top_srcdir)/docs/doxy.cfg.in COPYING TODO compile \ + config.guess config.sub depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_prog_doxygen.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) @@ -92,7 +94,7 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/lib/Grid_config.h -CONFIG_CLEAN_FILES = +CONFIG_CLEAN_FILES = docs/doxy.cfg CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) @@ -207,6 +209,8 @@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ +DOT = @DOT@ +DOXYGEN = @DOXYGEN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ @@ -261,6 +265,9 @@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ +enable_dot = @enable_dot@ +enable_html_docs = @enable_html_docs@ +enable_latex_docs = @enable_latex_docs@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ @@ -297,7 +304,8 @@ top_srcdir = @top_srcdir@ # additional include paths necessary to compile the C++ library AM_CXXFLAGS = -I$(top_srcdir)/ -SUBDIRS = lib tests benchmarks +SUBDIRS = lib tests benchmarks docs +@DOXYGEN_DOC_TRUE@directory = $(top_srcdir)/docs/ all: all-recursive .SUFFIXES: @@ -335,6 +343,8 @@ $(top_srcdir)/configure: $(am__configure_deps) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): +docs/doxy.cfg: $(top_builddir)/config.status $(top_srcdir)/docs/doxy.cfg.in + cd $(top_builddir) && $(SHELL) ./config.status $@ # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. @@ -752,6 +762,9 @@ uninstall-am: pdf-am ps ps-am tags tags-am uninstall uninstall-am +@DOXYGEN_DOC_TRUE@doxyfile: +@DOXYGEN_DOC_TRUE@ (cd $(directory) && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/TODO b/TODO index 670c53e3..948fb99f 100644 --- a/TODO +++ b/TODO @@ -64,6 +64,9 @@ Insert/Extract - optional parallel MPI2 IO - move Plaquette and link trace checks into nersc reader from the Grid_nersc_io.cc test. +* Support for ILDG + + Actions -- coherent framework for implementing actions and their forces. * Fermion diff --git a/aclocal.m4 b/aclocal.m4 index a3d1bc9c..d5fa395c 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1083,4 +1083,5 @@ AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR +m4_include([m4/ac_prog_doxygen.m4]) m4_include([m4/ax_cxx_compile_stdcxx_11.m4]) diff --git a/configure b/configure index b7bd49f0..ccfea6b7 100755 --- a/configure +++ b/configure @@ -626,6 +626,13 @@ ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS +enable_latex_docs +enable_html_docs +enable_dot +DOXYGEN_DOC_FALSE +DOXYGEN_DOC_TRUE +DOT +DOXYGEN BUILD_COMMS_NONE_FALSE BUILD_COMMS_NONE_TRUE BUILD_COMMS_MPI_FALSE @@ -738,6 +745,10 @@ enable_dependency_tracking enable_openmp enable_simd enable_comms +enable_doxygen +enable_dot +enable_html_docs +enable_latex_docs ' ac_precious_vars='build_alias host_alias @@ -1379,6 +1390,11 @@ Optional Features: Select instructions to be SSE4.0, AVX 1.0, AVX 2.0+FMA, AVX 512, MIC --enable-comms=none|mpi Select communications + --enable-doxygen enable documentation generation with doxygen (auto) + --enable-dot use 'dot' to generate graphs in doxygen (auto) + --enable-html-docs enable HTML generation with doxygen (yes) + --enable-latex-docs enable LaTeX documentation generation with doxygen + (no) Some influential environment variables: CXX C++ compiler command @@ -4893,6 +4909,165 @@ fi +################################################################### +# Checks for doxygen support +# if present enables the "make doxyfile" command +echo +echo Checking doxygen support +echo ::::::::::::::::::::::::::::::::::::::::::: + +# Check whether --enable-doxygen was given. +if test "${enable_doxygen+set}" = set; then : + enableval=$enable_doxygen; +fi + + +# Check whether --enable-dot was given. +if test "${enable_dot+set}" = set; then : + enableval=$enable_dot; +fi + +# Check whether --enable-html-docs was given. +if test "${enable_html_docs+set}" = set; then : + enableval=$enable_html_docs; +else + enable_html_docs=yes +fi + +# Check whether --enable-latex-docs was given. +if test "${enable_latex_docs+set}" = set; then : + enableval=$enable_latex_docs; +else + enable_latex_docs=no +fi + + +if test "x$enable_doxygen" = xno; then + enable_doc=no +else + # Extract the first word of "doxygen", so it can be a program name with args. +set dummy doxygen; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DOXYGEN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DOXYGEN"; then + ac_cv_prog_DOXYGEN="$DOXYGEN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DOXYGEN="doxygen" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DOXYGEN=$ac_cv_prog_DOXYGEN +if test -n "$DOXYGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOXYGEN" >&5 +$as_echo "$DOXYGEN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x$DOXYGEN = x; then + if test "x$enable_doxygen" = xyes; then + as_fn_error $? "could not find doxygen" "$LINENO" 5 + fi + enable_doc=no + else + doxy_ver=`doxygen --version` + doxy_major=`expr "$doxy_ver" : '\([0-9]\)\..*'` + doxy_minor=`expr "$doxy_ver" : '[0-9]\.\([0-9]\).*'` + if test $doxy_major -eq "1" -a $doxy_minor -ge "3" ; then + enable_doc=yes + # Extract the first word of "dot", so it can be a program name with args. +set dummy dot; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DOT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DOT"; then + ac_cv_prog_DOT="$DOT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DOT="dot" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DOT=$ac_cv_prog_DOT +if test -n "$DOT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOT" >&5 +$as_echo "$DOT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: doxygen version $doxy_ver too old, doxygen will not be used." >&5 +$as_echo "$as_me: WARNING: doxygen version $doxy_ver too old, doxygen will not be used." >&2;} + enable_doc=no + fi + fi +fi + + if test x$enable_doc = xyes; then + DOXYGEN_DOC_TRUE= + DOXYGEN_DOC_FALSE='#' +else + DOXYGEN_DOC_TRUE='#' + DOXYGEN_DOC_FALSE= +fi + + +if test x$DOT = x; then + if test "x$enable_dot" = xyes; then + as_fn_error $? "could not find dot" "$LINENO" 5 + fi + enable_dot=no +else + enable_dot=yes +fi + + + + + + +if test -n "$DOXYGEN" +then +ac_config_files="$ac_config_files docs/doxy.cfg" + +fi + + ac_config_files="$ac_config_files Makefile" ac_config_files="$ac_config_files lib/Makefile" @@ -5042,6 +5217,10 @@ if test -z "${BUILD_COMMS_NONE_TRUE}" && test -z "${BUILD_COMMS_NONE_FALSE}"; th as_fn_error $? "conditional \"BUILD_COMMS_NONE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${DOXYGEN_DOC_TRUE}" && test -z "${DOXYGEN_DOC_FALSE}"; then + as_fn_error $? "conditional \"DOXYGEN_DOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 @@ -5636,6 +5815,7 @@ do case $ac_config_target in "lib/Grid_config.h") CONFIG_HEADERS="$CONFIG_HEADERS lib/Grid_config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "docs/doxy.cfg") CONFIG_FILES="$CONFIG_FILES docs/doxy.cfg" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; @@ -6379,6 +6559,9 @@ The following features are enabled: - os (build) : $build_os - architecture (target) : $target_cpu - os (target) : $target_os +- build DOXYGEN documentation : `if test "x$enable_doc" = xyes; then echo yes; else echo no; fi` +- graphs and diagrams : `if test "x$enable_dot" = xyes; then echo yes; else echo no; fi` + ---------------------------------------------------------- - enabled simd support : ${ac_SIMD} - communications type : ${ac_COMMS} diff --git a/configure.ac b/configure.ac index 54a36eb1..5dcbea36 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ # # Project Grid package # -# Time-stamp: <2015-05-25 14:54:34 neo> +# Time-stamp: <2015-05-26 17:18:54 neo> AC_PREREQ([2.63]) AC_INIT([Grid], [1.0], [paboyle@ph.ed.ac.uk]) @@ -116,6 +116,20 @@ AM_CONDITIONAL(BUILD_COMMS_MPI,[ test "X${ac_COMMS}X" == "XmpiX" ]) AM_CONDITIONAL(BUILD_COMMS_NONE,[ test "X${ac_COMMS}X" == "XnoneX" ]) +################################################################### +# Checks for doxygen support +# if present enables the "make doxyfile" command +echo +echo Checking doxygen support +echo ::::::::::::::::::::::::::::::::::::::::::: +AC_PROG_DOXYGEN + +if test -n "$DOXYGEN" +then +AC_CONFIG_FILES([docs/doxy.cfg]) +fi + + AC_CONFIG_FILES(Makefile) AC_CONFIG_FILES(lib/Makefile) AC_CONFIG_FILES(tests/Makefile) @@ -134,6 +148,9 @@ The following features are enabled: - os (build) : $build_os - architecture (target) : $target_cpu - os (target) : $target_os +- build DOXYGEN documentation : `if test "x$enable_doc" = xyes; then echo yes; else echo no; fi` +- graphs and diagrams : `if test "x$enable_dot" = xyes; then echo yes; else echo no; fi` + ---------------------------------------------------------- - enabled simd support : ${ac_SIMD} - communications type : ${ac_COMMS} diff --git a/docs/doxy.cfg b/docs/doxy.cfg new file mode 100644 index 00000000..c4b82094 --- /dev/null +++ b/docs/doxy.cfg @@ -0,0 +1,2305 @@ +# Doxyfile 1.8.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "Grid" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = 1.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is included in +# the documentation. The maximum height of the logo should not exceed 55 pixels +# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo +# to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./doxy-en/ + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a +# new page for each member. If set to NO, the documentation of a member will be +# part of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. +# +# Note For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by by putting a % sign in front of the word +# or globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = YES + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO these classes will be included in the various overviews. This option has +# no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = YES + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the +# todo list. This list is created by putting \todo commands in the +# documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the +# test list. This list is created by putting \test commands in the +# documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES the list +# will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. Do not use file names with spaces, bibtex cannot handle them. See +# also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO doxygen will only warn about wrong or incomplete parameter +# documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. +# Note: If this tag is empty the current directory is searched. + +INPUT = ../lib \ + ../tests \ + ../benchmarks + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank the +# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, +# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, +# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, +# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, +# *.qsf, *.as and *.js. + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER ) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES, then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- +# defined cascading style sheet that is included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefor more robust against future updates. +# Doxygen will copy the style sheet file to the output directory. For an example +# see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the stylesheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler ( hhc.exe). If non-empty +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated ( +# YES) or that it should be included in the master .chm file ( NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated ( +# YES) or a normal table of contents ( NO) in the .chm file. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using prerendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = YES + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /