tbb不使用互斥锁的向量元素的增量数

时间:2017-03-21 12:49:19

标签: c++ image-processing tbb

目前我正致力于将图像处理算法平行化以从给定图像中提取边缘。我最近开始使用代码并行化。

无论如何,程序的一部分要求我计算图像的直方图,并计算从1到最大梯度强度的出现像素数。

我已将其实施如下:

tbb::concurrent_vector<double> histogram(32768);

tbb::parallel_for(tbb::blocked_range<size_t>(1, width - 1),
    [&](const tbb::blocked_range<size_t>& r)
{
    unsigned int idx;
    for (size_t w = r.begin(); w != r.end(); ++w) //1 to (width -1)
    {
        for (size_t h = 1; h < height - 1; ++h)
        {
            idx = h * width + w;

            //DO SOME STUFF BEFORE

            //Get max gradient intensity
            if (pgImg[idx] > maxGradIntensity)
            {
                maxGradIntensity = pgImg[idx];
            }
            //Get histogram information
            if (pgImg[idx] > 0)
            {
                tbb::mutex::scoped_lock sync(locked);
                ++histogram[(int)pgImg[idx]];
                ++totalGradPixels;
            }
        }
    }
});
histogram.resize(maxGradIntensity);

因此对我来说变得棘手的部分如下:

if (pgImg[idx] > 0)
{
    tbb::mutex::scoped_lock sync(locked);
    ++histogram[(int)pgImg[idx]];
    ++totalGradPixels;
}

如何避免使用tbb::mutex?将矢量设置为tbb::atomic我没有运气。也许我在那里做错了什么。对此主题的任何帮助将不胜感激。

0 个答案:

没有答案