2016-10-22 2 views
0

는 내가이 코드를 수행하고자하는 것은 다음과 같은 텍스트 파일을 읽는 병렬화OpenMPI 실행이

이 버퍼에 파일을 읽기 (그리고이 파일을 읽을 방법을 변경하지 않으도 내가 그것을 어떻게 저장했는지).

여러 개의 "노드"에 걸쳐 MPI_Scatter을 사용하여 해당 버퍼를 보냅니다. 따라서 각 노드는 빈 공간이있는 횟수를 계산할 수 있습니다.

#include <stdio.h> 
#include <mpi.h> 

int main() { 

int file_size = 10000; 
FILE * fp; 
int my_size, my_id, size, local_acum=0, acum=0, i; 
char buf[file_size], recv_vect[file_size]; 

fp = fopen("pru.txt","r"); 
fseek(fp, 0L, SEEK_END); 
size = ftell(fp); 
fseek(fp, 0L, SEEK_SET); 
fread (buf,1,size,fp); 

// Initialize the MPI environment 
MPI_Init(NULL, NULL); 
MPI_Comm_size(MPI_COMM_WORLD, &my_size); 
MPI_Comm_rank(MPI_COMM_WORLD,&my_id); 

MPI_Scatter(buf, size/my_size, MPI_CHAR, recv_vect, 
    size/my_size, MPI_CHAR, 0, MPI_COMM_WORLD); 

local_acum=0; 
for (i=0; i < size/my_size; i++){ 
    // printf("%c", buf[i]); 
    if (buf[i] == ' '){ 
     local_acum++; 
    } 
} 
printf("\nlocal is %d \n", local_acum); 

acum=0; 
MPI_Barrier(MPI_COMM_WORLD); 
MPI_Reduce(&local_acum, &acum, 1, MPI_INT, MPI_SUM, 
    0, MPI_COMM_WORLD); 

if (my_id == 0){ 
    printf("Counter is %d \n", acum); 
} 

// Finalize the MPI environment. 
MPI_Finalize(); 
} 

내가 원하는 결과를 얻고 있지 않다 :

내가 만든 코드

는 다음과 같습니다.

-np 옵션을 사용하여 실행하는 경우 1 예상대로 완벽하게 작동합니다.

그러나 -np 2 이상의 옵션을 사용하여 실행하면 결과가 표시되지 않습니다. 각 노드의 동작은 항상 같은 양의 공백을 계산합니다. 나는 이것이 이것이 문제의 열쇠라고 믿는다. 내가

for (i=0; i < sie; i++) 

을위한 노드의 경우

이 빈 공간의 수를 계산합니다. 따라서 각 노드에는 전체 버퍼가 있습니다. 이해가 안 돼요 왜 분산에 내가 통과하는 각 계급에 대한 부분 만 포함하는 대신 recv_vect의 전체 파일을 포함 (크기/my_size)

답변

1
  1. 당신은 buf 반복됩니다, 말하고 있기 때문이다.
  2. 루트가 아닌 각 노드에서 전체 파일을 읽는 중입니다. 그것은 당신의 경우에 어떤 이해가되지 않습니다.