Blitz++ library

From: Jacek M. Holeczek (
Date: Wed Jun 04 1997 - 09:56:50 MEST

                 Blitz++ Version Version 0.1 alpha 04b
                             April 1997

** Feel free to forward this notice to select people.

** Available by anon ftp from
   as pub/blitz/.alpha/blitz-0.1-alpha-??.tar.gz

Blitz++ is a C++ template class library for scientific computing.  
It offers a high level of abstraction, but performance which rivals 
that of Fortran 77.  The current alpha version supports only vectors;
matrices, and arrays will follow in the next few versions.  

1.  Contents of the alpha release

* Vector<T>
   Numerical vector class; supports integral, floating, or complex types
   Shallow copies and reference counting
   Subvectors, possibly with non-unit stride
   Rudimentary output formatting
   Debug mode with bounds checking
   Uses the NCEG restrict keyword if supported

* TinyVector<T,N>
   For small vectors (recommended less than 10 elements)
   Loops are unravelled for most operations
   Debug mode with bounds checking
   Uses restrict if supported
* Vector expressions
   Evaluated using expression templates, which rival Fortran 77 when
    used with KAI C++
   Operators + - * / % ^ & | >> << > >= < <= == != 
   Assignment operators = += -= *= /= %= ^= &= |= >>= <<=
   Operands: vectors, tiny vectors, scalars, expressions, vector picks, Range
   Arithmetic type promotion (in the C style)
   where(X,Y,Z) implementation of the ?: operator

* Math functions (Vector, Range, or vector expression arguments)
   abs       acos      acosh     asin      asinh     atan
   atnh      cbrt      ceil      cos       cosh      exp
   expm1     erf       erfc      fabs      finite    floor
   ilogb     isnan     itrunc    j0        j1        lgamma
   log       logb      log1p     log10     nearest   rint
   rsqrt     sin       sinh      sqrt      tan       tanh
   trunc     uitrunc   y0        y1

* Global vector functions
   accumulate         dot           delta            max 
   maxIndex           maxValue      mean             min 
   minIndex           minValue      norm             norm1
* VectorPick
   Selects an arbitrary subset or reordering of vector elements; may
    be used as an lvalue
   Rudimentary output formatting
* Random number generators

* Benchmark classes

* Example programs
* Benchmarks
   Haney's inductance benchmark

2.  Is it faster than Fortran 77?

Maybe.  There are two benchmark plots on the Blitz++ home page
( which show potential.  On a
DAXPY operation, Blitz++ is just as fast as inlined Fortran code,
and is faster than a Fortran daxpy() function call.  Blitz++
does fairly well on Scott Haney's inductance calculation benchmark:
it's 4% slower than Fortran, but 15% faster than C.
(It's possible that KAI C++ is passing up a possible optimization
on the C code).  Note that these figures are for one platform
only (an IBM RS/6000). 

I think there's a good chance that on application benchmarks,
Blitz++ compiled with KAI C++ will be faster than Fortran 77.  

2.  Availability and system requirements

The latest version of Blitz++ may be found in pub/blitz on

The Blitz++ library uses a number of new language features
which are not yet widely supported.  So far, only compilers
which use a recent Edison Design Group (EDG) front end will be able
to compile Blitz++.  I have tested Blitz++ on one of
these -- KAI C++ from Kuck and Associates, which is an excellent 
optimizing C++ compiler.  They can be found on the web at  (I don't have a promotional arrangement 
with KAI, but I do think very highly of their compiler!)

3.  More information

For up to date information on the Blitz++ library, please 
see the web page at:

The web page also contains explanations of the techniques
behind the library (expression templates, template
metaprograms, traits).

4.  Installation

No libraries need to be built -- Blitz++ is entirely template-based.
Just extract the gzipped tar file in a convenient location:

e.g.    gunzip blitz-0.1-alpha-1.tar.gz
        tar xvf blitz-0.1-alpha-1.tar
x Blitz++/CHANGELOG, 156 bytes, 1 media blocks.
x Blitz++/README, 6983 bytes, 14 media blocks.

If you're using KAI C++, you're now ready to compile.  Otherwise,
you need to configure the Blitz++ library for your compiler.
Go to the Blitz++/compiler directory, and use bash to run the
bzconfig script.  This script will produce a config.h file for
your compiler, which you should then copy to Blitz++/blitz/config.h.

5.  Directories

benchmarks    Benchmark programs 
blitz         Blitz++ headers and source files
blitz/meta    More Blitz++ headers
compiler      Compiler tests.  Use "bzconfig" to generate a config.h
              file for your compiler.
examples      Example programs
manual        Documentation in HTML format (so far, only for Vector<T> 
              and Range)

6.  Compiling programs

The Blitz++ library is mildly unusual in its use of header files.
All headers are referred to with a prefix of "blitz/".
For example, to use the Vector<T> class, one needs to include
<blitz/vector.h> instead of just <vector.h>.
To make this work, the main Blitz++ directory must be in
your include path.  For example, if Blitz++ was installed
in /software/Blitz++, you will need to compile with
-I /software/Blitz++.

Recommended compile flags for KAI C++:

  +K3 -O2 -DNDEBUG --restrict --no_implicit_include --abstract_pointer

To compile the benchmarks, you will need an implementation
of valarray<T>, part of the new standard C++ library.  This 
is included with the KAI C++ compiler.

7.  Email addresses

The point of this release is to get feedback.  If you have problems,
suggestions, results or bugs to report, please send them directly to me

Future addresses
Bug reports:
Licensing inquiries:


I am looking for people willing to compile and run benchmarks
on these platforms:

SPARC Solaris
SGI Irix
Digital UNIX
Cray T3D
IBM AIX  (upscale model)

I'm also collecting application benchmarks to compare the performance
of Blitz++ to Fortran 77, C, and existing C++ libraries.  Do you
have a code excerpt of 10-50 lines which could be turned into
a benchmark?  If so, please get in touch with me.

9.  Copyright and std disclaimer 

The Blitz++ library is copyright (C) 1997 Todd Veldhuizen.
The library may be redistributed in an unmodified form, provided
no fee is charged.  Academics and hobbyists may use this library
free of charge.  Commercial and government users may be asked
to purchase a license in the future; for now, feel free to use
the library until I sort out details.

Caveat: The library and the techniques behind are still experimental;
please be patient.

This software is distributed WITHOUT WARRANTY.  In no event will the
author or his institution be liable to you for damages, including
lost profits, lost monies, central processing unit meltdown, or other 
special, incidental or consequential damages arising out of or in 
connection with the use or inability to use (including but not 
limited to loss of data or data being rendered inaccurate or 
losses sustained by third parties or a failure of the software 
to operate as documented) the software, even if you have been 
advised of the possibility of such damages, or for any claim 
by any other party, whether in an action of contract,
negligence, or other tortious action.

                               Todd Veldhuizen,
                               Dept. of Systems Design Engineering,
                               University of Waterloo, Canada

This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:26:19 MET