많은 컴퓨팅 코어에서 실행될 수있는 많은 CPU 코어에서 실행되는 대규모 코드가 있습니다. 코드는 C++이며 OpenMPI와 병렬 처리됩니다.복잡한 개체를위한 MPI 공유 메모리
내 코드에는 각 MPI 프로세스에서 읽는 매우 큰 개체 (~ 10GB RAM 사용)가 있습니다. 이 객체는 매우 가끔 업데이트됩니다 (데이터 파일을 읽는 것만으로 단일 프로세스로 수행 할 수 있습니다).
지금까지 내가 해왔 던 것은 각 MPI 프로세스에이 개체의 복사본을 제공하는 것입니다. 하지만 그건 내가 심각하게 RAM 제한적이며 내 노드의 전체 CPU 성능을 사용할 수 없다는 것을 의미합니다. 그래서 저는 MPI 3 사양에서 공유 메모리에 대해 읽었습니다.
제 질문은 : MPI 프로세스에서 복잡한 객체를 공유하는 가장 좋은 방법은 무엇입니까? 모든 예제에서 MPI 공유 메모리 창을 만들어 간단한 데이터 구조 (float, ints 배열 등)를 교환하는 데 사용합니다. 내 전역 개체는 여러 멤버 변수를 포함하는 사용자 지정 클래스 형식이며 일부는 포인터이고 그 중 다수는 다른 복잡한 클래스 형식입니다. 따라서, 나는 단지 MPI_Win_allocate_shared
을 호출하고 내 복잡한 객체의 주소를 전달할 수 없기 때문에, 특히 멤버 변수에 대한 모든 정보를 공유하고자하므로 (특히, 기본 값을 공유하고 싶습니다. 포인터 타입 멤버 변수 - 즉, MPI 프로세스에서 "딥 카피 (deep copy)"를 공유하며 각 프로세스에서 모든 가상 메모리 주소가 정확합니다.)
MPI 공유 메모리와 함께 "깊은 공유"를 달성 할 수 있습니까? 그렇다면 그렇게하는 "모범 사례"가 있습니까? 아니면 다른 라이브러리 (예 : 프로세스 간 프로세스 향상)를 사용하면이 방법이 더 실현 가능할 것입니까?
P. 좋은 해결책을 찾을 수 없다면, 하이브리드 MPI + pthreads 접근 방식을 사용하게 될 것입니다. 여기서는 pthread가있는 각 노드에이 전역 객체를 쉽게 가질 수 있습니다. 하지만 정말 우아한 MPI 전용 솔루션을 찾고 싶습니다.
공유 메모리가 정확히 동일한 기본 주소에 매핑되어 있지 않은 한 프로세스의 가상 주소 공간에 대한 포인터는 다른 프로세스에서 의미가 없습니다. 당신이 원하는 것은 불가능한 것이 아닙니다 : 모든 프로세스에서 모든 메모리 구멍의 교차점에 큰 구멍을 발견하고'mmap()'을 선호 주소로 호출하는 것이 중요하지만, 이식성이없고 각각의 때마다. 적절한 해결책은 상대 포인터를 사용하고 역 참조하기 전에 각 포인터의 값에 기본 주소를 추가하는 것입니다. –
기본 통신자의 프로세스 그룹이 둘 이상의 공유 메모리 노드에 걸쳐있을 때'MPI_Win_allocate_shared'를 사용할 수 없음에 유의하십시오. 그런 경우 MPI RMA를 대신 사용해야합니다. –
당신이 말했듯이 RMA를 사용하여 노드 당 하나의 개체 복사본을 얻은 다음 각 노드에서 공유 메모리를 사용하므로 노드 당 하나의 개체 복사본 만 있습니다 (내 메모리 사용을 유지하기에 충분합니다) 최소한 - 1 노드에 n 개의 복사본이 없도록해야합니다.) 또한, 보장되고 이식 가능한 솔루션을 찾고 있습니다.이 코드는 안정적으로 작동해야하며 이상적으로는 Linux와 Windows에서 모두 실행해야합니다. "적절한 해결책은 ..."이라고 말하면 그 기술이 내 문제를 해결하는 방법을 더 설명 할 수 있습니까? 모든 의사/예제 코드도 도움이됩니다. 감사! – davewy