Hi David,

Not sure what you mean with a bit flip. Calculating CRC32 and then flipping the result in some way?

The polynomial used for multiplication is different so while, as with all CRCs, the algorithm is similar, but a different polynomial is used and the final checksum will be different.

The intrinsic that can be implemented for CRC32C will probably be even faster as it can make use of the specific crc32c instruction instead of using carry less multiplication.

I have also been thinking that using fork-join to help for large arrays. I decided to not go after it for this first implementation of the new API. The other question is if that should be something that is more explicit, similar to parallel streams, as not everyone might want/expect that the API to suddenly start using multiple threads to calculate the result.

Cheers,
Staffan

On 10/17/2014 02:06 PM, David Chase wrote:
See also: http://cr.openjdk.java.net/~drchase/7088419/webrev.01/

This is the version that was not coded as an intrinsic, that also included
fork/join.  The crazy Intel instructions are accessed from native code,
so you can get a feel for what the code looks like before it is converted
to an intrinsic.  There’s a certain amount of brain-hurt involved in the
fork/join code, but it works.

I’m still trying to figure out if the whole thing is just bit-flipped.

David

On 2014-10-17, at 4:50 PM, David Chase <david.r.ch...@oracle.com> wrote:

On 2014-10-17, at 2:53 PM, Staffan Friberg <staffan.frib...@oracle.com> wrote:

Fully agree that using Unsafe makes one sad.

I'm just about to send out a new webrev with Alan's and Peter's comments, once 
I have that done I will give using the NIO-Buffer API a second try to see if 
using IntBuffer and LongBuffer is able to achieve similar performance.

As I noted in my reply the second goal after adding this API will is to create 
intrinsics that make use of the crc32c instructions available on both x86 and 
SPARC which will bump the performance even further. So one thing I try to do is 
make sure the implementation makes it easy to do that without having to 
completely rewrite it again.
I’d like to review this, but it will take me a little bit of time.
Recall that I did a lot of work on CRC for Intel to take advantage
of the carryless multiply instructions for CRC32.

Reading the comments, if I understand this properly, the difference between
CRC32 and CRC32C is that CRC32C is just the bit or byte flip of CRC32 as
we currently compute it.   If so, wouldn’t it make more sense to not reinvent
that rather tricky wheel?  The code you have carefully written will run 
substantially
slower than CRC32 on recent Intel hardware (Haswell and newer in particular)
because there an intrinsic is already substituted.

Can you verify whether this bit/byte flipping equivalence holds, or not?

If we were interested in true peak performance, we’d also investigate
fork/join parallelism; I did this once and it worked just fine if you made the
block sizes large enough.

David


Reply via email to