我对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
设置为任何值(我的CPU有8个线程)时,我得到的时间完全相同?当我将Degree
设置为1或4时,我得到相同的执行时间。
那么,如何调试Parallel.For
以获得信息,循环中有多少个线程正在运行?如何强制程序使用我想要的那么多线程?如果需要,我可以分享我的完整代码
我在c#7.3和WPF 4.6.2中实现了我的测试程序
答案 0 :(得分:1)
如果您只想知道并行运行了多少个线程,对于任何给定时间,您都可以使用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}");
}
答案 1 :(得分:0)
您可以尝试将minimum threads设置为更高的数字。对于我的机器,默认值为4。
ThreadPool.SetMinThreads(8, 8);
您还可以在循环中嵌入Console.WriteLine(y + " -> " + Thread.CurrentThread.ManagedThreadId)
,以观察哪个线程正在执行每个循环。