我正在尝试并行运行代码的一部分,我试图使用c#中的螺纹池来避免任何头痛,但是看来我问的太多了池,我的代码实际上运行较慢!
下面的代码解释了我要做的事情,我有许多音频样本(取决于512-> 4096的缓冲区大小(,需要插入,传播和从节点传播和读取(n =任何地方4至n = 16(在延迟网络中。这必须按样本基础上的样本进行,因此我唯一的优化选择是扮演插入/传播/读取的部分,并为网络中存在的每个节点具有并行操作。该操作是每个游戏框架一次调用的,并且需要在游戏的使用寿命中。查看探查器的散射操作需要大量时间,因此这是一个很好的候选者(我已经进行了传统优化(。目前,我让ThreadPool工人在一个工作项目中为所有节点做这项工作,只是为了启动和运行,但稍后可以分开工作。
我认为,以下代码的问题是将工作项插入到线程池中的频率,我还阅读了某个地方,这些线程需要一段时间才能旋转,因此,如果ThreadPool创建更多,则不会对NECCSERSERSERSERSSERSERS。是否有人对其他并行处理方法有任何建议,或者我的ThreadPool实现可能会发现任何错误?
public void propagateNetwork() {
int numSampsToConsume = Mathf.min(inSamples.Count,buffersize);
for (int i = 0; i < numSampsToConsume; i++) {
outVal = 0.0f;
inVal = inSamples.Dequeue () * networkInScale;
directDelay.write (inVal);
directVal = directDelay.read ();
directVal *= directAtt;
for (j = 0; j < network.Count; j++) {
outVal += network [j].getOutgoing ();
network [j].inputIncoming (inVal);
}
ThreadPool.QueueUserWorkItem (scatteringThreadPoolWrapper);
scatteringThreadDone.WaitOne ();
outVal += directVal;
outSamples.Enqueue (outVal);
}
}
public void scatteringThreadPoolWrapper(object threadConext) {
doScatteringForNodeRange (0, network.Count);
}
public void doScatteringForNodeRange(int min,int max) {
for (int i = min; i < max; i++) {
network[i].doScattering (doLateReflections);
}
scatteringThreadDone.Set ();
}
也许使用 Parallel.for
会起作用吗?我在每个循环迭代中进行了一些本地变量,但是我不知道操作在做什么,以及如果并行运行,这可能会导致问题。
public void propagateNetwork() {
int numSampsToConsume = Mathf.min(inSamples.Count,buffersize);
Parallel.for(0, numSampsToConsume, i => {
var outVal = 0.0f;
var inVal = inSamples.Dequeue () * networkInScale;
directDelay.write (inVal);
var directVal = directDelay.read ();
directVal *= directAtt;
Parallel.for(0, network.Count, j => {
outVal += network [j].getOutgoing ();
network [j].inputIncoming (inVal);
});
doScatteringForNodeRange (0, network.Count);
outVal += directVal;
outSamples.Enqueue (outVal);
});
}