我正在尝试使用openmp并行化我的代码。我设法并行化了大部分代码,除了一部分。根据我的知识,以下部分不能并行化,但我想有不同的意见。任何建议,将不胜感激。如果可能的话,内部2 for循环可以并行化,这将是很好的。
for (o = 0; o < octaves; ++o)
for ( i = 0; i <= 1; ++i)
{
b = responseMap.at(filter_map[o][i]);
m = responseMap.at(filter_map[o][i+1]);
t = responseMap.at(filter_map[o][i+2]);
// loop over middle response layer at density of the most
// sparse layer (always top), to find maxima across scale and space
for ( r = 0; r < t->height; ++r)
{
for (c = 0; c < t->width; ++c)
{
if (isExtremum(r, c, t, m, b))
{
interpolateExtremum(r, c, t, m, b);
}
}
}
}
答案 0 :(得分:1)
我们在这里看到:r
和c
是循环内的局部变量。 t
,m
和b
似乎是内部循环的只读共享状态。如果isExtremum
和interpolateExtremum
是纯函数(它们不会产生副作用),那么你可以安全地在内循环上拍一个parallel for
:
#pragma omp parallel for private(r, c)
for ( r = 0; r < t->height; ++r)
{
for (c = 0; c < t->width; ++c)
{
if (isExtremum(r, c, t, m, b))
{
interpolateExtremum(r, c, t, m, b);
}
}
}