将完成的MPI_Request重新用于其他请求是否安全?我一直在使用MPI_Request池来提高性能,没有错误。但肯定知道会很好。
答案 0 :(得分:5)
类型MPI_Request
的变量本身不是请求对象,而是实际MPI请求对象的不透明句柄(类似于抽象指针)。为这样的变量赋值不会影响MPI对象,只会破坏与它的关联。因此,如果程序中没有句柄,则该对象可能无法访问,因此无法再将其传递给MPI调用。这与丢失指向动态分配的内存块的指针相同,从而泄漏它。
当涉及异步请求句柄时,一旦操作完成,MPI就会销毁请求对象,并且MPI_Wait*
/ MPI_Test*
在返回时将传递的句柄变量设置为MPI_REQUEST_NULL
。此外,对MPI_Request_free
的调用将标记删除请求,并在返回时将句柄设置为MPI_REQUEST_NULL
。此时,您可以重用该变量并在其中存储不同的请求句柄。
这同样适用于通信器的句柄(类型为MPI_Comm
),数据类型的句柄(类型为MPI_Datatype
),减少操作的句柄(类型为MPI_Op
),等等
答案 1 :(得分:4)
只要重新使用MPI_Request
对象,再次使用它们(通过完成请求或使用{{1}手动释放请求对象),就可以重复使用MPI_REQUEST_FREE
个对象。 })。