这是 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
,这会导致大量数据竞争。这包括指针(数组)fi
和xp
。线程不确定地增加这些,因此任何取消引用都是错误的。
关于c - 我想用 openMP 并行化这个函数,但我有一个 'segmentation fault (core dumped)' 。怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49590398/