gpt4 book ai didi

c - 我想用 openMP 并行化这个函数,但我有一个 'segmentation fault (core dumped)' 。怎么了?

转载 作者:行者123 更新时间:2023-11-30 19:31:04 25 4
gpt4 key购买 nike

这是 LAME 编码器的一个函数,当我与 #pragma omp 并行化时,结果是核心转储;我应该如何并行化这个函数?

我认为指针是 OpenMP 的问题,线程增加了错误的内存地址。

static void quantize_lines_xrpow(unsigned int l, FLOAT istep, const FLOAT * xp, int *pi)
{
fi_union *fi;
unsigned int remaining;
int i;
assert(l > 0);

fi = (fi_union *) pi;

l = l >> 1;
remaining = l % 2;
l = l >> 1;
double x0,x1,x2,x3;
#pragma omp parallel for private(i)

for(i=l;i>0;i--){//while (l--) {
x0 = istep * xp[0];
x1 = istep * xp[1];
x2 = istep * xp[2];
x3 = istep * xp[3];

x0 += MAGIC_FLOAT;
fi[0].f = x0;
x1 += MAGIC_FLOAT;
fi[1].f = x1;
x2 += MAGIC_FLOAT;
fi[2].f = x2;
x3 += MAGIC_FLOAT;
fi[3].f = x3;

fi[0].f = x0 + adj43asm[fi[0].i - MAGIC_INT];
fi[1].f = x1 + adj43asm[fi[1].i - MAGIC_INT];
fi[2].f = x2 + adj43asm[fi[2].i - MAGIC_INT];
fi[3].f = x3 + adj43asm[fi[3].i - MAGIC_INT];

fi[0].i -= MAGIC_INT;
fi[1].i -= MAGIC_INT;
fi[2].i -= MAGIC_INT;
fi[3].i -= MAGIC_INT;
fi += 4;
xp += 4;
};
if (remaining) {
double x0 = istep * xp[0];
double x1 = istep * xp[1];

x0 += MAGIC_FLOAT;
fi[0].f = x0;
x1 += MAGIC_FLOAT;
fi[1].f = x1;

fi[0].f = x0 + adj43asm[fi[0].i - MAGIC_INT];
fi[1].f = x1 + adj43asm[fi[1].i - MAGIC_INT];

fi[0].i -= MAGIC_INT;
fi[1].i -= MAGIC_INT;
}
}

最佳答案

线程之间有许多共享变量,x0、x1、x2、x3、fi、xp,这会导致大量数据竞争。这包括指针(数组)fixp。线程不确定地增加这些,因此任何取消引用都是错误的。

关于c - 我想用 openMP 并行化这个函数,但我有一个 'segmentation fault (core dumped)' 。怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49590398/

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