simd comparison operator?

Manu turkeyman at gmail.com
Sun Mar 3 05:06:42 PST 2013


On 20 February 2013 02:03, bearophile <bearophileHUGS at lycos.com> wrote:

> Don:
>
>> Simd comparison generally doesn't return a bool, it returns a bool array,
>> one per element.
>>
>> Does  (arr[] < 10) mean "is every element in arr less than 10" OR "is any
>> element of arr less than 10" OR "create a bool array which is true for each
>> element which is less than 10" ?
>>
>> All make sense. That's the problem.
>>
>
> Right, it's a design problem.
> I think the right thing to do is to take a look at what's an efficient
> operation to do in hardware (and then look at what's the most commonly
> useful operation for users). I think the right design here is to return a
> bool[N].
> So in this case monarch_dodra has to add some more code to test all/any.
>
> Bye,
> bearophile
>

Don is on the money.

I drafted: bool allEqual(a,b)/anyEqual(a,b) and friends in std.simd, but I
haven't written them yet (been awol for a while). They're actually quite
tricky to get right+fast in a portable way.

all/any comparisons are often used in a boolean way, but they may not be
super fast on some architectures. If you want to do component-wise logic,
the typical approach is to use component-wise selection, eg:
  uint4 mask = compareGreater(a, b); // <- build a bit mask of 0's (false)
or 1's (true) where components of a are greater than b.
  auto result = select(mask, c, d); // <- select components from c or d
according to the bit mask.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20130303/32d7e9ab/attachment.html>


More information about the Digitalmars-d mailing list