在编写MPI程序时,我一直在使用malloc来分配动态内存,例如:
int main(int argc, char* argv[]) {
MPI_Init(&argc, &argv);
int arr_size = 10;
int* arr = malloc( sizeof(int) * arr_size );
// do some MPI stuff
MPI_Finalize();
}
但是,我遇到了这个MPI函数:MPI_Alloc_mem
:https://www.mpich.org/static/docs/v3.2/www3/MPI_Alloc_mem.html但是我不确定那是什么意思。什么时候应该使用malloc什么时候应该使用MPI_Alloc_mem
?阅读本文后:http://mpi.deino.net/mpi_functions/MPI_Alloc_mem.html似乎MPI_Alloc_mem主要用于远程内存访问。为什么不直接使用malloc?我找不到任何答案,说什么时候选择MPI_Alloc_mem
而不是malloc
。
使用MPI_Alloc_mem()
返回的内存与malloc()
相比,RMA可能更快。此外,MPI_Alloc_mem()
采用MPI_Info
参数,您可以使用它来优化内存位置(请注意,此参数的值是特定于实现的,并且标准未涵盖,MPI_INFO_NULL
将始终有效)。
此外,一些MPI实现可能会选择在缓存行上对齐MPI_Alloc_mem()
返回内存,因此可能会带来更好的性能。
长话短说,如果内存将用于RMA操作,使用MPI_Alloc_mem()
不会受到伤害。但这确实是一个优化的事情,无论你如何分配内存,你的应用程序都应该工作(减去一些限制,见下文)
从MPI 3.1,第8.2章
在一些系统中,当访问特别分配的存储器(例如,由SMP上的通信组中的其他进程共享的存储器)时,消息传递和远程存储器访问(RMA)操作运行得更快。 MPI提供了一种分配和释放这种特殊内存的机制。将此类内存用于消息传递或RMA不是必需的,并且可以像使用任何其他动态分配的内存一样无限制地使用此内存。但是,实现可能会限制使用某些RMA功能,如第11.5.3节中所定义。