Re: Compile MTL with upcoming Sun Studio C++ 11 and upcoming patch for Sun Studio C++ 10
Peter Gottschling <[email protected]> Fri, 19 Aug 2005 13:00:29 +0200
| Newsgroups | gmane.comp.lib.mtl.devel |
|---|---|
| Message-ID | <[email protected]> |
Thank you Simon!
I will put it on the MTL page next week.
Best Regards,
Peter Gottschling
On 19.08.2005, at 12:47, Simon Atanasyan wrote:
> Hi,
>
> I'd like to suggest patch that makes MTL compatible with upcoming "Sun
> Studio C++ 11"
> and upcoming patch for "Sun Studio C++ 10". Most of fixes explicitly
> mark some maths
> functions (sqrt, rand, etc) that they come form std namespace. Another
> part of fixes
> remove some outdated "ifdef" pragmas related to __SUNPRO_CC. And the
> last fix turns on
> support of Sun C++ in configure.in
>
> With this patch I've successfully build all tests and examples and run
> test suite.
>
> --
> Simon Atanasyan
> diff -c3 -r mtl-2.1.2-22.orig/configure.in mtl-2.1.2-22/configure.in
> *** mtl-2.1.2-22.orig/configure.in Fri Feb 18 14:17:34 2005
> --- mtl-2.1.2-22/configure.in Thu Aug 18 05:18:38 2005
> ***************
> *** 49,57 ****
> if test $compiler = "none"; then AC_PROG_CXX_MWERKS ; fi
> if test $compiler = "none"; then AC_PROG_CXX_INTELCC ; fi
> if test $compiler = "none"; then AC_PROG_CXX_MSVCPP ; fi
> !
> ! dnl Don't bother checking for this
> ! dnl if test $compiler = "none"; then AC_PROG_CXX_SUNCC ; fi
>
> BACKEND=""
> MATHLIB=""
> --- 49,55 ----
> if test $compiler = "none"; then AC_PROG_CXX_MWERKS ; fi
> if test $compiler = "none"; then AC_PROG_CXX_INTELCC ; fi
> if test $compiler = "none"; then AC_PROG_CXX_MSVCPP ; fi
> ! if test $compiler = "none"; then AC_PROG_CXX_SUNCC ; fi
>
> BACKEND=""
> MATHLIB=""
> ***************
> *** 110,115 ****
> --- 108,121 ----
> CXX_DEBUG_FLAGS="-g"
> CXXLD="mwld"
> ;;
> + suncc*) # Sun Pro C++ http://www.sun.com
> + echo "Configuring for Sun Pro C++"
> + CXX_PICKY_FLAGS="-library=stlport4"
> + AC_BZ_SET_COMPILER($withval,"CC","$CXX_PICKY_FLAGS")
> + CXX_OPTIMIZE_FLAGS="-O"
> + CXX_DEBUG_FLAGS="-g"
> + CXXLD="$CXX"
> + ;;
> *)
> CXXLD="$CXX"
> AC_MSG_WARN([Compiler not recognized])
> diff -c3 -r mtl-2.1.2-22.orig/contrib/examples/lu_solve.cc
> mtl-2.1.2-22/contrib/examples/lu_solve.cc
> *** mtl-2.1.2-22.orig/contrib/examples/lu_solve.cc Tue Jul 5 08:11:50
> 2005
> --- mtl-2.1.2-22/contrib/examples/lu_solve.cc Thu Aug 18 05:18:28 2005
> ***************
> *** 40,46 ****
> double max_error = 0.0;
> for(Matrix::iterator i = AInvA.begin(); i != AInvA.end(); ++i)
> for(Matrix::Row::iterator j = (*i).begin(); j != (*i).end(); ++j)
> ! if(fabs(*j) > fabs(max_error))
> max_error = *j;
>
> std::cout << "max error = " << max_error << std::endl;
> --- 40,46 ----
> double max_error = 0.0;
> for(Matrix::iterator i = AInvA.begin(); i != AInvA.end(); ++i)
> for(Matrix::Row::iterator j = (*i).begin(); j != (*i).end(); ++j)
> ! if(std::fabs(*j) > std::fabs(max_error))
> max_error = *j;
>
> std::cout << "max error = " << max_error << std::endl;
> diff -c3 -r mtl-2.1.2-22.orig/contrib/examples/max_index.cc
> mtl-2.1.2-22/contrib/examples/max_index.cc
> *** mtl-2.1.2-22.orig/contrib/examples/max_index.cc Tue Jul 5
> 08:11:50 2005
> --- mtl-2.1.2-22/contrib/examples/max_index.cc Thu Aug 18 05:18:28 2005
> ***************
> *** 62,68 ****
> int imax = max_index(x);
> //end
>
> ! #if !defined(_MSVCPP_) && !defined(__sgi) || defined(__GNUC__)
> // VC++ and SGI CC do not have operator << defined for complex
> numbers
> print_vector(x);
> #endif
> --- 62,68 ----
> int imax = max_index(x);
> //end
>
> ! #if !defined(_MSVCPP_) && !defined(__sgi) || defined(__GNUC__) ||
> defined(__SUNPRO_CC)
> // VC++ and SGI CC do not have operator << defined for complex
> numbers
> print_vector(x);
> #endif
> diff -c3 -r mtl-2.1.2-22.orig/mtl/abs.h mtl-2.1.2-22/mtl/abs.h
> *** mtl-2.1.2-22.orig/mtl/abs.h Tue Jul 5 08:11:49 2005
> --- mtl-2.1.2-22/mtl/abs.h Thu Aug 18 05:18:28 2005
> ***************
> *** 25,36 ****
> }
> #endif
>
> - #ifdef __SUNPRO_CC //sigh
> - namespace std {
> - inline int abs(int a) {
> - return a > 0 ? a : -a;
> - }
> - }
> - #endif
> -
> #endif
> --- 25,28 ----
> diff -c3 -r mtl-2.1.2-22.orig/mtl/entry.h mtl-2.1.2-22/mtl/entry.h
> *** mtl-2.1.2-22.orig/mtl/entry.h Tue Jul 5 08:11:49 2005
> --- mtl-2.1.2-22/mtl/entry.h Thu Aug 18 05:18:28 2005
> ***************
> *** 205,211 ****
> };
>
>
> ! #if (__GNUC__ < 9) /* let the conversion operator handle all these
> ops */
>
> template <class T>
> std::ostream& operator<<(std::ostream& os, const elt_ref<T>& er) {
> --- 205,211 ----
> };
>
>
> ! #if defined(__SUNPRO_CC) || (__GNUC__ < 9) /* let the conversion
> operator handle all these ops */
>
> template <class T>
> std::ostream& operator<<(std::ostream& os, const elt_ref<T>& er) {
> diff -c3 -r mtl-2.1.2-22.orig/mtl/meta_if.h mtl-2.1.2-22/mtl/meta_if.h
> *** mtl-2.1.2-22.orig/mtl/meta_if.h Tue Jul 5 08:11:49 2005
> --- mtl-2.1.2-22/mtl/meta_if.h Thu Aug 18 05:18:28 2005
> ***************
> *** 24,31 ****
>
> namespace mtl {
>
> ! //sun workshop 6 update 2 did not handle partial specialized IF
> ! #if (MTL_PARTIAL_SPEC) && (!defined __SUNPRO_CC)
>
> template <int cond, class A, class B>
> struct IF { };
> --- 24,30 ----
>
> namespace mtl {
>
> ! #if (MTL_PARTIAL_SPEC)
>
> template <int cond, class A, class B>
> struct IF { };
> diff -c3 -r mtl-2.1.2-22.orig/mtl/mtl.h mtl-2.1.2-22/mtl/mtl.h
> *** mtl-2.1.2-22.orig/mtl/mtl.h Tue Jul 5 08:11:49 2005
> --- mtl-2.1.2-22/mtl/mtl.h Thu Aug 18 05:18:28 2005
> ***************
> *** 252,259 ****
> {
> typedef typename Vector::value_type T;
> typedef typename number_traits<T>::magnitude_type M;
> ! using std::sqrt;
> ! return ::sqrt(mtl_algo::accumulate(x.begin(), x.end(), M(),
> sqr_add()));
> }
>
> #if USE_BLAIS
> --- 252,258 ----
> {
> typedef typename Vector::value_type T;
> typedef typename number_traits<T>::magnitude_type M;
> ! return std::sqrt(mtl_algo::accumulate(x.begin(), x.end(), M(),
> sqr_add()));
> }
>
> #if USE_BLAIS
> ***************
> *** 263,270 ****
> {
> typedef typename Vector::value_type T;
> typedef typename number_traits<T>::magnitude_type M;
> ! using std::sqrt;
> ! return ::sqrt(fast::accumulate(x.begin(), fast::count<N>(), M(),
> sqr_add()));
> }
> #endif
>
> --- 262,268 ----
> {
> typedef typename Vector::value_type T;
> typedef typename number_traits<T>::magnitude_type M;
> ! return std::sqrt(fast::accumulate(x.begin(), fast::count<N>(),
> M(), sqr_add()));
> }
> #endif
>
> ***************
> *** 809,815 ****
> if (scal != T(0)) {
> T a_scl = a_in / scal;
> T b_scl = b_in / scal;
> ! r = scal * sqrt(a_scl * a_scl + b_scl * b_scl);
> if (roe < T(0)) r *= -1;
> c_ = a_in / r;
> s_ = b_in / r;
> --- 807,813 ----
> if (scal != T(0)) {
> T a_scl = a_in / scal;
> T b_scl = b_in / scal;
> ! r = scal * std::sqrt(a_scl * a_scl + b_scl * b_scl);
> if (roe < T(0)) r *= -1;
> c_ = a_in / r;
> s_ = b_in / r;
> ***************
> *** 842,855 ****
> if (abs_a > abs_b) {
> // 1/cs = sqrt( 1 + |b|^2 / |a|^2 )
> T t = abs_b / abs_a;
> ! T tt = sqrt(T(1) + t * t);
> c_ = T(1) / tt;
> s_ = t * c_;
> r_ = a * tt;
> } else {
> // 1/sn = sign(a) * sqrt( 1 + |a|^2/|b|^2 )
> T t = abs_a / abs_b;
> ! T tt = sqrt(T(1) + t * t);
> s_ = sign(a) / tt;
> c_ = t * s_;
> r_ = b * tt;
> --- 840,853 ----
> if (abs_a > abs_b) {
> // 1/cs = sqrt( 1 + |b|^2 / |a|^2 )
> T t = abs_b / abs_a;
> ! T tt = std::sqrt(T(1) + t * t);
> c_ = T(1) / tt;
> s_ = t * c_;
> r_ = a * tt;
> } else {
> // 1/sn = sign(a) * sqrt( 1 + |a|^2/|b|^2 )
> T t = abs_a / abs_b;
> ! T tt = std::sqrt(T(1) + t * t);
> s_ = sign(a) / tt;
> c_ = t * s_;
> r_ = b * tt;
> ***************
> *** 963,980 ****
> g2 = abs_sq(gs);
> fs = f / f1;
> f2 = abs_sq(fs);
> ! d = sqrt(T(1) + g2 / f2);
> cs = T(1) / d;
> sn = MTL_CONJ(gs) * fs * (cs / f2);
> r_ = f * d;
> } else {
> fs = f / g1;
> f2 = abs_sq(fs);
> ! fa = sqrt(f2);
> gs = g / g1;
> g2 = abs_sq(gs);
> ! ga = sqrt(g2);
> ! d = sqrt(T(1) + f2 / g2);
> di = T(1) / d;
> cs = (fa / ga ) * di;
> ss = (MTL_CONJ(gs) * fs) / (fa * ga);
> --- 961,978 ----
> g2 = abs_sq(gs);
> fs = f / f1;
> f2 = abs_sq(fs);
> ! d = std::sqrt(T(1) + g2 / f2);
> cs = T(1) / d;
> sn = MTL_CONJ(gs) * fs * (cs / f2);
> r_ = f * d;
> } else {
> fs = f / g1;
> f2 = abs_sq(fs);
> ! fa = std::sqrt(f2);
> gs = g / g1;
> g2 = abs_sq(gs);
> ! ga = std::sqrt(g2);
> ! d = std::sqrt(T(1) + f2 / g2);
> di = T(1) / d;
> cs = (fa / ga ) * di;
> ss = (MTL_CONJ(gs) * fs) / (fa * ga);
> ***************
> *** 1080,1097 ****
> g2 = abs_sq(gs);
> fs = f / f1;
> f2 = abs_sq(fs);
> ! d = sqrt(T(1) + g2 / f2);
> cs = T(1) / d;
> sn = MTL_CONJ(gs) * fs * (cs / f2);
> r_ = f * d;
> } else {
> fs = f / g1;
> f2 = abs_sq(fs);
> ! fa = sqrt(f2);
> gs = g / g1;
> g2 = abs_sq(gs);
> ! ga = sqrt(g2);
> ! d = sqrt(T(1) + f2 / g2);
> di = T(1) / d;
> cs = (fa / ga ) * di;
> ss = (MTL_CONJ(gs) * fs) / (fa * ga);
> --- 1078,1095 ----
> g2 = abs_sq(gs);
> fs = f / f1;
> f2 = abs_sq(fs);
> ! d = std::sqrt(T(1) + g2 / f2);
> cs = T(1) / d;
> sn = MTL_CONJ(gs) * fs * (cs / f2);
> r_ = f * d;
> } else {
> fs = f / g1;
> f2 = abs_sq(fs);
> ! fa = std::sqrt(f2);
> gs = g / g1;
> g2 = abs_sq(gs);
> ! ga = std::sqrt(g2);
> ! d = std::sqrt(T(1) + f2 / g2);
> di = T(1) / d;
> cs = (fa / ga ) * di;
> ss = (MTL_CONJ(gs) * fs) / (fa * ga);
> ***************
> *** 1190,1207 ****
> g2 = abs_sq(gs);
> fs = f / f1;
> f2 = abs_sq(fs);
> ! d = sqrt(T(1) + g2 / f2);
> cs = T(1) / d;
> sn = MTL_CONJ(gs) * fs * (cs / f2);
> r_ = f * d;
> } else {
> fs = f / g1;
> f2 = abs_sq(fs);
> ! fa = sqrt(f2);
> gs = g / g1;
> g2 = abs_sq(gs);
> ! ga = sqrt(g2);
> ! d = sqrt(T(1) + f2 / g2);
> di = T(1) / d;
> cs = (fa / ga ) * di;
> ss = (MTL_CONJ(gs) * fs) / (fa * ga);
> --- 1188,1205 ----
> g2 = abs_sq(gs);
> fs = f / f1;
> f2 = abs_sq(fs);
> ! d = std::sqrt(T(1) + g2 / f2);
> cs = T(1) / d;
> sn = MTL_CONJ(gs) * fs * (cs / f2);
> r_ = f * d;
> } else {
> fs = f / g1;
> f2 = abs_sq(fs);
> ! fa = std::sqrt(f2);
> gs = g / g1;
> g2 = abs_sq(gs);
> ! ga = std::sqrt(g2);
> ! d = std::sqrt(T(1) + f2 / g2);
> di = T(1) / d;
> cs = (fa / ga ) * di;
> ss = (MTL_CONJ(gs) * fs) / (fa * ga);
> ***************
> *** 1267,1273 ****
>
> template <class T>
> inline T two_norm3(const T& x, const T& y, const T& z) {
> ! return sqrt(x*x + y*y + z*z);
> }
>
> //: Generate Householder Transform
> --- 1265,1271 ----
>
> template <class T>
> inline T two_norm3(const T& x, const T& y, const T& z) {
> ! return std::sqrt(x*x + y*y + z*z);
> }
>
> //: Generate Householder Transform
> diff -c3 -r mtl-2.1.2-22.orig/mtl/rect_indexer.h
> mtl-2.1.2-22/mtl/rect_indexer.h
> *** mtl-2.1.2-22.orig/mtl/rect_indexer.h Tue Jul 5 08:11:49 2005
> --- mtl-2.1.2-22/mtl/rect_indexer.h Thu Aug 18 05:18:28 2005
> ***************
> *** 82,92 ****
> inline rect_indexer(const Indexer& x) : dim(x.dim) { }
> #endif
>
> - #if (defined __SUNPRO_CC)
> - template <class S, int MMM, int NNN>
> - inline rect_indexer(const dimension<S,MMM,NNN>& x) : dim(x) { }
> - #endif
> -
> inline rect_indexer(const strided_type& x, strideable)
> : dim(x.dim.transpose()) { }
>
> --- 82,87 ----
> diff -c3 -r mtl-2.1.2-22.orig/mtl/utils.h mtl-2.1.2-22/mtl/utils.h
> *** mtl-2.1.2-22.orig/mtl/utils.h Tue Jul 5 08:11:49 2005
> --- mtl-2.1.2-22/mtl/utils.h Thu Aug 18 05:18:28 2005
> ***************
> *** 459,472 ****
> inline float
> make_rand_element(float)
> {
> ! float r = float(rand());
> return r/float(RAND_MAX)*10.0;
> }
>
> inline double
> make_rand_element(double)
> {
> ! double r = double(rand());
> return r/double(RAND_MAX)*10.0L;
> }
>
> --- 459,472 ----
> inline float
> make_rand_element(float)
> {
> ! float r = float(std::rand());
> return r/float(RAND_MAX)*10.0;
> }
>
> inline double
> make_rand_element(double)
> {
> ! double r = double(std::rand());
> return r/double(RAND_MAX)*10.0L;
> }
>
> _______________________________________________
> This list is archived at http://www.osl.iu.edu/MailArchives/mtl-devel/
------------
Peter Gottschling
Research Associate
Open Systems Laboratory
Indiana University
301i Lindley Hall
Bloomington, IN 47405
Tel.: +1 812 855-8898 Fax: +1 812 856 0853
http://www.osl.iu.edu/~pgottsch
_______________________________________________
This list is archived at http://www.osl.iu.edu/MailArchives/mtl-devel/