2016-11-03 14 views
0

現在、2つの要素の最大の差を計算するための並列アルゴリズムを実装しています。私はこれを達成するためにtb30ライブラリから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である必要があるが、私が見えるように、私の実装であります私はアルゴリズムを逐次実行し、期待される結果を得ました。しかし、私が一度紹介したらparallel_invoke私は正しい結果を得ていないようです。

+0

これは並列性の非効率的な使用のように思われる –

+0

ですが、私はparallel_invokeを使用するのに制限があります。なぜ出力がオフになっているのですか? – RRP

+0

並列を実行する前に、2つの半分のアルゴリズムを連続的に試してください。つまり、parallel_invoke/lambdaの定型文を消去して、calculateMaxDiffを2回連続して呼び出します。何を手に入れますか?また、デバッグした後、アルゴリズムがこの4要素入力{0、0、100、100}をどのように処理するかを検討することもできます。 –

答えて

1

前半(18-9)と後半(9-6)から9の合計が18になります。シーケンシャルに実行すると、calculateMaxDif(src, 0, size)を呼び出すと仮定します。これは、配列のすべての要素を通過するため、うまくいきます。しかし、2つの関数を半分で呼び出すと、必要なペア(3、15)に達しません。これは、3が前半にあり、15が別のものにあるからです。

+0

あなたは正しいそれぞれのサブ問題は異なるペアリングと異なる最大差分を持つので、私はペア(3,15)を得るためにロジックを変更する必要があると言うでしょう。 – RRP

+0

2つのプロセスに対して厳しい要件がある場合は、前半からの最小値、右半分からの最大値、および左の最大差分、右からの最大差分、最大右から左への差分の3つの値を保存することができます –

+0

あなたは、私は左から右と最小値から最大値を取得する必要があると言っている。しかし、正確にここでこれは正確に何ですか – RRP

関連する問題