2016-05-20 16 views
0

の第二の右辺引数にconst性私はparallel_reduceを使用して並列にビルドで周りのヒストグラムをプレイしています:ラムダ形式:: parallel_reduce:機能を減らす

#include "stdint.h" 
#include "tbb/tbb.h" 
#include <algorithm> 
#include <vector> 
#include <functional> 
#include <iostream> 
#include <numeric> 


void buildhistogram(const uint8_t *inputImage, const size_t numElements, double *outputHist){ 

    auto range = tbb::blocked_range<size_t>(0,numElements); 
    auto buildHistogramFcn = [&](const tbb::blocked_range<size_t>& r, const std::vector<double>& initHist){ 
          std::vector<double> localHist(initHist); 
          for (size_t idx = r.begin(); idx != r.end(); ++idx){ 
           localHist[inputImage[idx]]++; 
          } 
          return localHist; 
}; 

auto reductionFcn = [&](const std::vector<double>& hist1, const std::vector<double>& hist2){ 
    std::vector<double> histOut(hist1.size()); 
    std::transform(hist1.begin(),hist1.end(),hist2.begin(),histOut.begin(),std::plus<double>()); 
    return histOut; 
}; 

std::vector<double> identity(256); 
auto output = tbb::parallel_reduce(range, identity, buildHistogramFcn, reductionFcn); 

std::copy(output.begin(),output.end(),outputHist); 
} 

私の質問は、ラムダ内のFuncの定義に関するparallel_reduceの形式。あなたは、Intelのドキュメントを見れば:

https://software.intel.com/en-us/node/506154

彼らがいるのconstとしてのFuncの二RHS引数を文書化:

Value Func::operator()(const Range& range, const Value& x) 

をしかし、あなたは彼らのサンプルコードを見れば、彼らは例を定義します二RHSは非constで、実際に彼らは、この変数変更と返す場所:私は変数を宣言しようとした場合

auto intelExampleFcn = [](const blocked_range<float*>& r, float init)->float { 
     for(float* a=r.begin(); a!=r.end(); ++a) 
      init += *a; 
     return init; 
    }; 

を「initHist」として非constであることと、ローカルコピーを割り当て、返さずに直接このメモリで動作:

/tbb/include/tbb/parallel_reduce.h:322:24:

auto buildHistogramFcn = [&](const tbb::blocked_range<size_t>& r, std::vector<double>& initHist){ 
         for (size_t idx = r.begin(); idx != r.end(); ++idx){ 
          initHist[inputImage[idx]]++; 
         } 
         return initHist; 
}; 

私は、コンパイル・エラーが発生します:エラー:タイプ 'const(ラムダat buildhistogramTBB.cpp:16:30)のオブジェクトの呼び出しのための一致する関数はありません' my_value = my_real_body(範囲、const_cast(my_value));

私は、lambdaの2番目のRHS引数が実際には非constであるかどうかに興味があります。なぜなら、私はベクトルのコピーをinit引数からローカル変数にコピーすることを避けたいと思っています。私は返す。

私は何かを誤解していますか、またはインテルの例が間違っていますか?

+0

* "変数" init "を非constとして宣言しようとすると" *あなたは実証できますか? –

+0

私の例では、constHostogramFcnの非const第2 RHS引数形式を示すために編集されています。明快さの欠如に対する謝罪。 –

答えて

1

Intelの例で2番目の「非const」引数が値渡しされています。 initHistベクトルを(参照ではなく)値渡しする場合は、constも必要ありません。

+0

そうです。ありがとうございました。 –