用于计算最大差异的并行算法

时间:2016-11-03 02:49:27

标签: c++ c++11 tbb

我目前正在实施一种并行算法,用于计算两个元素之间的最大差异,使得较小的数字出现在较大的数字之前。我正在使用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 ,我似乎无法获得正确的结果。

1 个答案:

答案 0 :(得分:1)

你从上半场(18-9)得到18分为9分,从下半场得到9分(15-6)。当你按顺序运行时,我会假设你调用calculateMaxDif(src, 0, size)这会很好,因为它会遍历数组的所有元素。但是当你将两个函数分成两半时 - 它不会到达所需的对(3,15),因为3是在前半部分,15是在另一半。