On 01/09/2012, James M. <jamesma...@gmail.com> wrote:
> Thanks for the quick reply.
> Why the setting of the top bit first?

This is just to ensure sufficient memory is allocated.

> I will certainly look into the mpn functions for implementation, as I keep
> all handling of mpir and calculation of the morton numbers restricted to
> the interior of a single class, even if it is tricky to get done I only
> need to do it once and any additional insanity will not propagate through
> my code.

If you are after absolutely optimal performance then it may be
worthwhile. Though you'll end up doing a lot of the bit setting by
hand I think.

> As for why I was mentioning the shifting was because if I have an
> d-dimensional point with n bits in each coordinate then the full
> calculation of a z-curve coordinate requires as follows:
> //this part actually happens in the constructor, the mpz_t is called index
> mpz_init2( index, (n*d) );
> //now for the actual morton number calculation
> for(int i=0; i<d; ++i)
> {
>     if( (coord[i] & 0x01ULL)==1 )
>     {
>         mpz_setbit( index, i );
>     }
>     for(int j=1; j<n; ++j)
>     {
>         if( ((coord[i]>>j)&0x01ULL)==1 )
>         {
>             mpz_setbit( index, (j*n+i) );
>         }
>     }
> }
>
> anyways this takes an average of n*d/2 mpz bitset operations plus (d-1)*n
> 64bit bit shifts plus d*n 64bit bitwise and plus d*n comparisons

Ah I see. I thought you meant you were doing multiple precision bitshifts.

>
> looking here:
> http://graphics.stanford.edu/~seander/bithacks.html#Interleave64bitOps and
> here: http://www.cs.indiana.edu/~dswise/Arcee/castingDilated-comb.pdf made
> me think that it must be possible to do better than this, though perhaps
> there are details coming from the internals of MPIR that I am unaware of.

Your code doesn't look too bad to me. Though with mpn's you could
combine the index calculations with the bitset indexing calculations
perhaps.

>
> As to the chopping out parts of MPIR I only asked because when I sent the
> early version of my code to a few people they complained a little about
> having to build and install the libraries and so I thought for a bit about
> cutting out what I did not need and simply compiling it with my code. This
> was just a thought though.
> --
> James

Bill.

>
> On Friday, August 31, 2012 11:20:23 PM UTC-4, Bill Hart wrote:
>>
>> The big problem with setting bits and shifting is that it is a
>> quadratic algorithm. It will be much slower than setting the
>> individual bits.
>>
>> The best idea would be to set the top bit first, then set the other bits.
>>
>>
>> The fastest method would use mpn's instead of mpz's, but this requires
>> considerably more work and may not be appropriate.
>>
>> As for cutting out portions of MPIR, this would be a massive job I am
>> afraid. I wouldn't recommend spending valuable time doing that.
>>
>> Bill.
>>
>> On 31/08/2012, James M. <james...@gmail.com <javascript:>> wrote:
>> > I am using MPIR to calculate Morton numbers or Z-curve indexes for high
>> >
>> > dimensional data for gamma-ray coincidence analysis. While not truly
>> meant
>> > for this, they work fantastically, so thank you very much for that.
>> > Anyways I was wondering a few things:
>> >
>> > First of all, does anyone have any suggestions for a a good way to write
>> >
>> an
>> >
>> > integer dilation function? As a quick, get it working, implementation I
>> >
>> > pretty much preallocate an mpz_class to the appropriate size and then
>> set
>> > each bit.
>> > Obviously this is... not optimal. So I have been looking at taking the
>> > coordinate value for each dimension, placing it into a preallocated
>> > mpz_class and adding zeros between the bits. If I do this for each
>> > dimension then all I have to do is a little bitshifting and addition to
>> >
>> get
>> >
>> > the Morton number. If anyone has suggestions or advice it would be
>> welcome.
>> >
>> > Second of all, all I use is the C++ integers portion of MPIR, mostly the
>> >
>> > bit manipulation in fact, how difficult is it to trim the source down to
>> >
>> > that? I don't really use all the super fancy bit of the integers either
>> >
>> but
>> >
>> > I realize that those would be harder trim out.
>> >
>> > Anyways, thanks for reading my possibly (probably) inane questions.
>> > --
>> > James M
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> Groups
>> > "mpir-devel" group.
>> > To view this discussion on the web visit
>> > https://groups.google.com/d/msg/mpir-devel/-/ZoSw11GEucoJ.
>> > To post to this group, send email to
>> > mpir-...@googlegroups.com<javascript:>.
>>
>> > To unsubscribe from this group, send email to
>> > mpir-devel+...@googlegroups.com <javascript:>.
>> > For more options, visit this group at
>> > http://groups.google.com/group/mpir-devel?hl=en.
>> >
>> >
>>
>
> --
> You received this message because you are subscribed to the Google Groups
> "mpir-devel" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/mpir-devel/-/ShaRIN_1_5oJ.
> To post to this group, send email to mpir-devel@googlegroups.com.
> To unsubscribe from this group, send email to
> mpir-devel+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/mpir-devel?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"mpir-devel" group.
To post to this group, send email to mpir-devel@googlegroups.com.
To unsubscribe from this group, send email to 
mpir-devel+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/mpir-devel?hl=en.

Reply via email to