2014-02-14 3 views
2

저는 MPI를 사용하여 Conways의 Game of Life를 병렬 처리합니다 (C++에서). 입력에서 (매우 큰) 행렬을 읽은 ​​다음, 행 단위로 슬라이스에 분산시킨 다음 모든 슬라이스를 병렬로 처리해야합니다. 내가 따르는 아이디어는 하나의 프로세스 만 I/O 작업을 처리하도록하는 것입니다. 특히, 프로세스 0은 파일로부터 읽은 다음 RxC 행렬에 초기 데이터를 저장하여 (R/P) xC "슬라이스 행렬"의 프로세스간에 분산됩니다. 이제 MPI_Scatter 루틴을 수행 할 때 "큰 행렬"이 첫 번째 프로세스에만 할당되기 때문에 컴파일러는 불만을 토로합니다. 모든 것이 공백으로 남아있는 경우에도 모든 일에 큰 매트릭스를 할당해야합니다. 평범한가요, 아니면 제가 잘못한 것을하고있는 중입니까? 모든 프로세스에 쓸모없고 쓸모없는 매트릭스를 할당하는 것을 피할 수있는 방법이 있습니까? 감사합니다.MPI_Scatter : 왜 모든 프로세스에서 메모리를 할당해야합니까?

+2

각 개별 MPI 프로세스를 자체 변수, 주소 공간, * etc *을 가진 별도의 프로그램으로 생각하십시오. 프로세스의 메모리에 변수 (예 : 배열)가 필요하다면, 확실히 그 프로세스의 메모리 공간을 할당해야합니다. 그러나 일반적으로 모든 프로세스의 메모리에 전역 배열을위한 공간을 할당해서는 안되며 배열의 로컬 부분을위한 공간 만 할당하면 안됩니다. 상당히 합리적인 프로그램 디자인을 사용하면 배열을 프로세스 0에 놓은 다음 작업을 수행 할 각 프로세스에 (* 메시지 전달 *) 조각을 보냅니다. –

답변

2

"큰 매트릭스"는 어디에도 할당 할 필요가 없지만 MPI_SCATTER은 모든 순위에 일부 메모리를 할당해야합니다.

는이 같은 데이터를 분산하려는 경우 :

산란하기 전에 :

rank 0 - 1 2 3 4 

산란 후 :

rank 0 - 1 
rank 1 - 2 
rank 2 - 3 
rank 3 - 4 

당신은 각 순위에 하나 int을위한 공간을 할당 할 필요가 (모두 4와 반대).

0

모든 곳에서 큰 매트릭스를 할당 할 필요는 없지만 큰 매트릭스 변수를 어디에나 선언해야합니다. 이 시도 :

int* big_matrix; 
if(process_id == 0) { 
    big_matrix = (int*) malloc(big_number * sizeof(int)); 
    // fill the big matrix with values 
} 
int* part_of_matrix = (int*) malloc(small_number * sizeof(int)); 
MPI_Scatter(big_matrix, small_number, MPI_INT, part_of_matrix, small_number, MPI_INT, 0, MPI_COMM_WORLD); 

은 적어도이 당신은 C++로 0 또는 무언가에 big_matrix를 초기화해야 할 수도 있습니다 C.에서 그것을 할 수있는 방법입니다.

+0

죄송합니다. 의심 스럽지만'int ** big_matrix'라고 선언해서는 안됩니까? – Caramelleamare

관련 문제