Extend vector ops to boolean operators?

James Miller james at aatch.net
Tue Mar 6 20:22:20 PST 2012


On 7 March 2012 17:03, bearophile <bearophileHUGS at lycos.com> wrote:
> James Miller:
>
>> What? I'm assuming you mean that you expect an array of `bool`s?
>
> Right. Vector operations like a[]<b[] are meant to return an array of bools. To see how this is useful you probably must think in terms of vector-style programming. In NumPy the use of arrays of booleans is common:
>
>>>> from numpy import *
>>>> a = array([3,6,8,9])
>>>> a == 6
> array([False,  True, False, False], dtype=bool)
>>>> a >= 7
> array([False, False,  True,  True], dtype=bool)
>>>> a < 5
> array([ True, False, False, False], dtype=bool)
>>>> # count all the even numbers
>>>> sum( (a%2) == 0 )
> 2
>>>> b = array([2,6,7,10])
>>>> a == b
> array([False,  True, False, False], dtype=bool)
>>>> a < b
> array([False, False, False,  True], dtype=bool)
>
>
> They are sometimes used as masks, it's useful if you have a Vector type that supports multi-index syntax:
>
> i = scipy.array([0,1,2,1]) # array of indices for the first axis
> j = scipy.array([1,2,3,4]) # array of indices for the second axis
> a[i,j] # return array([a[0,1], a[1,2], a[2,3], a[1,4]])
> b = scipy.array([True, False, True, False])
> a[b] # return array([a[0], a[2]]) since only b[0] and b[2] are True
>
>
> Using the new CPU AVX registers you are able to perform a loop and work on the items of an array in parallel until all the booleans of an array are false. See this, expecially Listing 5:
>
> http://software.intel.com/en-us/articles/introduction-to-intel-advanced-vector-extensions/
>
> http://www.cs.uaf.edu/2011/spring/cs641/lecture/04_12_AVX.html
>
> Vector comparisons have a natural hardware implementataion with AVX/AVX2 instructions like _mm256_cmp_ps.
>
> Bye,
> bearophile

Hmm, I see your point, I think that with D's current operator
overloading you could implement most of that. Other than the
comparison syntax.

If vector comparison gets added, then there should be some very clear
documentation that it returns a vector, because I can imagine using it
in an if statement and then wondering why it always went through...


More information about the Digitalmars-d mailing list