gpt4 book ai didi

c++ - 无法让 modf() 在多线程中工作

转载 作者:行者123 更新时间:2023-11-30 01:46:22 24 4
gpt4 key购买 nike

我实现了两个不同的函数来将双位数舍入为整数。

这是第一个函数

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_v1round_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_v1round_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)

事实上,由于您从不在它们适用的循环之外使用 ij,因此没有理由在循环之外声明它们的 C89 样式。

关于c++ - 无法让 modf() 在多线程中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33315854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com