Reputation: 1527
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;
}
Upvotes: 0
Views: 105
Reputation: 22122
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;
}
Upvotes: 1
Reputation: 7918
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.
Upvotes: 1