Чтобы ответить на изменения: в hwloc нет realloc, и в настоящее время мы не планируем добавлять его.Если вы заранее видите, что вы хотите (C-прототип функции), не стесняйтесь добавлять тикет в https://svn.open -mpi.org / trac / hwloc
Чтобы ответить на ogsx:Привязка памяти не специфична, она зависит от области виртуальной памяти и, возможно, от потока.Если вы перераспределяете, libc не делает ничего особенного.1) Если он может перераспределить внутри одной и той же страницы, вы получите память на том же узле.Хорошо, но редко, особенно для больших буферов.2) Если он перераспределяется на другой странице (в большинстве случаев для больших буферов), это зависит от того, была ли соответствующая страница уже выделена в физической памяти библиотекой malloc в прошлом (malloc'ed и освобождена в виртуальной памяти, новсе еще выделяется в физической памяти) 2.a) Если виртуальная страница была выделена, она могла быть размещена на другом узле по разным причинам в прошлом, вы облажались.2.b) Если новая виртуальная страница еще не была выделена, по умолчанию используется размещение на текущем узле.Если вы указали привязку с помощью set_area_membind () или mbind () ранее, она будет размещена на правом узле.Вы можете быть счастливы в этом случае.
Короче, это зависит от многих вещей.Если вы не хотите беспокоиться о том, чтобы библиотека malloc выполняла сложные / скрытые внутренние операции, особенно если у вас большие буферы, выполнение mmap (MAP_ANONYMOUS) вместо malloc - это простой способ убедиться, что страницы выделяются, когда вы действительно хотитеих.И у вас даже есть mremap для выполнения чего-то похожего на realloc.
alloc становится mmap (length) + set_area_membind realloc становится mremap + set_area_membind (для всего буфера mremap)
Никогда не использовал это, новыглядит интересно.