BLADE 0.2Alpha: Vector operations with mixins, expression templates, and asm
Pragma
ericanderton at yahoo.removeme.com
Tue Apr 3 12:10:49 PDT 2007
Don Clugston wrote:
> I have been trying to come up with a convincing use case for the new
> mixins (and for metaprogramming in general). My best effort to date can
> be found at:
> http://www.dsource.org/projects/mathextra/browser/trunk/mathextra/Blade.d
>
> It generates near-optimal x87 asm code for BLAS1-style basic vector
> operations. 32, 64 and 80 bit vectors are all supported.
>
> Compile with -version=BladeDebug to see the asm code which is generated.
>
> Typical usage:
>
> void main()
> {
> auto p = Vec([1.0L, 2, 18]); // a vector of 80-bit reals.
> auto q = Vec([3.5L, 1.1, 3.8]); // ditto
> auto r = Vec([17.0f, 28.25, 1]); // a vector of 32-bit floats
> auto z = Vec([17.0i, 28.1i, 1i]); // a vector of 64-bit idoubles
> real d = dot(r, p+r+r);
> ireal e = dot(r, z);
> q -= ((r+p)*18.0L*314.1L - (p-r))* 35;
> d = dot(r, p+r+r);
> }
>
> Notice that mixed-length operations (real[] + float[] - double[]) are
> supported.
>
> Like the C++ Blitz++ library, expression templates are used to convert
> vector expressions into efficient element-wise operations. Unlike that
> library, however, there is no reliance on the compiler's optimiser.
> Instead, the expression template is manipulated as text, converted into
> postfix, and then passed to a simple CTFE compile-time assembler, which
> creates highly efficient asm code which is used as a mixin.
> To understand the later parts of the code, you need some knowledge of
> x87 assembler. In fact, you probably need to have read Agner Fog's
> superb Pentium optimisation manual (www.agner.org).
>
> Some observations:
> * I was amazed at how simple the expression template code is (it is
> somewhat cluttered by the code to check for real/imaginary type mismatch
> errors).
> * I've often read that the x87 floating-point stack is notoriously
> difficult for compilers to write code for, but it works quite well in
> this case.
> * The major workarounds are:
> - inability to use a tuple element directly from asm code (bug #1028);
> - inability to define operators for built-in arrays (hence the use of
> 'Vec' wrappers).
> - inability to index through a tuple in a CTFE function (solved by
> converting types into a string).
> * There have been mutterings about how unhygenic/dangerous the new
> mixins are. In this case, the mixin forms the _entire_ body of the
> function. This is an interesting situation which I think a language
> purist will find more palatable.
>
> Enjoy.
This is a work of art Don - it's practically a compiler extension. Nice job. :)
For others that are interested in how this actually gets the job done, I found this in your documentation:
* THEORY:
* Expression templates are used to create an expression string of the form "(a+b*c)+d"
* and a tuple, the entries of which correspond to a, b, c, d, ...
* This string is converted to postfix. The postfix string is converted to
* a string containing x87 asm, which is then mixed into a function which accepts the tuple.
--
- EricAnderton at yahoo
More information about the Digitalmars-d
mailing list