作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我实现了两个不同的函数来将双位数舍入为整数。
这是第一个函数
static inline int round_v1(double value)
{
int t;
__asm
{
fld value;
fistp t;
}
return t;
}
这是第二个函数
static inline int round_v2(double value)
{
double intpart, fractpart;
fractpart = modf(value, &intpart);
if ((fabs(fractpart) != 0.5) || ((((int)intpart) % 2) != 0))
return (int)(value + (value >= 0 ? 0.5 : -0.5));
else
return (int)intpart;
}
这两个函数都可以在单线程中很好地工作,但是第二个不能在多线程中工作(使用 openMP)。当我使用第二个程序时,程序就崩溃了。这是调用 round_v1
或 round_v2
函数的主要代码。
void
BilateralFilter_Invoker::doFilter() const
{
if (!src || !dst) return;
int i, j;
int src_width = width + (radius << 1);
omp_set_num_threads(2);
#pragma omp parallel for
for (i = 0; i < height; ++i)
{
unsigned char* pSrc = src + (i+radius)*src_step + radius;
unsigned char* pDst = dst + i*dst_step;
for (j = 0; j < width; ++j)
{
float sum = 0.f, wsum = 0.f;
int val0 = pSrc[j];
for (int k = 0; k < maxk; ++k)
{
int val = pSrc[j + space_offset[k]];
float w = space_weight[k] * color_weight[std::abs(val-val0)];
sum += val * w;
wsum += w;
}
//pDst[j] = (unsigned char)round_v2(sum / wsum);
pDst[j] = (unsigned char)round_v1(sum / wsum);
}
}
}
变量src
, dst
, height
, width
, src_step
, dst_step
, radius
, maxk
, space_offset
, space_weight
, color_weight
是类 BilateralFilter_Invoker 的成员变量。
我分别调用round_v1
和round_v2
进行测试,只有调用round_v2
时程序崩溃。请问是不是 modf(double, double*)
函数导致了这个问题。为了进一步测试,我评论了这一行
fractpart = modf(value, &intpart);
并将其替换为
fractpart = intpart = value;
我再次运行该程序,它没有再次崩溃。我不知道 modf(double, double*)
是否会导致这个问题。或者可能是我的代码有问题而不是 modf(double, double*)
函数导致了问题。
注意我使用的操作系统是Windows7,编译器是VC10。
最佳答案
您在 SO 上犯了 OpenMP 最常见的错误。内部循环的迭代器需要设为私有(private)。你可以做
#pragma omp parallel for private(j)
或使用循环初始声明
for (int j = 0; j < width; ++j)
事实上,由于您从不在它们适用的循环之外使用 i
或 j
,因此没有理由在循环之外声明它们的 C89 样式。
关于c++ - 无法让 modf() 在多线程中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33315854/
我是一名优秀的程序员,十分优秀!