我目前正在实现一种并行算法,用于计算两个元素之间的最大差异,从而使较小的数字出现在较大的数字之前。我正在使用tbb库中的parallel_invoke实现此目的。我的实现如下
int calculateMaxDiff(int *src, int start, int end){
int maxVal = -1;
int maxRight = src[end -1];
for(int i = end - 2; i >= start; i--){
if(src[i] > maxRight){
maxRight = src[i];
}else{
int diff = maxRight - src[i];
if(diff > maxVal){
maxVal = diff;
}
}
}
return maxVal;
};
int compute_max_diff(int *src, int size)
{
int half1_diff;
int half2_diff;
parallel_invoke([&]{ half1_diff = calculateMaxDiff(src, 0, size/2);},
[&]{ half2_diff = calculateMaxDiff(src, size/2, size);});
int maxDiff = half1_diff + half2_diff;
return maxDiff;
}
现在对于上面的代码段,我将以下内容用作示例数组
int src[] = {12, 9, 18, 3, 7, 11, 6, 15, 6, 1, 10};
int size = 11;
对于上面的示例,输出或最大差异需要为12,但我似乎要达到18。我依次运行算法并获得了预期的结果。但是一旦我引入了parallel_invoke,我似乎就无法得到正确的结果。
最佳答案
您从上半部分(18-9)中得到9的总和为18,从下半部分(15-6)中得到9。当您顺序运行时,我假设您调用calculateMaxDif(src, 0, size)
会很好,因为它遍历数组的所有元素。但是,当您将两个函数一分为二时-它没有达到所需的对(3、15),因为上半部是3,而另一半是15。