簡體   English   中英

在C#中為Parallel For調整功能

[英]Adjust a function for Parallel For in c#

我剛剛開始學習c#中的Parallel.For(),並且我有一個函數在做一些事情,但我不知道如何將其調整為Parallel。 有人可以給我看這樣的例子嗎?

更新:

for (int i = 0; i < (samples32array.Length); i += 35) //Delimiter Samples Length = SampleRate*DelimiterTimeLength,( i.e: 44100*0.2=8820 samples)
{
    if ((i + (int)DelimiterSamplesCount - 1) > samples32array.Length)
    {
                    break;
    }
    double power = MyGoertzel.GoertzelFilter(samples32array, i, i + (int)DelimiterSamplesCount - 1, coeffDelimiter);
    if (power > max_power)
    {
        max_power = power;
        max_power_index = i;
    }
}

更新:這是我的嘗試,但是出了點問題...

private int delimiter_search_Parallel(float[] samples32array, int DelimiterSamplesCount, double DelimiterFreq)
    {
        double normalizedfreqDelimiter = DelimiterFreq / 44100;
        double coeffDelimiter = 2 * Math.Cos(2 * Math.PI * normalizedfreqDelimiter);
        double max_power = 0;
        int max_power_index = 0;
        List<double> powerParallelList = new List<double>();
        List<int> powerParallelListIndex = new List<int>();
        Parallel.For(0, samples32array.Length, (i, loopState) =>
            {
                if ((i + (int)DelimiterSamplesCount - 1) > samples32array.Length)
                {
                    //TODO -> Genereate a Windows with ERROR Exception
                    loopState.Stop();
                    return;
                }
                else
                {
                    double power = MyGoertzel.GoertzelFilter(samples32array, i, i + (int)DelimiterSamplesCount - 1, coeffDelimiter);
                    powerParallelList.Add(power);
                    powerParallelListIndex.Add(i);
                }
            }
            );
        max_power = powerParallelList.Max();
        max_power_index = powerParallelListIndex[powerParallelList.IndexOf(max_power)];
        return max_power_index;
    }

為了您的目的,我建議使用類似於以下示例的ConcurrentDictionary<int,double>dictPower (例如: httpsConcurrentDictionary<int,double>dictPower 。 aspx

 // dictionary with the desired concurrencyLevel and initialCapacity
 ConcurrentDictionary<int, double> cd = new ConcurrentDictionary<int, double>(concurrencyLevel, initialCapacity);

(並發級別通常等於CPU內核數)並相應地修改代碼:

powerParallelList.Add(power);
powerParallelListIndex.Add(i);

采用:

dictPower.Add(i,power)

完成Parallel.For循環后,只需在dictPower計算ItemsMax() (根據您的要求),或根據需要應用任何其他函數。

希望這會有所幫助。

您應該使用Parallel.For重載,該重載允許您擁有線程本地狀態,您可以在其中保持當前的最大值。

private int delimiter_search_Parallel(float[] samples32array,int DelimiterSamplesCount,double DelimiterFreq) {
    if(samples32array.Length%35<DelimiterSamplesCount-1) {
        //TODO -> Genereate a Windows with ERROR Exception
    }
    double normalizedfreqDelimiter=DelimiterFreq/44100;
    double coeffDelimiter=2*Math.Cos(2*Math.PI*normalizedfreqDelimiter);
    object lockObject=new object();
    Tuple<double,int> result=null;
    Parallel.For(0,(samples32array.Length-(DelimiterSamplesCount-1))/35+1,() => (Tuple<double,int>)null,(i,loopState,max) => {
        i*=35;
        double power=MyGoertzel.GoertzelFilter(samples32array,i,i+(int)DelimiterSamplesCount-1,coeffDelimiter);
        return max==null||power>max.Item1?Tuple.Create(power,i):max;
    },max => {
        if(max!=null) {
            lock(lockObject) {
                if(result==null||max.Item1>result.Item1) {
                    result=max;
                }
            }
        }
    });
    return result.Item2;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM