On 12/28/2017 05:56 PM, Grazvydas Ignotas wrote:
> zlib provides a faster slice-by-4 CRC32 implementation than the
> traditional single byte lookup one used by mesa. As most supported
> platforms now link zlib unconditionally, we can easily use it.
> For small buffers the old implementation is still used as it's faster
> with cold cache (first call), as indicated by some throughput
> benchmarking (avg MB/s, n=100, zlib 1.2.8):
> 
>             i5-6600K                    C2D E4500
> size      mesa zlib                    mesa zlib
> 4           66   43 -35% +/- 4.8%        43   22 -49% +/- 9.6%
> 32         193  171 -11% +/- 5.8%       129   49 -61% +/- 7.2%
> 64         256  267   4% +/- 4.1%       171   63 -63% +/- 5.4%
> 128        317  389  22% +/- 5.8%       253   89 -64% +/- 4.2%
> 256        364  596  63% +/- 5.6%       304  166 -45% +/- 2.8%
> 512        401  838 108% +/- 5.3%       338  296 -12% +/- 3.1%
> 1024       420 1036 146% +/- 7.6%       375  461  23% +/- 3.7%
> 1M         443 1443 225% +/- 2.1%       403 1175 191% +/- 0.9%
> 100M       448 1452 224% +/- 0.3%       406 1214 198% +/- 0.3%
> 
> With hot cache (repeated calls) zlib almost always wins on both CPUS.
> It has been verified the calculation results stay the same after this
> change.
> 
> Signed-off-by: Grazvydas Ignotas <nota...@gmail.com>
> ---
>  src/util/crc32.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/src/util/crc32.c b/src/util/crc32.c
> index f2e01c6..0cffa49 100644
> --- a/src/util/crc32.c
> +++ b/src/util/crc32.c
> @@ -31,12 +31,20 @@
>   * 
>   * @author Jose Fonseca
>   */
>  
>  
> +#ifdef HAVE_ZLIB
> +#include <zlib.h>
> +#endif
>  #include "crc32.h"
>  
> +/* For small buffers it's faster to avoid the library call.
> + * The optimal threshold depends on CPU characteristics, it is hoped
> + * the choice below is reasonable for typical modern CPU.
> + */
> +#define ZLIB_SIZE_THRESHOLD 64

For the actual users of this function in Mesa, is it even possible to
pass less than 64 bytes (I'm assuming that's the units)?

>  
>  static const uint32_t 
>  util_crc32_table[256] = {
>     0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 
>     0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 
> @@ -112,10 +120,15 @@ uint32_t
>  util_hash_crc32(const void *data, size_t size)
>  {
>     const uint8_t *p = data;
>     uint32_t crc = 0xffffffff;
>   
> +#ifdef HAVE_ZLIB
> +   if (size >= ZLIB_SIZE_THRESHOLD && (uInt)size == size)
                                         ^^^^^^^^^^^^^^^^^^
This comparison is always true (unless sizeof(uInt) != sizeof(size_t)?).
 I'm not 100% sure what you're trying to accomplish here, but I think
you want 'size > 0'.  I'm not familiar with this zlib function, so I
don't know what it's expectations for size are.

> +      return ~crc32(0, data, size);
> +#endif
> +
>     while (size--)
>        crc = util_crc32_table[(crc ^ *p++) & 0xff] ^ (crc >> 8);
>     
>     return crc;
>  }
> 

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to