C#并行处理选项



我正在尝试并行运行代码的一部分,我试图使用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);
    });
}

最新更新