C++ OpenMP并行计算不支持';t创建新线程

C++ OpenMP并行计算不支持';t创建新线程,c++,multithreading,parallel-processing,openmp,C++,Multithreading,Parallel Processing,Openmp,我有这样的代码 double ***arrayInit(int nz, int nx, int ny) { double ***u3d; u3d = new double **[nz]; for (int k = 0; k < nz; k++) { u3d[k] = new double *[nx]; for (int i = 0; i < nx; i++) { u3d[k][i] = new double[ny]; for (in

我有这样的代码

double ***arrayInit(int nz, int nx, int ny) {
  double ***u3d;
  u3d = new double **[nz];
  for (int k = 0; k < nz; k++) {
    u3d[k] = new double *[nx];
    for (int i = 0; i < nx; i++) {
      u3d[k][i] = new double[ny];
      for (int j = 0; j < ny; ++j)
        u3d[k][i][j] = 0;
    }
  }

  return u3d;
}

int main(int argc, char *argv[])
{
    int size(0);
    int rank = 0;

    Coefficients coefs; //structure with some coefficients for calculation
    map<string, string> config;


   coefs = fillCoefficients(config);


    auto rho0niz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto T0niz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto p0niz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);

        for (int k = 0; k < coefs.H1p1; ++k) {
        for (int i = 0; i < coefs.Lp1; ++i) {
            for (int j = 0; j < coefs.Mp1; ++j) {
                rho0niz[k][i][j] =
                    pow(1.0 - coefs.Lh * (k - 1 + 1) * coefs.h, coefs.nu - 1);
                T0niz[k][i][j] =
                    1.0 - coefs.Lh * (k - 1 + 1) * coefs.h; //Степень +1 к индексу
                p0niz[k][i][j] = rho0niz[k][i][j] * T0niz[k][i][j];
            }
        }
    }
    auto u0niz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto v0niz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto w0niz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);

    auto rhoniz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto uniz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto vniz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto wniz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto Tniz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto pniz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);


    auto rhotniz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto utniz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto vtniz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto wtniz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto Ttniz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);
    auto ptniz = arrayInit(coefs.H1p1, coefs.Lp1, coefs.Mp1);



    for (int k = 0; k < coefs.H1p1; ++k)
        for (int i = 0; i < coefs.Lp1; ++i)
            for (int j = 0; j < coefs.Mp1; ++j) {
                rhoniz[k][i][j] = rho0niz[k][i][j];
                uniz[k][i][j] = u0niz[k][i][j];
                vniz[k][i][j] = v0niz[k][i][j];
                wniz[k][i][j] = w0niz[k][i][j];
                Tniz[k][i][j] = T0niz[k][i][j];
                pniz[k][i][j] = rho0niz[k][i][j] * T0niz[k][i][j];

                rhotniz[k][i][j] = rho0niz[k][i][j];
                utniz[k][i][j] = u0niz[k][i][j];
                vtniz[k][i][j] = v0niz[k][i][j];
                wtniz[k][i][j] = w0niz[k][i][j];
                Ttniz[k][i][j] = T0niz[k][i][j];
                ptniz[k][i][j] = rho0niz[k][i][j] * T0niz[k][i][j];
            }

    double rd = 0;

    int timestamp_count = 10000;


    std::cout << "start" << std::endl;

    double utniz_res = -1, vtniz_res = -1, wtniz_res = -1, rhotniz_res = -1, Ttniz_res = -1;

    for (int n = 1; n <= timestamp_count; ++n) 
    {
        cout << "=============================== n " << n << endl;

#pragma omp parallel for private(utniz_res, vtniz_res, wtniz_res, rhotniz_res,Ttniz_res)
        for (int k = 1; k < coefs.H1; ++k) {
            utniz_res = -1;
            vtniz_res = -1;
            wtniz_res = -1;
            rhotniz_res = -1;
            Ttniz_res = -1;
            for (int i = 1; i < coefs.L; ++i) 
            {
                for (int j = 1; j < coefs.M; ++j) 
                {

                    utniz_res = f_u(coefs, uniz, tniz,rhoniz,vniz,wniw,pniz);
                    vtniz_res = f_v(coefs, uniz, tniz,rhoniz,vniz,wniw,pniz);
                    wtniz_res = f_w(coefs, uniz, tniz,rhoniz,vniz,wniw,pniz);
                    rhotniz_res = f_rho(coefs, uniz, tniz,rhoniz,vniz,wniw,pniz);;
                    Ttniz_res =  f_t(coefs, uniz, tniz,rhoniz,vniz,wniw,pniz);
#pragma omp critical 
                        {
                            utniz[k][i][j] = utniz_res;
                            vtniz[k][i][j] = vtniz_res;
                            wtniz[k][i][j] = wtniz_res;
                            rhotniz[k][i][j] = rhotniz_res;
                            Ttniz[k][i][j] = Ttniz_res;
                        }

                }
            }

        }


    return 0;
}
double***arrayInit(int-nz,int-nx,int-ny){
双***u3d;
u3d=新双**[nz];
对于(int k=0;kstd::难道这个问题与您使用动态数组无关。它与您如何为此程序设置OpenMP有关。您用来编译程序的行是什么?旁注:您不需要像现在这样在代码周围有一个
关键
部分。您的每个线程都将访问数组的不同部分(因为它们是根据
k
划分的),因此将永远不会尝试编辑内存中的相同位置。删除该
pragma
,您的代码将大大加快速度!感谢您的注意!是的,我的VS项目中禁用了OpenMP支持,我不知道为什么该问题与您使用动态阵列无关。它与您如何为此设置OpenMP有关程序。您用来编译程序的行是什么?旁注:您不需要像现在这样在代码周围有一个
关键
部分。您的每个线程都将访问数组的不同部分(因为它们是根据
k
划分的),因此将永远不会尝试编辑内存中的相同位置。删除该
pragma
,您的代码将大大加快速度!感谢您的注意!是的,我的VS项目中禁用了OpenMP支持,我不知道为什么