С прозрачными огромными страницами, просто выделение 4M-выровненного буфера будет работать.Используйте aligned_alloc
или posix_memalign
, чтобы получить указатель, который вы можете free
.(Обратите внимание, что aligned_alloc
требуется для сбоя, если размер буфера не кратен выравниванию. /Facepalm).
В зависимости от настроек /sys/kernel/mm/transparent_hugepage/defrag
, вам может потребоваться использовать madvise(MADV_HUGEPAGE)
в буфере, чтобы настоятельно рекомендовать ядру использовать огромные страницы.
Также обратите внимание, что x86-64 использует 2M огромных страниц.x86-32 использует 4M огромных страниц.Если вы хотите простое решение для обеих сторон, то можно настроить 4M.
запросить, чтобы память была либо не кэшируемой, либо доступной для записи?
AFAIK, выне может легко сделать это через обычные API Linux. NT хранит для нормальной работы с обратной записью, так что используйте это вместо этого.(Они переопределяют тип памяти и слабо упорядочены в обход кэша.)
Но если вы не пишете полные строки кэша за раз, вам определенно нужны кэшированные записи.Особенно, если есть какая-либо пространственная или временная локальность, но даже если нет, то хорошо бы позволить буферу хранилища выполнять свою работу (скрывая задержку хранилищ с отсутствием кэша).