//In other words, this equilavent to cv::Mat1f mat(5,n)
//i.e. a matrix 5xn
std::vector<cv::Mat1f> mat(5,cv::Mat1f::zeros(1,n));
std::vector<float> indexes(m);
// fill indexes
// m >> nThreads (from hundreds to thousands)
for(size_t i=0; i<m; i++){
mat[indexes[m]] += 1;
}
期待される結果は、各行の各要素を1ずつ増やすことです。これはおもちゃの例ですが、実際の合計はずっと複雑です。私はそれを並列化しようとしました:一般的にcv :: Matまたはcv :: Matのベクトル上でのompの減少
#pragma omp declare reduction(vec_float_plus : std::vector<cv::Mat1f> : \
std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<cv::Mat1f>())) \
initializer(omp_priv=omp_orig);
#pragma omp parallel for reduction(vec_float_plus : mat)
for(size_t i=0; i<m; i++){
mat[indexes[m]] += 1;
}
しかし、これは失敗します。これは、各行の各要素がランダムに初期化されているためです。これをどうすれば解決できますか?
この問題は、thisに関連していることがわかりました。だから私はとmat
を初期化する必要があります。
std::vector<cv::Mat1f> mat(5);
for(size_t i=0; i<mat.size(); i++)
mat[i] = cv::Mat1f::zeros(1,n);
しかし、それはstd::vector<cv::Mat1f> mat(5);
を検討すると、それは値が定義されていませんだから、これは、omp_priv = omp_orig
の問題を作成します。これをどうすれば解決できますか?
class vectMat{
public:
vectMat(size_t rows, size_t j){
for(size_t i=0; i<rows; i++)
mats.push_back(cv::Mat1f::zeros(1,j));
}
private:
std::vector<cv::Mat1f> mats;
};
しかし、その後、私はそれが残りのコードで動作するように実装する必要があります。私の心に来た唯一の解決策は、ラッパー構造を作成するようなものですか?
* "各行の各要素はランダムに非表示になっています" *とはどういう意味ですか? – Zulan
@Zulan前のケースでは、異なる行がリンクされていたので、最初のケースのように 'mat'を初期化できませんでしたが、' omp_priv = omp_orig'に問題がありますか? – justHelloWorld
@ Zulan私の質問を – justHelloWorld