단일 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 변수를 사용하는 동안이 분할 오류가 발생합니다.