[pypy-dev] Automatic SIMD vectorization

Richard Plangger planrichi at gmail.com
Tue Oct 20 11:11:08 EDT 2015


You're welcome. I forgot to mention that I'm happy to help if vec_all
crashes. So if you give it a shot and get stuck get in touch with me
here (or issues on bitbucket)!

Cheers,
Richard

On 10/20/2015 05:08 PM, Tuom Larsen wrote:
> Awesome, thank you!
> 
> On Tue, Oct 20, 2015 at 4:41 PM, Richard Plangger <planrichi at gmail.com> wrote:
>> Hi,
>>
>> glad you liked the post! See the answers below...
>>
>> On 10/20/2015 04:20 PM, Tuom Larsen wrote:
>>> Hello all!
>>>
>>> I just read with great interest the blog post "Automatic SIMD
>>> vectorization support in PyPy".
>>>
>>> Please, I have a few questions:
>>>
>>> - Does regular Python code benefit from the vectorization? I mean, the
>>> article on one hand says "it is not specifically targeted for the
>>> NumPy library" but on the other it says "Any interpreter (written in
>>> RPython)".
>>
>> Speaking about 'regular' Python code, there is potential !BUT! only if
>> enough time is spent in numeric code. What I meant in the article was:
>> E.g. you have a vector construct in your language (like the one the R
>> language has) you could use the optimization to vectorize operations on
>> the variables that represent.
>>
>> Take a look at my test virtual machine implementing a small subset of R.
>> https://bitbucket.org/plan_rich/vecopt-test-vm
>>
>>>
>>> - I would like to write a vector class as much suitable for PyPy as
>>> possible, what approach should I take in order to implement it? For
>>> example, what would suit PyPy JIT the best:
>>>
>>>     class Vector3d:
>>>         def __init__(a, x, y, z):
>>>             (a.x, a.y, a.z) = x, y, z
>>>         def __add__(a, b):
>>>             return Vector3d(a.x + b.x, a.y+b.y, a.z+b.z)
>>>
>>>     def add1(a, b):
>>>         (ax, ay, az) = a
>>>         (bx, by, bz) =  b
>>>         return [ax + bx, ay + by, az + bz]
>>>
>>>    def add2(a, b):
>>>         (ax, ay, az) = a
>>>         (bx, by, bz) =  b
>>>         return (ax + bx, ay + by, az + bz)
>>>
>>>     def add3((ax, ay, az), (bx, by, bz)):
>>>         return (ax + bx, ay + by, az + bz)
>>>
>>>     def add3:
>>>         ???
>>>
>>
>> I have made some tests with this already. You would need to use the
>> array module. Python lists would also work, but they leave behind some
>> instructions that are not well optimized. It is described in this post:
>>
>> http://pypyvecopt.blogspot.co.at/2015/08/gsoc-vec-little-brother-of-numpy-array.html
>>
>> The missing piece is then the --jit vec_all=1 parameter, that you must
>> specify on the command line.
>>
>> Be aware:
>>
>> 1) vec_all=1 parameter might lead to a crash, I have tested it, but it
>> occurred to me that it is not really ready for production. I'm still
>> working on this, thus it is disabled by default.
>>
>> 2) that with a very low number of vector elements (e.g 3) the overhead
>> to iterate the first iteration is quite significant. So I do not think
>> that there is much you can get just executing 1 vector add in parallel
>> on x86.
>>
>>> - Is NumPyPy going to be included with regular PyPy download/install?
>>>
>>
>> NumPyPy is included in a normal PyPy release version
>>
>>> Thanks a lot in advance!
>>> _______________________________________________
>>> pypy-dev mailing list
>>> pypy-dev at python.org
>>> https://mail.python.org/mailman/listinfo/pypy-dev
>>>
>>
>> Cheers,
>> Richard
>> _______________________________________________
>> pypy-dev mailing list
>> pypy-dev at python.org
>> https://mail.python.org/mailman/listinfo/pypy-dev
> _______________________________________________
> pypy-dev mailing list
> pypy-dev at python.org
> https://mail.python.org/mailman/listinfo/pypy-dev
> 


More information about the pypy-dev mailing list