[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
integer arithmetics
From: |
John W. Eaton |
Subject: |
integer arithmetics |
Date: |
Mon, 22 Sep 2008 15:50:10 -0400 |
On 22-Sep-2008, Jaroslav Hajek wrote:
| this is the first part of my aim to extend & improve performance of
| integer arithmetics in Octave. This patch does not yet implement int64
| operations (though it prepares the ground). Indeed, the only files
| modified by this patch are oct-inttypes.h and oct-inttypes.cc. Apart
| from the octave_int<T> class, the design is mostly rewritten. Due to
| the more specialized code employed, using C++ integer arithmetics
| where possible, integer arithmetics from Octave ends up
| significantly faster.
|
| Attached is what I got using "benchmark_intmath" from "benchmarks"
| Octave-Forge package, averaged over 5 runs on a non-loaded node of our
| cluster, a 2x dual core AMD Opteron machine on 2.5 GHz with 8 GB RAM,
| Octave compiled with Intel C++ 10.1 at -O2.
|
| Btw. Speed-up is measured as (old-time/new-time - 1)*100%.
|
| benchmark results: (averages over 5 runs)
|
| [...]
|
| This patch should not, IMHO, be applied before 3.2.x is forked, so
| I'm sharing mainly for comments.
I tried it but rebuilding fails with:
g++ -c -I/usr/include/freetype2 -fPIC -I. -I/home/jwe/src/octave/liboctave
-I.. -I../liboctave -I../src -I../libcruft/misc -I/home/jwe/src/octave
-I/home/jwe/src/octave/liboctave -I/home/jwe/src/octave/src
-I/home/jwe/src/octave/libcruft/misc -DHAVE_CONFIG_H -I/usr/include/freetype2
-Wall -W -Wshadow -Wold-style-cast -ggdb3
/home/jwe/src/octave/liboctave/MArray-i.cc -o pic/MArray-i.o
/home/jwe/src/octave/liboctave/oct-inttypes.h: In static member function
'static T octave_int_arith_base<T, true>::div(T, T) [with T = signed char]':
/home/jwe/src/octave/liboctave/oct-inttypes.h:754: instantiated from
'octave_int<T> octave_int<T>::operator/(const octave_int<T>&) const [with T =
signed char]'
/home/jwe/src/octave/liboctave/MArray.cc:126: instantiated from 'MArray<T>
operator/(const MArray<T>&, const T&) [with T = octave_int<signed char>]'
/home/jwe/src/octave/liboctave/MArray-i.cc:45: instantiated from here
/home/jwe/src/octave/liboctave/oct-inttypes.h:640: error: call of overloaded
'abs(int)' is ambiguous
/usr/include/c++/4.3/cmath:99: note: candidates are: double std::abs(double)
/usr/include/c++/4.3/cmath:103: note: float std::abs(float)
/usr/include/c++/4.3/cmath:107: note: long double
std::abs(long double)
/home/jwe/src/octave/liboctave/oct-inttypes.h:648: error: call of overloaded
'abs(int)' is ambiguous
/usr/include/c++/4.3/cmath:99: note: candidates are: double std::abs(double)
/usr/include/c++/4.3/cmath:103: note: float std::abs(float)
/usr/include/c++/4.3/cmath:107: note: long double
std::abs(long double)
/home/jwe/src/octave/liboctave/oct-inttypes.h: In static member function
'static T octave_int_arith_base<T, true>::div(T, T) [with T = short int]':
/home/jwe/src/octave/liboctave/oct-inttypes.h:754: instantiated from
'octave_int<T> octave_int<T>::operator/(const octave_int<T>&) const [with T =
short int]'
/home/jwe/src/octave/liboctave/MArray.cc:126: instantiated from 'MArray<T>
operator/(const MArray<T>&, const T&) [with T = octave_int<short int>]'
/home/jwe/src/octave/liboctave/MArray-i.cc:46: instantiated from here
/home/jwe/src/octave/liboctave/oct-inttypes.h:640: error: call of overloaded
'abs(int)' is ambiguous
/usr/include/c++/4.3/cmath:99: note: candidates are: double std::abs(double)
/usr/include/c++/4.3/cmath:103: note: float std::abs(float)
/usr/include/c++/4.3/cmath:107: note: long double
std::abs(long double)
/home/jwe/src/octave/liboctave/oct-inttypes.h:648: error: call of overloaded
'abs(int)' is ambiguous
/usr/include/c++/4.3/cmath:99: note: candidates are: double std::abs(double)
/usr/include/c++/4.3/cmath:103: note: float std::abs(float)
/usr/include/c++/4.3/cmath:107: note: long double
std::abs(long double)
/home/jwe/src/octave/liboctave/oct-inttypes.h: In static member function
'static T octave_int_arith_base<T, true>::div(T, T) [with T = int]':
/home/jwe/src/octave/liboctave/oct-inttypes.h:754: instantiated from
'octave_int<T> octave_int<T>::operator/(const octave_int<T>&) const [with T =
int]'
/home/jwe/src/octave/liboctave/MArray.cc:126: instantiated from 'MArray<T>
operator/(const MArray<T>&, const T&) [with T = octave_int<int>]'
/home/jwe/src/octave/liboctave/MArray-i.cc:47: instantiated from here
/home/jwe/src/octave/liboctave/oct-inttypes.h:640: error: call of overloaded
'abs(int)' is ambiguous
/usr/include/c++/4.3/cmath:99: note: candidates are: double std::abs(double)
/usr/include/c++/4.3/cmath:103: note: float std::abs(float)
/usr/include/c++/4.3/cmath:107: note: long double
std::abs(long double)
/home/jwe/src/octave/liboctave/oct-inttypes.h:648: error: call of overloaded
'abs(int)' is ambiguous
/usr/include/c++/4.3/cmath:99: note: candidates are: double std::abs(double)
/usr/include/c++/4.3/cmath:103: note: float std::abs(float)
/usr/include/c++/4.3/cmath:107: note: long double
std::abs(long double)
/home/jwe/src/octave/liboctave/oct-inttypes.h: In static member function
'static T octave_int_arith_base<T, true>::div(T, T) [with T = long int]':
/home/jwe/src/octave/liboctave/oct-inttypes.h:754: instantiated from
'octave_int<T> octave_int<T>::operator/(const octave_int<T>&) const [with T =
long int]'
/home/jwe/src/octave/liboctave/MArray.cc:126: instantiated from 'MArray<T>
operator/(const MArray<T>&, const T&) [with T = octave_int<long int>]'
/home/jwe/src/octave/liboctave/MArray-i.cc:48: instantiated from here
/home/jwe/src/octave/liboctave/oct-inttypes.h:640: error: call of overloaded
'abs(long int)' is ambiguous
/usr/include/c++/4.3/cmath:99: note: candidates are: double std::abs(double)
/usr/include/c++/4.3/cmath:103: note: float std::abs(float)
/usr/include/c++/4.3/cmath:107: note: long double
std::abs(long double)
/home/jwe/src/octave/liboctave/oct-inttypes.h:648: error: call of overloaded
'abs(long int)' is ambiguous
/usr/include/c++/4.3/cmath:99: note: candidates are: double std::abs(double)
/usr/include/c++/4.3/cmath:103: note: float std::abs(float)
/usr/include/c++/4.3/cmath:107: note: long double
std::abs(long double)
/home/jwe/src/octave/liboctave/oct-inttypes.h: At global scope:
/home/jwe/src/octave/liboctave/oct-inttypes.h: In instantiation of 'static
bool octave_int_cmp_op::cf::op(T, T) [with T = unsigned int]':
/home/jwe/src/octave/liboctave/oct-inttypes.h:204: instantiated from
'static T octave_int_base<T>::truncate_int(const S&) [with S = unsigned int, T
= short unsigned int]'
/home/jwe/src/octave/liboctave/oct-inttypes.h:373: instantiated from
'static T octave_int_arith_base<T, false>::mul(T, T) [with T = short unsigned
int]'
/home/jwe/src/octave/liboctave/oct-inttypes.h:753: instantiated from
'octave_int<T> octave_int<T>::operator*(const octave_int<T>&) const [with T =
short unsigned int]'
/home/jwe/src/octave/liboctave/MArray.cc:125: instantiated from 'MArray<T>
operator*(const MArray<T>&, const T&) [with T = octave_int<short unsigned int>]'
/home/jwe/src/octave/liboctave/MArray-i.cc:56: instantiated from here
/home/jwe/src/octave/liboctave/oct-inttypes.h:156: warning: unused parameter
'x'
/home/jwe/src/octave/liboctave/oct-inttypes.h:156: warning: unused parameter
'y'
/home/jwe/src/octave/liboctave/oct-inttypes.h: In instantiation of 'static
bool octave_int_cmp_op::cf::op(T, T) [with T = long unsigned int]':
/home/jwe/src/octave/liboctave/oct-inttypes.h:204: instantiated from
'static T octave_int_base<T>::truncate_int(const S&) [with S = long unsigned
int, T = unsigned int]'
/home/jwe/src/octave/liboctave/oct-inttypes.h:373: instantiated from
'static T octave_int_arith_base<T, false>::mul(T, T) [with T = unsigned int]'
/home/jwe/src/octave/liboctave/oct-inttypes.h:753: instantiated from
'octave_int<T> octave_int<T>::operator*(const octave_int<T>&) const [with T =
unsigned int]'
/home/jwe/src/octave/liboctave/MArray.cc:125: instantiated from 'MArray<T>
operator*(const MArray<T>&, const T&) [with T = octave_int<unsigned int>]'
/home/jwe/src/octave/liboctave/MArray-i.cc:57: instantiated from here
/home/jwe/src/octave/liboctave/oct-inttypes.h:156: warning: unused parameter
'x'
/home/jwe/src/octave/liboctave/oct-inttypes.h:156: warning: unused parameter
'y'
make[2]: *** [pic/MArray-i.o] Error 1
make[2]: Leaving directory `/scratch/jwe/build/octave/liboctave'
make[1]: *** [liboctave] Error 2
make[1]: Leaving directory `/scratch/jwe/build/octave'
make: *** [all] Error 2
Any clues?
jwe