4

我的神经网络库有问题。它使用多线程来加快计算。但是在运行大约 30-60 秒后,我的程序不再使用 100% 的 i7 3610QM 4cores 8threads。

基本上我的处理看起来像(带有伪代码的c#)

for each training example t in training set
    for each layer l in neural network
        Parallel.For(0, N, (int i)=>{l.processForward(l.regions[i])})
    for each layer l in neural network (but with reversed order)
        Parallel.For(0, N, (int i)=>{l.backPropageteError(l.regions[i])})

其中区域是层的要处理的预先计算的神经元区域列表。每个区域的大小与当前层的 1/N 相同,因此任务大小相同,以最大限度地减少其他线程需要等待最长任务完成的机会。

就像我说的,这种处理方案仅在短时间内消耗了我的处理器的 100%,然后下降到大约 80-85%。在我的情况下,我将 N 设置为 Environment.ProcessorsCount (= 8);

如果有人愿意提供帮助,我可以共享整个代码/存储库。

我试图调查并创建了新的控制台项目,并在那里放置了几乎 Parallel.For() 的 Hello World,我根本不知道发生了什么。这可能是 Parallel.For() 的其他问题,但我也希望您解决这个问题。这是代码:

class Program
{
    static void Main(string[] args)
    {
        const int n = 1;

        while (true)
        {
            //int counter = 0; for (int ii = 0; ii < 1000; ++ii) counter++;

            Parallel.For(0, n, (int i) => { int counter = 0; for (int ii = 0; ii < 1000; ++ii) counter++; });
        }

    }
}

在这段代码中,我不断(while 循环)创建一个任务(n=1),它有一些工作要做(将计数器增加一千次)。据我所知,Parallel.For 阻止执行/等待所有并行调用完成。如果这是真的,它应该做与注释部分相同的工作(提供 n=1)。但是在我的电脑上,这个程序使用了 100% 的 CPU,就像有多个线程在工作一样!这怎么可能?当我切换到注释版本时,程序使用的 CPU 不到 20%,这是我所期望的。请帮助我理解这种行为。

4

1 回答 1

0

正如@TaW 所说,它们是并行的成本。这就是为什么f()Parallel.For(0, n, _ => f())不等价的原因。并行版本会导致线程调度和上下文切换。在您的情况下,执行时间f()与线程调度开销相当。这就是为什么并行版本会降低性能的原因。Parallel.For一定要等到操作完成,但完成如此之快,以至于在很短的时间内,多个线程在 CPU 上运行(请记住,每次调用Parallel.For它可能会选择不同的线程在其上运行f())在不同的 CPU 内核上。

至于问题的第一部分,我想问题在于传递给的索引范围Parallel.For。而不是[0,CPU核心数),它应该等于数据的索引范围。

于 2014-10-27T00:10:22.993 回答