y****n 发帖数: 15 | 1 下面这段程序使用openmp执行一个类似图像线性插值的算法。
输入为Z(图像),X(坐标),Y(坐标),输出为F(图像)
为了避免同时写入数组F的某个元素,使用了#pragma omp atomic
我遇到的问题是,当把线程数设为1和2时,运行程序会得到不同的结果。实在想不出问
题出在什么地方。肯请大牛们帮忙看一看。
#pragma omp parallel for
for (int n = 0; n < MN; n++)
{
double y = Y[n];
double x = X[n];
int fx = (int)floor(x);
int fy = (int)floor(y);
if (fx<1 || x>nw || fy<1 || y>nh) // image index is [1...nw]
{
for (int i = 0; i < ndim; i++)
{
#pragma omp atomic
F[n+i*MN] += Z[n+i*MN];
}
}
else
{
int ndx = (fy-1)+(fx-1)*nh;
if (x==nw){x=x+1; ndx=ndx-nh; }
x = x-fx;
if (y==nh){y=y+1; ndx=ndx-1; }
y = y-fy;
int in1=ndx; int in2=in1+1;
int in3=ndx+nh; int in4=in3+1;
double m4=y*x;
double m1=1+m4-y-x;
double m2=y-m4;
double m3=x-m4;
for (int i = 0; i < ndim; i++)
{
double vZ = Z[i*MN + n];
#pragma omp atomic
F[in1 + i*MN] += vZ * m1;
#pragma omp atomic
F[in2 + i*MN] += vZ * m2;
#pragma omp atomic
F[in3 + i*MN] += vZ * m3;
#pragma omp atomic
F[in4 + i*MN] += vZ * m4;
}
}
} |
a**e 发帖数: 64 | 2 Is it working properly if you use omp critical instead of atomic? |
t****t 发帖数: 6806 | 3 不懂openmp, 但是浮点数支持atomic吗? I actually don't think so...
【在 y****n 的大作中提到】 : 下面这段程序使用openmp执行一个类似图像线性插值的算法。 : 输入为Z(图像),X(坐标),Y(坐标),输出为F(图像) : 为了避免同时写入数组F的某个元素,使用了#pragma omp atomic : 我遇到的问题是,当把线程数设为1和2时,运行程序会得到不同的结果。实在想不出问 : 题出在什么地方。肯请大牛们帮忙看一看。 : #pragma omp parallel for : for (int n = 0; n < MN; n++) : { : double y = Y[n]; : double x = X[n];
|
s****a 发帖数: 238 | 4 不要一下子跑这么长的程序,把后面的注释掉一段段跑出来和单线程的对比,这样可以
缩小范围。
如楼上所说,原子操作很可能出问题,还有shared和private的变量有没有设对? |
y****n 发帖数: 15 | 5 多谢大家的解答。
我又重新检查了一下,把线程数为1和2,结果相差10^-17。我现在觉得这不是程序错误
导致的,而是由于使用多个线程时 "F[i] += a" "F[i] += b" 求和顺序的变化引起的
舍入误差。
把atomic换成critical结果差不多,同样存在10^-17的差别。 |
f*****e 发帖数: 2992 | 6 不错,不过也说不定哪个更精确。
【在 y****n 的大作中提到】 : 多谢大家的解答。 : 我又重新检查了一下,把线程数为1和2,结果相差10^-17。我现在觉得这不是程序错误 : 导致的,而是由于使用多个线程时 "F[i] += a" "F[i] += b" 求和顺序的变化引起的 : 舍入误差。 : 把atomic换成critical结果差不多,同样存在10^-17的差别。
|
a**e 发帖数: 64 | 7 这个差别可以理解。之前没有想到这一点。
既然是浮点数的话这个差别一般也不用担心了。
【在 y****n 的大作中提到】 : 多谢大家的解答。 : 我又重新检查了一下,把线程数为1和2,结果相差10^-17。我现在觉得这不是程序错误 : 导致的,而是由于使用多个线程时 "F[i] += a" "F[i] += b" 求和顺序的变化引起的 : 舍入误差。 : 把atomic换成critical结果差不多,同样存在10^-17的差别。
|
j*********s 发帖数: 142 | 8 小生悄悄说一句。。。才差这么多不错啦。。我们上课算大数的时候差300多都算对。
。。 |