由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请大牛们帮忙看一段openmp并行代码的问题
相关主题
A helloworld OpenMP question?OpenMP能编译产生DLL吗?
[合集] Intel 9编译器在vc 6.0的环境里编译openmp的问题请问程序同时在多个cpu上运行需要怎么改程序?
请大牛们帮忙看一段并行c++代码的效率问题你们不懂c++
一个OpenMP问题求教轮到我的问题了
c++ thread 求助请教,如何设置run time KMP_PLACES_THREADS
谁在Xeon Phi上用过MKL请教一个算法
我写的C++ ParallelForLoop,感兴趣的来下载测试关于malloc/free和循环
并行程序能做到不用专门写么?size of structure
相关话题的讨论汇总
话题: mn话题: int话题: omp话题: pragma话题: ndx
进入Programming版参与讨论
1 (共1页)
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多都算对。
。。
1 (共1页)
进入Programming版参与讨论
相关主题
size of structurec++ thread 求助
Segmentation fault谁在Xeon Phi上用过MKL
visual studio 2005怎么不让自动添加#pragma once?我写的C++ ParallelForLoop,感兴趣的来下载测试
C怪问题一个并行程序能做到不用专门写么?
A helloworld OpenMP question?OpenMP能编译产生DLL吗?
[合集] Intel 9编译器在vc 6.0的环境里编译openmp的问题请问程序同时在多个cpu上运行需要怎么改程序?
请大牛们帮忙看一段并行c++代码的效率问题你们不懂c++
一个OpenMP问题求教轮到我的问题了
相关话题的讨论汇总
话题: mn话题: int话题: omp话题: pragma话题: ndx