gpt4 book ai didi

pthreads - 正确使用 MPI_THREAD_SERIALIZED 和 pthreads

转载 作者:行者123 更新时间:2023-12-05 04:18:58 28 4
gpt4 key购买 nike

在阅读了一些 MPI 规范后,我了解到,当使用 MPI_THREAD_SERIALIZED 进行初始化时,程序必须确保发生在不同线程中的 MPI_Send/Recv 调用不能重叠。换句话说,您需要一个互斥体来保护 MPI 调用。

考虑这种情况:

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 的结果而不会被中断,而另一个线程管理接收和附加到主线程的队列。

提前致谢。

最佳答案

当只使用 MPI_THREAD_SERIALIZED 时,这种外部锁定(或其他一些类似的同步方案)是极其必要的.绕过它的唯一方法是使用 MPI_THREAD_MULTIPLE ,但这似乎对您不可用。另外,请不要尝试使用 MPI_THREAD_SINGLEMPI_THREAD_FUNNELED而不是 SERIALIZED在这种情况下,有一些平台和实现会导致小块 MPI 被破坏。

如果您在进程内的线程之间发送/接收消息,您上面发布的代码可能会出现问题。如果thread2启动获取锁并输入MPI_Recv之前thread1能够获取锁并将消息发布到thread2通过MPI_Send ,那么就会出现死锁,因为thread1永远无法获得锁。如果在干扰获取锁的进程之间存在消息循环(当将消息传输视为进程/线程之间的有向图时),在某些情况下仍然会发生类似的死锁。

在这种情况下避免死锁的最佳方法是避免阻塞进行阻塞 MPI 调用,而是使用像 MPI_Irecv 这样的非阻塞调用。和 MPI_Test .

关于pthreads - 正确使用 MPI_THREAD_SERIALIZED 和 pthreads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5811416/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com