我的神经网络库有问题。它使用多线程来加快计算。但是在运行大约 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%,这是我所期望的。请帮助我理解这种行为。