Как оптимизировать загрузку процессора до 100% с помощью многопоточного архиватора GZip? - PullRequest
0 голосов
/ 03 марта 2019

Я работаю над многопоточным архиватором файлов уже неделю, он работает исключительно на чистых потоках.Синхронизация достигается мониторами и AutoResetEvent.Я распределил количество потоков по числу ядер:

public static int GetCoreCount()
        {
            int coreCount = 0;
            foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
            {
                coreCount += int.Parse(item["NumberOfCores"].ToString());
            }
            return coreCount;
        }

Но это загружает мой процессор максимум ~ 65%.И эта нагрузка далеко не равномерна, она постоянно падает и поднимается.Скажи мне.У кого-нибудь есть идеи, как использовать 100% процессорные возможности?Это мой код Run ():

 public void Run()
        {
            var readingThread = new Thread(new ThreadStart(ReadInFile));
            var compressingThreads = new List<Thread>();
            for (var i = 0; i < CoreManager.GetCoreCount(); i++)
            {
                var j = i;
                ProcessEvents[j] = new AutoResetEvent(false);
                compressingThreads.Add(new Thread(() => Process(j)));
            }
            var writingThread = new Thread(new ThreadStart(WriteOutFile));

            readingThread.Start();

            foreach (var compressThread in compressingThreads)
            {
                compressThread.Start();
            }

            writingThread.Start();

            WaitHandle.WaitAll(ProcessEvents);
            OutputDictionary.SetCompleted();

            writingThread.Join();

1 Ответ

0 голосов
/ 04 марта 2019

Невозможно сказать, что ограничивает использование вашего ядра без профилирования, а также знать, сколько данных вы сжимаете в своем тесте.

Однако я могу сказать, что для получения хорошей эффективности, которая включает в себякак полное использование ядра, так и близкое к коэффициенту n ускорение для n потоков в одном потоке, в pigz Я должен создать пулы потоков, которые всегда естьлибо работает, либо ждет больше работы.Это огромное влияние на создание и уничтожение потоков для каждого куска данных, которые будут обработаны.У меня также есть пулы предварительно выделенных блоков памяти по той же причине.

Может помочь исходный код по ссылке, в C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...