[Numpy-discussion] moving forward around ABI/API compatibilities (was numpy 1.7.x branch)
Travis Oliphant
travis at continuum.io
Tue Jun 26 11:02:05 EDT 2012
>>
>> (I have not read the whole cython discussion yet)
>
> So here's the summary. It's rather complicated but also incredibly neat
> :-) And technical details can be hidden behind a tight API.
Could you provide a bit more context for this list. I think this is an important technology concept. I'd like to understand better how well it jives with Numba-produced APIs and how we can make use of it in NumPy.
Where exactly would this be used in the NumPy API? What would it replace?
>
> - We introduce a C-level metaclass, "extensibletype", which to each
> type adds a branch-miss-free string->pointer hash table. The ndarray
> type is made an instance of this metaclass, so that you can do
>
> PyCustomSlots_GetTable(array_object->ob_type)
>
> - The hash table uses a perfect hashing scheme:
>
> a) We take the lower 64 bits of md5 of the lookup string (this can be
> done compile-time or module-load-time) as a pre-hash "h".
>
> b) When looking up the table for a key with pre-hash "h", the index
> in the table is given by
>
> ((h >> table->r) & table->m1) ^ table->d[r & table->m2]
>
> Then, *if* the element is present, it will always be found on the first
> try; the table is guaranteed collisionless. This means that an expensive
> branch-miss can be avoided. It is really incredibly fast in practice,
> with a 0.5 ns penalty on my 1.8 GHz laptop.
>
> The magic is in finding the right table->r and table->d. For a 64-slot
> table, parameters r and d[0]..d[63] can be found in 10us on my machine
> (it's an O(n) operation). (table->d[i] has type uint16_t)
>
> (This algorithm was found in an academic paper which I'm too lazy to dig
> up from that thread right now; perfect hashing is an active research field.)
>
> The result? You can use this table to store function pointers in the
> type, like C++ virtual tables or like the built-in slots like
> tp_get_buffer, but *without* having to agree on everything at
> compile-time like in C++. And the only penalty is ~0.5 ns per call and
> some cache usage.
>
> Cython would use this to replace the current custom "cdef class" vtable
> with something more tools could agree on, e.g. store function pointers
> in the table with keys like
>
> "method:foo:i4i8->f4"
>
> But NumPy could easily store entries relating to its C API in the same
> hash table,
>
> "numpy:SHAPE"
>
> Then, the C API functions would all take PyObject*, look up the fast
> hash table on the ob_type.
>
> This allows for incredibly flexible duck typing on the C level.
This does sound very nice.
>
> PyArray_Check would just check for the presence of the C API but not
> care about the actual Python type, i.e., no PyObject_TypeCheck.
>
> Me and Robert have talked a lot about this and will move forward with it
> for Cython. Obviously I don't expect others than me to pick it up for
> NumPy so we'll see... I'll write up a specification document sometimes
> over the next couple of weeks as we need that even if only for Cython.
We will look forward to what you come up with.
Best regards,
-Travis
More information about the NumPy-Discussion
mailing list