[Openmcl-devel] Non Blocking Nearly Wait Free Hash Table questions...
Jon S. Anthony
j-anthony at comcast.net
Mon Jan 11 07:28:30 PST 2010
On Mon, 2010-01-11 at 09:47 -0500, Gail Zacharias wrote:
> At 1/9/2010 04:23 PM, Jon S. Anthony wrote:
> >Hi,
> >
> >Gail, if you see this I would guess you would be the one most likely to
> >know. My understanding is that you were the one to implement these
> >things in CCL a year and half ago or so. Anyway,
> >
> >Let's suppose for a particular scenario, you have a perfect hash, H, for
> >a set of potential objects that covers an exact range from 0 to n. So,
> >there are n+1 objects and (H Oi) is in {0, ..., n-1}, and is unique for
> >any given Oi.
> >
> >We have a hashtable HT of size n which uses H.
> >
> >For the sake of what follows, let's say H takes "about the same" many
> >cycles as say INCF.
> >
> >Since, H is perfect for our hashing, comparison function just checks
> >that the object is an Oi and that this is an O(1) operation with cycles
> >again in the incf range
> >
> >We have a simple array A of size n.
> >
> >1. What would be the expected relative performance (more or less) of HT
> >compared to a simple index into A?
>
> It depends on which operation you care about. When there is no
> contention, the cost of gethash is pretty comparable. Puthash
> is quite a bit more expensive, and there are other costs if
> you're using address-based keys.
OK. We can set aside the address based key issue as that isn't in the
cards. Does puthash still need to use some locking under some
conditions? I guess I should look over the state machine concept here
more closely and try to understand the details...
> >2. How about for a locking version of A: grab a lock on A and then
> >index?
> >
> >
> >I'm thinking that 1. will be something like "nearly the same for most
> >cases" (nearly wait free part). And that for 2, HT will be much better
> >than locking version of A.
>
>
> Locks are pretty expensive. For gethash, yes, HT should do much better.
That fits with what I was thinking.
> However, why would you need to grab a lock for array access? Hash
> tables have a thread issue because they have two words (key and
> value) that need to be coordinated. But arrays don't. What's the lock for?
That arises out of a granularity consideration. The array would have
the O's in it and they may change (including creation). You could put a
lock on every O, but that would miss the case where an O is in process
of being created and array not yet updated indicating existence.
Let's set that aside for a moment. I would have thought that just
accessing the array elements, even if they are the entire "object" of
interest - say just fixnums, could be a locking issue if more than one
thread has access to the array. Are you saying array element update,
(setf (aref A i) x), is an atomic operation in CCL? That would lend
itself (in my case) to an even better solution!
Thanks!
/Jon
>
>
>
> >Many thanks for any insights!
> >
> >/Jon
> >
> >_______________________________________________
> >Openmcl-devel mailing list
> >Openmcl-devel at clozure.com
> >http://clozure.com/mailman/listinfo/openmcl-devel
>
More information about the Openmcl-devel
mailing list