[Spice-devel] [PATCH spice-gtk 3/4] quic: precompute golomb codes

Christophe Fergeau cfergeau at redhat.com
Wed Sep 11 02:12:35 PDT 2013


ACK

On Tue, Sep 10, 2013 at 04:43:38PM +0200, Marc-André Lureau wrote:
> From: Marc-André Lureau <marcandre.lureau at gmail.com>
> 
> We can avoid repetitive computation by using two precomputed array, of
> 4k each.
> ---
>  common/quic.c             | 25 ++++++++++++++++++++++++-
>  common/quic_family_tmpl.c | 22 +++++++++-------------
>  2 files changed, 33 insertions(+), 14 deletions(-)
> 
> diff --git a/common/quic.c b/common/quic.c
> index 3e7c802..c9c3624 100644
> --- a/common/quic.c
> +++ b/common/quic.c
> @@ -75,6 +75,9 @@ typedef struct QuicFamily {
>      unsigned int notGRsuffixlen[MAXNUMCODES];    /* indexed by code number, contains suffix
>                                                      length of the not-GR codeword */
>  
> +    unsigned int golomb_code_len[256][MAXNUMCODES];
> +    unsigned int golomb_code[256][MAXNUMCODES];
> +
>      /* array for translating distribution U to L for depths up to 8 bpp,
>      initialized by decorelateinit() */
>      BYTE xlatU2L[256];
> @@ -360,9 +363,22 @@ static void corelate_init(QuicFamily *family, int bpc)
>      }
>  }
>  
> +static void golomb_coding_slow(QuicFamily *family, const BYTE n, const unsigned int l,
> +                               unsigned int * const codeword,
> +                               unsigned int * const codewordlen)
> +{
> +    if (n < family->nGRcodewords[l]) {
> +        (*codeword) = bitat[l] | (n & bppmask[l]);
> +        (*codewordlen) = (n >> l) + l + 1;
> +    } else {
> +        (*codeword) = n - family->nGRcodewords[l];
> +        (*codewordlen) = family->notGRcwlen[l];
> +    }
> +}
> +
>  static void family_init(QuicFamily *family, int bpc, int limit)
>  {
> -    int l;
> +    int l, b;
>  
>      for (l = 0; l < bpc; l++) { /* fill arrays indexed by code number */
>          int altprefixlen, altcodewords;
> @@ -378,6 +394,13 @@ static void family_init(QuicFamily *family, int bpc, int limit)
>          family->notGRcwlen[l] = altprefixlen + ceil_log_2(altcodewords);
>          family->notGRprefixmask[l] = bppmask[32 - altprefixlen]; /* needed for decoding only */
>          family->notGRsuffixlen[l] = ceil_log_2(altcodewords); /* needed for decoding only */
> +
> +        for (b = 0; b < 256; b++) {
> +            unsigned int code, len;
> +            golomb_coding_slow(family, b, l, &code, &len);
> +            family->golomb_code[b][l] = code;
> +            family->golomb_code_len[b][l] = len;
> +        }
>      }
>  
>      decorelate_init(family, bpc);
> diff --git a/common/quic_family_tmpl.c b/common/quic_family_tmpl.c
> index 287ff6d..12ef62f 100644
> --- a/common/quic_family_tmpl.c
> +++ b/common/quic_family_tmpl.c
> @@ -34,26 +34,21 @@
>  #define BPC 5
>  #endif
>  
> +static inline unsigned int FNAME(golomb_code)(const BYTE n, const unsigned int l)
> +{
> +    return VNAME(family).golomb_code[n][l];
> +}
>  
> -static unsigned int FNAME(golomb_code_len)(const BYTE n, const unsigned int l)
> +static inline unsigned int FNAME(golomb_code_len)(const BYTE n, const unsigned int l)
>  {
> -    if (n < VNAME(family).nGRcodewords[l]) {
> -        return (n >> l) + 1 + l;
> -    } else {
> -        return VNAME(family).notGRcwlen[l];
> -    }
> +    return VNAME(family).golomb_code_len[n][l];
>  }
>  
>  static void FNAME(golomb_coding)(const BYTE n, const unsigned int l, unsigned int * const codeword,
>                                   unsigned int * const codewordlen)
>  {
> -    if (n < VNAME(family).nGRcodewords[l]) {
> -        (*codeword) = bitat[l] | (n & bppmask[l]);
> -        (*codewordlen) = (n >> l) + l + 1;
> -    } else {
> -        (*codeword) = n - VNAME(family).nGRcodewords[l];
> -        (*codewordlen) = VNAME(family).notGRcwlen[l];
> -    }
> +    *codeword = FNAME(golomb_code)(n, l);
> +    *codewordlen = FNAME(golomb_code_len)(n, l);
>  }
>  
>  static unsigned int FNAME(golomb_decoding)(const unsigned int l, const unsigned int bits,
> @@ -76,6 +71,7 @@ static unsigned int FNAME(golomb_decoding)(const unsigned int l, const unsigned
>  static void FNAME(update_model)(CommonState *state, s_bucket * const bucket,
>                                  const BYTE curval)
>  {
> +    spice_static_assert(BPC >= 1);
>      const unsigned int bpp = BPC;
>      COUNTER * const pcounters = bucket->pcounters;
>      unsigned int i;
> -- 
> 1.8.3.1
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20130911/595199a1/attachment.pgp>


More information about the Spice-devel mailing list