2011-01-13 2 views
0

g ++을 사용할 때 컴파일 및 실행이 적절한 C++로 작성된 코드가 있지만 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; 

세 개의 중첩 된 for 루프 중에 버스 오류가 발생합니다. 내 질문은 두 가지입니다. 하나는 3D 매트릭스에 대한 할당량을 망쳤습니다. 어떻게해야합니까? 둘째, 왜 gcc와 g ++에서 작동 하나 mpiC++에서는 그렇지 않은 것입니까?

+0

valgrind에서 코드를 실행할 수 있습니까? 그러면 버그가 어디에 있는지 알 수 있습니다. –

답변

4

점프 아웃 한 가지는 아마도 sizeof(*foo) (foo가 가리키는 것의 크기)을 의미 할 때 sizeof(&foo) (foo에 대한 포인터 크기)을 사용하고 있다는 것입니다.

나는 mpiC++가 32 비트 대상으로 컴파일되고 있는데, 여기서 double 형의 크기는 64 비트이고 주소의 크기는 32 비트입니다. 그러면 불일치가 생겨 문제가 발생합니다. 당신의 g ++은 64 비트 시스템을 대상으로하고 있습니다. 64 비트 시스템은 크기가 동일합니다 (둘 다 64 비트).

편집 :

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을 사용하십시오.

관련 문제