2012-03-16 4 views
1

MPI를 사용하여 프로그램을 작성하려고하는데 많은 도움이되는 질문이 있습니다. MPI에서 어떤 방식 으로든 다른 프로세스에 포인터를 보낼 수 있습니까? 내가 원하는 것은 포인터를 보내고 한 프로세스에서 다른 프로세스로 메모리를 복사하지 않는 것이다.포인터를 문자열로 표현하고 그 반대 방향으로 표현

예를 들어 포인터를 문자열로 표시 한 다음 보내면 수신 프로세스가 포인터를 다시 캐스팅하고 지적 된 메모리에 액세스 할 수 있도록 할 수 있습니까?

미리 감사드립니다.

+2

포인터 전달은 여기서 문제가되어서는 안됩니다. 문제는 포인터가 가리키는 메모리가 동일한 위치의 두 주소 공간에서 모두 사용 가능해야한다는 것입니다. 여기서 무엇을 이루려고합니까? –

답변

7

짧은 대답 : 아니요, 그렇게 할 수 없습니다.

설명은 MPI 프로세스가 메모리를 공유하지 않는다는 것입니다. 실제로 대부분의 MPI 구현은 MPI 프로세스를 실제 OS 프로세스에 매핑하므로 동일한 메모리 주소 공간을 공유하지 않습니다. 또한 클러스터에서 MPI 응용 프로그램을 실행하려고 할 수도 있습니다.이 경우 MPI 프로세스는 동일한 하드웨어에 있지 않습니다.

EDIT :

MPI2 메모리 액세스를 공유 모방하는 작업 창 (예 MPI_WIN_CREATE 참조)를 도입한다. 모든 프로세스가 동일한 노드에서 실행중인 경우, 그러한 창 조작은 공유 메모리를 사용하여 구현 될 수 있습니다. MPI는 언제나 그렇듯이 연산을 구현하는 방법을 절대 보장하지 않습니다.

+0

다른 하드웨어에 대해 알고 있지만 같은 노드의 프로세스간에 포인터를 교환하는 것만을 생각하고있었습니다. 정보를 가져 주셔서 감사합니다. 적어도 나는 할 수없는 일에 시간을 할애하지 않을 것입니다. – gkaran89

+0

동일한 노드의 프로세스간에 포인터를 교환 할 수 없습니다. 음, 할 수는 있지만 그러한 포인터는 의미가 없습니다. 최신 운영 체제에서는 개별 프로세스가 자체 가상 주소 공간에서 실행됩니다. 프로세스간에 메모리를 공유하려면 POSIX 공유 메모리 함수 (shmget, shmat 등) 또는 메모리 맵 파일 (mmap)을보십시오. 대부분의 MPI 구현은 배후에서 이러한 메서드를 사용합니다. 그래서 당신이'MPI_Send'와'MPI_Recv'를 사용할 때, 프로세스가 노드를 공유하면, 송신자는 데이터를 공유 버퍼에 복사하고, 수신기는 복사를합니다. –

관련 문제