Ошибка шины при использовании mpic ++, но без использования g ++ - PullRequest
0 голосов
/ 13 января 2011

У меня есть код, написанный на 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 ++?

Ответы [ 2 ]

4 голосов
/ 13 января 2011

Одна вещь, которая бросается в глаза, это то, что вы используете sizeof(&foo) (размер указателя на foo), когда вы, вероятно, имеете в виду sizeof(*foo) (размер того, на что указывает foo).

Могу поспорить, что происходит то, что mpic ++ компилируется в 32-битную цель, где размер double равен 64 битам, а размер адресов 32 битам. Это дает вам несоответствие и вызывает проблемы. Ваш g ++, вероятно, нацелен на 64-битную систему, где эти размеры одинаковы (оба 64-битных).

EDIT:

Вот код, который вы должны использовать:

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

И, если честно, вы заново изобретаете колесо. Вам следует использовать предоставляемую поставщиком библиотеку BLAS , в которой быстрые операции с матрицами оптимизированы для вашей платформы (возможно, в сотни раз быстрее, чем вы пишете ...).

1 голос
/ 13 января 2011

Вот общая процедура для динамического выделения массива 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, как описано выше.

...