2017-09-23 3 views
0

저는 MPI를 처음 사용하며 현재 로컬 베오 울프 클러스터에서 배열 분석을 수행해야하는 프로젝트를 진행 중입니다. 내 코드는 C로 작성되어 올바르게 컴파일됩니다. 단일 프로세스 만 사용할 때 올바르게 실행되지만 다중 프로세스로 실행하려고하면 루트 (순위 0) 이외의 모든 프로세스가 데이터를 브로드 캐스트하려고 할 때 지점 주변에서 죽는 경향이 있습니다. 다른 노드는 일반적으로 한 번 방송하려고 줄을 인쇄 한 다음 죽을 때 내 코드는 루트 노드이 완벽하게 정상적으로 모든 작업을 수행 할이여러 프로세스를 사용할 때 MPI Bcast 근처의 Seg 오류

//1. Initialize global variables 
//2. Initialize MPI, get number of processes, get rank 
//3. All processes create two dimensional arrays 
    array1 = (char **) malloc(sizeArray1 * sizeof(char *)); 
    array1[0] = (char *) malloc(sizeArray1 * lineLength * sizeof(char)); 
    for(i = 1; i < sizeArray1; i++) 
    { 
      array1[i] = array1[i - 1] + lineLength; 
    } 
    //4. Only server will populate it's arrays, then broadcast to all processes 
    if(rank == 0) 
    { 
      f = fopen("path..../testFile1.txt", "r"); 
      if(NULL == f) { 
        perror("FAILED: "); 
        return -1; 
      } 
      numWords = 0; 
      while(err != EOF && numWords < sizeArray2) 
      { 
        err = fscanf(f, "%[^\n]\n", array2[numWords]); 
        numWords ++; 
      } 
      fclose(f); 

    } 

//5. Broadcast each line from both arrays to all processes 
MPI_Bcast(array1, sizeArrray1 * lineLength, MPI_CHAR, 0, MPI_COMM_WORLD); 
//6. do further work on arrays 

같이 보입니다. 당신이 날

참고 알려 내 코드의 다른 부분을 볼 필요가있는 경우 내가 무엇입니까 정확한 오류가

Signal: Segmentation fault (11) 
Signal code: Address not mapped (1) 
Failing at address: 0x37 
malloc.c:2392: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. 

입니다 : 내가 다른 사용자의 제안과 일치하려면 코드를 편집했지만, 오류가 지속됩니다.

+3

, 당신은 [A, 최소 완료하고 검증 가능한 예]를 구축 할 것 (https://stackoverflow.com/help/mcve). 적어도, 당신이'array1'과'array2'를 할당하는 코드를 보여주십시오. 이 배열은 ** 모든 ** 작업에 할당되어야하고 루트 작업에만 할당되어야합니다 (여기서 작업 '0') –

+0

코드를 해당 부분으로 업데이트합니다. 너무 많이 포함시키지 않기 때문에 총 파일은 꽤 길다. 당신이 말했듯이, 나는 모든 작업에 배열을 할당하지만 하나만 채우고 있습니다. – MrRempton

+0

가능성이있다. (* minimal *이지만 실행 가능한 예제가 있다면) 직접 답을 찾을 수도있다. – YePhIcK

답변

0

그래서 배열은 이 아니라 int이 아닙니다. 이므로 MPI_INT 대신 MPI_Bcast()MPI_CHAR을 입력해야합니다. 당신은 하나의 호출을 MPI_Bcast() 수 있습니다 스타일의 문제 예를

MPI_Bcast(&(array1[i][0]), lineLength, MPI_CHAR, 0, MPI_COMM_WORLD); 

에 대한 , 당신은 또한 (당신이 한 덩어리에 array1을 할당 할 수 있습니다, 또한

MPI_Bcast(array1[i], lineLength, MPI_CHAR, 0, MPI_COMM_WORLD); 

으로 이것을 쓸 수 있습니다 이

할당이

array1 = (char **)malloc(sizeArray1 * sizeof(char *); 
array1[0] = (char *)malloc(sizeArray1 * lineLength * sizeof(char)); 
for (int i=1; i<sizeArray1; i++) array1[i] = array1[i-1] + lineLength; 
같을 것이다) 일반적으로 더 효율적입니다

이상적으로 다음

MPI_Bcast(array1, sizeArray1 * lineLength, MPI_CHAR, 0, MPI_COMM_WORLD); 
+0

정말 고마워요! 나는 당장 그걸 보지 못했다고 믿을 수 없다. 잠이나 부족한 것이어야한다. 인접 배열에 대한 아이디어에 감사드립니다! 편집 : 형식을 변경할 때 여전히 seg 오류가 있지만이 경우에는 더 많은 배열을 통과 할 수있었습니다. 그것은 여전히 ​​도움이되고, 나에게 무엇을주의해야하는지의보기 흉하지 않은 아이디어를 준다. – MrRempton

+0

이 질문에 대한 답변을 얻은 경우, 답변을 수락하거나 답변을 수락 할 수 있습니까? 새로운 문제에 직면 한 경우 새로운 질문을하십시오. –