目前我正致力于将图像处理算法平行化以从给定图像中提取边缘。我最近开始使用代码并行化。
无论如何,程序的一部分要求我计算图像的直方图,并计算从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
我没有运气。也许我在那里做错了什么。对此主题的任何帮助将不胜感激。