diff options
author | Dylan Baker <[email protected]> | 2019-10-31 13:26:00 -0700 |
---|---|---|
committer | Dylan Baker <[email protected]> | 2019-11-11 18:53:45 +0000 |
commit | a8d941091f72923561a6c58b46ccb264b6a0e205 (patch) | |
tree | 5fbfa8bb608bfd5bb090740e1b0391451a68a281 /src | |
parent | 57acf921e28eebb76e22f9abb96008885ec44441 (diff) |
util: Use ZSTD for shader cache if possible
This allows ZSTD instead of ZLIB to be used for compressing the shader
cache.
On a 72 core system emulating skl with a full shader-db (with i965):
ZSTD:
1915.10s user 229.27s system 5150% cpu 41.632 total (cold cache)
225.40s user 10.87s system 3810% cpu 6.201 total (warm cache)
154M (235M on disk)
ZLIB:
2231.33s user 194.24s system 1899% cpu 2:07.72 total (cold cache)
229.15s user 10.63s system 3906% cpu 6.139 total (warm cache)
163M (244M on disk)
Tim Arceri sees (8 core ryzen and a full shader-db):
ZSTD:
2505.22 user 40.50 system 3:18.73 elapsed 1280% CPU (cold cache)
418.71 user 14.93 system 0:46.53 elapsed 931% CPU (warm cache)
454.3 MB (681.7 MB on disk)
ZLIB:
3069.83 user 40.02 system 4:20.13 elapsed 1195% CPU (cold cache)
425.50 user 15.17 system 0:46.80 elapsed 941% CPU (warm cache)
470.3 MB (701.4 MB on disk)
Reviewed-by: Eric Engestrom <[email protected]> (v1)
Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/util/disk_cache.c | 30 | ||||
-rw-r--r-- | src/util/meson.build | 1 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c index 0cd92ca2d5b..e5b21b9a79f 100644 --- a/src/util/disk_cache.c +++ b/src/util/disk_cache.c @@ -40,6 +40,10 @@ #include <inttypes.h> #include "zlib.h" +#ifdef HAVE_ZSTD +#include "zstd.h" +#endif + #include "util/crc32.h" #include "util/debug.h" #include "util/rand_xor.h" @@ -75,6 +79,9 @@ */ #define CACHE_VERSION 1 +/* 3 is the recomended level, with 22 as the absolute maximum */ +#define ZSTD_COMPRESSION_LEVEL 3 + struct disk_cache { /* The path to the cache directory. */ char *path; @@ -738,6 +745,23 @@ static size_t deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest, const char *filename) { +#ifdef HAVE_ZSTD + /* from the zstd docs (https://facebook.github.io/zstd/zstd_manual.html): + * compression runs faster if `dstCapacity` >= `ZSTD_compressBound(srcSize)`. + */ + size_t out_size = ZSTD_compressBound(in_data_size); + void * out = malloc(out_size); + + size_t ret = ZSTD_compress(out, out_size, in_data, in_data_size, + ZSTD_COMPRESSION_LEVEL); + if (ZSTD_isError(ret)) { + free(out); + return 0; + } + write_all(dest, out, ret); + free(out); + return ret; +#else unsigned char *out; /* allocate deflate state */ @@ -798,6 +822,7 @@ deflate_and_write_to_disk(const void *in_data, size_t in_data_size, int dest, (void)deflateEnd(&strm); free(out); return compressed_size; +# endif } static struct disk_cache_put_job * @@ -1059,6 +1084,10 @@ static bool inflate_cache_data(uint8_t *in_data, size_t in_data_size, uint8_t *out_data, size_t out_data_size) { +#ifdef HAVE_ZSTD + size_t ret = ZSTD_decompress(out_data, out_data_size, in_data, in_data_size); + return !ZSTD_isError(ret); +#else z_stream strm; /* allocate inflate state */ @@ -1089,6 +1118,7 @@ inflate_cache_data(uint8_t *in_data, size_t in_data_size, /* clean up and return */ (void)inflateEnd(&strm); return true; +#endif } void * diff --git a/src/util/meson.build b/src/util/meson.build index 972d757195a..a7990ad52cc 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -149,6 +149,7 @@ deps_for_libmesa_util = [ dep_atomic, dep_m, dep_valgrind, + dep_zstd, ] if with_platform_android |