저는 MPI를 사용하여 Conways의 Game of Life를 병렬 처리합니다 (C++에서). 입력에서 (매우 큰) 행렬을 읽은 다음, 행 단위로 슬라이스에 분산시킨 다음 모든 슬라이스를 병렬로 처리해야합니다. 내가 따르는 아이디어는 하나의 프로세스 만 I/O 작업을 처리하도록하는 것입니다. 특히, 프로세스 0은 파일로부터 읽은 다음 RxC 행렬에 초기 데이터를 저장하여 (R/P) xC "슬라이스 행렬"의 프로세스간에 분산됩니다. 이제 MPI_Scatter 루틴을 수행 할 때 "큰 행렬"이 첫 번째 프로세스에만 할당되기 때문에 컴파일러는 불만을 토로합니다. 모든 것이 공백으로 남아있는 경우에도 모든 일에 큰 매트릭스를 할당해야합니다. 평범한가요, 아니면 제가 잘못한 것을하고있는 중입니까? 모든 프로세스에 쓸모없고 쓸모없는 매트릭스를 할당하는 것을 피할 수있는 방법이 있습니까? 감사합니다.MPI_Scatter : 왜 모든 프로세스에서 메모리를 할당해야합니까?
2
A
답변
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
관련 문제
- 1. 포인터로 선언 된 모든 변수는 메모리를 할당해야합니까?
- 2. 표준 할당자는 연속 메모리를 할당해야합니까?
- 3. 생성자에 대한 char 포인터를위한 메모리를 할당해야합니까?
- 4. Delphi 문자열 복사본을 만들기 전에 메모리를 할당해야합니까?
- 5. MPI_Scatter Segfaulting
- 6. 다른 프로세스에서 메모리를 할당하는 방법
- 7. MPI_Scatter() 오류
- 8. 내부 메모리가 이미 힙에 할당되어있을 때 힙에 객체를위한 메모리를 할당해야합니까?
- 9. 크기를 모르는 많은 (1000+) 배열에 메모리를 어떻게 할당해야합니까?
- 10. C++ STL 맵에 삽입하기 전에 new를 사용하여 메모리를 할당해야합니까?
- 11. 모든 백엔드 처리를 작업자 역할에 할당해야합니까?
- 12. 설명이 필요합니다 MPI_Scatter()
- 13. 공유 메모리를 사용하여 프로세스에서 프로세스로 문자열을 보냅니다.
- 14. 프로세스에서 사용하는 메모리를 가져 오는 명령 줄
- 15. 메모리를 사전 할당하고 분기 된 프로세스에서 사용하십시오.
- 16. Linux의 프로세스에서 메모리를 "사용"하는 방법은 무엇입니까?
- 17. 왜 특정 프로세스의 범위에서 MPI_Scatter()를 사용할 수 없습니까?
- 18. 언제 DirectSound 버퍼를 할당해야합니까?
- 19. 왜 개체 속성에 값을 할당하기 전에 클래스의 인스턴스를 할당해야합니까?
- 20. MPI_Scatter 및 MPI_Gather는 작동하지 않습니다.
- 21. 왜 메모리를 대량으로 할당하지 않습니까?
- 22. MPI_scatter : 유효하지 않은 버퍼 포인터
- 23. MPI_SCATTER 행에 의한 Fortran 행렬
- 24. std :: stringstream을 사전 할당해야합니까?
- 25. gdb에서 프로세스의 모든 메모리를 검색하려면 어떻게해야합니까?
- 26. 왜 GDB는 십진수로 메모리를 outpting합니까?
- 27. 왜 SaveChanges 메서드가 메모리를 차지합니까?
- 28. 왜 ActionController :: Metal은 메모리를 누출합니까?
- 29. 왜 executeFetchRequest가 : fetchRequest가 메모리를 유출하나요?
- 30. 내 DLL에 델파이에서 함수의 반환 pchar를 할당해야합니까?
각 개별 MPI 프로세스를 자체 변수, 주소 공간, * etc *을 가진 별도의 프로그램으로 생각하십시오. 프로세스의 메모리에 변수 (예 : 배열)가 필요하다면, 확실히 그 프로세스의 메모리 공간을 할당해야합니다. 그러나 일반적으로 모든 프로세스의 메모리에 전역 배열을위한 공간을 할당해서는 안되며 배열의 로컬 부분을위한 공간 만 할당하면 안됩니다. 상당히 합리적인 프로그램 디자인을 사용하면 배열을 프로세스 0에 놓은 다음 작업을 수행 할 각 프로세스에 (* 메시지 전달 *) 조각을 보냅니다. –