2012-06-27 2 views
0

기본적인 질문은 억압 파일이 valgrind에서 어떻게 작동하는지에 관한 것입니다. 나는 MPI 버전에서 다음을 사용하여 가리키는 문서의 많은 살펴 보았다> 1.5 (광산 1.6) :이처럼 실행할 때누군가가이 valgrind 오류를 open mpi로 설명 할 수 있습니까?

mpirun -np 2 valgrind --suppressions=/usr/share/openmpi/openmpi-valgrind.supp --track-origins=yes ./myprog 

, 파일은 600 개 이상의 오류가 있습니다! 내가 받고있는 오류는이 두 가지 이상입니다. 나는 valgrind와 mpi에 대한 나의 현재의 이해와 함께 이들 중 어느 하나를 어떻게 해석 할 지 모른다.

==8821== Address 0xad5e4d7 is 87 bytes inside a block of size 128 alloc'd 
==8821== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8821== by 0x6348C52: ??? (in /usr/lib/openmpi/lib/libopen-pal.so.0.0.0) 
==8821== by 0x6349AF1: ??? (in /usr/lib/openmpi/lib/libopen-pal.so.0.0.0) 
==8821== by 0x6349B81: ??? (in /usr/lib/openmpi/lib/libopen-pal.so.0.0.0) 
==8821== by 0x7DA5B9C: ??? (in /usr/lib/openmpi/lib/openmpi/mca_grpcomm_bad.so) 
==8821== by 0x7DA52F4: ??? (in /usr/lib/openmpi/lib/openmpi/mca_grpcomm_bad.so) 
==8821== by 0x5082AF2: ??? (in /usr/lib/openmpi/lib/libmpi.so.0.0.2) 
==8821== by 0x50A33FA: PMPI_Init (in /usr/lib/openmpi/lib/libmpi.so.0.0.2) 
==8821== by 0x408AB5: main (test_send-receive.cpp:8) 
==8821== Uninitialised value was created by a heap allocation 
==8821== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==8821== by 0x635FE2B: ??? (in /usr/lib/openmpi/lib/libopen-pal.so.0.0.0) 
==8821== by 0x6360634: opal_ifcount (in /usr/lib/openmpi/lib/libopen-pal.so.0.0.0) 
==8821== by 0x81B36AA: ??? (in /usr/lib/openmpi/lib/openmpi/mca_oob_tcp.so) 
==8821== by 0x5C01EE2: mca_oob_base_init (in /usr/lib/openmpi/lib/libopen-rte.so.0.0.0) 
==8821== by 0x7FA97FB: ??? (in /usr/lib/openmpi/lib/openmpi/mca_rml_oob.so) 
==8821== by 0x5C083E4: orte_rml_base_select (in /usr/lib/openmpi/lib/libopen-rte.so.0.0.0) 
==8821== by 0x5BF5EC4: orte_ess_base_app_setup (in /usr/lib/openmpi/lib/libopen-rte.so.0.0.0) 
==8821== by 0x7BA1EAE: ??? (in /usr/lib/openmpi/lib/openmpi/mca_ess_env.so) 
==8821== by 0x5BDDB72: orte_init (in /usr/lib/openmpi/lib/libopen-rte.so.0.0.0) 
==8821== by 0x50822E0: ??? (in /usr/lib/openmpi/lib/libmpi.so.0.0.2) 
==8821== by 0x50A33FA: PMPI_Init (in /usr/lib/openmpi/lib/libmpi.so.0.0.2) 

이러한 오류를 생성하는 코드는 다음과 같습니다

int main(int argc, char *argv[]) { 

    /* init MPI */ 
    MPI_Init(&argc, &argv); 

    int myid; 
    MPI_Comm_rank(MPI_COMM_WORLD, &myid); 
    int i; 
    if(myid == 0){ 
    double * d = new double [10]; 
    for(i = 0; i<10; i++){ 
     d[i] = i + 1.0; 
    } 
    MPI_Send(d, 
      10, 
     MPI_DOUBLE, 
     1, 
     1, 
     MPI_COMM_WORLD); 
    delete[] d; 
    } else { 
    MPI_Status status; 
    double * c = new double [10]; 
    MPI_Recv(c, 
     10, 
     MPI_DOUBLE, 
      0, 
     MPI_ANY_TAG, 
     MPI_COMM_WORLD, 
     &status); 

    for(i = 0; i<10; i++){ 
     printf("%f\n", c[i]); 
    } 
    delete[] c; 
    } 
    MPI_Finalize(); 
    return 0; 
    } 

는 또한,이 코드는 잘 실행하고 예상 결과를 출력합니다. 데이터가 네트워크를 통해 전송되는 방식을 잘못 이해하고 있습니까? 아니면 여기에 내가 이해하지 못하는 다른 문제가 있습니까?

게시물의 길이는 유감 스럽지만, 지금까지 읽어 본 사람도 있습니다.

+0

코드가 myid == 0 경로 또는 "else"경로를 사용하거나 두 경우 모두 발생하면 valgrind 오류가 발생합니까? –

+0

또한 MPI_Recv() 호출의 반환 값 (또는 'status'변수)을 검사하지 않아 MPI_Recv()가 성공했는지 여부를 확인하지 않습니다. 따라서 MPI_Recv()가 어떤 이유로 실패하여 (c) 배열에 데이터를 쓰지 않아서 나중에 발생하는 printf() 호출에서 초기화되지 않은 메모리 읽기 오류가 발생할 수 있습니다. 그냥 추측. –

+0

@JeremyFriesner, 반환 값에 대한 테스트는 ** 필요하지 않습니다 ** 하나는 커뮤니 케이 터에 대한 오류 처리기를 변경했습니다. 디폴트 표준 에러 핸들러는 연산이'MPI_SUCCESS'가 아닌 다른 것을 리턴하면 어플리케이션을 중단합니다 (MPI I/O 연산에는 유효하지 않습니다). –

답변

관련 문제