Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: kinosearch: discuss

Indirect dispatch a success

 

 

kinosearch discuss RSS feed   Index | Next | Previous | View Threaded


marvin at rectangular

Nov 7, 2007, 12:50 PM

Post #1 of 1 (784 views)
Permalink
Indirect dispatch a success

[cross posted to the KinoSearch and Lucy dev lists]

Greets,

Indirect dispatch is now a part of KinoSearch as of revision r2610.

Method calls look like they did before:

HitQ_Insert(hit_q, score_doc);

But the macros have changed:

/* Before */
#define Kino_HitQ_Insert(self, element) \
(self)->_->insert((kino_PriorityQueue*)self, element)

/* After */
#define Kino_HitQ_Insert(self, element) \
(((kino_PriQ_insert_t)((self)->_->methods
[Kino_HitQ_Insert_OFFSET])) \
((kino_PriorityQueue*)self, element))

This is how the generated assembler for that macro looks, approximately.

movl (%eax), %edx # Load HitQueue
object
# into %edx.
movl Kino_HitQ_Insert_OFFSET [at] GO(%ebx), %eax # Load Global
Offset Table
# pointer
entry for
#
method_OFFSET into %eax.
movl (%eax), %eax # Dereference
method_OFFSET,
# loading its
value into
# %eax.
movl 20(%edx,%eax,4), %eax # Add the
address of
# self->_-
>methods to %eax,
# which will
then hold the
# address of a
pointer to
#
kino_HitQ_insert.

A few more instructions must be executed compared with before.
However, I can detect no impact on performance using the indexing
benchmark script, even after changing InStream and OutStream from
FINAL_CLASS to CLASS so that their methods go through the dispatch
table rather than resolve to function addresses. I speculate that
because all the extra instructions are pipeline-able, they're nearly
indistinguishable from free.

It turns out to be possible to avoid bootstrapping under GCC, but I
haven't yet come up with a portable hack. The problem is that while
you can fake flexible arrays on just about any compiler using
last_element[1] instead of last_element[], static initialization is a
bugaboo. For now I've gone with the static approach, but it warns
under -pedantic and will probably need to be changed.

To recap, the rationale for this mod is that it removes vtables as a
source of potential binary incompatibility should a C API be published.

Marvin Humphrey
Rectangular Research
http://www.rectangular.com/



_______________________________________________
KinoSearch mailing list
KinoSearch [at] rectangular
http://www.rectangular.com/mailman/listinfo/kinosearch

kinosearch discuss RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.