2011-01-13 2 views
0

У меня есть код, написанный на C++, который компилируется и работает отлично (с разумным результатом) при использовании g ++, но когда я пытаюсь использовать mpiC++, я получаю ошибку шины времени выполнения. Мне удалось выяснить, где происходит ошибка шины, но не почему. Вот мой код:Ошибка шины с использованием mpiC++, но не используется g ++

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; 

Ошибка шины возникает во время трех вложенных циклов. Мой вопрос в два раза: один, я полагаю, я накрутил свое выделение для 3D-матрицы; как я должен был это сделать? Два, почему это работало с gcc и g ++, но не с mpiC++?

+0

Не могли бы вы запустить свой код под valgrind. Это, вероятно, даст вам очень хорошее представление о том, где ваша ошибка. –

ответ

4

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

Готов поспорить, что mpiC++ компилируется в 32-битную цель, где размер удваивается 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, предоставляемую поставщиком, которая имеет быстрые матричные операции, оптимизированные для вашей платформы (вероятно, в сотни раз быстрее, чем все, что вы пишете ...).

+0

Я думал, что это может быть так, но когда я меняю его на sizeof (* foo), он не только не работает с gcc и g ++, он все еще не работает с mpiC++. – wolfPack88

+1

Просто отредактирован, чтобы добавить еще одну гипотезу. – EmeryBerger

+0

Какая строка вызывает ошибку шины? –

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, как описано выше.

Смежные вопросы