0

我有一些用 C++ 编写的代码,在使用 g++ 时编译和运行良好(输出合理),但是当我尝试使用 mpic++ 时,出现运行时总线错误。我已经设法弄清楚总线错误发生在哪里,但不知道为什么。这是我的代码:

one = (double *) malloc(sizeof(&one) * nx * nx * nt);
two = (double **) malloc(sizeof(&two) * nx * nx);
rho_exp = (double ***) malloc(sizeof(&rho_exp) * nx);

for(i = 0; i < nx * nx; i++)
    two[i] = &one[i * nt];

for(i = 0; i < nx; i++)
    rho_exp[i] = &two[i * nx];

for(i = 0; i < nx; i++)
    for(j = 0; j < nx; j++)
        for(k = 0; k < nt; k++)
            rho_exp[i][j][k] = 0;

在三个嵌套的 for 循环期间发生总线错误。我的问题有两个:第一,我想,我搞砸了我对 3D 矩阵的分配;我应该怎么做?二,为什么这适用于 gcc 和 g++,但不适用于 mpic++?

4

2 回答 2

4

跳出来的一件事是,sizeof(&foo)当您可能是指sizeof(*foo)(foo 指向的事物的大小)时,您正在使用(指向 foo 的指针的大小)。

我敢打赌,mpic++ 正在编译为 32 位目标,其中双精度的大小为 64 位,地址的大小为 32 位。这会给您带来不匹配并导致问题。您的 g++ 可能针对的是 64 位系统,其中这些大小相同(均为 64 位)。

编辑:

这是您应该使用的代码:

  double * one = new double[nx * nx * nt];
  double ** two = new double*[nx * nx];
  double ***rho_exp = new double**[nx];

老实说,你正在重新发明轮子。您应该使用供应商提供的BLAS库,该库具有针对您的平台优化的快速矩阵运算(可能比您编写的任何内容快数百倍......)。

于 2011-01-13T15:57:43.550 回答
1

下面是动态分配 X x Y x Z 数组的一般过程:

double ***rho_exp = malloc(sizeof *rho_exp * X);
if (rho_exp)
{
  size_t i;
  for (i = 0; i < X; i++)
  {
    rho_exp[i] = malloc(sizeof *rho_exp[i] * Y);
    if (rho_exp[i])
    {
      size_t j;
      for (j = 0; j < Y; j++)
      {
        rho_exp[i][j] = malloc(sizeof *rho_exp[i][j] * Z);
        if (rho_exp[i][j])
        {
          size_t k;
          for (k = 0; k < Z; k++)
          {
            rho_exp[i][j][k] = 0;
          }
        }
      }
    }
  }
}

没关系,那是针对 C 的;由于您使用的是 C++,请new按上述方式使用。

于 2011-01-13T16:11:50.623 回答