나는 순서가 맞지 않는 통신을하려고합니다. 기본적으로 정수 ID로 식별되는 같은 크기의 부동 소수점 배열이 여러 개 있습니다. 그것은 많은 어레이가 정확하게 방법을 알고, 따라서 RECVS의 정확한 수를 설정하는 수신 측에두 개의 MPI 메시지를 묶을 수 있습니까?
<int id><float array data>
: 같은
각 메시지가 보일 것입니다. 메시지를 받으면 ID를 분석하여 데이터를 올바른 위치에 넣습니다. 문제는 메시지가 다른 프로세스에서 수신 프로세스로 전송 될 수 있다는 것입니다. (예 : 생산자는 작업 대기열 구조를 가지고 있고 큐에서 사용할 수있는 ID를 처리합니다.)
MPI는 주문 전달에서 P2P 만 보장하므로 정수 ID와 FP 데이터를 간단히 두 개의 메시지에 넣을 수 없습니다. 수신기가 ID와 데이터를 일치시킬 수 없습니다. MPI는 한 번의 전송에서도 두 가지 유형의 데이터를 허용하지 않습니다.
나는 두 가지 접근법 만 생각할 수 있습니다.
1) 수신자는 크기 m (source [m])의 배열을 갖고, m은 송신 노드 수입니다. 보낸 사람이 먼저 ID를 보낸 다음 데이터를 보냅니다. 수신자는 송신자 i로부터 정수 메시지를 수신 한 후 id를 source [i]에 저장합니다. 송신자 i에서 FP 배열을 수신하면 소스 [i]를 확인하고 ID를 얻은 다음 올바른 위치로 데이터를 이동합니다. 그것은 MPI가 주문형 P2P 통신을 보장하기 때문에 작동합니다. 수신자는 각 발신자에 대한 상태 정보를 보관해야합니다. 문제를 악화 시키려면 단일 송신 프로세스가 데이터 (예 : 멀티 스레드) 이전에 송신 된 두 개의 ID를 가질 수있는 경우이 메커니즘이 작동하지 않습니다.
2) id와 FP를 바이트로 처리하고 송신 버퍼에 복사합니다. 그것들을 MPI_CHAR로 보내면 수신기는 그것들을 정수와 FP 배열로 다시 캐스트합니다. 그런 다음 송신 측에서 바이트 버퍼에 항목을 복사하는 추가 비용을 지불해야합니다. MPI 프로세스 내에서 스레드 수를 늘리면 전체 임시 버퍼도 커집니다.
둘 중 누구도 완벽한 솔루션이 아닙니다. 나는 프로세스 내부에 아무것도 잠그고 싶지 않습니다. 여러분 중에 더 좋은 제안이 있는지 궁금합니다.
편집 : 코드는 infiniband가있는 공유 클러스터에서 실행됩니다. 기계가 무작위로 지정됩니다. 그래서 나는 TCP 소켓이 나를 여기서 도울 수있을 것이라고 생각하지 않는다. 또한 IPoIB는 값 비싼 것처럼 보입니다. 통신을 위해서는 전체 40Gbps의 속도가 필요하며 CPU가 계산을 수행하게하십시오.
MPI_ANY_SOURCE를 사용하고 "should"태그가 작동하지만, 코드에서 지정한대로 작동하지 않는다는 것에 동의합니다. 이번에는 내 자신의 데이터 형식을 시도 할 것입니다. 감사! – wujj123456
당신이 제안하는 것은 이식성이 매우 뛰어나며 이기종 환경에서는 작동하지 않을 것입니다. 이식 가능한 솔루션은 MPI 구조체 타입을 'MPI_INT'타입과 블록 길이 '1'과 'MPI_FLOAT'타입과 'asize' 블록 타입 중 하나의 두 필드로 등록하는 것입니다. –
@HristoIliev 당신 말이 맞아요. 이제 문제는 해결되어야합니다. – Massimiliano