일부 MPI 사양을 읽은 후에는 MPI_THREAD_SERIALIZED로 초기화 할 때 프로그램이 별도의 스레드에서 발생하는 MPI_Send/Recv 호출이 겹치지 않아야 함을 이해해야합니다. 즉, MPI 호출을 보호하기 위해 뮤텍스가 필요합니다. pthread가있는 MPI_THREAD_SERIALIZED의 올바른 사용
는 이러한 상황을 고려해Mutex mpi_lock = MUTEX_INITIALIZER;
void thread1_function(){
while(true){
/* things happen */
lock(mpi_lock);
MPI_Send(/* some message */);
unlock(mpi_lock);
/* eventually break out of loop */
}
}
void thread2_function(){
while(true){
/* things happen */
char *buffer = CREATE_BUFFER();
lock(mpi_lock);
MPI_Recv(buffer /* some message stored in buffer */);
unlock(mpi_lock);
/* eventually break out of loop */
}
}
int main(){
create_thread(thread1_function);
create_thread(thread2_function);
return 0;
}
여기 내 질문이있다 :이 올바른 방법인가 및/또는이 필요하다? 제 상황에서는 thread2_function()에서받은 메시지 사이에 큰 시간 간격이있을 수 있다고 가정해야합니다. thread1_function()이 thread2_function()이 송신을 수행하기 전에 수신을 완료하기를 기다릴 필요가 없도록하는 방법이 있습니까?
나는 MPI_THREAD_MULTIPLE에 대해 이미 알고 있지만 시스템 제약 조건은이 기능을 사용할 수 없다는 것을 의미합니다.
코드 구조 조정을위한 제안이 있지만 내 목표는 끊임없이 작동하는 "메인"스레드와 인터럽트없이 MPI_Send의 결과를 갖는 것입니다. 다른 스레드는 메인 스레드의 큐에 대한 수신 및 추가를 관리합니다 .
미리 감사드립니다.