omp redução no vetor de cv :: Mat ou cv :: Mat em geral
//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;
}
O resultado esperado é aumentar cada elemento de cada linha em um. Este é um exemplo de brinquedo, a soma real é muito mais complicada. Eu tentei paralelizar com:
#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;
}
Mas isso falha porque cada elemento de cada linha é inicializado aleatoriamente. Como posso resolver isso?
Então eu descobri que o problema está relacionado aesta. Então eu deveria inicializarmat
com:
std::vector<cv::Mat1f> mat(5);
for(size_t i=0; i<mat.size(); i++)
mat[i] = cv::Mat1f::zeros(1,n);
Mas isso criaria problemas comomp_priv = omp_orig
, pois considerariastd::vector<cv::Mat1f> mat(5);
e seus valores são indefinidos. Como posso resolver isso? A única solução que me veio à mente é criar uma estrutura de wrapper, algo como:
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;
};
Mas então o que devo implementar para fazê-lo funcionar com o restante do código?