在C中使用openMP遇到竞争条件

时间:2018-04-23 17:18:04

标签: c matrix openmp race-condition

这是我的代码部分,我遇到了竞争条件。我只是想将矩阵“matxOriginal”的值复制到矩阵“cluster0”中,但是,当使用openMP在多个线程上运行时,为“cluster0”打印的样本值与“matxOriginal”不同。 两个矩阵都是动态分配的,都是698 x 9矩阵。

此外,我想保留“cluster0IndexCounter”变量的用途和目的,以便在我发布的内容之外使用其他用途。如果可以,请告诉我如何使这项工作。

double **matxGen(int row, int col)
{
    int i=0, j=0;
    double **m;
    m=(double **) malloc(row*col*sizeof(double *));
    for (i; i<row; i++)
    {
      m[i]=(double *) malloc(col*sizeof(double ));
      for (j=0; j<col; j++)
      {
          m[i][j]=j+i;
      }
    }
    return m;
}


double **emptyMatxGen(int row, int col)
{
    int i=0, j=0;
    double **m;
    m=(double **) malloc(row*col*sizeof(double *));
    for (i; i<row; i++)
    {
      m[i]=(double *) malloc(col*sizeof(double ));
      for (j=0; j<col; j++)
      {
          m[i][j]=0.0;
      }
    }
    return m;
}


int main()
{
    int x, i, j, tid, row=699, col=9,
    cluster0IndexCounter=0;
    double **matxOriginal, **matx, **cluster0;

    matxOriginal=matxGen(row, col); 
    matx=matxGen(row, col);

    double *centerPoint0=matx[99]; 
    cluster0=emptyMatxGen(row, col);

    #pragma omp parallel for private(x, j, tid) schedule(static) reduction(+:cluster0IndexCounter)
    for (x=0; x<=698; x++)
    {

       for (j=0; j<9; j++)
        {
           cluster0[cluster0IndexCounter][j]=matxOriginal[x][j];

        }

        cluster0IndexCounter=cluster0IndexCounter+1;

    }


printf("cluster0: %f, %f, %f, %f, %f\n", cluster0[9][0], cluster0[9][1], cluster0[9][2], cluster0[9][3], cluster0[9][4]);

free(cluster0);
free(matxOriginal);
free(matx);

return 0;
}

0 个答案:

没有答案