[dmd-internals] Shift support for vector types (or: is vector type a first class type?)
Kai Nacke
kai at redstar.de
Mon Apr 1 22:13:05 PDT 2013
On 01.04.2013 04:31, Walter Bright wrote:
>
> On 3/31/2013 6:56 PM, Kai Nacke wrote:
>> Hi!
>>
>> I try to write a generic vectorized version of SHA1. During that I
>> noticed that only some operations are allowed on vector types.
>>
>> For the SHA1 algorithm I need to implement a 'rotate left'. I like to
>> write something like this
>>
>> uint4 w = ...;
>> uint4 v = (w << 1) | (w >> 31);
>>
>> which is not allowed by DMD.
>>
>> Is this by design or simply not implemented because the backend is
>> not capable of generating code for it? The TDPL says nothing about
>> vector types. My understanding of the language reference on the web
>> (http://dlang.org/simd.html) is that the supported operators are CPU
>> architecture dependent.
>>
>> I really like to see more support for vector operations in the
>> language, e.g. for shifting. What is the view of the language
>> designers? Is the vector type a first class type or just an
>> architecture (maybe vendor) dependent type with limited usability?
>>
>> Because LLVM treats the vector type as a first class type supporting
>> more operators is easy with LDC. See my pull request for shift
>> operators here: https://github.com/ldc-developers/ldc/pull/321
>
> The idea is if a vector operation is not supported by the underlying
> hardware, then dmd won't allow it. It specifically does not generate
> "workaround" code like gcc does. The reason for this is the workaround
> code is terribly, terribly slow (because moving code between the ALU
> and the SIMD unit is awful), and having the compiler silently insert
> it leaves the programmer mystified why he is getting execrable
> performance.
Shifting a vector left by a single scalar e.g. v << 2 is then a missing
operation. It is supported by the PSLLW/D/Q instruction. Same for
shifting right. This is good news for my implementation. :-)
> The vector design philosophy in D is if you write SIMD code, and it
> compiles, you can be confident it will execute in the SIMD unit of
> your particular target processor. You won't have to dump the assembler
> output to be sure.
Would it be legal for a D compiler to generate "workaround" code?
Otherwise the language changes depending on the target. Consider again
the left shift: on an Intel CPU only v << n (v: vector; n: scalar) is
valid. In contrast, Altivec allows v << w (v, w: vector). Then the same
source may or may not compile depending on the target (with an error
message saying 'incompatible types'). As a user of a cross compiler I
would be very surprised by this behavior. I really have Linux/PPC64 in
mind but do most development on Windows...
(It feels a bit like ++ is only supported if the underlying hardware has
an INC instruction...)
Regards
Kai
More information about the dmd-internals
mailing list