[英]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
(例如: https : ConcurrentDictionary<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
計算Items
的Max()
(根據您的要求),或根據需要應用任何其他函數。
希望這會有所幫助。
您應該使用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.