Parallel processing OpenMP-并行化循环

Parallel processing OpenMP-并行化循环,parallel-processing,openmp,Parallel Processing,Openmp,我一直在尝试用OpenMP与这个循环并行 #define AX(i,j,k) (Ax[((k)*n+(j))*n+(i)]) for (int k = k1; k < k2; ++k) { for (int j = j1; j < j2; ++j) { for (int i = i1; i < i2; ++i) { double xx = AX(i,j,k); double xn = (i > 0)

我一直在尝试用OpenMP与这个循环并行

#define AX(i,j,k) (Ax[((k)*n+(j))*n+(i)])
for (int k = k1; k < k2; ++k) {
    for (int j = j1; j < j2; ++j) {
        for (int i = i1; i < i2; ++i) {
            double xx = AX(i,j,k);
            double xn = (i > 0)   ? AX(i-1,j,k) : 0;
            double xe = (j > 0)   ? AX(i,j-1,k) : 0;
            double xu = (k > 0)   ? AX(i,j,k-1) : 0;
            AX(i,j,k) = (xx+xn+xe+xu)/6*w;
        }
    }
}
#undef AX
但是,我注意到,
#pragma
不起作用,因为我的函数同时速度更快,但生成的结果更不一致(可能是由于数据依赖性)

我可能不得不在代码中添加另一个子句或尝试更改某些内容,但我不知道是什么

编辑:

好的,谢谢,我理解为什么它不起作用,但我试过了为什么你说,不幸的是它仍然不起作用。然而,我知道这个问题,但我不知道如何解决它

void ssor_forward_sweep(int n, int i1, int i2, int j1, int j2, int k1, int k2, 
                    double* restrict Ax, double w)
{

int k,j,i;

double* AxL=malloc(n*sizeof(double));
for (int a=0; a < n;a++){
AxL[a]=Ax[a];
}
#define AX(i,j,k) (Ax[((k)*n+(j))*n+(i)])
#define AXL(i,j,k) (AxL[((k)*n+(j))*n+(i)])

#pragma omp parallel for private (k,j,i) shared(Ax)
for (k = k1; k < k2; ++k) {
    for (j = j1; j < j2; ++j) {     
        for (i = i1; i < i2; ++i) {

            double xx = AXL(i,j,k);
            double xn = (i > 0)   ? AXL(i-1,j,k) : 0;
            double xe = (j > 0)   ? AXL(i,j-1,k) : 0;
            double xu = (k > 0)   ? AXL(i,j,k-1) : 0;
            AX(i,j,k) = (xx+xn+xe+xu)/6*w;
            //AXL(i,j,k) = (xx+xn+xe+xu)/6*w;
        }
    }
}
#undef AX
#undef AXL
void ssor前扫(int n,int i1,int i2,int j1,int j2,int k1,int k2,
双*限制轴,双w)
{
int k,j,i;
double*AxL=malloc(n*sizeof(double));
对于(int a=0;a0)?AXL(i-1,j,k):0;
双xe=(j>0)?AXL(i,j-1,k):0;
双xu=(k>0)?AXL(i,j,k-1):0;
AX(i,j,k)=(xx+xn+xe+xu)/6*w;
//AXL(i,j,k)=(xx+xn+xe+xu)/6*w;
}
}
}
#未定义的AX
#未定义AXL
我知道数据依赖性仍然存在问题,但我不知道如何解决它;事实上,修改后的值没有考虑到新值。复制数据时也可能有问题。 当我说它不工作时,我没有任何输出(没有错误,也没有输出),它只是直接崩溃

希望有人能帮助我

非常感谢你的帮助!
致以最诚挚的问候,

你说它不工作是什么意思?它出错了吗?它运行缓慢吗?它给出了错误的结果吗?请在回答中具体说明(不要回答此评论,但要编辑问题)。此外,请提供一个我们可以测试的最低限度的工作示例;您发布的代码本身无法编译/执行。它无法工作,因为没有协调线程读取和写入
AX
元素。例如,
AX(3,4,5)
的更新取决于
AX(2,4,5)的值,AX(3,3,5),AX(3,4,4)
可以由其他线程以不同于顺序代码中更新顺序的顺序进行更新。有一个简单的修复方法,制作两个数组,
AX_old
AX_new
,然后从旧更新到新,然后四处移动几个指针。但是这会占用内存。谢谢,我用新问题编辑了我的帖子很抱歉,我没有使用该函数。我使用了shared AxL,但它仍然没有输出任何信息。你说它不工作是什么意思?它出错了吗?它运行缓慢吗?它是否给出了错误的结果?请在回答中具体说明(不要回答此评论,但编辑问题)。此外,请提供一个我们可以测试的最低限度的工作示例;您发布的代码本身无法编译/执行。它无法工作,因为没有协调线程读取和写入
AX
元素。例如,
AX(3,4,5)
的更新取决于
AX(2,4,5)的值,AX(3,3,5),AX(3,4,4)
可以由其他线程以不同于顺序代码中更新顺序的顺序进行更新。有一个简单的修复方法,制作两个数组,
AX_old
AX_new
,然后从旧更新到新,然后四处移动几个指针。但是这会占用内存。谢谢,我用新问题编辑了我的帖子很抱歉,我没有使用这个函数。我使用了共享AxL,但它仍然没有提供任何输出。
void ssor_forward_sweep(int n, int i1, int i2, int j1, int j2, int k1, int k2, 
                    double* restrict Ax, double w)
{

int k,j,i;

double* AxL=malloc(n*sizeof(double));
for (int a=0; a < n;a++){
AxL[a]=Ax[a];
}
#define AX(i,j,k) (Ax[((k)*n+(j))*n+(i)])
#define AXL(i,j,k) (AxL[((k)*n+(j))*n+(i)])

#pragma omp parallel for private (k,j,i) shared(Ax)
for (k = k1; k < k2; ++k) {
    for (j = j1; j < j2; ++j) {     
        for (i = i1; i < i2; ++i) {

            double xx = AXL(i,j,k);
            double xn = (i > 0)   ? AXL(i-1,j,k) : 0;
            double xe = (j > 0)   ? AXL(i,j-1,k) : 0;
            double xu = (k > 0)   ? AXL(i,j,k-1) : 0;
            AX(i,j,k) = (xx+xn+xe+xu)/6*w;
            //AXL(i,j,k) = (xx+xn+xe+xu)/6*w;
        }
    }
}
#undef AX
#undef AXL