]> granicus.if.org Git - xz/commitdiff
Docs: Use lzma_cputhreads() in 04_compress_easy_mt.c.
authorLasse Collin <lasse.collin@tukaani.org>
Sun, 21 Dec 2014 16:58:44 +0000 (18:58 +0200)
committerLasse Collin <lasse.collin@tukaani.org>
Sun, 21 Dec 2014 16:58:44 +0000 (18:58 +0200)
doc/examples/04_compress_easy_mt.c

index 121d3b1103aaf50d9580809fc8e3f42a078ece5c..efe56975cd5ea74a186d56ea1d31b44e94cf64f8 100644 (file)
@@ -31,10 +31,6 @@ init_encoder(lzma_stream *strm)
                // No flags are needed.
                .flags = 0,
 
-               // Set the number of threads to use.
-               // FIXME: Add how to autodetect a reasonable number.
-               .threads = 4,
-
                // Let liblzma determine a sane block size.
                .block_size = 0,
 
@@ -57,6 +53,32 @@ init_encoder(lzma_stream *strm)
                .check = LZMA_CHECK_CRC64,
        };
 
+       // Detect how many threads the CPU supports.
+       mt.threads = lzma_cputhreads();
+
+       // If the number of CPU cores/threads cannot be detected,
+       // use one thread. Note that this isn't the same as the normal
+       // single-threaded mode as this will still split the data into
+       // blocks and use more RAM than the normal single-threaded mode.
+       // You may want to consider using lzma_easy_encoder() or
+       // lzma_stream_encoder() instead of lzma_stream_encoder_mt() if
+       // lzma_cputhreads() returns 0 or 1.
+       if (mt.threads == 0)
+               mt.threads = 1;
+
+       // If the number of CPU cores/threads exceeds threads_max,
+       // limit the number of threads to keep memory usage lower.
+       // The number 8 is arbitrarily chosen and may be too low or
+       // high depending on the compression preset and the computer
+       // being used.
+       //
+       // FIXME: A better way could be to check the amount of RAM
+       // (or available RAM) and use lzma_stream_encoder_mt_memusage()
+       // to determine if the number of threads should be reduced.
+       const uint32_t threads_max = 8;
+       if (mt.threads > threads_max)
+               mt.threads = threads_max;
+
        // Initialize the threaded encoder.
        lzma_ret ret = lzma_stream_encoder_mt(strm, &mt);