Parallel.For, как получить количество потоков, которые используются в цикле? - PullRequest
1 голос
/ 26 марта 2019

У меня вопрос по поводу метода Parallel.For.

Я хочу провести сравнение между использованием от 1 до 4 потоков в алгоритме обработки изображений.Я настраиваю свой Parallel.For следующим образом:

        ParallelOptions po = new ParallelOptions();
        po.MaxDegreeOfParallelism = 4;

        Parallel.For(0, height - 1, po, y =>
        {
            int offset = y * stride; //row
            for (int x = 0; x < width - 1; x++)
            {
                //do stuff here
            }
         });

Время считается Stopwatch классом.

var stopwatch = Stopwatch.StartNew();
MethodWithParallelFor.Execute();
stopwatch.Stop();

Мой вопрос, почему, когда я настраиваю MaxDegreeOfParallelism влюбое значение (мой процессор имеет 8 потоков) я получаю точно такое же время?Когда я устанавливаю Degree в 1 или 4, я получаю одинаковое время выполнения.

Итак, как отладить Parallel.For для получения информации, сколько потоков запущено в моем цикле?Как заставить программу использовать столько потоков, сколько я хочу?При необходимости я могу поделиться с моим полным кодом

Я реализовал мою тестовую программу в c # 7.3 и WPF 4.6.2

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Если все, что вы хотите знать, - это сколько потоков одновременно работает в вашем Parallel.For, в любой момент времени вы можете использовать Interlocked.Increment и Interlocked.Decrement (в начале и в конце цикла), проверьтеесли значение в переменной больше, чем раньше, и вывести его после завершения Parallel.For, что-то вроде этого:

public void TestParallelism() {
    int maxThreads = 0;
    int currentThreads = 0;

    Parallel.For(0, 100, (i) => {

        var max = Interlocked.Increment(ref currentThreads);

        if (maxThreads < max) {
            maxThreads = max; 
        }

        // your code here...

        Interlocked.Decrement(ref currentThreads);
    });

    Console.WriteLine($ "Max Parallel Threads: {maxThreads}");
}
0 голосов
/ 27 марта 2019

Вы можете попробовать установить минимальные потоки на большее число. Для моей машины значение по умолчанию - 4.

ThreadPool.SetMinThreads(8, 8);

Также вы можете встроить в цикл a Console.WriteLine(y + " -> " + Thread.CurrentThread.ManagedThreadId), чтобы посмотреть, какой поток выполняет каждый цикл.

...