0

I just started to learn about the Parallel.For() in c# and I have a function that doing something and I don't know how to adjust it to be Parallel. Can any anybody show me an example of such similar case?

Update:

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;
    }
}

Update: this is my tryings but something is going wrong ...

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;
    }
axcelenator
  • 1,497
  • 3
  • 18
  • 42

2 Answers2

1

For your purpose I would suggest to use a ConcurrentDictionary<int,double>dictPower similar to the following sample(re: https://msdn.microsoft.com/en-us/library/dd287191%28v=vs.110%29.aspx)

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

(where concurrency level typically equal the number of CPU cores) and modify your code correspondingly: instead of

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

use:

dictPower.Add(i,power)

Upon completion of that Parallel.For loop, just calculate the Max() of Items in dictPower (as per your requirement), or apply any other function upon necessity.

Hope this may help.

Alexander Bell
  • 7,842
  • 3
  • 26
  • 42
1

You should use Parallel.For overload that allows you to have thread local state, where you can keep your current maximum value.

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;
}
user4003407
  • 21,204
  • 4
  • 50
  • 60