2016-10-22 2 views
1

:Mpi recv : 신호 분할 오류를 사용하려고하면 오류가 발생합니다.

mpi 프로그램과 관련하여 불안한 질문이 있습니다. 아이디어는 다음과 같습니다 : 각 프로세스 (슬레이브)가 만델 브로 프랙털을 계산하기 위해 마스터에게 데이터를 보냅니다.

먼저, 각 슬레이브는 포인트와 작업자를 보냈습니다. 그 다음 그들은 선을 보내었다.

하지만 이제는 블록 줄을 보내려고합니다. (5 행, 하위 행을 가정 해 봅시다).

제 아이디어는이 다섯 줄을 한 줄로 만드는 것입니다. 마스터는 첫 번째 "새로운"행을 받지만 다른 행은 O_o가 아닙니다. 나는 방해 받았다. 신호 세그먼트 오류 신호 코드 : 내가 다른 사람 (> 1)에 대한 수신

ADRESS

에 실패 ADRESS이 매핑되지 도와주세요! 장시간이기 때문에, i'have는 :(

시 찾고 : 내가

//the whole table to be used in a master //int table[NX*NY]; //int count =0; if (rank == 0) { int res; int line[MAXY+MAXY+1]; int block[5*(MAXY+MAXY+1)]; int count = 0; /* Begin User Program - the master */ //MPI_Recv(&line, MAXY+MAXY+1, MPI_INT,MPI_ANY_SOURCE, DATATAG, MPI_COMM_WORLD, &status); MPI_Recv(&block, 5*(MAXY+MAXY+1), MPI_INT,MPI_ANY_SOURCE, DATATAG, MPI_COMM_WORLD, &status); printf("sizeof of datablock received is = %d \n",sizeof(block)/sizeof(block[0])); recvd = status.MPI_SOURCE; printf("i have received blockdata from %d \n",recvd); /* remplissage du case */ for(i = -MAXX; i <= MAXX; i++) { for(j = -MAXY; j <= MAXY; j++) { cases[i + MAXX][j + MAXY] = block[count%(MAXY+MAXY+1)]; //printf("j'ai fait un bloc[count], pas credible\n"); count++; } } dump_ppm("mandel.ppm", cases); printf("Fini.\n"); } else { /* On est l'un des fils */ /* for the block;let's suppose each son send 5 rows*/ double x, y; int i, j, res, rc, rank,count; //int line[MAXY + MAXY + 1]; int block[5*(MAXY+MAXY+1)]; count = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); for(i = -MAXX; i <= MAXX; i++) { for(j = -MAXY; j <= MAXY; j++) { x = 2 * i/(double)MAXX; y = 1.5 * j/(double)MAXY; res = mandel(x, y); //line[j+MAXY] = res; block[count] =res; if (count % (5*(MAXY+MAXY+1)) == 0){ //we send each five rows MPI_Send(&block,5*(MAXY+MAXY+1), MPI_INT, 0, DATATAG, MPI_COMM_WORLD); printf("me slave %d, have sent datablock to master\n",rank); printf("sizeof of datablock sent is = %d\n",sizeof(block)/sizeof(block[0])); } count++; } //MPI_Send(&line, MAXY+MAXY+1 , MPI_INT, 0, DATATAG, MPI_COMM_WORLD); } } MPI_Finalize(); return 0; }

답변

0

(내 영어 나쁜 왜 그렇게 그건)가 필요 MPI_Recv() 기능 프랑스어 해요 주소는 MPI_Send()과 같습니다. int block[5*(MAXY+MAXY+1)]은 배열이기 때문에 block은 배열 block[0]의 첫 번째 항목을 가리 킵니다 : 반면에 &block 01을 가리킨다.: int에 대한 포인터의 포인터와 비슷합니다. 그러나 &block 값은 배열의 첫 번째 항목의 주소가 아닙니다! 따라서

, 당신은 시도 할 수 :에 해당합니다

int block[5*(MAXY+MAXY+1)] 
... 
MPI_Send(block,5*(MAXY+MAXY+1), MPI_INT, 0, DATATAG, MPI_COMM_WORLD); 
... 
MPI_Recv(block, 5*(MAXY+MAXY+1), MPI_INT,MPI_ANY_SOURCE, DATATAG, MPI_COMM_WORLD, &status); 

:

int block[5*(MAXY+MAXY+1)] 
... 
MPI_Send(&block[0],5*(MAXY+MAXY+1), MPI_INT, 0, DATATAG, MPI_COMM_WORLD); 
... 
MPI_Recv(&block[0], 5*(MAXY+MAXY+1), MPI_INT,MPI_ANY_SOURCE, DATATAG, MPI_COMM_WORLD, &status); 

당신이 무엇을 하나의 정수 int a을 어떻게 보낼 경우? MPI_Send()에 전념 많은 예에서 수행으로 a (&a)의 주소는 MPI_Send()에게 제공 할 수 있습니다

int a=42; 
MPI_Send(&a,1, MPI_INT, 0, DATATAG, MPI_COMM_WORLD); 

마지막으로, MPI_Send()MPI_Recv()만큼 여러 번 호출되어 있는지 확인합니다. 실제로 게시 한 코드에서 루트 프로세스가 MPI_Recv()을 한 번만 호출하는 반면 루트가 아닌 각 프로세스는 루트에 메시지를 보냅니다. 결과적으로 프로그램은 2 개의 프로세스에 대해 작동하며 더 많은 프로세스가 사용되거나 단일 프로세스가 사용되면 실패 할 수 있습니다.

관련 문제