#c #mpi #dynamic-memory-allocation
#c #mpi #динамическое выделение памяти
Вопрос:
При написании MPI-программ я использовал malloc для выделения динамической памяти, например:
int main(int argc, char* argv[]) {
MPI_Init(amp;argc, amp;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
.
Ответ №1:
RMA может быть быстрее при использовании памяти, возвращаемой с помощью MPI_Alloc_mem()
по сравнению с malloc()
. Также MPI_Alloc_mem()
принимает MPI_Info
параметр, который вы можете использовать для оптимизации расположения памяти (обратите внимание, значение этого параметра зависит от конкретной реализации и не распространяется на стандарт, MPI_INFO_NULL
всегда будет работать).
Кроме того, некоторые реализации MPI могут предпочесть, чтобы MPI_Alloc_mem()
возвращаемая память была выровнена по строке кэша, и, следовательно, потенциально может привести к повышению производительности.
Короче говоря, использование не повредит, MPI_Alloc_mem()
если память будет использоваться в операциях RMA. Но это действительно оптимизация, и ваше приложение должно работать независимо от того, как вы выделяете память (за вычетом некоторых ограничений, см. Ниже)
Из MPI 3.1, глава 8.2
В некоторых системах операции передачи сообщений и удаленного доступа к памяти (RMA) выполняются быстрее при доступе к специально выделенной памяти (например, памяти, которая совместно используется другими процессами в группе обмена данными на SMP). MPI предоставляет механизм для выделения и освобождения такой специальной памяти. Использование такой памяти для передачи сообщений или RMA не является обязательным, и эта память может использоваться без ограничений, как любая другая динамически выделяемая память.