2013-07-29 5 views
0

단일 Xeon Phi 노드 (61 코어 포함)에 대한 코드를 작성했습니다. 두 파일이 있습니다. 다른 mpi 호출을 호출하기 전에 MPI_Init (2)를 호출했습니다. mpi 호출을 사용하여 ntasks를 찾았습니다. 필요한 모든 라이브러리도 포함 시켰습니다. 아직도 나는 오류가 발생합니다. 이걸 좀 도와 주실 래요? 파일 1에서Xeon Phi에서 open_shm으로 생성 된 공유 메모리를 사용할 때 세그먼테이션 오류가 발생했습니다

:

int buffsize; 
int *sendbuff,**recvbuff,buffsum; 
int *shareRegion; 
shareRegion = (int*)gInit(MPI_COMM_WORLD, buffsize, ntasks); /* gInit is in file 2 */ 
buffsize=atoi(argv[1]); 
sendbuff=(int *)malloc(sizeof(int)*buffsize); 
if(taskid == 0){ 
    recvbuff=(int **)malloc(sizeof(int *)*ntasks); 
    recvbuff[0]=(int *)malloc(sizeof(int)*ntasks*buffsize); 
    for(i=1;i<ntasks;i++)recvbuff[i]=recvbuff[i-1]+buffsize; 
} 
else{ 
    recvbuff=(int **)malloc(sizeof(int *)*1); 
    recvbuff[0]=(int *)malloc(sizeof(int)*1); 
} 

for(i=0;i<buffsize;i++){ 
    sendbuff[i]=1; 

MPI_Barrier(MPI_COMM_WORLD); 

call(sendbuff, buffsize, shareRegion, recvbuff[0],buffsize,taskid,ntasks); 

파일 2에서 :

void* gInit(MPI_Comm comm, int size, int num_proc) 
{ 
    int share_mem = shm_open("share_region", O_CREAT|O_RDWR,0666); 

    if(share_mem == -1) 
    return NULL; 
    int rank; 
    MPI_Comm_rank(comm,&rank); 

    if(ftruncate(share_mem, sizeof(int)*size*num_proc) == -1) 
     return NULL; 

    int* shared = mmap(NULL, sizeof(int)*size*num_proc, PROT_WRITE | PROT_READ, MAP_SHARED, share_mem, 0); 

    if(shared == (void*)-1) 
     printf("error in mem allocation (mmap)\n"); 

    *(shared+(rank)) = 0 

    MPI_Barrier(MPI_COMM_WORLD); 

    return shared; 
} 

void call(int *sendbuff, int sendcount, volatile int *sharedRegion, int **recvbuff, int recvcount, int rank, int size) 
{ 
    int i=0; 
    int k,j; 
    j=rank*sendcount; 
    for(i=0;i<sendcount;i++) 
    { 
     sharedRegion[j] = sendbuff[i]; 
     j++; 
    } 

    if(rank == 0) 
     for(k=0;k<size;k++) 
     for(i=0;i<sendcount;i++) 
     { 

      j=0; 
      recvbuff[k][i] = sharedRegion[j]; 
      j++; 

     } 
} 

그러면 이런 recvbuff에 파일 1에서 일부 계산을 수행하고있다. sharedRegion 변수를 사용하는 동안이 분할 오류가 발생합니다.

답변

1

은 MPI는 패러다임 전달 메시지를 나타낸다. 즉, 프로세스 (순위)는 격리되어 있으며 일반적으로 기계에서 실행됩니다. 이들은 명시적인 통신 메시지를 통해 통신하지만 최근 버전에서는 일방적이지만 여전히 명시적인 데이터 전송이 가능합니다. 공유 메모리가 프로세스에 사용 가능하다고 가정 할 수 없습니다. MPI 사용법을 보려면 MPI 튜토리얼을보십시오.

실행중인 컴퓨터의 종류를 지정하지 않았으므로 더 이상의 제안은 완전히 투기 적입니다. 실제로 공유 메모리 머신에 있다면, 대신에 실제 공유 메모리 패러다임을 사용할 수 있습니다. OpenMP.

0

하나의 머신 만 사용하고 공유 메모리를 사용하는 것을 제한 할 수 있지만 (특히 MPI-3의 RMA 챕터를 참조하십시오), 한 머신 만 사용하려는 경우 다른 머신을 사용하는 것이 더 쉽습니다 어형 변화표.

그러나 여러 노드를 사용하고 하나의 노드에서 여러 등급 (예 : 멀티 코어 프로세스)을 사용하려는 경우 MPI-3 RMA를 살펴 보는 것이 도움이 될 수 있습니다 로컬 공유 메모리와 원격 메모리 액세스가 모두 가능합니다. 이 주제에 대해 여러 개의 논문이 있지만 새로 소개되었으므로 많은 훌륭한 자습서가 아직 없습니다. 당신은 당신에게 유용한 무엇인가를 찾기 위해 조금 파헤쳐 야 할 것입니다.

0

이 두 줄의 순서 :

shareRegion = (int*)gInit(MPI_COMM_WORLD, buffsize, ntasks); /* gInit is in file 2 */ 
buffsize=atoi(argv[1]); 

buffsize 가능성이 이전과 gInit에 대한 호출 후 다른 값을 가질 수 있음을 시사한다. gInit이 호출되는 동안 buffsize이 프로그램의 첫 번째 인수에서 전달 된 값이 초기 값보다 큰 경우 나중에 경계 외부 메모리 액세스가 발생하여 세그먼트 화 오류가 발생합니다.

힌트 : ((예 : gdb를) 디버거 내부에서 (mpirun없이 예)는 MPI 싱글로 코드를 실행하거나 제한을 변경할 코어가 (예를 들어 ulimit -c unlimited과) 오류에 버려진 얻을 것이다 그래야 다음 코어 파일을 검사 s)를 디버거와 함께 사용합니다. 디버그 정보로 컴파일 (예 : -g을 컴파일러 옵션에 추가)하면 이러한 경우에 많은 도움이됩니다.